Elin Decompiled Documentation EA 23.331 Nightly
Loading...
Searching...
No Matches
ModManager Class Reference
Inheritance diagram for ModManager:

Public Member Functions

override void Init (string path, string defaultPackage="_Elona")
 
void SaveLoadOrder ()
 
void LoadLoadOrder ()
 
IEnumerator RefreshMods (Action onComplete, bool syncMods)
 
ModPackage AddPackage (DirectoryInfo dir, bool isInPackages=false)
 
ModPackage AddWorkshopPackage (WorkshopItem item, bool isInPackages=false)
 
int CountUserMod ()
 
void LoadLocalPackages ()
 
void LoadCustomPackage ()
 
IEnumerator LoadWorkshopPackages ()
 
void InitPackagesMeta ()
 
void ActivatePackages ()
 
override void ParseExtra (DirectoryInfo dir, BaseModPackage package)
 

Public Attributes

List< FileInfo > replaceFiles = new List<FileInfo>()
 

Static Public Attributes

static List< object > ListPluginObject = new List<object>()
 
static bool disableMod
 

Properties

static List< string > ListChainLoad [get]
 
static DirectoryInfo DirWorkshop [get]
 
static new ModManager Instance [get]
 
static bool IsInitialized [get]
 

Private Member Functions

IEnumerator UpdateWorkshopPackages ()
 

Private Attributes

LoadingScreen _loading
 

Detailed Description

Definition at line 13 of file ModManager.cs.

Member Function Documentation

◆ ActivatePackages()

void ModManager.ActivatePackages ( )
inline

Definition at line 326 of file ModManager.cs.

327 {
329 ListPluginObject.Clear();
330 foreach (ModPackage package in packages)
331 {
332 if ((disableMod && !package.builtin) || !package.IsValidVersion())
333 {
334 continue;
335 }
336 try
337 {
338 package.Activate();
339 if (package.activated)
340 {
341 BaseModManager.listChainLoad.Add(package.dirInfo.FullName);
342 }
343 }
344 catch (Exception ex)
345 {
346 _loading.Log("Failed to activate mod: " + package.title + ", reason: " + ex.Message);
347 }
348 }
349 ModUtil.OnModsActivated();
350 ModUtil.LoadTypeFallback();
351 }
static List< string > listChainLoad
Text Log(string s)
LoadingScreen _loading
Definition: ModManager.cs:19
static bool disableMod
Definition: ModManager.cs:17
static List< object > ListPluginObject
Definition: ModManager.cs:15

References _loading, disableMod, BaseModManager.listChainLoad, ListPluginObject, and LoadingScreen.Log().

Referenced by RefreshMods().

◆ AddPackage()

ModPackage ModManager.AddPackage ( DirectoryInfo  dir,
bool  isInPackages = false 
)
inline

Definition at line 159 of file ModManager.cs.

160 {
161 ModPackage modPackage = new ModPackage
162 {
163 dirInfo = new DirectoryInfo(dir.FullName.NormalizePath()),
164 installed = true,
165 isInPackages = isInPackages,
166 loadPriority = priorityIndex,
167 Mapping = new FileMapping(dir)
168 };
169 packages.Add(modPackage);
170 priorityIndex++;
171 return modPackage;
172 }

References installed.

Referenced by AddWorkshopPackage(), LoadLocalPackages(), LayerMod.OnInit(), and RefreshMods().

◆ AddWorkshopPackage()

ModPackage ModManager.AddWorkshopPackage ( WorkshopItem  item,
bool  isInPackages = false 
)
inline

Definition at line 174 of file ModManager.cs.

175 {
176 bool itemInstallInfo = UserGeneratedContent.Client.GetItemInstallInfo(item.FileId, out var _, out var folderPath, out var _);
177 if (folderPath == null)
178 {
179 folderPath = Path.Combine(DirWorkshop.FullName, item.FileId.ToString());
180 }
181 DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);
182 itemInstallInfo &= directoryInfo.Exists;
183 ModPackage modPackage = AddPackage(directoryInfo, isInPackages);
184 modPackage.installed = itemInstallInfo;
185 modPackage.banned = item.IsBanned;
186 modPackage.workshopId = item.FileId.ToString();
187 modPackage.item = item;
188 return modPackage;
189 }
ModPackage AddPackage(DirectoryInfo dir, bool isInPackages=false)
Definition: ModManager.cs:159
static DirectoryInfo DirWorkshop
Definition: ModManager.cs:25

