Elin Decompiled Documentation EA 23.344.1 Nightly
Loading...
Searching...
No Matches
BaseModPackage.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Xml;
5using System.Xml.Linq;
6using UnityEngine;
7using UnityEngine.UI;
8
9public class BaseModPackage
10{
11 public const int defaultLoadPriority = 100;
12
13 public const int minLoadPriority = -999;
14
15 public const int maxLoadPriority = 999;
16
17 public static XmlReader xmlReader;
18
19 public static XmlReaderSettings readerSetting;
20
21 public string title;
22
23 public string author;
24
25 public string version;
26
27 public string id;
28
29 public string description;
30
31 public string visibility;
32
33 public string[] tags;
34
35 public string[][] dependency;
36
37 public string[][] incompatible;
38
39 public string[][] loadAfter;
40
41 public string[][] loadBefore;
42
43 public bool builtin;
44
45 public bool activated;
46
47 public bool willActivate = true;
48
49 public bool installed;
50
51 public bool banned;
52
53 public bool isInPackages;
54
56
57 public bool downloadStarted;
58
59 public int loadPriority = 100;
60
61 public int orderIndex = -1;
62
64
65 public string langDepError;
66
68
69 public string parseError;
70
71 public object item;
72
73 public DirectoryInfo dirInfo;
74
75 public Text progressText;
76
77 private static readonly Dictionary<string, string> builtinPackages = new Dictionary<string, string>
78 {
79 { "_Elona", "elin_core1" },
80 { "_Lang_Chinese", "elin_language_chinese" },
81 { "_ModdingKit", "elin.plugins.modding" },
82 { "Mod_Slot", "elin_minigame_slot" }
83 };
84
85 public bool CanActivate
86 {
87 get
88 {
90 {
91 DirectoryInfo directoryInfo = dirInfo;
92 if (directoryInfo != null && directoryInfo.Exists)
93 {
94 return willActivate;
95 }
96 }
97 return false;
98 }
99 }
100
101 public static string NormalizeId(string s)
102 {
103 if (s.IsEmpty())
104 {
105 return null;
106 }
107 string text = s.Trim().ToLowerInvariant();
108 if (!text.IsEmpty())
109 {
110 return text;
111 }
112 return null;
113 }
114
115 public static bool IsBuiltinDir(string dirName)
116 {
117 if (!dirName.IsEmpty())
118 {
119 return builtinPackages.ContainsKey(dirName);
120 }
121 return false;
122 }
123
124 public static bool IsBuiltinPackage(DirectoryInfo dir, string packageId)
125 {
126 if (dir != null && builtinPackages.TryGetValue(dir.Name, out var value))
127 {
128 return NormalizeId(packageId) == value;
129 }
130 return false;
131 }
132
133 public bool IsValidVersion()
134 {
135 if (!builtin && !version.IsEmpty() && version.Split('.').Length >= 3)
136 {
138 }
139 return true;
140 }
141
142 public bool Init()
143 {
144 if (!File.Exists(dirInfo.FullName + "/package.xml"))
145 {
146 return false;
147 }
148 UpdateMeta();
149 return true;
150 }
151
152 public void UpdateMeta(bool updateOnly = false)
153 {
154 string text = dirInfo.FullName + "/package.xml";
155 if (!File.Exists(text))
156 {
157 return;
158 }
159 byte[] bytes;
160 try
161 {
162 bytes = File.ReadAllBytes(text);
163 }
164 catch (Exception ex)
165 {
166 parseError = ex.Message;
167 Debug.LogWarning($"#mod package.xml can't be read: {text}\n{ex}");
168 return;
169 }
170 string error;
171 XDocument xDocument = ModXml.Load(bytes, out error);
172 if (xDocument?.Root == null)
173 {
174 parseError = error.IsEmpty("no root element");
175 Debug.LogWarning("#mod package.xml failed to parse: " + text + "\n" + parseError);
176 return;
177 }
178 string text2 = null;
179 string text3 = null;
180 string packageId = null;
181 string text4 = null;
182 string text5 = null;
183 string text6 = null;
184 string[] array = null;
185 int num = 100;
186 List<string[]> rows = null;
187 List<string[]> rows2 = null;
188 List<string[]> rows3 = null;
189 List<string[]> rows4 = null;
190 try
191 {
192 foreach (XElement item in xDocument.Root.Descendants())
193 {
194 string text7 = ModXml.ValidXml(item.Name.LocalName);
195 if (text7 == null)
196 {
197 Debug.LogWarning("#mod package.xml unknown element <" + item.Name.LocalName + ">, ignored: " + text);
198 continue;
199 }
200 if (text7 != item.Name.LocalName)
201 {
202 Debug.LogWarning("#mod package.xml <" + item.Name.LocalName + "> should be written as <" + text7 + ">, parsed: " + text);
203 }
204 switch (text7)
205 {
206 case "title":
207 text2 = ModXml.Text(item);
208 break;
209 case "author":
210 text3 = ModXml.Text(item);
211 break;
212 case "id":
213 packageId = ModXml.Text(item);
214 break;
215 case "description":
216 text4 = item.Value;
217 break;
218 case "version":
219 text5 = ModXml.Text(item);
220 break;
221 case "tag":
222 case "tags":
223 array = ModXml.SplitTags(ModXml.Text(item));
224 break;
225 case "loadPriority":
226 {
227 if (int.TryParse(ModXml.Text(item), out var result))
228 {
229 num = Mathf.Clamp(result, -999, 999);
230 }
231 break;
232 }
233 case "visibility":
234 text6 = ModXml.Text(item);
235 break;
236 case "dependency":
237 ModXml.ReadIdRow(item, ref rows, text);
238 break;
239 case "incompatible":
240 ModXml.ReadIdRow(item, ref rows2, text);
241 break;
242 case "loadAfter":
243 ModXml.ReadIdRow(item, ref rows3, text);
244 break;
245 case "loadBefore":
246 ModXml.ReadIdRow(item, ref rows4, text);
247 break;
248 }
249 }
250 }
251 catch (Exception ex2)
252 {
253 parseError = ex2.Message;
254 Debug.LogWarning($"#mod package.xml failed to parse: {text}\n{ex2}");
255 return;
256 }
257 title = text2;
258 author = text3;
259 id = packageId;
260 description = text4;
261 version = text5;
262 visibility = text6;
263 tags = array;
264 loadPriority = num;
265 dependency = rows?.ToArray();
266 incompatible = rows2?.ToArray();
267 loadAfter = rows3?.ToArray();
268 loadBefore = rows4?.ToArray();
269 builtin = IsBuiltinPackage(dirInfo, packageId);
270 parseError = null;
271 }
272
273 public void Activate()
274 {
275 if (CanActivate)
276 {
277 int num = ((BaseModManager.Instance == null) ? (-1) : BaseModManager.Instance.packages.IndexOf(this));
278 Debug.Log("Activating(" + (num + 1) + ") : " + title + "/" + id);
279 activated = true;
280 Parse();
281 }
282 }
283
284 public void Parse()
285 {
286 DirectoryInfo[] directories = dirInfo.GetDirectories();
287 foreach (DirectoryInfo directoryInfo in directories)
288 {
289 if (directoryInfo.Name.ToLower() == "actor")
290 {
291 FileInfo[] files = directoryInfo.GetFiles("*.xlsx", SearchOption.TopDirectoryOnly);
292 foreach (FileInfo fileInfo in files)
293 {
294 MOD.actorSources.Add(new ExcelData(fileInfo.FullName));
295 }
296 DirectoryInfo[] directories2 = directoryInfo.GetDirectories();
297 foreach (DirectoryInfo directoryInfo2 in directories2)
298 {
299 Log.App(directoryInfo2.FullName);
300 string text = directoryInfo2.Name.ToLower();
301 if (!(text == "pcc"))
302 {
303 if (!(text == "sprite"))
304 {
305 continue;
306 }
307 files = directoryInfo2.GetFiles();
308 foreach (FileInfo fileInfo2 in files)
309 {
310 if (fileInfo2.Name.EndsWith(".png"))
311 {
312 MOD.sprites.Add(fileInfo2);
313 }
314 }
315 }
316 else
317 {
318 DirectoryInfo[] directories3 = directoryInfo2.GetDirectories();
319 foreach (DirectoryInfo obj in directories3)
320 {
321 MOD.OnAddPcc(obj);
322 }
323 }
324 }
325 }
326 else
327 {
328 BaseModManager.Instance.ParseExtra(directoryInfo, this);
329 }
330 }
331 }
332}
Version versionMod
Definition: BaseCore.cs:21
static BaseCore Instance
Definition: BaseCore.cs:11
List< BaseModPackage > packages
virtual void ParseExtra(DirectoryInfo dir, BaseModPackage package)
static BaseModManager Instance
DirectoryInfo dirInfo
static string NormalizeId(string s)
string[][] loadAfter
BaseModPackage duplicateOf
const int defaultLoadPriority
void UpdateMeta(bool updateOnly=false)
const int minLoadPriority
static XmlReaderSettings readerSetting
static bool IsBuiltinPackage(DirectoryInfo dir, string packageId)
string[][] loadBefore
const int maxLoadPriority
static bool IsBuiltinDir(string dirName)
static XmlReader xmlReader
bool hasPublishedPackage
static readonly Dictionary< string, string > builtinPackages
string[][] dependency
BaseModPackage blockedBy
string[][] incompatible
void Add(ExcelData data)
Definition: Log.cs:4
static void App(string s)
Definition: Log.cs:7
Definition: MOD.cs:7
static ExcelDataList actorSources
Definition: MOD.cs:20
static ModItemList< Sprite > sprites
Definition: MOD.cs:22
static Action< DirectoryInfo > OnAddPcc
Definition: MOD.cs:24
void Add(FileInfo fi, string path=null, string prefix="")
Definition: ModItemList.cs:85
Definition: ModXml.cs:10
static XDocument Load(byte[] bytes, out string error)
Definition: ModXml.cs:97
static string[] SplitTags(string value)
Definition: ModXml.cs:27
static string ValidXml(string name)
Definition: ModXml.cs:17
static string Text(XElement e)
Definition: ModXml.cs:22
static void ReadIdRow(XElement e, ref List< string[]> rows, string path)
Definition: ModXml.cs:50
static Version Get(string str)
Definition: Version.cs:73
bool IsBelow(int _major, int _minor, int _batch)
Definition: Version.cs:49