From bbef0f95f752ffcc1e7bc095e2fc217c8d607f6e Mon Sep 17 00:00:00 2001 From: SGKoishi Date: Sun, 24 Nov 2024 09:27:36 +0900 Subject: [PATCH] Respect ServerApi.plugins when detecting duplicates --- Core/TileProvider/Misc.cs | 2 +- Core/Utils.cs | 54 ++++++++++++++++----------------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/Core/TileProvider/Misc.cs b/Core/TileProvider/Misc.cs index 0448049..44ade70 100644 --- a/Core/TileProvider/Misc.cs +++ b/Core/TileProvider/Misc.cs @@ -31,7 +31,7 @@ private void MMHook_TileProvider_ClearWorld(On.Terraria.WorldGen.orig_clearWorld { try { - Terraria.Main.tile = (ModFramework.ICollection) Activator.CreateInstance(Terraria.Main.tile.GetType()); + Terraria.Main.tile = (ModFramework.ICollection) Activator.CreateInstance(Terraria.Main.tile.GetType())!; } catch { diff --git a/Core/Utils.cs b/Core/Utils.cs index 3fced48..145d131 100644 --- a/Core/Utils.cs +++ b/Core/Utils.cs @@ -499,7 +499,7 @@ public static void AddPermission(TShockAPI.Group? group, params string[] perm) { return; } - TShockAPI.TShock.Groups.AddPermissions(group!.Name, perm.ToList()); + TShockAPI.TShock.Groups.AddPermissions(group!.Name, [.. perm]); } public static void OnceFlag(string key, Action action) @@ -514,14 +514,20 @@ public static void OnceFlag(string key, Action action) public static void AssemblyMutex(TerrariaApi.Server.TerrariaPlugin plugin) { var asm = plugin.GetType().Assembly; - foreach (var ld in AppDomain.CurrentDomain.GetAssemblies()) + var lds = ((List) typeof(TerrariaApi.Server.ServerApi) + .GetField("plugins", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)! + .GetValue(null)!)!; + + var dict = ((Dictionary) typeof(TerrariaApi.Server.ServerApi) + .GetField("loadedAssemblies", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)! + .GetValue(null)!) + .ToDictionary(kvp => kvp.Value, kvp => kvp.Key)!; + + foreach (var other in lds) { - if (ld.GetName().Name == asm.GetName().Name && ld != asm) + var ld = other.Plugin.GetType().Assembly; + if (ld.GetName().Name == asm.GetName().Name && other.Plugin != plugin) { - var dict = ((Dictionary) typeof(TerrariaApi.Server.ServerApi) - .GetField("loadedAssemblies", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)! - .GetValue(null)!) - .ToDictionary(kvp => kvp.Value, kvp => kvp.Key)!; var em = $"Duplicate {plugin.Name} loaded:"; if (dict.TryGetValue(ld, out var fileNameWithoutExtension)) { @@ -553,9 +559,9 @@ public static T Read(this OTAPI.Hooks.MessageBuffer.GetDataEventArgs args, in return args.Instance.Read(args.ReadOffset + offset); } - public class ConsolePlayer : TSPlayer + public class ConsolePlayer(string name) : TSPlayer(name) { - public static ConsolePlayer Instance = new ConsolePlayer("Console"); + public static readonly ConsolePlayer Instance = new ConsolePlayer("Console"); private static readonly Dictionary _consoleColorMap = new Dictionary { [ConsoleColor.Red] = 0xFF0000, @@ -576,10 +582,6 @@ public class ConsolePlayer : TSPlayer [ConsoleColor.Black] = 0x000000, }; - public ConsolePlayer(string name) : base(name) - { - } - public override void SendMessage(string msg, byte red, byte green, byte blue) { Console.ForegroundColor = _consoleColorMap @@ -595,17 +597,11 @@ public override void SendMessage(string msg, byte red, byte green, byte blue) } } -public class Ring : IEnumerable +public class Ring(int length) : IEnumerable { - internal T[] _data; - internal int _start; - internal int _length; - public Ring(int length) - { - this._data = new T[length]; - this._start = 0; - this._length = 0; - } + internal T[] _data = new T[length]; + internal int _start = 0; + internal int _length = 0; public T this[int index] => this._data[(index + this._start) % this._data.Length]; @@ -632,21 +628,15 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() return new RingEnumerator(this); } - private class RingEnumerator : IEnumerator + private class RingEnumerator(Ring ring) : IEnumerator { - private readonly Ring _ring; - private int _index; + private readonly Ring _ring = ring; + private int _index = -1; public T Current => this._ring[this._index]; object? System.Collections.IEnumerator.Current => this._ring[this._index]; - public RingEnumerator(Ring ring) - { - this._ring = ring; - this._index = -1; - } - public void Dispose() { }