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();
208 BaseModManager.isInitialized =
true;
209 yield
return new WaitForEndOfFrame();
210 onComplete?.Invoke();
213 UnityEngine.Object.Destroy(loading.gameObject);
224 List<string> list =
new List<string>();
227 if (!package.
builtin && Directory.Exists(package.
dirInfo.FullName))
229 string item = package.dirInfo.FullName +
"," + (package.willActivate ? 1 : 0);
238 string path = CorePath.rootExe +
"loadorder.txt";
239 if (!File.Exists(path))
243 Dictionary<string, BaseModPackage> dictionary =
new Dictionary<string, BaseModPackage>();
248 dictionary[package.
dirInfo.FullName] = package;
252 string[] array = File.ReadAllLines(path);
253 for (
int i = 0; i < array.Length; i++)
255 string[] array2 = array[i].Split(
',');
256 if (dictionary.ContainsKey(array2[0]))
259 baseModPackage.loadPriority = num;
260 baseModPackage.willActivate = array2[1] ==
"1";
274 modPackage.isInPackages = isInPackages;
282 UserGeneratedContent.Client.GetItemInstallInfo(
item.FileId, out var _, out var folderPath, out var _);
283 DirectoryInfo directoryInfo =
new DirectoryInfo(folderPath);
287 dirInfo = directoryInfo,
289 banned = item.IsBanned
292 modPackage.isInPackages = isInPackages;
317 FileInfo[] files = dir.GetFiles();
318 foreach (FileInfo fileInfo
in files)
320 if (fileInfo.Name.EndsWith(
".xlsx"))
333 FileInfo[] files = dir.GetFiles();
334 foreach (FileInfo fileInfo5
in files)
336 if (fileInfo5.Name.EndsWith(
".z"))
349 FileInfo[] files = dir.GetFiles();
350 foreach (FileInfo fileInfo3
in files)
352 if (fileInfo3.Name.EndsWith(
".mp"))
359 case "Texture Replace":
361 FileInfo[] files = dir.GetFiles();
362 foreach (FileInfo fileInfo6
in files)
364 if (fileInfo6.Name.EndsWith(
".png"))
373 FileInfo[] files = dir.GetFiles();
374 foreach (FileInfo fileInfo4
in files)
376 if (fileInfo4.Name.EndsWith(
".png"))
385 FileInfo[] files = dir.GetFiles();
386 foreach (FileInfo fileInfo2
in files)
388 if (fileInfo2.Name.EndsWith(
".png"))
390 if (fileInfo2.Name.StartsWith(
"BG_"))
394 else if (fileInfo2.Name.StartsWith(
"BGF_"))
398 else if (fileInfo2.Name.EndsWith(
"-full.png"))
402 else if (fileInfo2.Name.EndsWith(
"-overlay.png"))
417 DirectoryInfo[] directories = dir.GetDirectories();
418 foreach (DirectoryInfo directoryInfo
in directories)
420 if (!directoryInfo.Name.StartsWith(
"_") && !TryAddLang(directoryInfo, isNew:
false))
422 Debug.Log(
"Generating Language Mod Contents:" + directoryInfo.FullName);
424 Directory.CreateDirectory(directoryInfo.FullName +
"/Dialog");
428 TryAddLang(directoryInfo, isNew:
true);
434 bool TryAddLang(DirectoryInfo dirLang,
bool isNew)
436 string name = dirLang.Name;
437 FileInfo[] files2 = dirLang.GetFiles();
438 foreach (FileInfo fileInfo7
in files2)
440 if (fileInfo7.Name ==
"lang.ini")
445 dir = dirLang.FullName +
"/"
454 Log.system =
"Updated Language Files:" + Environment.NewLine + Environment.NewLine;
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");
465 IO.DeleteDirectory(text +
"_temp");
466 text = dirLang.FullName +
"/Data";
467 IO.CopyDir(text, text +
"_temp");
470 UpdateTalks(
new DirectoryInfo(text), text +
"_temp");
471 IO.DeleteDirectory(text +
"_temp");
473 IO.SaveText(dirLang.FullName +
"/update.txt",
Log.
system);
485 DirectoryInfo[] directories = dir.GetDirectories();
486 foreach (DirectoryInfo directoryInfo
in directories)
488 UpdateDialogs(directoryInfo, dirTemp +
"/" + directoryInfo.Name);
490 FileInfo[] files = dir.GetFiles();
491 foreach (FileInfo fileInfo
in files)
493 if (fileInfo.Name.EndsWith(
"xlsx"))
502 FileInfo[] files = dir.GetFiles();
503 foreach (FileInfo fileInfo
in files)
505 if (fileInfo.Name ==
"god_talk.xlsx" || fileInfo.Name ==
"chara_talk.xlsx")
514 string path = dirTemp +
"/" + f.Name;
515 if (!File.Exists(path))
519 XSSFWorkbook xSSFWorkbook;
520 using (FileStream @is = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
522 xSSFWorkbook =
new XSSFWorkbook((Stream)@is);
524 XSSFWorkbook xSSFWorkbook2;
525 using (FileStream is2 = File.Open(f.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
527 xSSFWorkbook2 =
new XSSFWorkbook((Stream)is2);
529 for (
int i = 0; i < xSSFWorkbook2.NumberOfSheets; i++)
531 ISheet sheetAt = xSSFWorkbook2.GetSheetAt(i);
532 ISheet sheet = xSSFWorkbook.GetSheet(sheetAt.SheetName);
535 Log.system = Log.system +
"Old sheet not found:" + sheetAt.SheetName + Environment.NewLine;
539 Log.system = Log.system + ((num == 0) ?
"(No Changes) " :
"(Updated) ") + f.FullName +
"(" + sheetAt.SheetName +
")" + Environment.NewLine;
542 Log.system = Log.system + num + Environment.NewLine;
544 Log.system += Environment.NewLine;
546 using FileStream stream =
new FileStream(f.FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
547 xSSFWorkbook2.Write(stream);
552 Dictionary<string, string[]> dictionary =
new Dictionary<string, string[]>();
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++)
563 ICell cell = row2.GetCell(i);
568 string stringCellValue = cell.StringCellValue;
569 if (stringCellValue ==
"id" || (updateOnlytext && stringCellValue !=
"text"))
573 for (
int j = 0; j < row3.LastCellNum; j++)
575 cell = row3.GetCell(j);
580 if (cell.StringCellValue == stringCellValue)
587 Debug.Log(destSheet.SheetName +
"/" + stringCellValue +
"/" + i +
"/" + j);
592 for (
int k = 2; k <= oldSheet.LastRowNum; k++)
594 IRow row4 = oldSheet.GetRow(k);
605 ICell cell2 = row4.GetCell(cellnum2);
610 string text = ((cell2.CellType == CellType.Numeric) ? cell2.NumericCellValue.ToString() : cell2.StringCellValue);
615 string[] array =
new string[list.Count];
616 for (
int l = 0; l < list.Count; l++)
618 ICell cell3 = row4.GetCell(list[l].old);
621 string stringCellValue2 = cell3.StringCellValue;
622 if (!stringCellValue2.IsEmpty())
624 array[l] = stringCellValue2;
628 dictionary.Add(text, array);
631 for (
int m = 2; m <= destSheet.LastRowNum; m++)
633 IRow row5 = destSheet.GetRow(m);
644 ICell cell4 = row5.GetCell(cellnum);
649 string text2 = ((cell4.CellType == CellType.Numeric) ? cell4.NumericCellValue.ToString() : cell4.StringCellValue);
650 if (text2.IsEmpty() || !dictionary.ContainsKey(text2))
654 string[] array2 = dictionary[text2];
655 for (
int n = 0; n < list.Count; n++)
657 ICell cell5 = row5.GetCell(list[n].dest) ?? row5.CreateCell(list[n].dest, CellType.String);
660 cell5.SetCellValue(array2[n]);
661 cell5.SetCellType(CellType.String);
662 cell5.SetAsActiveCell();
668 static int FindField(IRow row,
string id)
670 for (
int num4 = 0; num4 < row.LastCellNum; num4++)
672 ICell cell6 = row.GetCell(num4);
677 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 void LoadTypeFallback()
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