Elin Decompiled Documentation EA 23.356.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
66
67 public string langDepError;
68
70
71 public string parseError;
72
73 public object item;
74
75 public DirectoryInfo dirInfo;
76
77 public Text progressText;
78
79 private static readonly Dictionary<string, string> builtinPackages = new Dictionary<string, string>
80 {
81 { "_Elona", "elin_core1" },
82 { "_Lang_Chinese", "elin_language_chinese" },
83 { "_ModdingKit", "elin.plugins.modding" },
84 { "Mod_Slot", "elin_minigame_slot" }
85 };
86
87 public bool CanActivate
88 {
89 get
90 {
92 {
93 DirectoryInfo directoryInfo = dirInfo;
94 if (directoryInfo != null && directoryInfo.Exists)
95 {
96 return willActivate;
97 }
98 }
99 return false;
100 }
101 }
102
103 public static string NormalizeId(string s)
104 {
105 if (s.IsEmpty())
106 {
107 return null;
108 }
109 string text = s.Trim().ToLowerInvariant();
110 if (!text.IsEmpty())
111 {
112 return text;
113 }
114 return null;
115 }
116
117 public static bool IsBuiltinDir(string dirName)
118 {
119 if (!dirName.IsEmpty())
120 {
121 return builtinPackages.ContainsKey(dirName);
122 }
123 return false;
124 }
125
126 public static bool IsBuiltinPackage(DirectoryInfo dir, string packageId)
127 {
128 if (dir != null && builtinPackages.TryGetValue(dir.Name, out var value))
129 {
130 return NormalizeId(packageId) == value;
131 }
132 return false;
133 }
134
135 public bool IsValidVersion()
136 {
137 if (!builtin && !version.IsEmpty() && version.Split('.').Length >= 3)
138 {
140 }
141 return true;
142 }
143
144 public bool Init()
145 {
146 if (!File.Exists(dirInfo.FullName + "/package.xml"))
147 {
148 return false;
149 }
150 UpdateMeta();
151 return true;
152 }
153
154 public void UpdateMeta(bool updateOnly = false)
155 {
156 string text = dirInfo.FullName + "/package.xml";
157 if (!File.Exists(text))
158 {
159 return;
160 }
161 byte[] bytes;
162 try
163 {
164 bytes = File.ReadAllBytes(text);
165 }
166 catch (Exception ex)
167 {
168 parseError = ex.Message;
169 Debug.LogWarning($"#mod package.xml can't be read: {text}\n{ex}");
170 return;
171 }
172 string error;
173 XDocument xDocument = ModXml.Load(bytes, out error);
174 if (xDocument?.Root == null)
175 {
176 parseError = error.IsEmpty("no root element");
177 Debug.LogWarning("#mod package.xml failed to parse: " + text + "\n" + parseError);
178 return;
179 }
180 string text2 = null;
181 string text3 = null;
182 string packageId = null;
183 string text4 = null;
184 string text5 = null;
185 string text6 = null;
186 string[] array = null;
187 int num = 100;
188 List<string[]> rows = null;
189 List<string[]> rows2 = null;
190 List<string[]> rows3 = null;
191 List<string[]> rows4 = null;
192 try
193 {
194 foreach (XElement item in xDocument.Root.Descendants())
195 {
196 string text7 = ModXml.ValidXml(item.Name.LocalName);
197 if (text7 == null)
198 {
199 Debug.LogWarning("#mod package.xml unknown element <" + item.Name.LocalName + ">, ignored: " + text);
200 continue;
201 }
202 if (text7 != item.Name.LocalName)
203 {
204 Debug.LogWarning("#mod package.xml <" + item.Name.LocalName + "> should be written as <" + text7 + ">, parsed: " + text);
205 }
206 switch (text7)
207 {
208 case "title":
209 text2 = ModXml.Text(item);
210 break;
211 case "author":
212 text3 = ModXml.Text(item);
213 break;
214 case "id":
215 packageId = ModXml.Text(item);
216 break;
217 case "description":
218 text4 = item.Value;
219 break;
220 case "version":
221 text5 = ModXml.Text(item);
222 break;
223 case "tag":
224 case "tags":
225 array = ModXml.SplitTags(ModXml.Text(item));
226 break;
227 case "loadPriority":
228 {
229 if (int.TryParse(ModXml.Text(item), out var result))
230 {
231 num = Mathf.Clamp(result, -999, 999);
232 }
233 break;
234 }
235 case "visibility":
236 text6 = ModXml.Text(item);
237 break;
238 case "dependency":
239 ModXml.ReadIdRow(item, ref rows, text);
240 break;
241 case "incompatible":
242 ModXml.ReadIdRow(item, ref rows2, text);
243 break;
244 case "loadAfter":
245 ModXml.ReadIdRow(item, ref rows3, text);
246 break;
247 case "loadBefore":
248 ModXml.ReadIdRow(item, ref rows4, text);
249 break;
250 }
251 }
252 }
253 catch (Exception ex2)
254 {
255 parseError = ex2.Message;
256 Debug.LogWarning($"#mod package.xml failed to parse: {text}\n{ex2}");
257 return;
258 }
259 title = text2;
260 author = text3;
261 id = packageId;
262 description = text4;
263 version = text5;
264 visibility = text6;
265 tags = array;
266 loadPriority = num;
267 dependency = rows?.ToArray();
268 incompatible = rows2?.ToArray();
269 loadAfter = rows3?.ToArray();
270 loadBefore = rows4?.ToArray();
271 builtin = IsBuiltinPackage(dirInfo, packageId);
272 parseError = null;
273 }
274
275 public void Activate()
276 {
277 if (CanActivate)
278 {
279 int num = ((BaseModManager.Instance == null) ? (-1) : BaseModManager.Instance.packages.IndexOf(this));
280 Debug.Log("Activating(" + (num + 1) + ") : " + title + "/" + id);
281 activated = true;
282 Parse();
283 }
284 }
285
286 public void Parse()
287 {
288 DirectoryInfo[] directories = dirInfo.GetDirectories();
289 foreach (DirectoryInfo directoryInfo in directories)
290 {
291 if (directoryInfo.Name.ToLower() == "actor")
292 {
293 FileInfo[] files = directoryInfo.GetFiles("*.xlsx", SearchOption.TopDirectoryOnly);
294 foreach (FileInfo fileInfo in files)
295 {
296 MOD.actorSources.Add(new ExcelData(fileInfo.FullName));
297 }
298 DirectoryInfo[] directories2 = directoryInfo.GetDirectories();
299 foreach (DirectoryInfo directoryInfo2 in directories2)
300 {
301 Log.App(directoryInfo2.FullName);
302 string text = directoryInfo2.Name.ToLower();
303 if (!(text == "pcc"))
304 {
305 if (!(text == "sprite"))
306 {
307 continue;
308 }
309 files = directoryInfo2.GetFiles();
310 foreach (FileInfo fileInfo2 in files)
311 {
312 if (fileInfo2.Name.EndsWith(".png"))
313 {
314 MOD.sprites.Add(fileInfo2);
315 }
316 }
317 }
318 else
319 {
320 DirectoryInfo[] directories3 = directoryInfo2.GetDirectories();
321 foreach (DirectoryInfo obj in directories3)
322 {
323 MOD.OnAddPcc(obj);
324 }
325 }
326 }
327 }
328 else
329 {
330 BaseModManager.Instance.ParseExtra(directoryInfo, this);
331 }
332 }
333 }
334}
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:93
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