References AddPackage(), DirWorkshop, and item.

Referenced by LoadWorkshopPackages().

◆ CountUserMod()

int ModManager.CountUserMod ( )
inline

Definition at line 191 of file ModManager.cs.

192 {
193 return packages.Count((BaseModPackage p) => !p.builtin);
194 }

References BaseModPackage.builtin.

Referenced by LayerTitle.OnClickContinue(), and LayerTitle.OnClickStart().

◆ Init()

override void ModManager.Init ( string  path,
string  defaultPackage = "_Elona" 
)
inline

Definition at line 31 of file ModManager.cs.

32 {
33 base.Init(path, defaultPackage);
34 Debug.Log("IsOffline:" + BaseCore.IsOffline);
35 IniData elinIni = Core.GetElinIni();
36 if (elinIni != null)
37 {
39 {
40 string key = elinIni.GetKey("path_workshop");
41 if (!key.IsEmpty())
42 {
43 dirWorkshop = new DirectoryInfo(key);
44 }
45 }
46 else
47 {
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;
51 Core.SaveElinIni(elinIni);
52 }
53 }
54 if ((!(dirWorkshop?.Exists)) ?? true)
55 {
56 dirWorkshop = null;
57 }
58 Debug.Log("Workshop:" + dirWorkshop);
59 Debug.Log("Packages:" + BaseModManager.rootMod);
60 Debug.Log("Core Mod:" + BaseModManager.rootDefaultPacakge);
61 }
static bool IsOffline
Definition: BaseCore.cs:9
static string rootDefaultPacakge
static string rootMod
Definition: Core.cs:14
static void SaveElinIni(IniData ini)
Definition: Core.cs:814
static IniData GetElinIni()
Definition: Core.cs:780

References Debug, Core.GetElinIni(), BaseCore.IsOffline, BaseModManager.rootDefaultPacakge, BaseModManager.rootMod, and Core.SaveElinIni().

Referenced by CoreDebug.RegenerateNames(), and Core.StartCase().

◆ InitPackagesMeta()

void ModManager.InitPackagesMeta ( )
inline

Definition at line 306 of file ModManager.cs.

307 {
308 foreach (BaseModPackage package in packages)
309 {
310 try
311 {
312 if (package.Init())
313 {
314 mappedPackages[package.id] = package as ModPackage;
315 }
316 _loading?.Log(package.ToString());
317 }
318 catch (Exception ex)
319 {
320 package.willActivate = false;
321 _loading?.Log("Mod " + package.title + "/" + package.id + " has failed to initialize, reason: " + ex.Message);
322 }
323 }
324 }

References _loading, BaseModPackage.id, BaseModPackage.Init(), LoadingScreen.Log(), and BaseModPackage.title.

Referenced by RefreshMods().

◆ LoadCustomPackage()

void ModManager.LoadCustomPackage ( )
inline

Definition at line 218 of file ModManager.cs.

219 {
220 _loading.Log("Loading user Custom...");
221 DirectoryInfo[] directories = new DirectoryInfo(CorePath.custom).GetDirectories();
222 ModPackage package = new ModPackage();
223 DirectoryInfo[] array = directories;
224 foreach (DirectoryInfo dir in array)
225 {
226 ParseExtra(dir, package);
227 }
228 }
static string custom
Definition: CorePath.cs:159

References _loading, CorePath.custom, and LoadingScreen.Log().

Referenced by RefreshMods().

◆ LoadLoadOrder()

void ModManager.LoadLoadOrder ( )
inline

Definition at line 74 of file ModManager.cs.

