Terraria ModLoader  0.11.6.2
A framework for 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")) + (GoGVerifier.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, 6, 2)
 
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 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 26 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 259 of file ModLoader.cs.

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

259  {
260  msg += "\n\n" + (e.Data.Contains("hideStackTrace") ? e.Message : e.ToString());
261 
262  if (Main.dedServ) {
263  Console.ForegroundColor = ConsoleColor.Red;
264  Console.WriteLine(msg);
265  Console.ResetColor();
266 
267  if (fatal) {
268  Console.WriteLine("Press any key to exit...");
269  Console.ReadKey();
270  Environment.Exit(-1);
271  }
272  else {
273  Reload();
274  }
275  }
276  else {
277  Interface.errorMessage.Show(msg,
278  gotoMenu: fatal ? -1 : Interface.reloadModsID,
279  webHelpURL: e.HelpLink,
280  showRetry: continueIsRetry,
281  showSkip: !fatal);
282  }
283  }
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 233 of file ModLoader.cs.

References Terraria.ModLoader.Console.

233  {
234  Logging.tML.Info("Unloading mods");
235  if (Main.dedServ) {
236  Console.WriteLine("Unloading mods...");
237  }
238  else {
239  Interface.loadMods.SetLoadStage("tModLoader.MSUnloading", Mods.Length);
240  }
241 
242  ModContent.UnloadModContent();
243  Mods = new Mod[0];
244  modsByName.Clear();
245  ModContent.Unload();
246 
247  MemoryTracking.Clear();
248  Thread.MemoryBarrier();
249  GC.Collect();
250  }
Command can be used in server console during MP.
static readonly IDictionary< string, Mod > modsByName
Definition: ModLoader.cs:59
static void Terraria.ModLoader.ModLoader.DotNet45Check ( )
staticprivate

Definition at line 188 of file ModLoader.cs.

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

188  {
189  if (FrameworkVersion.Framework != Framework.NetFramework || FrameworkVersion.Version >= new Version(4, 5))
190  return;
191 
192  var msg = Language.GetTextValue("tModLoader.LoadErrorDotNet45Required");
193 #if CLIENT
194  Interface.MessageBoxShow(msg);
195  Process.Start("https://dotnet.microsoft.com/download/dotnet-framework");
196 #else
197  Console.ForegroundColor = ConsoleColor.Red;
198  Console.WriteLine(msg);
199  Console.ResetColor();
200  Console.WriteLine("Press any key to exit...");
201  Console.ReadKey();
202 #endif
203  Environment.Exit(-1);
204  }
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 286 of file ModLoader.cs.

286  {
287  var f = new RSAPKCS1SignatureDeformatter();
288  var v = AsymmetricAlgorithm.Create("RSA");
289  f.SetHashAlgorithm("SHA1");
290  v.FromXmlString(xmlPublicKey);
291  f.SetKey(v);
292  return f.VerifySignature(mod.hash, mod.signature);
293  }
static void Terraria.ModLoader.ModLoader.Load ( CancellationToken  token = default)
staticprivate

Definition at line 114 of file ModLoader.cs.

