Terraria ModLoader  0.11.7.5
A mod to make and play Terraria mods
Terraria.ModLoader.ModLoader Class Reference

This serves as the central class which loads mods. It contains many static fields and methods related to mods and their contents. More...

+ Collaboration diagram for Terraria.ModLoader.ModLoader:

Static Public Member Functions

static bool FileExists (string name)
 
static byte[] GetFileBytes (string name)
 
static string[] GetLoadedMods ()
 
static Mod GetMod (string name)
 Gets the instance of the Mod with the specified name. More...
 
static Mod GetMod (int index)
 
static Music GetMusic (string name)
 
static SoundEffect GetSound (string name)
 
static Texture2D GetTexture (string name)
 
static bool IsSignedBy (TmodFile mod, string xmlPublicKey)
 
static bool MusicExists (string name)
 
static bool SoundExists (string name)
 
static bool TextureExists (string name)
 

Static Public Attributes

static readonly int beta = 0
 
static readonly string branchName = ""
 
static readonly string compressedPlatformRepresentation = Platform.IsWindows ? "w" : (Platform.IsLinux ? "l" : "m")
 
static string CompressedPlatformRepresentation => (Platform.IsWindows ? "w" : (Platform.IsLinux ? "l" : "m")) + (InstallVerifier.IsGoG ? "g" : "s") + (FrameworkVersion.Framework == Framework.NetFramework ? "n" : (FrameworkVersion.Framework == Framework.Mono ? "o" : "u"))
 
static Version LastLaunchedTModLoaderVersion
 
static readonly bool linux = Platform.IsLinux
 
static Mod[] LoadedMods => Mods
 
static readonly bool mac = Platform.IsOSX
 
static int ModCount => Mods.Length
 
static string ModPath => ModOrganizer.modPath
 
static bool ShowFirstLaunchWelcomeMessage
 
static readonly Version version = new Version(0, 11, 7, 5)
 
static readonly string versionedName
 
static readonly string versionTag
 
static readonly bool windows = Platform.IsWindows
 

Properties

static Mod[] Mods [get, private set]
 

Static Private Member Functions

static void DisplayLoadError (string msg, Exception e, bool fatal, bool continueIsRetry=false)
 
static void do_Unload ()
 
static void DotNet45Check ()
 
static void Load (CancellationToken token=default)
 
static bool Unload ()
 
static void WarnModsStillLoaded ()
 

Static Private Attributes

static HashSet< string > _enabledMods
 A cached list of enabled mods (not necessarily currently loaded or even installed), mirroring the enabled.json file. More...
 
static bool _needsSavingEnabledMods
 
static bool _pauseSavingEnabledMods
 
static bool isLoading = false
 
static readonly IDictionary< string, ModmodsByName = new Dictionary<string, Mod>(StringComparer.OrdinalIgnoreCase)
 
static string steamID64 = ""
 
static WeakReference[] weakModReferences = new WeakReference[0]
 

Detailed Description

This serves as the central class which loads mods. It contains many static fields and methods related to mods and their contents.

Definition at line 28 of file ModLoader.cs.

Member Function Documentation

static void Terraria.ModLoader.ModLoader.DisplayLoadError ( string  msg,
Exception  e,
bool  fatal,
bool  continueIsRetry = false 
)
staticprivate

Definition at line 271 of file ModLoader.cs.

References Terraria.ModLoader.Console, and Terraria.ModLoader.Environment.

272  {
273  msg += "\n\n" + (e.Data.Contains("hideStackTrace") ? e.Message : e.ToString());
274 
275  if (Main.dedServ) {
276  Console.ForegroundColor = ConsoleColor.Red;
277  Console.WriteLine(msg);
278  Console.ResetColor();
279 
280  if (fatal) {
281  Console.WriteLine("Press any key to exit...");
282  Console.ReadKey();
283  Environment.Exit(-1);
284  }
285  else {
286  Reload();
287  }
288  }
289  else {
290  Interface.errorMessage.Show(msg,
291  gotoMenu: fatal ? -1 : Interface.reloadModsID,
292  webHelpURL: e.HelpLink,
293  continueIsRetry: continueIsRetry,
294  showSkip: !fatal);
295  }
296  }
Command can be used in server console during MP.
Sandstorm, Hell, Above surface during Eclipse, Space
static void Terraria.ModLoader.ModLoader.do_Unload ( )
staticprivate