75 {
76 string path = CorePath.rootExe + "loadorder.txt";
77 if (!File.Exists(path))
78 {
79 return;
80 }
81 Dictionary<string, BaseModPackage> dictionary = new Dictionary<string, BaseModPackage>();
82 foreach (BaseModPackage package in packages)
83 {
84 if (!package.builtin)
85 {
86 dictionary[package.dirInfo.FullName] = package;
87 }
88 }
89 int num = 0;
90 string[] array = File.ReadAllLines(path);
91 for (int i = 0; i < array.Length; i++)
92 {
93 string[] array2 = array[i].Split(',');
94 if (dictionary.TryGetValue(array2[0], out var value))
95 {
96 value.loadPriority = num;
97 value.willActivate = array2[1] == "1";
98 }
99 num++;
100 }
101 }
DirectoryInfo dirInfo

References BaseModPackage.builtin, and BaseModPackage.dirInfo.

Referenced by RefreshMods().

◆ LoadLocalPackages()

void ModManager.LoadLocalPackages ( )
inline

Definition at line 196 of file ModManager.cs.

197 {
198 _loading.Log("Loading local Package...");
199 DirectoryInfo[] directories = new DirectoryInfo(BaseModManager.rootMod).GetDirectories();
200 Array.Reverse(directories);
201 DirectoryInfo[] array = directories;
202 foreach (DirectoryInfo directoryInfo in array)
203 {
204 if (!disableMod || !(directoryInfo.Name != "_Elona") || !(directoryInfo.Name != "_Lang_Chinese"))
205 {
206 if (directoryInfo.Name == "Mod_FixedPackageLoader")
207 {
208 IO.DeleteDirectory(directoryInfo.FullName);
209 }
210 else
211 {
212 AddPackage(directoryInfo, isInPackages: true);
213 }
214 }
215 }
216 }
Definition: IO.cs:10
static void DeleteDirectory(string path)
Definition: IO.cs:392

References _loading, AddPackage(), disableMod, LoadingScreen.Log(), and BaseModManager.rootMod.

Referenced by RefreshMods().

◆ LoadWorkshopPackages()

IEnumerator ModManager.LoadWorkshopPackages ( )
inline

Definition at line 230 of file ModManager.cs.

231 {
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))
237 {
238 yield return awaiter;
239 }
240 yield return UpdateWorkshopPackages();
241 void HandleWorkshopQuery(UgcQuery query)
242 {
243 foreach (WorkshopItem results in query.ResultsList)
244 {
245 AddWorkshopPackage(results);
246 }
247 }
248 }
ModPackage AddWorkshopPackage(WorkshopItem item, bool isInPackages=false)
Definition: ModManager.cs:174
IEnumerator UpdateWorkshopPackages()
Definition: ModManager.cs:250

References _loading, AddWorkshopPackage(), LoadingScreen.Log(), and UpdateWorkshopPackages().

Referenced by RefreshMods().

◆ ParseExtra()

override void ModManager.ParseExtra ( DirectoryInfo  dir,
BaseModPackage  package 
)
inline

Definition at line 353 of file ModManager.cs.

354 {
355 ModPackage modPackage = (ModPackage)package;
356 switch (dir.Name.ToLower())
357 {
358 case "talktext":
359 modPackage.ParseTalkText(dir);
360 break;
361 case "map":
362 if (!package.builtin)
363 {
364 modPackage.ParseMap(dir);
365 }
366 break;
367 case "map piece":
368 if (!package.builtin)
369 {
370 modPackage.ParseMapPiece(dir);
371 }
372 break;
373 case "texture replace":
374 replaceFiles.AddRange(modPackage.ParseTextureReplace(dir));
375 break;
376 case "texture":
377 modPackage.ParseTexture(dir);
378 break;
379 case "portrait":
380 modPackage.ParsePortrait(dir);
381 break;
382 case "langmod":
383 modPackage.ParseLangMod(dir);
384 break;
385 case "sound":
386 modPackage.ParseSound(dir);
387 break;
388 case "lang":
389 modPackage.AddOrUpdateLang(dir);
390 break;
391 }
392 }
List< FileInfo > replaceFiles
Definition: ModManager.cs:21
IReadOnlyList< FileInfo > ParseTalkText(DirectoryInfo dir)
Definition: ModPackage.cs:26
void ParseLangMod(DirectoryInfo dir)
Definition: ModPackage.cs:161
IReadOnlyList< FileInfo > ParseTexture(DirectoryInfo dir)
Definition: ModPackage.cs:103
void AddOrUpdateLang(DirectoryInfo dir)
Definition: ModPackage.cs:335
IReadOnlyList< FileInfo > ParseMapPiece(DirectoryInfo dir, bool addToList=true)
Definition: ModPackage.cs:65
IReadOnlyList< FileInfo > ParseTextureReplace(DirectoryInfo dir)
Definition: ModPackage.cs:86
IReadOnlyList< FileInfo > ParsePortrait(DirectoryInfo dir)
Definition: ModPackage.cs:123
IReadOnlyList< FileInfo > ParseMap(DirectoryInfo dir, bool addToList=true)
Definition: ModPackage.cs:44
IReadOnlyList< FileInfo > ParseSound(DirectoryInfo dir)
Definition: ModPackage.cs:176

