2using System.Collections;
3using System.Collections.Generic;
6using HeathenEngineering.SteamworksIntegration;
7using HeathenEngineering.SteamworksIntegration.API;
31 public override void Init(
string path,
string defaultPackage =
"_Elona")
33 base.Init(path, defaultPackage);
40 string key = elinIni.GetKey(
"path_workshop");
43 dirWorkshop =
new DirectoryInfo(key);
48 string path2 = Path.Combine(App.Client.GetAppInstallDirectory(SteamSettings.behaviour.settings.applicationId),
"../../workshop/content/2135150");
49 dirWorkshop =
new DirectoryInfo(path2);
50 elinIni.Global[
"path_workshop"] = dirWorkshop.FullName;
54 if ((!(dirWorkshop?.Exists)) ??
true)
58 Debug.Log(
"Workshop:" + dirWorkshop);
67 List<string> contents = (from p in packages
68 where !p.builtin && p.dirInfo.Exists
69 select
$"{p.dirInfo.FullName},{(p.willActivate ? 1 : 0)}").ToList();
76 string path = CorePath.rootExe +
"loadorder.txt";
77 if (!File.Exists(path))
81 Dictionary<string, BaseModPackage> dictionary =
new Dictionary<string, BaseModPackage>();
86 dictionary[package.
dirInfo.FullName] = package;
90 string[] array = File.ReadAllLines(path);
91 for (
int i = 0; i < array.Length; i++)
93 string[] array2 = array[i].Split(
',');
94 if (dictionary.TryGetValue(array2[0], out var value))
96 value.loadPriority = num;
97 value.willActivate = array2[1] ==
"1";
105 bool flag = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() != 0;
107 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
121 DirectoryInfo[] directories = dirWorkshop.GetDirectories();
122 foreach (DirectoryInfo dir
in directories)
133 if (mappedPackages.TryGetValue(
item.id, out var value) && value.isInPackages)
135 value.hasPublishedPackage =
true;
140 yield
return awaiter;
146 mappedPackages[package.
id] =
package as ModPackage;
149 BaseModManager.isInitialized =
true;
150 yield
return awaiter;
151 onComplete?.Invoke();
154 UnityEngine.Object.Destroy(
_loading.gameObject);
163 dirInfo =
new DirectoryInfo(dir.FullName.NormalizePath()),
165 isInPackages = isInPackages,
166 loadPriority = priorityIndex,
167 Mapping =
new FileMapping(dir)
169 packages.Add(modPackage);
176 bool itemInstallInfo = UserGeneratedContent.Client.GetItemInstallInfo(
item.FileId, out var _, out var folderPath, out var _);
177 if (folderPath ==
null)
179 folderPath = Path.Combine(
DirWorkshop.FullName,
item.FileId.ToString());
181 DirectoryInfo directoryInfo =
new DirectoryInfo(folderPath);
182 itemInstallInfo &= directoryInfo.Exists;
184 modPackage.installed = itemInstallInfo;
185 modPackage.banned =
item.IsBanned;
186 modPackage.workshopId =
item.FileId.ToString();
187 modPackage.item =
item;
200 Array.Reverse(directories);
201 DirectoryInfo[] array = directories;
202 foreach (DirectoryInfo directoryInfo
in array)
204 if (!
disableMod || !(directoryInfo.Name !=
"_Elona") || !(directoryInfo.Name !=
"_Lang_Chinese"))
206 if (directoryInfo.Name ==
"Mod_FixedPackageLoader")
208 IO.DeleteDirectory(directoryInfo.FullName);
212 AddPackage(directoryInfo, isInPackages:
true);
221 DirectoryInfo[] directories =
new DirectoryInfo(
CorePath.
custom).GetDirectories();
223 DirectoryInfo[] array = directories;
224 foreach (DirectoryInfo dir
in array)
226 ParseExtra(dir, package);
232 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
233 UgcQuery activeQuery = UgcQuery.GetSubscribed(withLongDescription:
false, withMetadata:
false, withKeyValueTags:
false, withAdditionalPreviews:
false, 0u);
234 activeQuery.Execute(HandleWorkshopQuery);
235 _loading.
Log(
"Fetching subscriptions...(Hit ESC to cancel)");
236 while (activeQuery.handle != UGCQueryHandle_t.Invalid && !UnityEngine.Input.GetKey(KeyCode.Escape))
238 yield
return awaiter;
241 void HandleWorkshopQuery(UgcQuery query)
243 foreach (WorkshopItem results
in query.ResultsList)
253 WaitForEndOfFrame awaiter =
new WaitForEndOfFrame();
259 if (!(
item.item is WorkshopItem { IsBanned: false } workshopItem))
264 string text =
"Downloading " + workshopItem.Title +
": ";
270 if (
item.downloadStarted && workshopItem.DownloadCompletion >= 1f)
272 item.installed =
true;
273 if ((
bool)
item.progressText)
275 item.progressText.text = text +
"Done!";
278 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
280 int num = Mathf.FloorToInt(workshopItem.DownloadCompletion * 100f);
281 if ((
bool)
item.progressText)
283 item.progressText.text = text + num +
"%";
286 else if (!
item.downloadStarted)
288 item.downloadStarted =
true;
289 workshopItem.DownloadItem(highPriority:
true);
290 Debug.Log(
"Start downloading: " + workshopItem.Title +
" | " +
$"Installed={workshopItem.IsInstalled}, " +
$"Downloading={workshopItem.IsDownloading}, " +
$"Pending={workshopItem.IsDownloadPending}");
297 if (UnityEngine.Input.GetKey(KeyCode.Escape))
301 yield
return awaiter;
303 Debug.Log(
"Workshop updating cancelled");
314 mappedPackages[package.
id] =
package as ModPackage;
320 package.willActivate =
false;
321 _loading?.
Log(
"Mod " + package.
title +
"/" + package.
id +
" has failed to initialize, reason: " + ex.Message);
332 if ((
disableMod && !package.builtin) || !package.IsValidVersion())
339 if (package.activated)
346 _loading.
Log(
"Failed to activate mod: " + package.title +
", reason: " + ex.Message);
349 ModUtil.OnModsActivated();
350 ModUtil.LoadTypeFallback();
356 switch (dir.Name.ToLower())
373 case "texture replace":
static bool isInitialized
static string rootDefaultPacakge
static BaseModManager Instance
static List< string > listChainLoad
static void SaveElinIni(IniData ini)
static IniData GetElinIni()
static new ModManager Instance
override void ParseExtra(DirectoryInfo dir, BaseModPackage package)
static bool IsInitialized
static List< string > ListChainLoad
List< FileInfo > replaceFiles
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)