Definition at line 243 of file ModLoader.cs.

References Terraria.ModLoader.Console.

244  {
245  Logging.tML.Info("Unloading mods");
246  if (Main.dedServ) {
247  Console.WriteLine("Unloading mods...");
248  }
249  else {
250  Interface.loadMods.SetLoadStage("tModLoader.MSUnloading", Mods.Length);
251  }
252 
253  ModContent.UnloadModContent();
254  Mods = new Mod[0];
255  modsByName.Clear();
256  ModContent.Unload();
257 
258  MemoryTracking.Clear();
259  Thread.MemoryBarrier();
260  GC.Collect();
261  }
Command can be used in server console during MP.
static readonly IDictionary< string, Mod > modsByName
Definition: ModLoader.cs:63
static void Terraria.ModLoader.ModLoader.DotNet45Check ( )
staticprivate

Definition at line 195 of file ModLoader.cs.

References Terraria.ModLoader.Console, Terraria.ModLoader.Environment, Terraria.ModLoader.FrameworkVersion.Framework, and Terraria.ModLoader.FrameworkVersion.Version.

196  {
197  if (FrameworkVersion.Framework != Framework.NetFramework || FrameworkVersion.Version >= new Version(4, 5))
198  return;
199 
200  var msg = Language.GetTextValue("tModLoader.LoadErrorDotNet45Required");
201 #if CLIENT
202  Interface.MessageBoxShow(msg);
203  Process.Start("https://dotnet.microsoft.com/download/dotnet-framework");
204 #else
205  Console.ForegroundColor = ConsoleColor.Red;
206  Console.WriteLine(msg);
207  Console.ResetColor();
208  Console.WriteLine("Press any key to exit...");
209  Console.ReadKey();
210 #endif
211  Environment.Exit(-1);
212  }
Command can be used in server console during MP.
Sandstorm, Hell, Above surface during Eclipse, Space
static bool Terraria.ModLoader.ModLoader.FileExists ( string  name)
static
static byte [] Terraria.ModLoader.ModLoader.GetFileBytes ( string  name)
static
static string [] Terraria.ModLoader.ModLoader.GetLoadedMods ( )
static
static Mod Terraria.ModLoader.ModLoader.GetMod ( int  index)
static
static Music Terraria.ModLoader.ModLoader.GetMusic ( string  name)
static
static SoundEffect Terraria.ModLoader.ModLoader.GetSound ( string  name)
static
static Texture2D Terraria.ModLoader.ModLoader.GetTexture ( string  name)
static
static bool Terraria.ModLoader.ModLoader.IsSignedBy ( TmodFile  mod,
string  xmlPublicKey 
)
static

Definition at line 299 of file ModLoader.cs.

300  {
301  var f = new RSAPKCS1SignatureDeformatter();
302  var v = AsymmetricAlgorithm.Create("RSA");
303  f.SetHashAlgorithm("SHA1");
304  v.FromXmlString(xmlPublicKey);
305  f.SetKey(v);
306  return f.VerifySignature(mod.hash, mod.signature);
307  }
static void Terraria.ModLoader.ModLoader.Load ( CancellationToken  token = default)
staticprivate

Definition at line 120 of file ModLoader.cs.

