2using System.Collections;
3using System.Collections.Generic;
5using HeathenEngineering.SteamworksIntegration;
6using HeathenEngineering.SteamworksIntegration.API;
8using NPOI.SS.UserModel;
9using NPOI.XSSF.UserModel;
35 public override void Init(
string path,
string defaultPackage =
"_Elona")
37 base.Init(path, defaultPackage);
44 string key = elinIni.GetKey(
"path_workshop");
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 ??
"";
66 Array.Reverse(directories);
67 DirectoryInfo[] array = directories;
68 foreach (DirectoryInfo directoryInfo
in array)
70 if (!
EClass.
debug.
skipMod || !Application.isEditor || !(directoryInfo.Name !=
"_Elona"))
75 DirectoryInfo[] directories2 =
new DirectoryInfo(
CorePath.
custom).GetDirectories();
78 foreach (DirectoryInfo dir
in array)
80 ParseExtra(dir, package);
86 foreach (WorkshopItem results
in query.ResultsList)
88 if (results.IsSubscribed)
95 public IEnumerator
RefreshMods(Action onComplete,
bool syncMods)
97 bool sync = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() != 0;
103 UgcQuery activeQuery = UgcQuery.GetSubscribed(withLongDescription:
false, withMetadata:
false, withKeyValueTags:
false, withAdditionalPreviews:
false, 0u);
105 loading?.
Log(
"Fetching subscribed Mods...(Hit ESC to cancel)");
106 while (activeQuery.handle != UGCQueryHandle_t.Invalid && !UnityEngine.Input.GetKey(KeyCode.Escape))
108 yield
return new WaitForEndOfFrame();
113 loading?.
Log(
"Fetching offline Mods.");
116 DirectoryInfo[] directories =
dirWorkshop.GetDirectories();
117 foreach (DirectoryInfo dir
in directories)
132 WorkshopItem workshopItem = package.item as WorkshopItem;
133 if (!package.
installed && workshopItem !=
null && !workshopItem.IsBanned)
136 string text =
"Downloading " + workshopItem.Title +
": ";
139 package.progressText = loading.
Log(text);
143 package.progressText.text = text +
"Done!";
144 package.installed =
true;
146 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
148 package.progressText.text = text + (int)(workshopItem.DownloadCompletion * 100f) +
"%";
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);
158 if (!valid && UnityEngine.Input.GetKey(KeyCode.Escape))
162 yield
return new WaitForEndOfFrame();
182 package4.hasPublishedPackage =
true;
186 loading?.Log(
"Total number of Mods:" +
packages.Count);
189 loading.Log(
"Activating Mods...");
190 yield
return new WaitForEndOfFrame();
191 yield
return new WaitForEndOfFrame();
207 BaseModManager.isInitialized =
true;
208 yield
return new WaitForEndOfFrame();
209 onComplete?.Invoke();
212 UnityEngine.Object.Destroy(loading.gameObject);
223 List<string> list =
new List<string>();
226 if (!package.
builtin && Directory.Exists(package.
dirInfo.FullName))
228 string item = package.dirInfo.FullName +
"," + (package.willActivate ? 1 : 0);
237 string path = CorePath.rootExe +
"loadorder.txt";
238 if (!File.Exists(path))
242 Dictionary<string, BaseModPackage> dictionary =
new Dictionary<string, BaseModPackage>();
247 dictionary[package.
dirInfo.FullName] = package;
251 string[] array = File.ReadAllLines(path);
252 for (
int i = 0; i < array.Length; i++)
254 string[] array2 = array[i].Split(
',');
255 if (dictionary.ContainsKey(array2[0]))
258 baseModPackage.loadPriority = num;
259 baseModPackage.willActivate = array2[1] ==
"1";
273 modPackage.isInPackages = isInPackages;
281 UserGeneratedContent.Client.GetItemInstallInfo(
item.FileId, out var _, out var folderPath, out var _);
282 DirectoryInfo directoryInfo =
new DirectoryInfo(folderPath);
286 dirInfo = directoryInfo,
288 banned = item.IsBanned
291 modPackage.isInPackages = isInPackages;
316 FileInfo[] files = dir.GetFiles();
317 foreach (FileInfo fileInfo
in files)
319 if (fileInfo.Name.EndsWith(
".xlsx"))
332 FileInfo[] files = dir.GetFiles();
333 foreach (FileInfo fileInfo5
in files)
335 if (fileInfo5.Name.EndsWith(
".z"))
348 FileInfo[] files = dir.GetFiles();
349 foreach (FileInfo fileInfo3
in files)
351 if (fileInfo3.Name.EndsWith(
".mp"))
358 case "Texture Replace":
360 FileInfo[] files = dir.GetFiles();
361 foreach (FileInfo fileInfo6
in files)
363 if (fileInfo6.Name.EndsWith(
".png"))
372 FileInfo[] files = dir.GetFiles();
373 foreach (FileInfo fileInfo4
in files)
375 if (fileInfo4.Name.EndsWith(
".png"))
384 FileInfo[] files = dir.GetFiles();
385 foreach (FileInfo fileInfo2
in files)
387 if (fileInfo2.Name.EndsWith(
".png"))
389 if (fileInfo2.Name.StartsWith(
"BG_"))
393 else if (fileInfo2.Name.StartsWith(
"BGF_"))
397 else if (fileInfo2.Name.EndsWith(
"-full.png"))
401 else if (fileInfo2.Name.EndsWith(
"-overlay.png"))
416 DirectoryInfo[] directories = dir.GetDirectories();
417 foreach (DirectoryInfo directoryInfo
in directories)
419 if (!directoryInfo.Name.StartsWith(
"_") && !TryAddLang(directoryInfo, isNew:
false))
421 Debug.Log(
"Generating Language Mod Contents:" + directoryInfo.FullName);
423 Directory.CreateDirectory(directoryInfo.FullName +
"/Dialog");
427 TryAddLang(directoryInfo, isNew:
true);
433 bool TryAddLang(DirectoryInfo dirLang,
bool isNew)
435 string name = dirLang.Name;
436 FileInfo[] files2 = dirLang.GetFiles();
437 foreach (FileInfo fileInfo7
in files2)
439 if (fileInfo7.Name ==
"lang.ini")
444 dir = dirLang.FullName +
"/"
453 Log.system =
"Updated Language Files:" + Environment.NewLine + Environment.NewLine;
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");
464 IO.DeleteDirectory(text +
"_temp");
465 text = dirLang.FullName +
"/Data";
466 IO.CopyDir(text, text +
"_temp");
469 UpdateTalks(
new DirectoryInfo(text), text +
"_temp");
470 IO.DeleteDirectory(text +
"_temp");
472 IO.SaveText(dirLang.FullName +
"/update.txt",
Log.
system);
484 DirectoryInfo[] directories = dir.GetDirectories();
485 foreach (DirectoryInfo directoryInfo
in directories)
487 UpdateDialogs(directoryInfo, dirTemp +
"/" + directoryInfo.Name);
489 FileInfo[] files = dir.GetFiles();
490 foreach (FileInfo fileInfo
in files)
492 if (fileInfo.Name.EndsWith(
"xlsx"))
501 FileInfo[] files = dir.GetFiles();
502 foreach (FileInfo fileInfo
in files)
504 if (fileInfo.Name ==
"god_talk.xlsx" || fileInfo.Name ==
"chara_talk.xlsx")
513 string path = dirTemp +
"/" + f.Name;
514 if (!File.Exists(path))
518 XSSFWorkbook xSSFWorkbook;
519 using (FileStream @is = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
521 xSSFWorkbook =
new XSSFWorkbook((Stream)@is);
523 XSSFWorkbook xSSFWorkbook2;
524 using (FileStream is2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
526 xSSFWorkbook2 =
new XSSFWorkbook((Stream)is2);
528 for (
int i = 0; i < xSSFWorkbook2.NumberOfSheets; i++)
530 ISheet sheetAt = xSSFWorkbook2.GetSheetAt(i);
531 ISheet sheet = xSSFWorkbook.GetSheet(sheetAt.SheetName);
534 Log.system = Log.system +
"Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
538 Log.system = Log.system + ((num == 0) ?
"(No Changes) " :
"(Updated) ") + f.FullName +
"(" + sheetAt.SheetName +
")" + Environment.NewLine;
541 Log.system = Log.system + num + Environment.NewLine;
543 Log.system += Environment.NewLine;
545 using FileStream stream =
new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
546 xSSFWorkbook2.Write(stream);
551 Dictionary<string, string[]> dictionary =
new Dictionary<string, string[]>();
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++)
562 ICell cell = row2.GetCell(i);
567 string stringCellValue = cell.StringCellValue;
568 if (stringCellValue ==
"id" || (updateOnlytext && stringCellValue !=
"text"))
572 for (
int j = 0; j < row3.LastCellNum; j++)
574 cell = row3.GetCell(j);
579 if (cell.StringCellValue == stringCellValue)
586 Debug.Log(destSheet.SheetName +
"/" + stringCellValue +
"/" + i +
"/" + j);
591 for (
int k = 2; k <= oldSheet.LastRowNum; k++)
593 IRow row4 = oldSheet.GetRow(k);
604 ICell cell2 = row4.GetCell(cellnum2);
609 string text = ((cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue);
614 string[] array =
new string[list.Count];
615 for (
int l = 0; l < list.Count; l++)
617 ICell cell3 = row4.GetCell(list[l].old);
620 string stringCellValue2 = cell3.StringCellValue;
621 if (!stringCellValue2.IsEmpty())
623 array[l] = stringCellValue2;
627 dictionary.Add(text, array);
630 for (
int m = 2; m <= destSheet.LastRowNum; m++)
632 IRow row5 = destSheet.GetRow(m);
643 ICell cell4 = row5.GetCell(cellnum);
648 string text2 = ((cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue);
649 if (text2.IsEmpty() || !dictionary.ContainsKey(text2))
653 string[] array2 = dictionary[text2];
654 for (
int n = 0; n < list.Count; n++)
656 ICell cell5 = row5.GetCell(list[n].dest) ?? row5.CreateCell(list[n].dest, CellType.String);
659 cell5.SetCellValue(array2[n]);
660 cell5.SetCellType(CellType.String);
661 cell5.SetAsActiveCell();
667 static int FindField(IRow row,
string id)
669 for (
int num4 = 0; num4 < row.LastCellNum; num4++)
671 ICell cell6 = row.GetCell(num4);
676 if (cell6.StringCellValue ==
id)
List< BaseModPackage > packages
static bool isInitialized
static string rootDefaultPacakge
static BaseModManager Instance
static List< string > listChainLoad
DirectoryInfo dirWorkshop
static string packageCore
static void SaveElinIni(IniData ini)
static IniData GetElinIni()
static SourceManager sources
static bool IsBuiltin(string id)
static Dictionary< string, LangSetting > langs
static List< FileInfo > listMaps
static List< FileInfo > listPartialMaps
void Add(FileInfo fi, string path=null, string prefix="")
void HandleResults(UgcQuery query)
override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
void UpdateTalks(DirectoryInfo dir, string dirTemp)
static bool IsInitialized
static List< string > ListChainLoad
List< FileInfo > replaceFiles
ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages=false)
override void Init(string path, string defaultPackage="_Elona")
IEnumerator RefreshMods(Action onComplete, bool syncMods)
void UpdateDialogs(DirectoryInfo dir, string dirTemp)
ModPackage AddPackage(DirectoryInfo dir, bool isInPackages=false)
static List< object > ListPluginObject
void UpdateExcelBook(FileInfo f, string dirTemp, bool updateOnlyText)
int UpdateExcelSheet(ISheet destSheet, ISheet oldSheet, bool updateOnlytext)
static DirectoryInfo DirWorkshop
static void OnModsActivated()
static ModItemList< Sprite > modPortraitBGFs
static ModItemList< Sprite > modPortraitBGs
static ModItemList< Sprite > modOverlays
static ModItemList< Sprite > modPortraits
static HashSet< string > allIds
static ModItemList< Sprite > modFull
void UpdateSourceTexts(string path)
void ExportSourceTexts(string path)
static Dictionary< string, string > dictModItems
static List< ExcelData > modList