References ModPackage.AddOrUpdateLang(), BaseModPackage.builtin, ModPackage.ParseLangMod(), ModPackage.ParseMap(), ModPackage.ParseMapPiece(), ModPackage.ParsePortrait(), ModPackage.ParseSound(), ModPackage.ParseTalkText(), ModPackage.ParseTexture(), ModPackage.ParseTextureReplace(), and replaceFiles.

◆ RefreshMods()

IEnumerator ModManager.RefreshMods ( Action  onComplete,
bool  syncMods 
)
inline

Definition at line 103 of file ModManager.cs.

104 {
105 bool flag = !BaseCore.IsOffline && syncMods && UserGeneratedContent.Client.GetNumSubscribedItems() != 0;
106 _loading = Util.Instantiate<LoadingScreen>("LoadingScreen");
107 WaitForEndOfFrame awaiter = new WaitForEndOfFrame();
108 packages.Clear();
109 disableMod |= Application.isEditor && EClass.debug.skipMod;
112 if (!disableMod && dirWorkshop != null)
113 {
114 _loading.Log("Loading workshop contents...");
115 if (flag)
116 {
117 yield return LoadWorkshopPackages();
118 }
119 else
120 {
121 DirectoryInfo[] directories = dirWorkshop.GetDirectories();
122 foreach (DirectoryInfo dir in directories)
123 {
124 AddPackage(dir);
125 }
126 }
127 }
130 packages.Sort((BaseModPackage a, BaseModPackage b) => a.loadPriority - b.loadPriority);
131 foreach (BaseModPackage item in packages.Where((BaseModPackage p) => !p.isInPackages && p.willActivate && !p.id.IsEmpty()))
132 {
133 if (mappedPackages.TryGetValue(item.id, out var value) && value.isInPackages)
134 {
135 value.hasPublishedPackage = true;
136 }
137 }
138 _loading.Log($"Total number of mods:{packages.Count}");
139 _loading.Log("Activating Mods...");
140 yield return awaiter;
142 foreach (BaseModPackage package in packages)
143 {
144 if (package.activated)
145 {
146 mappedPackages[package.id] = package as ModPackage;
147 }
148 }
149 BaseModManager.isInitialized = true;
150 yield return awaiter;
151 onComplete?.Invoke();
152 if ((bool)_loading)
153 {
154 UnityEngine.Object.Destroy(_loading.gameObject);
155 }
156 yield return null;
157 }
$
Definition: ModManager.cs:74
bool skipMod
Definition: CoreDebug.cs:149
Definition: EClass.cs:6
static CoreDebug debug
Definition: EClass.cs:49
void ActivatePackages()
Definition: ModManager.cs:326
void LoadLoadOrder()
Definition: ModManager.cs:74
void LoadCustomPackage()
Definition: ModManager.cs:218
IEnumerator LoadWorkshopPackages()
Definition: ModManager.cs:230
void LoadLocalPackages()
Definition: ModManager.cs:196
void InitPackagesMeta()
Definition: ModManager.cs:306
Definition: Util.cs:10
static Transform Instantiate(string path, Component parent=null)
Definition: Util.cs:67