121  {
122  try {
123  if (isLoading)
124  throw new Exception("Load called twice");
125  isLoading = true;
126 
127  if (!Unload())
128  return;
129 
130  var modInstances = ModOrganizer.LoadMods(token);
131 
132  weakModReferences = modInstances.Select(x => new WeakReference(x)).ToArray();
133  modInstances.Insert(0, new ModLoaderMod());
134  Mods = modInstances.ToArray();
135  foreach (var mod in Mods)
136  modsByName[mod.Name] = mod;
137 
138  ModContent.Load(token);
139 
140  if (OnSuccessfulLoad != null) {
141  OnSuccessfulLoad();
142  }
143  else {
144  Main.menuMode = 0;
145  }
146  }
147  catch when (token.IsCancellationRequested) {
148  // cancel needs to reload with ModLoaderMod and all others skipped
149  skipLoad = true;
150  OnSuccessfulLoad += () => Main.menuMode = Interface.modsMenuID;
151 
152  isLoading = false;
153  Load(); // don't provide a token, loading just ModLoaderMod should be quick
154  }
155  catch (Exception e) {
156  var responsibleMods = new List<string>();
157  if (e.Data.Contains("mod"))
158  responsibleMods.Add((string)e.Data["mod"]);
159  if (e.Data.Contains("mods"))
160  responsibleMods.AddRange((IEnumerable<string>)e.Data["mods"]);
161  responsibleMods.Remove("ModLoader");
162 
163  if (responsibleMods.Count == 0 && AssemblyManager.FirstModInStackTrace(new StackTrace(e), out var stackMod))
164  responsibleMods.Add(stackMod);
165 
166  var msg = Language.GetTextValue("tModLoader.LoadError", string.Join(", ", responsibleMods));
167  if (responsibleMods.Count == 1) {
168  var mod = ModOrganizer.FindMods().FirstOrDefault(m => m.Name == responsibleMods[0]); //use First rather than Single, incase of "Two mods with the same name" error message from ModOrganizer (#639)
169  if (mod != null && mod.tModLoaderVersion != version)
170  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorVersionMessage", mod.tModLoaderVersion, versionedName);
171  }
172  if (responsibleMods.Count > 0)
173  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorDisabled");
174  else
175  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorCulpritUnknown");
176 
177  if (e is ReflectionTypeLoadException reflectionTypeLoadException)
178  msg += "\n\n" + string.Join("\n", reflectionTypeLoadException.LoaderExceptions.Select(x => x.Message));
179 
180  Logging.tML.Error(msg, e);
181 
182  foreach (var mod in responsibleMods)
183  DisableMod(mod);
184 
185  isLoading = false; // disable loading flag, because server will just instantly retry reload
186  DisplayLoadError(msg, e, e.Data.Contains("fatal"), responsibleMods.Count == 0);
187  }
188  finally {
189  isLoading = false;
190  OnSuccessfulLoad = null;
191  skipLoad = false;
192  }
193  }
static readonly string versionedName
Definition: ModLoader.cs:41
static WeakReference[] weakModReferences
Definition: ModLoader.cs:64
static void Load(CancellationToken token=default)
Definition: ModLoader.cs:120
static void DisplayLoadError(string msg, Exception e, bool fatal, bool continueIsRetry=false)
Definition: ModLoader.cs:271
static readonly IDictionary< string, Mod > modsByName
Definition: ModLoader.cs:63
static readonly Version version
Definition: ModLoader.cs:30
static bool Terraria.ModLoader.ModLoader.MusicExists ( string  name)
static
static bool Terraria.ModLoader.ModLoader.SoundExists ( string  name)
static
static bool Terraria.ModLoader.ModLoader.TextureExists ( string  name)
static
static bool Terraria.ModLoader.ModLoader.Unload ( )
staticprivate

Definition at line 222 of file ModLoader.cs.

223  {
224  try {
225  // have to move unload logic to a separate method so the stack frame is cleared. Otherwise unloading can capture mod instances in local variables, even with memory barriers (thanks compiler weirdness)
226  do_Unload();
228  return true;
229  }
230  catch (Exception e) {
231  var msg = Language.GetTextValue("tModLoader.UnloadError");
232 
233  if (e.Data.Contains("mod"))
234  msg += "\n" + Language.GetTextValue("tModLoader.DefensiveUnload", e.Data["mod"]);
235 
236  Logging.tML.Fatal(msg, e);
237  DisplayLoadError(msg, e, true);
238 
239  return false;
240  }
241  }
static void DisplayLoadError(string msg, Exception e, bool fatal, bool continueIsRetry=false)
Definition: ModLoader.cs:271
static void WarnModsStillLoaded()
Definition: ModLoader.cs:264
static void Terraria.ModLoader.ModLoader.WarnModsStillLoaded ( )
staticprivate

Definition at line 264 of file ModLoader.cs.

