2using System.Collections;
3using System.Collections.Generic;
6using HeathenEngineering.SteamworksIntegration;
7using HeathenEngineering.SteamworksIntegration.API;
34 public override void Init(
string path,
string defaultPackage =
"_Elona")
36 base.Init(path, defaultPackage);
43 string key = elinIni.GetKey(
"path_workshop");
46 dirWorkshop =
new DirectoryInfo(key);
51 string path2 = Path.Combine(App.Client.GetAppInstallDirectory(SteamSettings.behaviour.settings.applicationId),
"../../workshop/content/2135150");
52 dirWorkshop =
new DirectoryInfo(path2);
53 elinIni.Global[
"path_workshop"] = dirWorkshop.FullName;
57 if (!dirWorkshop.Exists)
61 Debug.Log(
"Workshop:" + dirWorkshop);
66 if (ModManagerCore.useLocalizations)
68 ImportSourceLocalizations(lang as string);
69 ModManagerCore.generateLocalizations = false;
80 List<string> contents = (from p in packages
81 where !p.builtin && p.dirInfo.Exists
82 select
$"{p.dirInfo.FullName},{(p.willActivate ? 1 : 0)}").ToList();
89 string path = CorePath.rootExe +
"loadorder.txt";
90 if (!File.Exists(path))
94 Dictionary<string, BaseModPackage> dictionary =
new Dictionary<string, BaseModPackage>();
99 dictionary[package.
dirInfo.FullName] = package;
103 string[] array = File.ReadAllLines(path);
104 for (
int i = 0; i < array.Length; i++)
106 string[] array2 = array[i].Split(
',');
107 if (dictionary.TryGetValue(array2[0], out var value))
109 value.loadPriority = num;
110 value.willActivate = array2[1] ==
"1";
118 PackageIterator.RebuildAllMappings(lang);
119 SortedDictionary<string, string> sortedDictionary =
new SortedDictionary<string, string>();
120 Dictionary<string, SortedDictionary<string, string>> dictionary =
new Dictionary<string, SortedDictionary<string, string>>();
123 foreach (
string item in FileMapping.FallbackLut[lang].Append(lang).Distinct())
125 (FileInfo, EMod)[] filesEx = PackageIterator.GetFilesEx(
item +
"/SourceLocalization.json", useCache:
false);
126 for (
int i = 0; i < filesEx.Length; i++)
128 var (fileInfo, eMod) = filesEx[i];
131 SortedDictionary<string, string> sortedDictionary2 = IO.LoadFile<SortedDictionary<string, string>>(fileInfo.FullName);
132 foreach (KeyValuePair<string, string> item2
in sortedDictionary2)
134 item2.Deconstruct(out value, out key);
137 sortedDictionary[key2] = value2;
139 dictionary[eMod.id] = sortedDictionary2;
141 catch (Exception arg)
143 Debug.LogError(
$"#source localization failed to load {fileInfo.ShortPath()}\n{arg}");
147 JsonSerializerSettings setting =
new JsonSerializerSettings
149 PreserveReferencesHandling = PreserveReferencesHandling.None,
150 NullValueHandling = NullValueHandling.Ignore
159 if (sourceRows ==
null || sourceRows.Count <= 0)
163 modPackage.ImportSourceLocalizations(sortedDictionary);
164 if (!ModManagerCore.generateLocalizations || (!modPackage.isInPackages && !Application.isEditor))
170 SortedDictionary<string, string> sortedDictionary3 = dictionary.GetValueOrDefault(modPackage.id) ??
new SortedDictionary<string, string>();
171 SortedDictionary<string, string> sortedDictionary4 = modPackage.ExportSourceLocalizations();
172 SortedDictionary<string, string>
final =
new SortedDictionary<string, string>();
173 foreach (KeyValuePair<string, string> item3
in sortedDictionary4)
175 item3.Deconstruct(out key, out value);
177 string defaultValue = value;
178 final[key3] = sortedDictionary3.GetValueOrDefault(key3, defaultValue);
180 if (sortedDictionary3.Count !=
final.Count || sortedDictionary3.Any((KeyValuePair<string, string> kv) => !
final.ContainsKey(kv.Key)))
182 string path = Path.Combine(modPackage.dirInfo.FullName,
"LangMod/" + lang +
"/SourceLocalization.json");
183 IO.SaveFile(path,
final, compress:
false, setting);
184 Debug.Log(
$"#source localization updated {path.ShortPath()} / {modPackage}");
187 catch (Exception arg2)
189 Debug.LogError(
$"#source localization failed to generate {modPackage}\n{arg2}");
198 SourceCache.InvalidateCacheVersion();
202 EClass.sources.materials
204 List<string> list =
new List<string>();
207 if (
item.builtin || !
item.activated)
211 foreach (FileInfo sourceSheet
in item.Mapping.SourceSheets)
213 if (!sourceSheet.Name.StartsWith(
".") && !sourceSheet.Name.Contains(
"~"))
216 list.Add(sourceSheet.FullName);
221 SourceCache.FinalizeCache();
222 SourceCache.InvalidateCacheBlobs();
223 SourceCache.ClearDetail();
225 catch (Exception message)
227 Debug.LogError(message);
229 Debug.Log(
"#source finished importing workbooks");
234 Lang.extraExcelDialogs =
new HashSet<string>(PathComparer.Default);
235 Lang.excelDialog =
null;
236 FileInfo[] files = PackageIterator.GetFiles(
"Dialog/dialog.xlsx");
237 foreach (FileInfo fileInfo
in files)
240 Debug.Log(
"#dialog loaded " + fileInfo.ShortPath());
251 foreach (
ExcelData item in from f
in PackageIterator.GetFiles(
"Data/god_talk.xlsx")
254 foreach (KeyValuePair<
string, Dictionary<string, string>> item2
in map)
256 item2.Deconstruct(out var key, out var _);
262 Dictionary<string, string> valueOrDefault =
item.sheets[
"_default"].map.GetValueOrDefault(text);
263 if (valueOrDefault ==
null)
267 foreach (KeyValuePair<string, string> item3
in valueOrDefault)
269 item3.Deconstruct(out key, out var value2);
271 string value3 = value2;
274 map[text][text2] = value3;
278 Debug.Log(
"#dialog loaded " +
item.path.ShortPath());
284 bool flag = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() != 0;
286 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
298 else if (dirWorkshop !=
null)
300 DirectoryInfo[] directories = dirWorkshop.GetDirectories();
301 foreach (DirectoryInfo dir
in directories)
312 if (mappedPackages.TryGetValue(
item.id, out var value) && value.isInPackages)
314 value.hasPublishedPackage =
true;
319 yield
return awaiter;
325 mappedPackages[package.
id] =
package as ModPackage;
328 BaseModManager.isInitialized =
true;
329 yield
return awaiter;
330 onComplete?.Invoke();
333 UnityEngine.Object.Destroy(
_loading.gameObject);
344 isInPackages = isInPackages,
345 loadPriority = priorityIndex,
346 Mapping =
new FileMapping(dir)
348 packages.Add(modPackage);
358 bool itemInstallInfo = UserGeneratedContent.Client.GetItemInstallInfo(
item.FileId, out sizeOnDisk, out folderPath, out timeStamp);
359 DirectoryInfo directoryInfo =
new DirectoryInfo(folderPath);
360 if (!directoryInfo.Exists)
365 modPackage.installed = itemInstallInfo;
366 modPackage.banned =
item.IsBanned;
379 Array.Reverse(directories);
380 DirectoryInfo[] array = directories;
381 foreach (DirectoryInfo directoryInfo
in array)
383 if (!
disableMod || !(directoryInfo.Name !=
"_Elona") || !(directoryInfo.Name !=
"_Lang_Chinese"))
385 AddPackage(directoryInfo, isInPackages:
true);
393 DirectoryInfo[] directories =
new DirectoryInfo(
CorePath.
custom).GetDirectories();
395 DirectoryInfo[] array = directories;
396 foreach (DirectoryInfo dir
in array)
398 ParseExtra(dir, package);
404 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
405 UgcQuery activeQuery = UgcQuery.GetSubscribed(withLongDescription:
false, withMetadata:
false, withKeyValueTags:
false, withAdditionalPreviews:
false, 0u);
406 activeQuery.Execute(HandleWorkshopQuery);
407 _loading.
Log(
"Fetching subscriptions...(Hit ESC to cancel)");
408 while (activeQuery.handle != UGCQueryHandle_t.Invalid && !UnityEngine.Input.GetKey(KeyCode.Escape))
410 yield
return awaiter;
413 void HandleWorkshopQuery(UgcQuery query)
415 foreach (WorkshopItem results
in query.ResultsList)
425 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
431 if (!(
item.item is WorkshopItem { IsBanned: false } workshopItem))
436 string text =
"Downloading " + workshopItem.Title +
": ";
442 if (
item.downloadStarted && workshopItem.DownloadCompletion >= 1f)
444 item.installed =
true;
445 if ((
bool)
item.progressText)
447 item.progressText.text = text +
"Done!";
450 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
452 int num = Mathf.FloorToInt(workshopItem.DownloadCompletion * 100f);
453 if ((
bool)
item.progressText)
455 item.progressText.text = text + num +
"%";
458 else if (!
item.downloadStarted)
460 item.downloadStarted =
true;
461 workshopItem.DownloadItem(highPriority:
true);
462 Debug.Log(
"Start downloading: " + workshopItem.Title +
" | " +
$"Installed={workshopItem.IsInstalled}, " +
$"Downloading={workshopItem.IsDownloading}, " +
$"Pending={workshopItem.IsDownloadPending}");
469 if (UnityEngine.Input.GetKey(KeyCode.Escape))
473 yield
return awaiter;
475 Debug.Log(
"Workshop updating cancelled");
486 mappedPackages[package.
id] =
package as ModPackage;
492 package.willActivate =
false;
493 _loading?.
Log(
"Mod " + package.
title +
"/" + package.
id +
" has failed to initialize, reason: " + ex.Message);
504 if ((
disableMod && !package.builtin) || !package.IsValidVersion())
511 if (package.activated)
518 _loading.
Log(
"Failed to activate mod: " + package.title +
", reason: " + ex.Message);
545 case "Texture Replace":
static bool isInitialized
static string rootDefaultPacakge
static BaseModManager Instance
static List< string > listChainLoad
static void SubscribeEvent(string eventId, Action< object > handler)
static void SaveElinIni(IniData ini)
static IniData GetElinIni()
static SourceManager sources
Dictionary< string, Sheet > sheets
static LangSetting setting
static HashSet< string > extraExcelDialogs
void ImportAllModSourceSheets()
static new ModManager Instance
override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
void ImportAllModDialogs()
static bool IsInitialized
void ImportSourceLocalizations(string lang)
static List< string > ListChainLoad
List< FileInfo > replaceFiles
void ImportAllModGodTalks()
ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages=false)
IEnumerator UpdateWorkshopPackages()
override void Init(string path, string defaultPackage="_Elona")
IEnumerator RefreshMods(Action onComplete, bool syncMods)
IEnumerator LoadWorkshopPackages()
ModPackage AddPackage(DirectoryInfo dir, bool isInPackages=false)
static List< object > ListPluginObject
static DirectoryInfo DirWorkshop
IReadOnlyList< FileInfo > ParseTalkText(DirectoryInfo dir)
void ParseLangMod(DirectoryInfo dir)
IReadOnlyList< FileInfo > ParseTexture(DirectoryInfo dir)
void AddOrUpdateLang(DirectoryInfo dir)
IReadOnlyList< FileInfo > ParseMapPiece(DirectoryInfo dir, bool addToList=true)
IReadOnlyList< FileInfo > ParseTextureReplace(DirectoryInfo dir)
IReadOnlyList< FileInfo > ParsePortrait(DirectoryInfo dir)
IReadOnlyList< FileInfo > ParseMap(DirectoryInfo dir, bool addToList=true)
IReadOnlyList< FileInfo > ParseSound(DirectoryInfo dir)
static SourceImporter sourceImporter
static void OnModsActivated()
static void LoadTypeFallback()
IEnumerable< SourceData > ImportFilesCached(IEnumerable< string > imports, bool resetData=true)
static void HotInit(IEnumerable< SourceData > sourceData)
Dictionary< string, EMod > fileProviders