114  {
115  try {
116  if (isLoading)
117  throw new Exception("Load called twice");
118  isLoading = true;
119 
120  if (!Unload())
121  return;
122 
123  var modInstances = ModOrganizer.LoadMods(token);
124 
125  weakModReferences = modInstances.Select(x => new WeakReference(x)).ToArray();
126  modInstances.Insert(0, new ModLoaderMod());
127  Mods = modInstances.ToArray();
128  foreach (var mod in Mods)
129  modsByName[mod.Name] = mod;
130 
131  ModContent.Load(token);
132 
133  if (OnSuccessfulLoad != null) {
134  OnSuccessfulLoad();
135  }
136  else {
137  Main.menuMode = 0;
138  }
139  }
140  catch when (token.IsCancellationRequested) {
141  // cancel needs to reload with ModLoaderMod and all others skipped
142  skipLoad = true;
143  OnSuccessfulLoad += () => Main.menuMode = Interface.modsMenuID;
144 
145  isLoading = false;
146  Load(); // don't provide a token, loading just ModLoaderMod should be quick
147  }
148  catch (Exception e) {
149  var responsibleMods = new List<string>();
150  if (e.Data.Contains("mod"))
151  responsibleMods.Add((string)e.Data["mod"]);
152  if (e.Data.Contains("mods"))
153  responsibleMods.AddRange((IEnumerable<string>)e.Data["mods"]);
154  responsibleMods.Remove("ModLoader");
155 
156  if (responsibleMods.Count == 0 && AssemblyManager.FirstModInStackTrace(new StackTrace(e), out var stackMod))
157  responsibleMods.Add(stackMod);
158 
159  var msg = Language.GetTextValue("tModLoader.LoadError", string.Join(", ", responsibleMods));
160  if (responsibleMods.Count == 1) {
161  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)
162  if (mod != null && mod.tModLoaderVersion != version)
163  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorVersionMessage", mod.tModLoaderVersion, versionedName);
164  }
165  if (responsibleMods.Count > 0)
166  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorDisabled");
167  else
168  msg += "\n" + Language.GetTextValue("tModLoader.LoadErrorCulpritUnknown");
169 
170  if (e is ReflectionTypeLoadException reflectionTypeLoadException)
171  msg += "\n\n" + string.Join("\n", reflectionTypeLoadException.LoaderExceptions.Select(x => x.Message));
172 
173  Logging.tML.Error(msg, e);
174 
175  foreach (var mod in responsibleMods)
176  DisableMod(mod);
177 
178  isLoading = false; // disable loading flag, because server will just instantly retry reload
179  DisplayLoadError(msg, e, e.Data.Contains("fatal"), responsibleMods.Count == 0);
180  }
181  finally {
182  isLoading = false;
183  OnSuccessfulLoad = null;
184  skipLoad = false;
185  }
186  }
static readonly string versionedName
Definition: ModLoader.cs:38
static WeakReference[] weakModReferences
Definition: ModLoader.cs:60
static void Load(CancellationToken token=default)
Definition: ModLoader.cs:114
static void DisplayLoadError(string msg, Exception e, bool fatal, bool continueIsRetry=false)
Definition: ModLoader.cs:259
static readonly IDictionary< string, Mod > modsByName
Definition: ModLoader.cs:59
static readonly Version version
Definition: ModLoader.cs:28
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 213 of file ModLoader.cs.

213  {
214  try {
215  // 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)
216  do_Unload();
218  return true;
219  }
220  catch (Exception e) {
221  var msg = Language.GetTextValue("tModLoader.UnloadError");
222 
223  if (e.Data.Contains("mod"))
224  msg += "\n" + Language.GetTextValue("tModLoader.DefensiveUnload", e.Data["mod"]);
225 
226  Logging.tML.Fatal(msg, e);
227  DisplayLoadError(msg, e, true);
228 
229  return false;
230  }
231  }
static void DisplayLoadError(string msg, Exception e, bool fatal, bool continueIsRetry=false)
Definition: ModLoader.cs:259
static void WarnModsStillLoaded()
Definition: ModLoader.cs:253
static void Terraria.ModLoader.ModLoader.WarnModsStillLoaded ( )
staticprivate

Definition at line 253 of file ModLoader.cs.

253  {
254  badUnloaders = weakModReferences.Where(r => r.IsAlive).Select(r => ((Mod)r.Target).Name).ToList();
255  foreach (var modName in badUnloaders)
256  Logging.tML.WarnFormat("{0} not fully unloaded during unload.", modName);
257  }
static WeakReference[] weakModReferences
Definition: ModLoader.cs:60

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 296 of file ModLoader.cs.

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

Definition at line 36 of file ModLoader.cs.

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

Definition at line 34 of file ModLoader.cs.

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

Definition at line 53 of file ModLoader.cs.

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

Definition at line 55 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader.isLoading = false
staticprivate

Definition at line 113 of file ModLoader.cs.

Version Terraria.ModLoader.ModLoader.LastLaunchedTModLoaderVersion
static

Definition at line 30 of file ModLoader.cs.

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

Definition at line 48 of file ModLoader.cs.

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

Definition at line 94 of file ModLoader.cs.

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

Definition at line 50 of file ModLoader.cs.

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

Definition at line 97 of file ModLoader.cs.

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

Definition at line 57 of file ModLoader.cs.

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

Definition at line 59 of file ModLoader.cs.

bool Terraria.ModLoader.ModLoader.ShowFirstLaunchWelcomeMessage
static

Definition at line 32 of file ModLoader.cs.

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

Definition at line 65 of file ModLoader.cs.

readonly Version Terraria.ModLoader.ModLoader.version = new Version(0, 11, 6, 2)
static

Definition at line 28 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 38 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 41 of file ModLoader.cs.

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

Definition at line 60 of file ModLoader.cs.

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

Definition at line 46 of file ModLoader.cs.

Property Documentation