265  {
266  badUnloaders = weakModReferences.Where(r => r.IsAlive).Select(r => ((Mod)r.Target).Name).ToList();
267  foreach (var modName in badUnloaders)
268  Logging.tML.WarnFormat("{0} not fully unloaded during unload.", modName);
269  }
static WeakReference[] weakModReferences
Definition: ModLoader.cs:64

Member Data Documentation

HashSet<string> Terraria.ModLoader.ModLoader._enabledMods
staticprivate

A cached list of enabled mods (not necessarily currently loaded or even installed), mirroring the enabled.json file.

Definition at line 323 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader._needsSavingEnabledMods
staticprivate

Definition at line 310 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader._pauseSavingEnabledMods
staticprivate

Definition at line 309 of file ModLoader.cs.

readonly int Terraria.ModLoader.ModLoader.beta = 0
static

Definition at line 38 of file ModLoader.cs.

readonly string Terraria.ModLoader.ModLoader.branchName = ""
static

Definition at line 36 of file ModLoader.cs.

readonly string Terraria.ModLoader.ModLoader.compressedPlatformRepresentation = Platform.IsWindows ? "w" : (Platform.IsLinux ? "l" : "m")
static

Definition at line 57 of file ModLoader.cs.

string Terraria.ModLoader.ModLoader.CompressedPlatformRepresentation => (Platform.IsWindows ? "w" : (Platform.IsLinux ? "l" : "m")) + (InstallVerifier.IsGoG ? "g" : "s") + (FrameworkVersion.Framework == Framework.NetFramework ? "n" : (FrameworkVersion.Framework == Framework.Mono ? "o" : "u"))
static

Definition at line 59 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader.isLoading = false
staticprivate

Definition at line 119 of file ModLoader.cs.

Version Terraria.ModLoader.ModLoader.LastLaunchedTModLoaderVersion
static

Definition at line 32 of file ModLoader.cs.

readonly bool Terraria.ModLoader.ModLoader.linux = Platform.IsLinux
static

Definition at line 52 of file ModLoader.cs.

Mod [] Terraria.ModLoader.ModLoader.LoadedMods => Mods
static

Definition at line 99 of file ModLoader.cs.

readonly bool Terraria.ModLoader.ModLoader.mac = Platform.IsOSX
static

Definition at line 54 of file ModLoader.cs.

int Terraria.ModLoader.ModLoader.ModCount => Mods.Length
static

Definition at line 102 of file ModLoader.cs.

string Terraria.ModLoader.ModLoader.ModPath => ModOrganizer.modPath
static

Definition at line 61 of file ModLoader.cs.

readonly IDictionary<string, Mod> Terraria.ModLoader.ModLoader.modsByName = new Dictionary<string, Mod>(StringComparer.OrdinalIgnoreCase)
staticprivate

Definition at line 63 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader.ShowFirstLaunchWelcomeMessage
static

Definition at line 34 of file ModLoader.cs.

string Terraria.ModLoader.ModLoader.steamID64 = ""
staticprivate

Definition at line 69 of file ModLoader.cs.

readonly Version Terraria.ModLoader.ModLoader.version = new Version(0, 11, 7, 5)
static

Definition at line 30 of file ModLoader.cs.

readonly string Terraria.ModLoader.ModLoader.versionedName
static
Initial value:
= $"tModLoader v{version}" +
(branchName.Length == 0 ? "" : $" {branchName}") +
(beta == 0 ? "" : $" Beta {beta}")

Definition at line 41 of file ModLoader.cs.

readonly string Terraria.ModLoader.ModLoader.versionTag
static
Initial value:
= $"v{version}" +
(branchName.Length == 0 ? "" : $"-{branchName.ToLower()}") +
(beta == 0 ? "" : $"-beta{beta}")

Definition at line 45 of file ModLoader.cs.

WeakReference [] Terraria.ModLoader.ModLoader.weakModReferences = new WeakReference[0]
staticprivate

Definition at line 64 of file ModLoader.cs.

readonly bool Terraria.ModLoader.ModLoader.windows = Platform.IsWindows
static

Definition at line 50 of file ModLoader.cs.

Property Documentation