Skip to content

Commit

Permalink
Respect ServerApi.plugins when detecting duplicates
Browse files Browse the repository at this point in the history
  • Loading branch information
sgkoishi committed Nov 24, 2024
1 parent 9ecf6e5 commit bbef0f9
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 33 deletions.
2 changes: 1 addition & 1 deletion Core/TileProvider/Misc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ private void MMHook_TileProvider_ClearWorld(On.Terraria.WorldGen.orig_clearWorld
{
try
{
Terraria.Main.tile = (ModFramework.ICollection<Terraria.ITile>) Activator.CreateInstance(Terraria.Main.tile.GetType());
Terraria.Main.tile = (ModFramework.ICollection<Terraria.ITile>) Activator.CreateInstance(Terraria.Main.tile.GetType())!;
}
catch
{
Expand Down
54 changes: 22 additions & 32 deletions Core/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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<TerrariaApi.Server.PluginContainer>) typeof(TerrariaApi.Server.ServerApi)
.GetField("plugins", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)!
.GetValue(null)!)!;

var dict = ((Dictionary<string, System.Reflection.Assembly>) 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<string, System.Reflection.Assembly>) 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))
{
Expand Down Expand Up @@ -553,9 +559,9 @@ public static T Read<T>(this OTAPI.Hooks.MessageBuffer.GetDataEventArgs args, in
return args.Instance.Read<T>(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<ConsoleColor, int> _consoleColorMap = new Dictionary<ConsoleColor, int>
{
[ConsoleColor.Red] = 0xFF0000,
Expand All @@ -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
Expand All @@ -595,17 +597,11 @@ public override void SendMessage(string msg, byte red, byte green, byte blue)
}
}

public class Ring<T> : IEnumerable<T>
public class Ring<T>(int length) : IEnumerable<T>
{
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];

Expand All @@ -632,21 +628,15 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
return new RingEnumerator(this);
}

private class RingEnumerator : IEnumerator<T>
private class RingEnumerator(Ring<T> ring) : IEnumerator<T>
{
private readonly Ring<T> _ring;
private int _index;
private readonly Ring<T> _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<T> ring)
{
this._ring = ring;
this._index = -1;
}

public void Dispose()
{
}
Expand Down

0 comments on commit bbef0f9

Please sign in to comment.