Skip to content

Commit

Permalink
Move methods, update docs, add command aliases
Browse files Browse the repository at this point in the history
  • Loading branch information
sgkoishi committed Dec 26, 2023
1 parent fb0031e commit df87ae3
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 159 deletions.
49 changes: 16 additions & 33 deletions Core/Backport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,6 @@ namespace Chireiden.TShock.Omni;

public partial class Plugin
{
#region MyRegion
[Obsolete]
private void ILHook_Backport_2892(ILContext context)
{
if (context.Body?.Instructions[0]?.Operand?.ToString()?.Contains(@"(?:\/s(?<Stack>\d{1,3}))") == true)
{
context.Body!.Instructions[0].Operand = @"\[i(tem)?(?:\/s(?<Stack>\d{1,4}))?(?:\/p(?<Prefix>\d{1,3}))?:(?<NetID>-?\d{1,4})\]";
}
}

[Obsolete]
private bool Detour_Backport_2894(Func<TShockAPI.DB.CharacterManager, TShockAPI.TSPlayer, bool, bool> orig,
TShockAPI.DB.CharacterManager self, TShockAPI.TSPlayer player, bool fromCommand)
{
return player.State >= 10 && orig(self, player, fromCommand);
}

[Obsolete("Pre 5.2.0")]
public void Run()
{
this.Detour(
nameof(this.Detour_Backport_2894),
typeof(TShockAPI.DB.CharacterManager)
.GetMethod(nameof(TShockAPI.DB.CharacterManager.InsertPlayerData), _bfany),
this.Detour_Backport_2894);

this.ILHook(
nameof(this.ILHook_Backport_2892),
typeof(TShockAPI.Utils).GetMethod(nameof(TShockAPI.Utils.GetItemFromTag), _bfany),
this.ILHook_Backport_2892);
}
#endregion

private void Detour_Backport_2934(Action orig)
{
orig();
Expand All @@ -49,6 +16,7 @@ private void Detour_Backport_2934(Action orig)

private void Backport_Inferno()
{
// Reported via Discord https://discord.com/channels/479657350043664384/482065271297671168/1061908947151372408
var bouncer = Utils.TShockType("Bouncer");
if (bouncer?.GetField("NPCAddBuffTimeMax", _bfany)?.GetValue(null) is Dictionary<int, int> npcAddBuffTimeMax)
{
Expand All @@ -59,9 +27,24 @@ private void Backport_Inferno()
}
}

private void Backport_3005()
{
var bouncer = Utils.TShockType("Bouncer");
if (bouncer?.GetField("PlayerAddBuffWhitelist", _bfany)?.GetValue(null) is Array array)
{
var bl = bouncer.GetNestedType("BuffLimit", _bfany)!;
var bli = Activator.CreateInstance(bl);
bl.GetProperty("MaxTicks", _bfany)!.SetValue(bli, 300);
bl.GetProperty("CanBeAddedWithoutHostile", _bfany)!.SetValue(bli, true);
bl.GetProperty("CanOnlyBeAppliedToSender", _bfany)!.SetValue(bli, true);
array.SetValue(bli, Terraria.ID.BuffID.ParryDamageBuff);
}
}

private void Backports()
{
this.Backport_Inferno();
this.Backport_3005();

this.Detour(
nameof(this.Detour_Backport_2934),
Expand Down
28 changes: 28 additions & 0 deletions Core/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ public class Config
"*console*",
});

/// <summary>
/// Hidden commands that won't show up in the help.
/// </summary>
public Optional<List<string>> HideCommands = Optional.Default(new List<string> {
DefinedConsts.Commands.Whynot,
DefinedConsts.Commands.Admin.DebugStat,
Expand All @@ -46,20 +49,38 @@ public class Config
DefinedConsts.Commands.Admin.InspectTileFrame
});

/// <summary>
/// Startup commands.
/// </summary>
public Optional<List<string>> StartupCommands = Optional.Default(new List<string>());

/// <summary>
/// Rename commands. The key of the dictionary is the method name with the full name of the declaring type, e.g. "Chireiden.TShock.Omni.Plugin.Command_PermissionCheck".
/// </summary>
public Optional<Dictionary<string, List<string>>> CommandRenames = Optional.Default(new Dictionary<string, List<string>>());

/// <summary>
/// Random features of improvement.
/// </summary>
public Optional<EnhancementsSettings> Enhancements = Optional.Default(new EnhancementsSettings());

/// <summary>
/// Troubleshooting networking issues.
/// </summary>
public Optional<DebugPacketSettings> DebugPacket = Optional.Default(new DebugPacketSettings());

/// <summary>
/// Problems that should be fixed.
/// </summary>
public Optional<SoundnessSettings> Soundness = Optional.Default(new SoundnessSettings(), true);

public Optional<PermissionSettings> Permission = Optional.Default(new PermissionSettings());

public Optional<Modes> Mode = Optional.Default(new Modes());

/// <summary>
/// Other settings that can't be perfectly resolved and might have side effects.
/// </summary>
public Optional<MitigationSettings> Mitigation = Optional.Default(new MitigationSettings());

public record class EnhancementsSettings
Expand Down Expand Up @@ -95,14 +116,21 @@ public record class EnhancementsSettings
public Optional<UpdateOptions> SuppressUpdate = Optional.Default(UpdateOptions.Silent);

/// <summary>
/// <para>
/// Socket Provider
/// </para>
/// <para>
/// Different types of wrapper implementation around socket. May affect the memory usage.
/// </para>
/// </summary>
public Optional<SocketType> Socket = Optional.Default(SocketType.AnotherAsyncSocketAsFallback, true);

public Optional<NameCollisionAction> NameCollision = Optional.Default(NameCollisionAction.Unhandled, true);

public Optional<TileProviderOptions> TileProvider = Optional.Default(TileProviderOptions.AsIs, true);

public Optional<int> ShowCommandAlias = Optional.Default(0);

/// <summary>
/// Support regex (`namea:player.*`) and IP mask (`ipa:1.1.0.0/16`).
/// </summary>
Expand Down
111 changes: 111 additions & 0 deletions Core/Enhancements.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
namespace Chireiden.TShock.Omni;

public partial class Plugin
{
private void MMHook_MemoryTrim_DisplayDoll(On.Terraria.GameContent.Tile_Entities.TEDisplayDoll.orig_ctor orig, Terraria.GameContent.Tile_Entities.TEDisplayDoll self)
{
orig(self);
if (this.config.Enhancements.Value.TrimMemory)
{
self._dollPlayer = null;
}
}

private void MMHook_MemoryTrim_HatRack(On.Terraria.GameContent.Tile_Entities.TEHatRack.orig_ctor orig, Terraria.GameContent.Tile_Entities.TEHatRack self)
{
orig(self);
if (this.config.Enhancements.Value.TrimMemory)
{
self._dollPlayer = null;
}
}

private async Task Detour_UpdateCheckAsync(Func<TShockAPI.UpdateManager, object, Task> orig, TShockAPI.UpdateManager um, object state)
{
var flag = this.config.Enhancements.Value.SuppressUpdate.Value;
if (flag == Config.EnhancementsSettings.UpdateOptions.Disabled)
{
return;
}
try
{
await orig(um, state);
return;
}
catch when (flag is Config.EnhancementsSettings.UpdateOptions.Silent)
{
return;
}
}

private void TAHook_NameCollision(TerrariaApi.Server.NameCollisionEventArgs args)
{
if (args.Handled)
{
return;
}
var ip = TShockAPI.TShock.Utils.GetRealIP(Terraria.Netplay.Clients[args.Who].Socket.GetRemoteAddress().ToString());
var player = Utils.ActivePlayers.FirstOrDefault(p => p.Name == args.Name && p.Index != args.Who);
var account = TShockAPI.TShock.UserAccounts.GetUserAccountByName(args.Name);
var knownIPs = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(account?.KnownIps ?? "[]")!;
var first = false;
var second = false;
switch (this.config.Enhancements.Value.NameCollision.Value)
{
case Config.EnhancementsSettings.NameCollisionAction.First:
first = true;
args.Handled = true;
break;
case Config.EnhancementsSettings.NameCollisionAction.Second:
second = true;
args.Handled = true;
break;
case Config.EnhancementsSettings.NameCollisionAction.Both:
first = true;
second = true;
args.Handled = true;
break;
case Config.EnhancementsSettings.NameCollisionAction.None:
args.Handled = true;
break;
case Config.EnhancementsSettings.NameCollisionAction.Known:
if (!knownIPs.Contains(ip))
{
second = true;
}
else if (player != null && !knownIPs.Contains(player.IP) && !player.IsLoggedIn)
{
first = true;
}
else
{
second = true;
}
args.Handled = true;
break;
case Config.EnhancementsSettings.NameCollisionAction.Unhandled:
return;
default:
throw new System.Runtime.CompilerServices.SwitchExpressionException($"Unexpected option {this.config.Enhancements.Value.NameCollision.Value}");
}
if (first)
{
Terraria.NetMessage.BootPlayer(player!.Index, Terraria.Localization.NetworkText.FromKey(Terraria.Lang.mp[5].Key, args.Name));
}
if (second)
{
Terraria.NetMessage.BootPlayer(args.Who, Terraria.Localization.NetworkText.FromKey(Terraria.Lang.mp[5].Key, args.Name));
}
}

private string Detour_HelpAliases(Func<object, TShockAPI.Command, string> orig, object _instance, TShockAPI.Command command)
{
var ac = this.config.Enhancements.Value.ShowCommandAlias.Value;
if (ac == 0 || command.Names.Count == 1)
{
return orig(_instance, command);
}
var aliases = string.Join(", ", command.Names.Skip(1).Take(ac).Select(x => TShockAPI.Commands.Specifier + x));
return $"{TShockAPI.Commands.Specifier}{command.Name} ({aliases})";
}
}
22 changes: 0 additions & 22 deletions Core/MemoryTrim.cs

This file was deleted.

10 changes: 9 additions & 1 deletion Core/Mitigations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ internal void SwapWhileUseDetected(int player, int slot)
{
this.SwapWhileUse?.Invoke(player, slot);
}

public delegate void PotionBypassEvent(int player, int slot);
public event PotionBypassEvent? PotionBypass;
internal void PotionBypassDetected(int player, int amount)
{
this.PotionBypass?.Invoke(player, amount);
}
}

public Detection Detections = new Detection();
Expand Down Expand Up @@ -130,7 +137,7 @@ private void OTHook_Mitigation_GetData(object? sender, OTAPI.Hooks.MessageBuffer
args.CancelPacket();
break;
}
if (Terraria.Main.player[index].inventory[Terraria.Main.player[index].selectedItem].potion)
if (Terraria.Main.player[index].inventory[Terraria.Main.player[index].selectedItem].potion && Terraria.Main.player[index].talkNPC != -1)
{
var amount = BitConverter.ToInt16(args.Instance.readBuffer.AsSpan(args.ReadOffset + 1, 2));
this[index].PendingRevertHeal = Math.Min(amount, Terraria.Main.player[index].statLifeMax2 - Terraria.Main.player[index].statLife);
Expand All @@ -147,6 +154,7 @@ private void OTHook_Mitigation_GetData(object? sender, OTAPI.Hooks.MessageBuffer
this[index].PendingRevertHeal = 0;
Terraria.Main.player[index].statLife -= pending;
Terraria.NetMessage.TrySendData((int) PacketTypes.PlayerHp, -1, -1, null, index);
this.Detections.PotionBypassDetected(index, pending);
}
break;
}
Expand Down
70 changes: 0 additions & 70 deletions Core/NameCollision.cs

This file was deleted.

7 changes: 7 additions & 0 deletions Core/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ public Plugin(Main game) : base(game)
.SelectMany(i => i.GetMethods(_bfany).Where(m => m.Name.Contains("CheckBan")))
.FirstOrDefault(),
this.Detour_CheckBan_IP);
this.Detour(
nameof(this.Detour_HelpAliases),
typeof(Commands)
.GetNestedTypes(_bfany)
.SelectMany(i => i.GetMethods(_bfany).Where(m => m.DeclaringType!.Name == "<>c" && m.Name.StartsWith("<Help>")))
.FirstOrDefault(),
this.Detour_HelpAliases);
this.ILHook(
nameof(this.ILHook_Mitigation_DisabledInvincible),
Utils.TShockType("Bouncer")
Expand Down
Loading

0 comments on commit df87ae3

Please sign in to comment.