Elin Decompiled Documentation EA 23.200 Stable
Loading...
Searching...
No Matches
ModManager.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.IO;
5using HeathenEngineering.SteamworksIntegration;
6using HeathenEngineering.SteamworksIntegration.API;
7using IniParser.Model;
8using NPOI.SS.UserModel;
9using NPOI.XSSF.UserModel;
10using Steamworks;
11using UnityEngine;
12
13[Serializable]
15{
16 public struct SheetIndex
17 {
18 public int dest;
19
20 public int old;
21 }
22
23 public static List<object> ListPluginObject = new List<object>();
24
25 public static bool disableMod = false;
26
27 public List<FileInfo> replaceFiles = new List<FileInfo>();
28
29 public static List<string> ListChainLoad => BaseModManager.listChainLoad;
30
31 public static DirectoryInfo DirWorkshop => BaseModManager.Instance.dirWorkshop;
32
34
35 public override void Init(string path, string defaultPackage = "_Elona")
36 {
37 base.Init(path, defaultPackage);
38 IniData elinIni = Core.GetElinIni();
39 Debug.Log("IsOffline:" + BaseCore.IsOffline);
40 if (elinIni != null)
41 {
43 {
44 string key = elinIni.GetKey("path_workshop");
45 if (!key.IsEmpty())
46 {
47 dirWorkshop = new DirectoryInfo(key);
48 }
49 }
50 else
51 {
52 DirectoryInfo parent = new DirectoryInfo(App.Client.GetAppInstallDirectory(SteamSettings.behaviour.settings.applicationId)).Parent.Parent;
53 dirWorkshop = new DirectoryInfo(parent.FullName + "/workshop/content/2135150");
54 elinIni.Global["path_workshop"] = dirWorkshop.FullName ?? "";
55 Core.SaveElinIni(elinIni);
56 }
57 }
58 if (dirWorkshop != null && !dirWorkshop.Exists)
59 {
60 dirWorkshop = null;
61 }
62 Debug.Log("dirWorkshop:" + dirWorkshop);
63 Debug.Log("Mod Init:" + BaseModManager.rootDefaultPacakge);
64 packages.Clear();
65 DirectoryInfo[] directories = new DirectoryInfo(BaseModManager.rootMod).GetDirectories();
66 Array.Reverse(directories);
67 DirectoryInfo[] array = directories;
68 foreach (DirectoryInfo directoryInfo in array)
69 {
70 if (!EClass.debug.skipMod || !Application.isEditor || !(directoryInfo.Name != "_Elona"))
71 {
72 AddPackage(directoryInfo, isInPackages: true);
73 }
74 }
75 DirectoryInfo[] directories2 = new DirectoryInfo(CorePath.custom).GetDirectories();
76 ModPackage package = new ModPackage();
77 array = directories2;
78 foreach (DirectoryInfo dir in array)
79 {
80 ParseExtra(dir, package);
81 }
82 }
83
84 private void HandleResults(UgcQuery query)
85 {
86 foreach (WorkshopItem results in query.ResultsList)
87 {
88 if (results.IsSubscribed)
89 {
90 AddWorkshopPackage(results);
91 }
92 }
93 }
94
95 public IEnumerator RefreshMods(Action onComplete, bool syncMods)
96 {
97 bool sync = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() != 0;
98 LoadingScreen loading = (sync ? Util.Instantiate<LoadingScreen>("LoadingScreen") : null);
99 if (!disableMod && (!EClass.debug.skipMod || !Application.isEditor))
100 {
101 if (sync)
102 {
103 UgcQuery activeQuery = UgcQuery.GetSubscribed(withLongDescription: false, withMetadata: false, withKeyValueTags: false, withAdditionalPreviews: false, 0u);
104 activeQuery.Execute(HandleResults);
105 loading?.Log("Fetching subscribed Mods...(Hit ESC to cancel)");
106 while (activeQuery.handle != UGCQueryHandle_t.Invalid && !UnityEngine.Input.GetKey(KeyCode.Escape))
107 {
108 yield return new WaitForEndOfFrame();
109 }
110 }
111 else
112 {
113 loading?.Log("Fetching offline Mods.");
114 if (dirWorkshop != null)
115 {
116 DirectoryInfo[] directories = dirWorkshop.GetDirectories();
117 foreach (DirectoryInfo dir in directories)
118 {
119 AddPackage(dir);
120 }
121 }
122 }
123 }
124 if (sync)
125 {
126 bool valid = false;
127 while (!valid)
128 {
129 valid = true;
130 foreach (BaseModPackage package in packages)
131 {
132 WorkshopItem workshopItem = package.item as WorkshopItem;
133 if (!package.installed && workshopItem != null && !workshopItem.IsBanned)
134 {
135 valid = false;
136 string text = "Downloading " + workshopItem.Title + ": ";
137 if (!package.progressText)
138 {
139 package.progressText = loading.Log(text);
140 }
141 if (package.downloadStarted && workshopItem.DownloadCompletion >= 1f)
142 {
143 package.progressText.text = text + "Done!";
144 package.installed = true;
145 }
146 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
147 {
148 package.progressText.text = text + (int)(workshopItem.DownloadCompletion * 100f) + "%";
149 }
150 else if (!package.downloadStarted)
151 {
152 package.downloadStarted = true;
153 workshopItem.DownloadItem(highPriority: true);
154 Debug.Log("start downloading:" + workshopItem.Title + "/" + workshopItem.IsInstalled + "/" + package.installed + "/" + workshopItem.IsDownloading + "/" + workshopItem.IsDownloadPending + "/" + workshopItem.DownloadCompletion);
155 }
156 }
157 }
158 if (!valid && UnityEngine.Input.GetKey(KeyCode.Escape))
159 {
160 break;
161 }
162 yield return new WaitForEndOfFrame();
163 }
164 }
165 foreach (BaseModPackage package2 in packages)
166 {
167 package2.Init();
168 Debug.Log(package2.title + "/" + package2.id + "/" + package2.installed + "/" + package2.dirInfo.FullName);
169 }
172 foreach (BaseModPackage package3 in packages)
173 {
174 if (package3.isInPackages || !package3.willActivate)
175 {
176 continue;
177 }
178 foreach (BaseModPackage package4 in packages)
179 {
180 if (package4.isInPackages && package3.id == package4.id)
181 {
182 package4.hasPublishedPackage = true;
183 }
184 }
185 }
186 loading?.Log("Total number of Mods:" + packages.Count);
187 if ((bool)loading)
188 {
189 loading.Log("Activating Mods...");
190 yield return new WaitForEndOfFrame();
191 yield return new WaitForEndOfFrame();
192 }
194 ListPluginObject.Clear();
195 foreach (BaseModPackage package5 in packages)
196 {
197 if (package5.IsValidVersion() && (!disableMod || package5.builtin))
198 {
199 package5.Activate();
200 if (package5.activated)
201 {
202 BaseModManager.listChainLoad.Add(package5.dirInfo.FullName);
203 }
204 }
205 }
208 BaseModManager.isInitialized = true;
209 yield return new WaitForEndOfFrame();
210 onComplete?.Invoke();
211 if ((bool)loading)
212 {
213 UnityEngine.Object.Destroy(loading.gameObject);
214 }
215 yield return null;
216 }
217
218 public void SaveLoadOrder()
219 {
220 if (disableMod)
221 {
222 return;
223 }
224 List<string> list = new List<string>();
225 foreach (BaseModPackage package in packages)
226 {
227 if (!package.builtin && Directory.Exists(package.dirInfo.FullName))
228 {
229 string item = package.dirInfo.FullName + "," + (package.willActivate ? 1 : 0);
230 list.Add(item);
231 }
232 }
233 File.WriteAllLines(CorePath.rootExe + "loadorder.txt", list);
234 }
235
236 public void LoadLoadOrder()
237 {
238 string path = CorePath.rootExe + "loadorder.txt";
239 if (!File.Exists(path))
240 {
241 return;
242 }
243 Dictionary<string, BaseModPackage> dictionary = new Dictionary<string, BaseModPackage>();
244 foreach (BaseModPackage package in packages)
245 {
246 if (!package.builtin)
247 {
248 dictionary[package.dirInfo.FullName] = package;
249 }
250 }
251 int num = 0;
252 string[] array = File.ReadAllLines(path);
253 for (int i = 0; i < array.Length; i++)
254 {
255 string[] array2 = array[i].Split(',');
256 if (dictionary.ContainsKey(array2[0]))
257 {
258 BaseModPackage baseModPackage = dictionary[array2[0]];
259 baseModPackage.loadPriority = num;
260 baseModPackage.willActivate = array2[1] == "1";
261 }
262 num++;
263 }
264 }
265
266 public ModPackage AddPackage(DirectoryInfo dir, bool isInPackages = false)
267 {
268 ModPackage modPackage = new ModPackage
269 {
270 dirInfo = dir,
271 installed = true
272 };
273 packages.Add(modPackage);
274 modPackage.isInPackages = isInPackages;
275 modPackage.loadPriority = priorityIndex;
277 return modPackage;
278 }
279
280 public ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages = false)
281 {
282 UserGeneratedContent.Client.GetItemInstallInfo(item.FileId, out var _, out var folderPath, out var _);
283 DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
284 ModPackage modPackage = new ModPackage
285 {
286 item = item,
287 dirInfo = directoryInfo,
288 installed = directoryInfo.Exists,
289 banned = item.IsBanned
290 };
291 packages.Add(modPackage);
292 modPackage.isInPackages = isInPackages;
293 modPackage.loadPriority = priorityIndex;
295 return modPackage;
296 }
297
298 public int CountUserMod()
299 {
300 int num = 0;
301 foreach (BaseModPackage package in packages)
302 {
303 if (!package.builtin)
304 {
305 num++;
306 }
307 }
308 return num;
309 }
310
311 public override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
312 {
313 switch (dir.Name)
314 {
315 case "TalkText":
316 {
317 FileInfo[] files = dir.GetFiles();
318 foreach (FileInfo fileInfo in files)
319 {
320 if (fileInfo.Name.EndsWith(".xlsx"))
321 {
322 TalkText.modList.Add(new ExcelData(fileInfo.FullName));
323 }
324 }
325 break;
326 }
327 case "Map":
328 {
329 if (package.builtin)
330 {
331 break;
332 }
333 FileInfo[] files = dir.GetFiles();
334 foreach (FileInfo fileInfo5 in files)
335 {
336 if (fileInfo5.Name.EndsWith(".z"))
337 {
338 MOD.listMaps.Add(fileInfo5);
339 }
340 }
341 break;
342 }
343 case "Map Piece":
344 {
345 if (package.builtin)
346 {
347 break;
348 }
349 FileInfo[] files = dir.GetFiles();
350 foreach (FileInfo fileInfo3 in files)
351 {
352 if (fileInfo3.Name.EndsWith(".mp"))
353 {
354 MOD.listPartialMaps.Add(fileInfo3);
355 }
356 }
357 break;
358 }
359 case "Texture Replace":
360 {
361 FileInfo[] files = dir.GetFiles();
362 foreach (FileInfo fileInfo6 in files)
363 {
364 if (fileInfo6.Name.EndsWith(".png"))
365 {
366 replaceFiles.Add(fileInfo6);
367 }
368 }
369 break;
370 }
371 case "Texture":
372 {
373 FileInfo[] files = dir.GetFiles();
374 foreach (FileInfo fileInfo4 in files)
375 {
376 if (fileInfo4.Name.EndsWith(".png"))
377 {
378 SpriteReplacer.dictModItems[fileInfo4.Name.Replace(".png", "")] = fileInfo4.GetFullFileNameWithoutExtension();
379 }
380 }
381 break;
382 }
383 case "Portrait":
384 {
385 FileInfo[] files = dir.GetFiles();
386 foreach (FileInfo fileInfo2 in files)
387 {
388 if (fileInfo2.Name.EndsWith(".png"))
389 {
390 if (fileInfo2.Name.StartsWith("BG_"))
391 {
392 Portrait.modPortraitBGs.Add(fileInfo2);
393 }
394 else if (fileInfo2.Name.StartsWith("BGF_"))
395 {
396 Portrait.modPortraitBGFs.Add(fileInfo2);
397 }
398 else if (fileInfo2.Name.EndsWith("-full.png"))
399 {
400 Portrait.modFull.Add(fileInfo2);
401 }
402 else if (fileInfo2.Name.EndsWith("-overlay.png"))
403 {
404 Portrait.modOverlays.Add(fileInfo2);
405 }
406 else
407 {
408 Portrait.modPortraits.Add(fileInfo2);
409 }
410 Portrait.allIds.Add(fileInfo2.Name);
411 }
412 }
413 break;
414 }
415 case "Lang":
416 {
417 DirectoryInfo[] directories = dir.GetDirectories();
418 foreach (DirectoryInfo directoryInfo in directories)
419 {
420 if (!directoryInfo.Name.StartsWith("_") && !TryAddLang(directoryInfo, isNew: false))
421 {
422 Debug.Log("Generating Language Mod Contents:" + directoryInfo.FullName);
423 IO.CopyDir(CorePath.packageCore + "Lang/EN", directoryInfo.FullName);
424 Directory.CreateDirectory(directoryInfo.FullName + "/Dialog");
425 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", directoryInfo.FullName + "/Dialog");
426 EClass.sources.ExportSourceTexts(directoryInfo.FullName + "/Game");
427 IO.Copy(CorePath.packageCore + "Lang/lang.ini", directoryInfo.FullName + "/");
428 TryAddLang(directoryInfo, isNew: true);
429 }
430 }
431 break;
432 }
433 }
434 bool TryAddLang(DirectoryInfo dirLang, bool isNew)
435 {
436 string name = dirLang.Name;
437 FileInfo[] files2 = dirLang.GetFiles();
438 foreach (FileInfo fileInfo7 in files2)
439 {
440 if (fileInfo7.Name == "lang.ini")
441 {
442 LangSetting langSetting = new LangSetting(fileInfo7.FullName)
443 {
444 id = name,
445 dir = dirLang.FullName + "/"
446 };
447 if (isNew)
448 {
449 langSetting.SetVersion();
450 }
451 else if ((Application.isEditor || Lang.runUpdate) && !Lang.IsBuiltin(dirLang.Name) && langSetting.GetVersion() != EClass.core.version.GetInt())
452 {
454 Log.system = "Updated Language Files:" + Environment.NewLine + Environment.NewLine;
455 Debug.Log("Updating Language:" + langSetting.name + "/" + langSetting.GetVersion() + "/" + EClass.core.version.GetInt());
456 string text = dirLang.FullName + "/Game";
457 Directory.Move(text, text + "_temp");
460 IO.DeleteDirectory(text + "_temp");
461 text = dirLang.FullName + "/Dialog";
462 Directory.Move(text, text + "_temp");
463 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", text);
464 UpdateDialogs(new DirectoryInfo(text), text + "_temp");
465 IO.DeleteDirectory(text + "_temp");
466 text = dirLang.FullName + "/Data";
467 IO.CopyDir(text, text + "_temp");
468 IO.Copy(CorePath.packageCore + "Lang/EN/Data/god_talk.xlsx", text);
469 IO.Copy(CorePath.packageCore + "Lang/EN/Data/chara_talk.xlsx", text);
470 UpdateTalks(new DirectoryInfo(text), text + "_temp");
471 IO.DeleteDirectory(text + "_temp");
472 langSetting.SetVersion();
473 IO.SaveText(dirLang.FullName + "/update.txt", Log.system);
474 }
475 MOD.langs[name] = langSetting;
476 return true;
477 }
478 }
479 return false;
480 }
481 }
482
483 public void UpdateDialogs(DirectoryInfo dir, string dirTemp)
484 {
485 DirectoryInfo[] directories = dir.GetDirectories();
486 foreach (DirectoryInfo directoryInfo in directories)
487 {
488 UpdateDialogs(directoryInfo, dirTemp + "/" + directoryInfo.Name);
489 }
490 FileInfo[] files = dir.GetFiles();
491 foreach (FileInfo fileInfo in files)
492 {
493 if (fileInfo.Name.EndsWith("xlsx"))
494 {
495 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: true);
496 }
497 }
498 }
499
500 public void UpdateTalks(DirectoryInfo dir, string dirTemp)
501 {
502 FileInfo[] files = dir.GetFiles();
503 foreach (FileInfo fileInfo in files)
504 {
505 if (fileInfo.Name == "god_talk.xlsx" || fileInfo.Name == "chara_talk.xlsx")
506 {
507 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: false);
508 }
509 }
510 }
511
512 public void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
513 {
514 string path = dirTemp + "/" + f.Name;
515 if (!File.Exists(path))
516 {
517 return;
518 }
519 XSSFWorkbook xSSFWorkbook;
520 using (FileStream @is = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
521 {
522 xSSFWorkbook = new XSSFWorkbook((Stream)@is);
523 }
524 XSSFWorkbook xSSFWorkbook2;
525 using (FileStream is2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
526 {
527 xSSFWorkbook2 = new XSSFWorkbook((Stream)is2);
528 }
529 for (int i = 0; i < xSSFWorkbook2.NumberOfSheets; i++)
530 {
531 ISheet sheetAt = xSSFWorkbook2.GetSheetAt(i);
532 ISheet sheet = xSSFWorkbook.GetSheet(sheetAt.SheetName);
533 if (sheet == null)
534 {
535 Log.system = Log.system + "Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
536 continue;
537 }
538 int num = UpdateExcelSheet(sheetAt, sheet, updateOnlyText);
539 Log.system = Log.system + ((num == 0) ? "(No Changes) " : "(Updated) ") + f.FullName + "(" + sheetAt.SheetName + ")" + Environment.NewLine;
540 if (num != 0)
541 {
542 Log.system = Log.system + num + Environment.NewLine;
543 }
544 Log.system += Environment.NewLine;
545 }
546 using FileStream stream = new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
547 xSSFWorkbook2.Write(stream);
548 }
549
550 public int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
551 {
552 Dictionary<string, string[]> dictionary = new Dictionary<string, string[]>();
553 int num = 0;
554 int num2 = 0;
555 int num3 = 10;
556 IRow row2 = destSheet.GetRow(0);
557 IRow row3 = oldSheet.GetRow(0);
558 List<SheetIndex> list = new List<SheetIndex>();
559 int cellnum = FindField(row2, "id");
560 int cellnum2 = FindField(row3, "id");
561 for (int i = 0; i < row2.LastCellNum; i++)
562 {
563 ICell cell = row2.GetCell(i);
564 if (cell == null)
565 {
566 break;
567 }
568 string stringCellValue = cell.StringCellValue;
569 if (stringCellValue == "id" || (updateOnlytext && stringCellValue != "text"))
570 {
571 continue;
572 }
573 for (int j = 0; j < row3.LastCellNum; j++)
574 {
575 cell = row3.GetCell(j);
576 if (cell == null)
577 {
578 break;
579 }
580 if (cell.StringCellValue == stringCellValue)
581 {
582 list.Add(new SheetIndex
583 {
584 dest = i,
585 old = j
586 });
587 Debug.Log(destSheet.SheetName + "/" + stringCellValue + "/" + i + "/" + j);
588 break;
589 }
590 }
591 }
592 for (int k = 2; k <= oldSheet.LastRowNum; k++)
593 {
594 IRow row4 = oldSheet.GetRow(k);
595 if (row4 == null)
596 {
597 if (num2 >= num3)
598 {
599 break;
600 }
601 num2++;
602 continue;
603 }
604 num2 = 0;
605 ICell cell2 = row4.GetCell(cellnum2);
606 if (cell2 == null)
607 {
608 continue;
609 }
610 string text = ((cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue);
611 if (text.IsEmpty())
612 {
613 continue;
614 }
615 string[] array = new string[list.Count];
616 for (int l = 0; l < list.Count; l++)
617 {
618 ICell cell3 = row4.GetCell(list[l].old);
619 if (cell3 != null)
620 {
621 string stringCellValue2 = cell3.StringCellValue;
622 if (!stringCellValue2.IsEmpty())
623 {
624 array[l] = stringCellValue2;
625 }
626 }
627 }
628 dictionary.Add(text, array);
629 }
630 num2 = 0;
631 for (int m = 2; m <= destSheet.LastRowNum; m++)
632 {
633 IRow row5 = destSheet.GetRow(m);
634 if (row5 == null)
635 {
636 if (num2 >= num3)
637 {
638 break;
639 }
640 num2++;
641 continue;
642 }
643 num2 = 0;
644 ICell cell4 = row5.GetCell(cellnum);
645 if (cell4 == null)
646 {
647 continue;
648 }
649 string text2 = ((cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue);
650 if (text2.IsEmpty() || !dictionary.ContainsKey(text2))
651 {
652 continue;
653 }
654 string[] array2 = dictionary[text2];
655 for (int n = 0; n < list.Count; n++)
656 {
657 ICell cell5 = row5.GetCell(list[n].dest) ?? row5.CreateCell(list[n].dest, CellType.String);
658 if (cell5 != null)
659 {
660 cell5.SetCellValue(array2[n]);
661 cell5.SetCellType(CellType.String);
662 cell5.SetAsActiveCell();
663 num++;
664 }
665 }
666 }
667 return num;
668 static int FindField(IRow row, string id)
669 {
670 for (int num4 = 0; num4 < row.LastCellNum; num4++)
671 {
672 ICell cell6 = row.GetCell(num4);
673 if (cell6 == null)
674 {
675 break;
676 }
677 if (cell6.StringCellValue == id)
678 {
679 return num4;
680 }
681 }
682 return -1;
683 }
684 }
685}
static bool IsOffline
Definition: BaseCore.cs:9
Version version
Definition: BaseCore.cs:17
List< BaseModPackage > packages
static bool isInitialized
static string rootDefaultPacakge
static BaseModManager Instance
static string rootMod
static List< string > listChainLoad
DirectoryInfo dirWorkshop
bool IsValidVersion()
DirectoryInfo dirInfo
bool skipMod
Definition: CoreDebug.cs:134
static string custom
Definition: CorePath.cs:163
static string packageCore
Definition: CorePath.cs:157
static string rootExe
Definition: CorePath.cs:172
Definition: Core.cs:14
static void SaveElinIni(IniData ini)
Definition: Core.cs:800
static IniData GetElinIni()
Definition: Core.cs:766
Definition: EClass.cs:5
static Core core
Definition: EClass.cs:6
static SourceManager sources
Definition: EClass.cs:42
static CoreDebug debug
Definition: EClass.cs:48
string name
Definition: LangSetting.cs:24
void SetVersion()
Definition: LangSetting.cs:114
int GetVersion()
Definition: LangSetting.cs:100
Definition: Lang.cs:6
static bool IsBuiltin(string id)
Definition: Lang.cs:62
static bool runUpdate
Definition: Lang.cs:24
Text Log(string s)
Definition: Log.cs:4
static string system
Definition: Log.cs:5
Definition: MOD.cs:7
static Dictionary< string, LangSetting > langs
Definition: MOD.cs:8
static List< FileInfo > listMaps
Definition: MOD.cs:20
static List< FileInfo > listPartialMaps
Definition: MOD.cs:22
void Add(FileInfo fi, string path=null, string prefix="")
Definition: ModItemList.cs:85
void HandleResults(UgcQuery query)
Definition: ModManager.cs:84
override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
Definition: ModManager.cs:311
void UpdateTalks(DirectoryInfo dir, string dirTemp)
Definition: ModManager.cs:500
static bool IsInitialized
Definition: ModManager.cs:33
static List< string > ListChainLoad
Definition: ModManager.cs:29
List< FileInfo > replaceFiles
Definition: ModManager.cs:27
void LoadLoadOrder()
Definition: ModManager.cs:236
ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages=false)
Definition: ModManager.cs:280
override void Init(string path, string defaultPackage="_Elona")
Definition: ModManager.cs:35
IEnumerator RefreshMods(Action onComplete, bool syncMods)
Definition: ModManager.cs:95
void UpdateDialogs(DirectoryInfo dir, string dirTemp)
Definition: ModManager.cs:483
static bool disableMod
Definition: ModManager.cs:25
ModPackage AddPackage(DirectoryInfo dir, bool isInPackages=false)
Definition: ModManager.cs:266
static List< object > ListPluginObject
Definition: ModManager.cs:23
int CountUserMod()
Definition: ModManager.cs:298
void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
Definition: ModManager.cs:512
void SaveLoadOrder()
Definition: ModManager.cs:218
int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
Definition: ModManager.cs:550
static DirectoryInfo DirWorkshop
Definition: ModManager.cs:31
static void OnModsActivated()
Definition: ModUtil.cs:17
static void LoadTypeFallback()
Definition: ModUtil.cs:21
static ModItemList< Sprite > modPortraitBGFs
Definition: Portrait.cs:8
static ModItemList< Sprite > modPortraitBGs
Definition: Portrait.cs:10
static ModItemList< Sprite > modOverlays
Definition: Portrait.cs:14
static ModItemList< Sprite > modPortraits
Definition: Portrait.cs:12
static HashSet< string > allIds
Definition: Portrait.cs:20
static ModItemList< Sprite > modFull
Definition: Portrait.cs:16
void UpdateSourceTexts(string path)
void ExportSourceTexts(string path)
static Dictionary< string, string > dictModItems
static List< ExcelData > modList
Definition: TalkText.cs:5
int GetInt()
Definition: Version.cs:21