Elin Decompiled Documentation EA 23.102 Nightly
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())
198 {
199 package5.Activate();
200 if (package5.activated)
201 {
202 BaseModManager.listChainLoad.Add(package5.dirInfo.FullName);
203 }
204 }
205 }
207 BaseModManager.isInitialized = true;
208 yield return new WaitForEndOfFrame();
209 onComplete?.Invoke();
210 if ((bool)loading)
211 {
212 UnityEngine.Object.Destroy(loading.gameObject);
213 }
214 yield return null;
215 }
216
217 public void SaveLoadOrder()
218 {
219 if (disableMod)
220 {
221 return;
222 }
223 List<string> list = new List<string>();
224 foreach (BaseModPackage package in packages)
225 {
226 if (!package.builtin && Directory.Exists(package.dirInfo.FullName))
227 {
228 string item = package.dirInfo.FullName + "," + (package.willActivate ? 1 : 0);
229 list.Add(item);
230 }
231 }
232 File.WriteAllLines(CorePath.rootExe + "loadorder.txt", list);
233 }
234
235 public void LoadLoadOrder()
236 {
237 string path = CorePath.rootExe + "loadorder.txt";
238 if (!File.Exists(path))
239 {
240 return;
241 }
242 Dictionary<string, BaseModPackage> dictionary = new Dictionary<string, BaseModPackage>();
243 foreach (BaseModPackage package in packages)
244 {
245 if (!package.builtin)
246 {
247 dictionary[package.dirInfo.FullName] = package;
248 }
249 }
250 int num = 0;
251 string[] array = File.ReadAllLines(path);
252 for (int i = 0; i < array.Length; i++)
253 {
254 string[] array2 = array[i].Split(',');
255 if (dictionary.ContainsKey(array2[0]))
256 {
257 BaseModPackage baseModPackage = dictionary[array2[0]];
258 baseModPackage.loadPriority = num;
259 baseModPackage.willActivate = array2[1] == "1";
260 }
261 num++;
262 }
263 }
264
265 public ModPackage AddPackage(DirectoryInfo dir, bool isInPackages = false)
266 {
267 ModPackage modPackage = new ModPackage
268 {
269 dirInfo = dir,
270 installed = true
271 };
272 packages.Add(modPackage);
273 modPackage.isInPackages = isInPackages;
274 modPackage.loadPriority = priorityIndex;
276 return modPackage;
277 }
278
279 public ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages = false)
280 {
281 UserGeneratedContent.Client.GetItemInstallInfo(item.FileId, out var _, out var folderPath, out var _);
282 DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
283 ModPackage modPackage = new ModPackage
284 {
285 item = item,
286 dirInfo = directoryInfo,
287 installed = directoryInfo.Exists,
288 banned = item.IsBanned
289 };
290 packages.Add(modPackage);
291 modPackage.isInPackages = isInPackages;
292 modPackage.loadPriority = priorityIndex;
294 return modPackage;
295 }
296
297 public int CountUserMod()
298 {
299 int num = 0;
300 foreach (BaseModPackage package in packages)
301 {
302 if (!package.builtin)
303 {
304 num++;
305 }
306 }
307 return num;
308 }
309
310 public override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
311 {
312 switch (dir.Name)
313 {
314 case "TalkText":
315 {
316 FileInfo[] files = dir.GetFiles();
317 foreach (FileInfo fileInfo in files)
318 {
319 if (fileInfo.Name.EndsWith(".xlsx"))
320 {
321 TalkText.modList.Add(new ExcelData(fileInfo.FullName));
322 }
323 }
324 break;
325 }
326 case "Map":
327 {
328 if (package.builtin)
329 {
330 break;
331 }
332 FileInfo[] files = dir.GetFiles();
333 foreach (FileInfo fileInfo5 in files)
334 {
335 if (fileInfo5.Name.EndsWith(".z"))
336 {
337 MOD.listMaps.Add(fileInfo5);
338 }
339 }
340 break;
341 }
342 case "Map Piece":
343 {
344 if (package.builtin)
345 {
346 break;
347 }
348 FileInfo[] files = dir.GetFiles();
349 foreach (FileInfo fileInfo3 in files)
350 {
351 if (fileInfo3.Name.EndsWith(".mp"))
352 {
353 MOD.listPartialMaps.Add(fileInfo3);
354 }
355 }
356 break;
357 }
358 case "Texture Replace":
359 {
360 FileInfo[] files = dir.GetFiles();
361 foreach (FileInfo fileInfo6 in files)
362 {
363 if (fileInfo6.Name.EndsWith(".png"))
364 {
365 replaceFiles.Add(fileInfo6);
366 }
367 }
368 break;
369 }
370 case "Texture":
371 {
372 FileInfo[] files = dir.GetFiles();
373 foreach (FileInfo fileInfo4 in files)
374 {
375 if (fileInfo4.Name.EndsWith(".png"))
376 {
377 SpriteReplacer.dictModItems[fileInfo4.Name.Replace(".png", "")] = fileInfo4.GetFullFileNameWithoutExtension();
378 }
379 }
380 break;
381 }
382 case "Portrait":
383 {
384 FileInfo[] files = dir.GetFiles();
385 foreach (FileInfo fileInfo2 in files)
386 {
387 if (fileInfo2.Name.EndsWith(".png"))
388 {
389 if (fileInfo2.Name.StartsWith("BG_"))
390 {
391 Portrait.modPortraitBGs.Add(fileInfo2);
392 }
393 else if (fileInfo2.Name.StartsWith("BGF_"))
394 {
395 Portrait.modPortraitBGFs.Add(fileInfo2);
396 }
397 else if (fileInfo2.Name.EndsWith("-full.png"))
398 {
399 Portrait.modFull.Add(fileInfo2);
400 }
401 else if (fileInfo2.Name.EndsWith("-overlay.png"))
402 {
403 Portrait.modOverlays.Add(fileInfo2);
404 }
405 else
406 {
407 Portrait.modPortraits.Add(fileInfo2);
408 }
409 Portrait.allIds.Add(fileInfo2.Name);
410 }
411 }
412 break;
413 }
414 case "Lang":
415 {
416 DirectoryInfo[] directories = dir.GetDirectories();
417 foreach (DirectoryInfo directoryInfo in directories)
418 {
419 if (!directoryInfo.Name.StartsWith("_") && !TryAddLang(directoryInfo, isNew: false))
420 {
421 Debug.Log("Generating Language Mod Contents:" + directoryInfo.FullName);
422 IO.CopyDir(CorePath.packageCore + "Lang/EN", directoryInfo.FullName);
423 Directory.CreateDirectory(directoryInfo.FullName + "/Dialog");
424 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", directoryInfo.FullName + "/Dialog");
425 EClass.sources.ExportSourceTexts(directoryInfo.FullName + "/Game");
426 IO.Copy(CorePath.packageCore + "Lang/lang.ini", directoryInfo.FullName + "/");
427 TryAddLang(directoryInfo, isNew: true);
428 }
429 }
430 break;
431 }
432 }
433 bool TryAddLang(DirectoryInfo dirLang, bool isNew)
434 {
435 string name = dirLang.Name;
436 FileInfo[] files2 = dirLang.GetFiles();
437 foreach (FileInfo fileInfo7 in files2)
438 {
439 if (fileInfo7.Name == "lang.ini")
440 {
441 LangSetting langSetting = new LangSetting(fileInfo7.FullName)
442 {
443 id = name,
444 dir = dirLang.FullName + "/"
445 };
446 if (isNew)
447 {
448 langSetting.SetVersion();
449 }
450 else if ((Application.isEditor || Lang.runUpdate) && !Lang.IsBuiltin(dirLang.Name) && langSetting.GetVersion() != EClass.core.version.GetInt())
451 {
453 Log.system = "Updated Language Files:" + Environment.NewLine + Environment.NewLine;
454 Debug.Log("Updating Language:" + langSetting.name + "/" + langSetting.GetVersion() + "/" + EClass.core.version.GetInt());
455 string text = dirLang.FullName + "/Game";
456 Directory.Move(text, text + "_temp");
459 IO.DeleteDirectory(text + "_temp");
460 text = dirLang.FullName + "/Dialog";
461 Directory.Move(text, text + "_temp");
462 IO.CopyDir(CorePath.packageCore + "Lang/_Dialog", text);
463 UpdateDialogs(new DirectoryInfo(text), text + "_temp");
464 IO.DeleteDirectory(text + "_temp");
465 text = dirLang.FullName + "/Data";
466 IO.CopyDir(text, text + "_temp");
467 IO.Copy(CorePath.packageCore + "Lang/EN/Data/god_talk.xlsx", text);
468 IO.Copy(CorePath.packageCore + "Lang/EN/Data/chara_talk.xlsx", text);
469 UpdateTalks(new DirectoryInfo(text), text + "_temp");
470 IO.DeleteDirectory(text + "_temp");
471 langSetting.SetVersion();
472 IO.SaveText(dirLang.FullName + "/update.txt", Log.system);
473 }
474 MOD.langs[name] = langSetting;
475 return true;
476 }
477 }
478 return false;
479 }
480 }
481
482 public void UpdateDialogs(DirectoryInfo dir, string dirTemp)
483 {
484 DirectoryInfo[] directories = dir.GetDirectories();
485 foreach (DirectoryInfo directoryInfo in directories)
486 {
487 UpdateDialogs(directoryInfo, dirTemp + "/" + directoryInfo.Name);
488 }
489 FileInfo[] files = dir.GetFiles();
490 foreach (FileInfo fileInfo in files)
491 {
492 if (fileInfo.Name.EndsWith("xlsx"))
493 {
494 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: true);
495 }
496 }
497 }
498
499 public void UpdateTalks(DirectoryInfo dir, string dirTemp)
500 {
501 FileInfo[] files = dir.GetFiles();
502 foreach (FileInfo fileInfo in files)
503 {
504 if (fileInfo.Name == "god_talk.xlsx" || fileInfo.Name == "chara_talk.xlsx")
505 {
506 UpdateExcelBook(fileInfo, dirTemp, updateOnlyText: false);
507 }
508 }
509 }
510
511 public void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
512 {
513 string path = dirTemp + "/" + f.Name;
514 if (!File.Exists(path))
515 {
516 return;
517 }
518 XSSFWorkbook xSSFWorkbook;
519 using (FileStream @is = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
520 {
521 xSSFWorkbook = new XSSFWorkbook((Stream)@is);
522 }
523 XSSFWorkbook xSSFWorkbook2;
524 using (FileStream is2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
525 {
526 xSSFWorkbook2 = new XSSFWorkbook((Stream)is2);
527 }
528 for (int i = 0; i < xSSFWorkbook2.NumberOfSheets; i++)
529 {
530 ISheet sheetAt = xSSFWorkbook2.GetSheetAt(i);
531 ISheet sheet = xSSFWorkbook.GetSheet(sheetAt.SheetName);
532 if (sheet == null)
533 {
534 Log.system = Log.system + "Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
535 continue;
536 }
537 int num = UpdateExcelSheet(sheetAt, sheet, updateOnlyText);
538 Log.system = Log.system + ((num == 0) ? "(No Changes) " : "(Updated) ") + f.FullName + "(" + sheetAt.SheetName + ")" + Environment.NewLine;
539 if (num != 0)
540 {
541 Log.system = Log.system + num + Environment.NewLine;
542 }
543 Log.system += Environment.NewLine;
544 }
545 using FileStream stream = new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
546 xSSFWorkbook2.Write(stream);
547 }
548
549 public int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
550 {
551 Dictionary<string, string[]> dictionary = new Dictionary<string, string[]>();
552 int num = 0;
553 int num2 = 0;
554 int num3 = 10;
555 IRow row2 = destSheet.GetRow(0);
556 IRow row3 = oldSheet.GetRow(0);
557 List<SheetIndex> list = new List<SheetIndex>();
558 int cellnum = FindField(row2, "id");
559 int cellnum2 = FindField(row3, "id");
560 for (int i = 0; i < row2.LastCellNum; i++)
561 {
562 ICell cell = row2.GetCell(i);
563 if (cell == null)
564 {
565 break;
566 }
567 string stringCellValue = cell.StringCellValue;
568 if (stringCellValue == "id" || (updateOnlytext && stringCellValue != "text"))
569 {
570 continue;
571 }
572 for (int j = 0; j < row3.LastCellNum; j++)
573 {
574 cell = row3.GetCell(j);
575 if (cell == null)
576 {
577 break;
578 }
579 if (cell.StringCellValue == stringCellValue)
580 {
581 list.Add(new SheetIndex
582 {
583 dest = i,
584 old = j
585 });
586 Debug.Log(destSheet.SheetName + "/" + stringCellValue + "/" + i + "/" + j);
587 break;
588 }
589 }
590 }
591 for (int k = 2; k <= oldSheet.LastRowNum; k++)
592 {
593 IRow row4 = oldSheet.GetRow(k);
594 if (row4 == null)
595 {
596 if (num2 >= num3)
597 {
598 break;
599 }
600 num2++;
601 continue;
602 }
603 num2 = 0;
604 ICell cell2 = row4.GetCell(cellnum2);
605 if (cell2 == null)
606 {
607 continue;
608 }
609 string text = ((cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue);
610 if (text.IsEmpty())
611 {
612 continue;
613 }
614 string[] array = new string[list.Count];
615 for (int l = 0; l < list.Count; l++)
616 {
617 ICell cell3 = row4.GetCell(list[l].old);
618 if (cell3 != null)
619 {
620 string stringCellValue2 = cell3.StringCellValue;
621 if (!stringCellValue2.IsEmpty())
622 {
623 array[l] = stringCellValue2;
624 }
625 }
626 }
627 dictionary.Add(text, array);
628 }
629 num2 = 0;
630 for (int m = 2; m <= destSheet.LastRowNum; m++)
631 {
632 IRow row5 = destSheet.GetRow(m);
633 if (row5 == null)
634 {
635 if (num2 >= num3)
636 {
637 break;
638 }
639 num2++;
640 continue;
641 }
642 num2 = 0;
643 ICell cell4 = row5.GetCell(cellnum);
644 if (cell4 == null)
645 {
646 continue;
647 }
648 string text2 = ((cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue);
649 if (text2.IsEmpty() || !dictionary.ContainsKey(text2))
650 {
651 continue;
652 }
653 string[] array2 = dictionary[text2];
654 for (int n = 0; n < list.Count; n++)
655 {
656 ICell cell5 = row5.GetCell(list[n].dest) ?? row5.CreateCell(list[n].dest, CellType.String);
657 if (cell5 != null)
658 {
659 cell5.SetCellValue(array2[n]);
660 cell5.SetCellType(CellType.String);
661 cell5.SetAsActiveCell();
662 num++;
663 }
664 }
665 }
666 return num;
667 static int FindField(IRow row, string id)
668 {
669 for (int num4 = 0; num4 < row.LastCellNum; num4++)
670 {
671 ICell cell6 = row.GetCell(num4);
672 if (cell6 == null)
673 {
674 break;
675 }
676 if (cell6.StringCellValue == id)
677 {
678 return num4;
679 }
680 }
681 return -1;
682 }
683 }
684}
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:133
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:793
static IniData GetElinIni()
Definition: Core.cs:759
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:310
void UpdateTalks(DirectoryInfo dir, string dirTemp)
Definition: ModManager.cs:499
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:235
ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages=false)
Definition: ModManager.cs:279
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:482
static bool disableMod
Definition: ModManager.cs:25
ModPackage AddPackage(DirectoryInfo dir, bool isInPackages=false)
Definition: ModManager.cs:265
static List< object > ListPluginObject
Definition: ModManager.cs:23
int CountUserMod()
Definition: ModManager.cs:297
void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
Definition: ModManager.cs:511
void SaveLoadOrder()
Definition: ModManager.cs:217
int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
Definition: ModManager.cs:549
static DirectoryInfo DirWorkshop
Definition: ModManager.cs:31
static void OnModsActivated()
Definition: ModUtil.cs:17
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