References $, _loading, BaseModPackage.activated, ActivatePackages(), AddPackage(), EClass.debug, disableMod, BaseModPackage.id, InitPackagesMeta(), BaseModPackage.isInPackages, item, LoadCustomPackage(), LoadLoadOrder(), LoadLocalPackages(), BaseModPackage.loadPriority, LoadWorkshopPackages(), LoadingScreen.Log(), CoreDebug.skipMod, Util, and BaseModPackage.willActivate.

Referenced by Core.StartCase().

◆ SaveLoadOrder()

void ModManager.SaveLoadOrder ( )
inline

Definition at line 63 of file ModManager.cs.

64 {
65 if (!disableMod)
66 {
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();
70 File.WriteAllLines(CorePath.rootExe + "loadorder.txt", contents);
71 }
72 }
static string rootExe
Definition: CorePath.cs:168

References $, disableMod, and CorePath.rootExe.

Referenced by LayerMod.Move(), LayerMod.OnInit(), and LayerMod.OnKill().

◆ UpdateWorkshopPackages()

IEnumerator ModManager.UpdateWorkshopPackages ( )
inlineprivate

Definition at line 250 of file ModManager.cs.

251 {
252 _loading?.Log("Updating subscriptions...");
253 WaitForEndOfFrame awaiter = new WaitForEndOfFrame();
254 while (true)
255 {
256 bool flag = false;
257 foreach (BaseModPackage item in packages.Where((BaseModPackage p) => !p.installed))
258 {
259 if (!(item.item is WorkshopItem { IsBanned: false } workshopItem))
260 {
261 continue;
262 }
263 flag = true;
264 string text = "Downloading " + workshopItem.Title + ": ";
265 BaseModPackage baseModPackage = item;
266 if ((object)baseModPackage.progressText == null)
267 {
268 baseModPackage.progressText = _loading?.Log(text);
269 }
270 if (item.downloadStarted && workshopItem.DownloadCompletion >= 1f)
271 {
272 item.installed = true;
273 if ((bool)item.progressText)
274 {
275 item.progressText.text = text + "Done!";
276 }
277 }
278 else if (workshopItem.IsDownloading || workshopItem.IsDownloadPending)
279 {
280 int num = Mathf.FloorToInt(workshopItem.DownloadCompletion * 100f);
281 if ((bool)item.progressText)
282 {
283 item.progressText.text = text + num + "%";
284 }
285 }
286 else if (!item.downloadStarted)
287 {
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}");
291 }
292 }
293 if (!flag)
294 {
295 yield break;
296 }
297 if (UnityEngine.Input.GetKey(KeyCode.Escape))
298 {
299 break;
300 }
301 yield return awaiter;
302 }
303 Debug.Log("Workshop updating cancelled");
304 }

References $, _loading, Debug, BaseModPackage.installed, item, LoadingScreen.Log(), and BaseModPackage.progressText.

Referenced by LoadWorkshopPackages().

Member Data Documentation

◆ _loading

◆ disableMod

bool ModManager.disableMod
static

◆ ListPluginObject

List<object> ModManager.ListPluginObject = new List<object>()
static

Definition at line 15 of file ModManager.cs.

Referenced by ActivatePackages(), and Core.StartCase().

◆ replaceFiles

List<FileInfo> ModManager.replaceFiles = new List<FileInfo>()

Definition at line 21 of file ModManager.cs.

Referenced by TextureManager.Init(), and ParseExtra().

Property Documentation

◆ DirWorkshop

DirectoryInfo ModManager.DirWorkshop
staticget

Definition at line 25 of file ModManager.cs.

Referenced by AddWorkshopPackage().

◆ Instance

new ModManager ModManager.Instance
staticget

Definition at line 27 of file ModManager.cs.

◆ IsInitialized

bool ModManager.IsInitialized
staticget

Definition at line 29 of file ModManager.cs.

Referenced by Core.StartCase().

◆ ListChainLoad

List<string> ModManager.ListChainLoad
staticget

Definition at line 23 of file ModManager.cs.


The documentation for this class was generated from the following file: