23 public static List<string> ListChainLoad
27 return BaseModManager.listChainLoad;
33 public static DirectoryInfo DirWorkshop
37 return BaseModManager.Instance.dirWorkshop;
43 public static bool IsInitialized
47 return BaseModManager.isInitialized;
53 public static string PathIni
57 return CorePath.PathIni;
62 public IniData GetElinIni()
64 FileIniDataParser fileIniDataParser =
new FileIniDataParser();
69 IniData iniData = fileIniDataParser.ReadFile(
ModManager.PathIni, Encoding.UTF8);
70 if (iniData.GetKey(
"pass").IsEmpty())
73 for (
int i = 0; i < 4; i++)
75 text +=
ModManager.PasswordChar.RandomItem<
char>().ToString();
77 iniData.Global[
"pass"] = text;
78 fileIniDataParser.WriteFile(
ModManager.PathIni, iniData,
null);
84 public override void Init(
string path,
string defaultPackage =
"_Elona")
86 base.Init(path, defaultPackage);
87 IniData elinIni = this.GetElinIni();
88 if (BaseCore.IsOffline)
90 string key = elinIni.GetKey(
"path_workshop");
93 this.dirWorkshop =
new DirectoryInfo(key);
98 DirectoryInfo parent =
new DirectoryInfo(App.Client.GetAppInstallDirectory(SteamSettings.behaviour.settings.applicationId)).Parent.Parent;
99 this.dirWorkshop =
new DirectoryInfo(parent.FullName +
"/workshop/content/2135150");
100 elinIni.Global[
"path_workshop"] = (this.dirWorkshop.FullName ??
"");
101 new FileIniDataParser().WriteFile(
ModManager.PathIni, elinIni,
null);
103 if (this.dirWorkshop !=
null && !this.dirWorkshop.Exists)
105 this.dirWorkshop =
null;
107 Debug.Log(
"Mod Init:" + BaseModManager.rootDefaultPacakge);
108 this.packages.Clear();
109 DirectoryInfo[] directories =
new DirectoryInfo(BaseModManager.rootMod).GetDirectories();
110 Array.Reverse<DirectoryInfo>(directories);
111 foreach (DirectoryInfo directoryInfo
in directories)
113 if (!
EClass.debug.skipMod || !Application.isEditor || !(directoryInfo.Name !=
"_Elona"))
115 this.AddPackage(directoryInfo,
true);
121 private void HandleResults(UgcQuery query)
123 foreach (WorkshopItem workshopItem
in query.ResultsList)
125 if (workshopItem.IsSubscribed)
127 this.AddWorkshopPackage(workshopItem,
false);
133 public IEnumerator RefreshMods(Action onComplete,
bool syncMods)
135 bool sync = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() > 0U;
136 LoadingScreen loading = sync ? Util.Instantiate<LoadingScreen>(
"LoadingScreen",
null) :
null;
137 if (!
EClass.debug.skipMod || !Application.isEditor)
141 UgcQuery activeQuery = UgcQuery.GetSubscribed(
false,
false,
false,
false, 0U);
142 activeQuery.Execute(
new UnityAction<UgcQuery>(this.HandleResults));
143 LoadingScreen loadingScreen = loading;
144 if (loadingScreen !=
null)
146 loadingScreen.Log(
"Fetching subscripted Mods...(Hit ESC to cancel)");
148 while (activeQuery.handle != UGCQueryHandle_t.Invalid && !UnityEngine.Input.GetKey(KeyCode.Escape))
150 yield
return new WaitForEndOfFrame();
156 LoadingScreen loadingScreen2 = loading;
157 if (loadingScreen2 !=
null)
159 loadingScreen2.Log(
"Fetching offline Mods.");
161 if (this.dirWorkshop !=
null)
163 foreach (DirectoryInfo dir
in this.dirWorkshop.GetDirectories())
165 this.AddPackage(dir,
false);
176 foreach (BaseModPackage baseModPackage
in this.packages)
178 WorkshopItem workshopItem = baseModPackage.item as WorkshopItem;
179 if (!baseModPackage.installed && workshopItem !=
null && !workshopItem.IsBanned)
182 string text =
"Downloading " + workshopItem.Title +
": ";
183 if (!baseModPackage.progressText)
185 baseModPackage.progressText = loading.Log(text);
187 if (baseModPackage.downloadStarted && workshopItem.DownloadCompletion >= 1f)
189 baseModPackage.progressText.text = text +
"Done!";
190 baseModPackage.installed =
true;
192 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
194 baseModPackage.progressText.text = text + ((int)(workshopItem.DownloadCompletion * 100f)).ToString() +
"%";
196 else if (!baseModPackage.downloadStarted)
198 baseModPackage.downloadStarted =
true;
199 workshopItem.DownloadItem(
true);
200 Debug.Log(
string.Concat(
new string[]
202 "start downloading:",
205 workshopItem.IsInstalled.ToString(),
207 baseModPackage.installed.ToString(),
209 workshopItem.IsDownloading.ToString(),
211 workshopItem.IsDownloadPending.ToString(),
213 workshopItem.DownloadCompletion.ToString()
218 if (!valid && UnityEngine.Input.GetKey(KeyCode.Escape))
222 yield
return new WaitForEndOfFrame();
225 foreach (BaseModPackage baseModPackage2
in this.packages)
227 baseModPackage2.Init();
228 Debug.Log(
string.Concat(
new string[]
230 baseModPackage2.title,
234 baseModPackage2.installed.ToString(),
236 baseModPackage2.dirInfo.FullName
239 this.LoadLoadOrder();
240 this.packages.Sort((BaseModPackage a, BaseModPackage b) => a.loadPriority - b.loadPriority);
241 foreach (BaseModPackage baseModPackage3
in this.packages)
243 if (!baseModPackage3.isInPackages && baseModPackage3.willActivate)
245 foreach (BaseModPackage baseModPackage4
in this.packages)
247 if (baseModPackage4.isInPackages && baseModPackage3.id == baseModPackage4.id)
249 baseModPackage4.hasPublishedPackage =
true;
254 LoadingScreen loadingScreen3 = loading;
255 if (loadingScreen3 !=
null)
257 loadingScreen3.Log(
"Total number of Mods:" + this.packages.Count.ToString());
261 loading.Log(
"Activating Mods...");
262 yield
return new WaitForEndOfFrame();
263 yield
return new WaitForEndOfFrame();
265 BaseModManager.listChainLoad.Clear();
267 foreach (BaseModPackage baseModPackage5
in this.packages)
269 if (baseModPackage5.IsValidVersion())
271 baseModPackage5.Activate();
272 if (baseModPackage5.activated)
274 BaseModManager.listChainLoad.Add(baseModPackage5.dirInfo.FullName);
278 BaseModManager.isInitialized =
true;
279 yield
return new WaitForEndOfFrame();
280 if (onComplete !=
null)
286 UnityEngine.Object.Destroy(loading.gameObject);
293 public void SaveLoadOrder()
295 List<string> list =
new List<string>();
296 foreach (BaseModPackage baseModPackage
in this.packages)
298 if (!baseModPackage.builtin && Directory.Exists(baseModPackage.dirInfo.FullName))
300 string item = baseModPackage.dirInfo.FullName +
"," + (baseModPackage.willActivate ? 1 : 0).ToString();
304 File.WriteAllLines(CorePath.rootExe +
"loadorder.txt", list);
308 public void LoadLoadOrder()
310 string path = CorePath.rootExe +
"loadorder.txt";
311 if (!File.Exists(path))
315 Dictionary<string, BaseModPackage> dictionary =
new Dictionary<string, BaseModPackage>();
316 foreach (BaseModPackage baseModPackage
in this.packages)
318 if (!baseModPackage.builtin)
320 dictionary[baseModPackage.dirInfo.FullName] = baseModPackage;
324 string[] array = File.ReadAllLines(path);
325 for (
int i = 0; i < array.Length; i++)
327 string[] array2 = array[i].Split(
',', StringSplitOptions.None);
328 if (dictionary.ContainsKey(array2[0]))
330 BaseModPackage baseModPackage2 = dictionary[array2[0]];
331 baseModPackage2.loadPriority = num;
332 baseModPackage2.willActivate = (array2[1] ==
"1");
339 public ModPackage AddPackage(DirectoryInfo dir,
bool isInPackages =
false)
346 this.packages.Add(modPackage);
347 modPackage.isInPackages = isInPackages;
348 modPackage.loadPriority = this.priorityIndex;
349 this.priorityIndex++;
354 public ModPackage AddWorkshopPackage(WorkshopItem item,
bool isInPackages =
false)
359 UserGeneratedContent.Client.GetItemInstallInfo(item.FileId, out num, out path, out dateTime);
360 DirectoryInfo directoryInfo =
new DirectoryInfo(path);
364 dirInfo = directoryInfo,
365 installed = directoryInfo.Exists,
366 banned = item.IsBanned
368 this.packages.Add(modPackage);
369 modPackage.isInPackages = isInPackages;
370 modPackage.loadPriority = this.priorityIndex;
371 this.priorityIndex++;
376 public override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
378 string name = dir.Name;
379 uint num = <PrivateImplementationDetails>.ComputeStringHash(name);
380 if (num <= 1151856721U)
382 if (num != 688467962U)
384 if (num != 1054589944U)
386 if (num != 1151856721U)
390 if (!(name ==
"Map"))
394 if (!package.builtin)
396 foreach (FileInfo fileInfo
in dir.GetFiles())
398 if (fileInfo.Name.EndsWith(
".z"))
400 MOD.listMaps.Add(fileInfo);
408 if (!(name ==
"TalkText"))
412 foreach (FileInfo fileInfo2
in dir.GetFiles())
414 if (fileInfo2.Name.EndsWith(
".xlsx"))
416 TalkText.modList.Add(
new ExcelData(fileInfo2.FullName));
424 if (!(name ==
"Portrait"))
428 foreach (FileInfo fileInfo3
in dir.GetFiles())
430 if (fileInfo3.Name.EndsWith(
".png"))
432 if (fileInfo3.Name.StartsWith(
"BG_"))
434 Portrait.modPortraitBGs.Add(fileInfo3,
null,
"");
436 else if (fileInfo3.Name.StartsWith(
"BGF_"))
438 Portrait.modPortraitBGFs.Add(fileInfo3,
null,
"");
440 else if (fileInfo3.Name.EndsWith(
"-full.png"))
442 Portrait.modFull.Add(fileInfo3,
null,
"");
444 else if (fileInfo3.Name.EndsWith(
"-overlay.png"))
446 Portrait.modOverlays.Add(fileInfo3,
null,
"");
450 Portrait.modPortraits.Add(fileInfo3,
null,
"");
452 Portrait.allIds.Add(fileInfo3.Name);
458 else if (num <= 2571916692U)
460 if (num != 2026591700U)
462 if (num != 2571916692U)
466 if (!(name ==
"Texture"))
470 foreach (FileInfo fileInfo4
in dir.GetFiles())
472 if (fileInfo4.Name.EndsWith(
".png"))
474 SpriteReplacer.dictModItems[fileInfo4.Name.Replace(
".png",
"")] = fileInfo4.GetFullFileNameWithoutExtension();
481 if (!(name ==
"Texture Replace"))
485 foreach (FileInfo fileInfo5
in dir.GetFiles())
487 if (fileInfo5.Name.EndsWith(
".png"))
489 this.replaceFiles.Add(fileInfo5);
495 else if (num != 3658367683U)
497 if (num != 4044785525U)
501 if (!(name ==
"Lang"))
505 foreach (DirectoryInfo directoryInfo
in dir.GetDirectories())
507 if (!directoryInfo.Name.StartsWith(
"_") && !
this.<ParseExtra>g__TryAddLang|19_0(directoryInfo,
false))
509 Debug.Log(
"Generating Language Mod Contents:" + directoryInfo.FullName);
510 IO.CopyDir(CorePath.packageCore +
"Lang/EN", directoryInfo.FullName,
null);
511 Directory.CreateDirectory(directoryInfo.FullName +
"/Dialog");
512 IO.CopyDir(CorePath.packageCore +
"Lang/_Dialog", directoryInfo.FullName +
"/Dialog",
null);
513 EClass.sources.ExportSourceTexts(directoryInfo.FullName +
"/Game");
514 IO.Copy(CorePath.packageCore +
"Lang/lang.ini", directoryInfo.FullName +
"/");
515 this.<ParseExtra>g__TryAddLang|19_0(directoryInfo,
true);
521 if (!(name ==
"Map Piece"))
525 if (!package.builtin)
527 foreach (FileInfo fileInfo6
in dir.GetFiles())
529 if (fileInfo6.Name.EndsWith(
".mp"))
531 MOD.listPartialMaps.Add(fileInfo6);
540 public void UpdateDialogs(DirectoryInfo dir,
string dirTemp)
542 foreach (DirectoryInfo directoryInfo
in dir.GetDirectories())
544 this.UpdateDialogs(directoryInfo, dirTemp +
"/" + directoryInfo.Name);
546 foreach (FileInfo fileInfo
in dir.GetFiles())
548 if (fileInfo.Name.EndsWith(
"xlsx"))
550 this.UpdateExcelBook(fileInfo, dirTemp,
true);
556 public void UpdateTalks(DirectoryInfo dir,
string dirTemp)
558 foreach (FileInfo fileInfo
in dir.GetFiles())
560 if (fileInfo.Name ==
"god_talk.xlsx" || fileInfo.Name ==
"chara_talk.xlsx")
562 this.UpdateExcelBook(fileInfo, dirTemp,
false);
568 public void UpdateExcelBook(FileInfo f,
string dirTemp,
bool updateOnlyText)
570 string path = dirTemp +
"/" + f.Name;
571 if (!File.Exists(path))
575 XSSFWorkbook xssfworkbook;
576 using (FileStream fileStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
578 xssfworkbook =
new XSSFWorkbook(fileStream);
580 XSSFWorkbook xssfworkbook2;
581 using (FileStream fileStream2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
583 xssfworkbook2 =
new XSSFWorkbook(fileStream2);
585 for (
int i = 0; i < xssfworkbook2.NumberOfSheets; i++)
587 ISheet sheetAt = xssfworkbook2.GetSheetAt(i);
588 ISheet sheet = xssfworkbook.GetSheet(sheetAt.SheetName);
591 Log.system = Log.system +
"Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
595 int num = this.UpdateExcelSheet(sheetAt, sheet, updateOnlyText);
596 Log.system =
string.Concat(
new string[]
599 (num == 0) ?
"(No Changes) " :
"(Updated) ",
608 Log.system = Log.system + num.ToString() + Environment.NewLine;
610 Log.system += Environment.NewLine;
613 using (FileStream fileStream3 =
new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
615 xssfworkbook2.Write(fileStream3);
620 public int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet,
bool updateOnlytext)
622 Dictionary<string, string[]> dictionary =
new Dictionary<string, string[]>();
626 IRow row = destSheet.GetRow(0);
627 IRow row2 = oldSheet.GetRow(0);
629 int cellnum =
ModManager.<UpdateExcelSheet>g__FindField|24_0(row,
"id");
630 int cellnum2 =
ModManager.<UpdateExcelSheet>g__FindField|24_0(row2,
"id");
631 for (
int i = 0; i < (int)row.LastCellNum; i++)
633 ICell cell = row.GetCell(i);
638 string stringCellValue = cell.StringCellValue;
639 if (!(stringCellValue ==
"id") && (!updateOnlytext || !(stringCellValue !=
"text")))
641 for (
int j = 0; j < (int)row2.LastCellNum; j++)
643 cell = row2.GetCell(j);
648 if (cell.StringCellValue == stringCellValue)
655 Debug.Log(
string.Concat(
new string[]
670 for (
int k = 2; k <= oldSheet.LastRowNum; k++)
672 IRow row3 = oldSheet.GetRow(k);
684 ICell cell2 = row3.GetCell(cellnum2);
687 string text = (cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue;
690 string[] array =
new string[list.Count];
691 for (
int l = 0; l < list.Count; l++)
693 ICell cell3 = row3.GetCell(list[l].old);
696 string stringCellValue2 = cell3.StringCellValue;
697 if (!stringCellValue2.IsEmpty())
699 array[l] = stringCellValue2;
703 dictionary.Add(text, array);
709 for (
int m = 2; m <= destSheet.LastRowNum; m++)
711 IRow row4 = destSheet.GetRow(m);
723 ICell cell4 = row4.GetCell(cellnum);
726 string text2 = (cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue;
727 if (!text2.IsEmpty() && dictionary.ContainsKey(text2))
729 string[] array2 = dictionary[text2];
730 for (
int n = 0; n < list.Count; n++)
732 ICell cell5 = row4.GetCell(list[n].dest) ?? row4.CreateCell(list[n].dest, CellType.String);
735 cell5.SetCellValue(array2[n]);
736 cell5.SetCellType(CellType.String);
737 cell5.SetAsActiveCell();
750 private bool <ParseExtra>g__TryAddLang|19_0(DirectoryInfo dirLang,
bool isNew)
752 string name = dirLang.Name;
753 foreach (FileInfo fileInfo
in dirLang.GetFiles())
755 if (fileInfo.Name ==
"lang.ini")
757 LangSetting langSetting =
new LangSetting(fileInfo.FullName)
760 dir = dirLang.FullName +
"/"
764 langSetting.SetVersion();
766 else if (Application.isEditor && !Lang.IsBuiltin(dirLang.Name) && langSetting.GetVersion() !=
EClass.core.version.GetInt())
769 Log.system =
"Updated Language Files:" + Environment.NewLine + Environment.NewLine;
770 Debug.Log(
string.Concat(
new string[]
772 "Updating Language:",
775 langSetting.GetVersion().ToString(),
777 EClass.core.version.GetInt().ToString()
779 string text = dirLang.FullName +
"/Game";
780 Directory.Move(text, text +
"_temp");
781 EClass.sources.ExportSourceTexts(text);
782 EClass.sources.UpdateSourceTexts(text);
783 IO.DeleteDirectory(text +
"_temp");
784 text = dirLang.FullName +
"/Dialog";
785 Directory.Move(text, text +
"_temp");
786 IO.CopyDir(CorePath.packageCore +
"Lang/_Dialog", text,
null);
787 this.UpdateDialogs(
new DirectoryInfo(text), text +
"_temp");
788 IO.DeleteDirectory(text +
"_temp");
789 text = dirLang.FullName +
"/Data";
790 IO.CopyDir(text, text +
"_temp",
null);
791 IO.Copy(CorePath.packageCore +
"Lang/EN/Data/god_talk.xlsx", text);
792 IO.Copy(CorePath.packageCore +
"Lang/EN/Data/chara_talk.xlsx", text);
793 this.UpdateTalks(
new DirectoryInfo(text), text +
"_temp");
794 IO.DeleteDirectory(text +
"_temp");
795 langSetting.SetVersion();
796 IO.SaveText(dirLang.FullName +
"/update.txt", Log.system);
798 MOD.langs[name] = langSetting;
807 internal static int <UpdateExcelSheet>g__FindField|24_0(IRow row,
string id)
809 for (
int i = 0; i < (int)row.LastCellNum; i++)
811 ICell cell = row.GetCell(i);
816 if (cell.StringCellValue ==
id)
825 public static readonly
string PasswordChar =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
828 public static List<object> ListPluginObject =
new List<object>();
831 public List<FileInfo> replaceFiles =
new List<FileInfo>();