From e813c8430930e8c3250c7cd850c10bc5b810e16b Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Wed, 18 Mar 2026 02:16:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?update(servertool)=EF=BC=9A=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E4=BF=AE=E6=94=B9npc=E7=94=9F=E6=88=90=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E4=BD=9C=E7=94=A8=E4=BA=8E=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E9=99=84=E8=BF=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ServerTools/Command/NPCSpawnRate.cs | 73 +++++++++++++++++++++++++ src/ServerTools/ModifyClientDetect.cs | 2 +- src/ServerTools/Plugin.Handler.cs | 20 +++++++ src/ServerTools/Plugin.cs | 3 +- src/ServerTools/README.md | 7 +++ 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/ServerTools/Command/NPCSpawnRate.cs diff --git a/src/ServerTools/Command/NPCSpawnRate.cs b/src/ServerTools/Command/NPCSpawnRate.cs new file mode 100644 index 000000000..a243e2fcb --- /dev/null +++ b/src/ServerTools/Command/NPCSpawnRate.cs @@ -0,0 +1,73 @@ +using LazyAPI.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Terraria; +using TShockAPI; + +namespace ServerTools.Command; + +[Command("spawnrate", "sr")] +[Permissions("server.tool.npcspawn")] +public class NPCSpawnRate +{ + [Alias("enable", "on")] + [RealPlayer] + public static void Enable(CommandArgs args) + { + var rate = GetPlayerSpawnItem(args.Player.TPlayer); + rate.Enable = true; + args.Player.SendInfoMessage(GetString($"开启怪物生成率,当前生成率{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); + } + + [Alias("off")] + [RealPlayer] + public static void Off(CommandArgs args) + { + if(Plugin.PlayerSpawnRates.TryGetValue(args.Player.TPlayer, out var rate)) + { + rate.Enable = false; + } + args.Player.SendInfoMessage(GetString("已关闭怪物生成率")); + } + + [Alias("rate")] + [RealPlayer] + public static void ModifySpawnRate(CommandArgs args, int num) + { + var rate = GetPlayerSpawnItem(args.Player.TPlayer); + rate.spawnRate = num; + args.Player.SendInfoMessage(GetString($"设置生成速率{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); + } + + [Alias("max")] + [RealPlayer] + public static void ModifySpawnMax(CommandArgs args, int max) + { + var rate = GetPlayerSpawnItem(args.Player.TPlayer); + rate.maxSpawns = max; + args.Player.SendInfoMessage(GetString($"设置最大生成数量{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); + } + + [Alias("help")] + public static void Help(CommandArgs args) + { + args.Player.SendInfoMessage(GetString("/spawnrate on 启用生成率修改")); + args.Player.SendInfoMessage(GetString("/spawnrate off 关闭生成率修改")); + args.Player.SendInfoMessage(GetString("/spawnrate rate [生成率] 设置怪物生成速率(越小越快)")); + args.Player.SendInfoMessage(GetString("/spawnrate max [数量] 设置每次生成最大可生成数量)")); + } + + private static Plugin.PlayerSpawnRate GetPlayerSpawnItem(Player player) + { + if(Plugin.PlayerSpawnRates.TryGetValue(player, out var item)) + { + return item; + } + var rate = new Plugin.PlayerSpawnRate(); + Plugin.PlayerSpawnRates[player] = rate; + return rate; + } +} diff --git a/src/ServerTools/ModifyClientDetect.cs b/src/ServerTools/ModifyClientDetect.cs index d0a1529e5..db6eb20d4 100644 --- a/src/ServerTools/ModifyClientDetect.cs +++ b/src/ServerTools/ModifyClientDetect.cs @@ -31,7 +31,7 @@ public static void CheckModify(MessageBuffer instance, int value) var player = TShockAPI.TShock.Players[instance.whoAmI]; if (CheckPacket(value) && player != null) { - var text = $"[警告]玩家 {player.Name} 使用修改后的客户端进入服务器!"; + var text = GetString($"[警告]玩家 {player.Name} 使用修改后的客户端进入服务器!"); TShockAPI.TShock.Log.ConsoleWarn(text); TShockAPI.TShock.Utils.Broadcast(text, Microsoft.Xna.Framework.Color.Red); if(Config.Instance.KickCheater) diff --git a/src/ServerTools/Plugin.Handler.cs b/src/ServerTools/Plugin.Handler.cs index a92fdc213..f9be67295 100644 --- a/src/ServerTools/Plugin.Handler.cs +++ b/src/ServerTools/Plugin.Handler.cs @@ -12,6 +12,13 @@ namespace ServerTools; public partial class Plugin { + internal class PlayerSpawnRate + { + public int spawnRate = 600; + public int maxSpawns = 5; + public bool Enable = false; + } + private static long TimerCount = 0; private readonly Dictionary PlayerDeath = []; @@ -22,6 +29,19 @@ public partial class Plugin public static readonly List ActivePlayers = []; + internal static readonly Dictionary PlayerSpawnRates = []; + + private void Spawner_GetSpawnRate(On.Terraria.NPC.Spawner.orig_GetSpawnRate orig, NPC.Spawner self, Player player, out int spawnRate, out int maxSpawns) + { + if(PlayerSpawnRates.TryGetValue(player, out var inner) && inner.Enable) + { + spawnRate = inner.spawnRate; + maxSpawns = inner.maxSpawns; + return; + } + orig(self, player, out spawnRate, out maxSpawns); + } + private void OnGreet(GreetPlayerEventArgs args) { var ply = TShock.Players[args.Who]; diff --git a/src/ServerTools/Plugin.cs b/src/ServerTools/Plugin.cs index 64194618f..c5246ddcd 100644 --- a/src/ServerTools/Plugin.cs +++ b/src/ServerTools/Plugin.cs @@ -15,7 +15,7 @@ public partial class Plugin : LazyPlugin public override string Name => Assembly.GetExecutingAssembly().GetName().Name!; - public override Version Version => new Version(1, 3, 0, 0); + public override Version Version => new Version(1, 3, 0, 1); public const string ReaderPath = "ReaderPlayers"; @@ -44,6 +44,7 @@ public override void Initialize() GetDataHandlers.KillMe.Register(this.KillMe); GetDataHandlers.PlayerSpawn.Register(this.OnPlayerSpawn); GetDataHandlers.PlayerUpdate.Register(this.OnUpdate); + On.Terraria.NPC.Spawner.GetSpawnRate += this.Spawner_GetSpawnRate; HookManager.Add(typeof(TSRestPlayer).GetConstructor([typeof(string), typeof(TShockAPI.Group)])!, RestPlayerCtor); HookManager.Add(typeof(Commands).GetMethod("ViewAccountInfo", BindingFlags.NonPublic | BindingFlags.Static)!, ViewAccountInfo); OnTimer += this.OnUpdatePlayerOnline; diff --git a/src/ServerTools/README.md b/src/ServerTools/README.md index a8425aee4..adb41659d 100644 --- a/src/ServerTools/README.md +++ b/src/ServerTools/README.md @@ -22,6 +22,10 @@ | /readplayer | servertool.readplayer.use | 读取并保存文件夹下所有存档到数据库 | | /readplayer [文件名] | servertool.readplayer.use | 读取并保存文件夹下指定文存档到数据库 | | /readplayer [文件名] [角色名] | servertool.readplayer.use | 读取存档到指定角色下 | +| /spawnrate on | server.tool.npcspawn | 启用生成率修改 | +| /spawnrate off | server.tool.npcspawn | 关闭生成率修改 | +| /spawnrate rate [速率] | server.tool.npcspawn | 修改生成速率 | +| /spawnrate max [数量] | server.tool.npcspawn | 修改生成数量 | ## REST API @@ -164,6 +168,9 @@ ## 更新日志 +### v1.3.0.1 +- 添加修改NPC生成速率 + ### v1.3.0.0 — 检测作弊者 From ea16ba07743c3285e2f571bdeb144c089ea2abc2 Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Wed, 18 Mar 2026 02:20:54 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ServerTools/Command/NPCSpawnRate.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServerTools/Command/NPCSpawnRate.cs b/src/ServerTools/Command/NPCSpawnRate.cs index a243e2fcb..f960dced2 100644 --- a/src/ServerTools/Command/NPCSpawnRate.cs +++ b/src/ServerTools/Command/NPCSpawnRate.cs @@ -56,8 +56,8 @@ public static void Help(CommandArgs args) { args.Player.SendInfoMessage(GetString("/spawnrate on 启用生成率修改")); args.Player.SendInfoMessage(GetString("/spawnrate off 关闭生成率修改")); - args.Player.SendInfoMessage(GetString("/spawnrate rate [生成率] 设置怪物生成速率(越小越快)")); - args.Player.SendInfoMessage(GetString("/spawnrate max [数量] 设置每次生成最大可生成数量)")); + args.Player.SendInfoMessage(GetString("/spawnrate rate [生成率] 设置NPC生成速率(越小越快)")); + args.Player.SendInfoMessage(GetString("/spawnrate max [数量] 设置每次生成最大可生成数量")); } private static Plugin.PlayerSpawnRate GetPlayerSpawnItem(Player player) From 286ccacc952f77e805597d66167d6d77fed7d7e1 Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Wed, 18 Mar 2026 18:00:24 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ServerTools/Command/NPCSpawnRate.cs | 13 ++++--------- src/ServerTools/Plugin.cs | 2 ++ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/ServerTools/Command/NPCSpawnRate.cs b/src/ServerTools/Command/NPCSpawnRate.cs index f960dced2..c6405e48e 100644 --- a/src/ServerTools/Command/NPCSpawnRate.cs +++ b/src/ServerTools/Command/NPCSpawnRate.cs @@ -1,9 +1,4 @@ using LazyAPI.Attributes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Terraria; using TShockAPI; @@ -17,7 +12,7 @@ public class NPCSpawnRate [RealPlayer] public static void Enable(CommandArgs args) { - var rate = GetPlayerSpawnItem(args.Player.TPlayer); + var rate = GetPlayerSpawnRate(args.Player.TPlayer); rate.Enable = true; args.Player.SendInfoMessage(GetString($"开启怪物生成率,当前生成率{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); } @@ -37,7 +32,7 @@ public static void Off(CommandArgs args) [RealPlayer] public static void ModifySpawnRate(CommandArgs args, int num) { - var rate = GetPlayerSpawnItem(args.Player.TPlayer); + var rate = GetPlayerSpawnRate(args.Player.TPlayer); rate.spawnRate = num; args.Player.SendInfoMessage(GetString($"设置生成速率{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); } @@ -46,7 +41,7 @@ public static void ModifySpawnRate(CommandArgs args, int num) [RealPlayer] public static void ModifySpawnMax(CommandArgs args, int max) { - var rate = GetPlayerSpawnItem(args.Player.TPlayer); + var rate = GetPlayerSpawnRate(args.Player.TPlayer); rate.maxSpawns = max; args.Player.SendInfoMessage(GetString($"设置最大生成数量{{spawnRate: {rate.spawnRate}, maxSpawn: {rate.maxSpawns}}}")); } @@ -60,7 +55,7 @@ public static void Help(CommandArgs args) args.Player.SendInfoMessage(GetString("/spawnrate max [数量] 设置每次生成最大可生成数量")); } - private static Plugin.PlayerSpawnRate GetPlayerSpawnItem(Player player) + private static Plugin.PlayerSpawnRate GetPlayerSpawnRate(Player player) { if(Plugin.PlayerSpawnRates.TryGetValue(player, out var item)) { diff --git a/src/ServerTools/Plugin.cs b/src/ServerTools/Plugin.cs index c5246ddcd..3e934cafe 100644 --- a/src/ServerTools/Plugin.cs +++ b/src/ServerTools/Plugin.cs @@ -75,6 +75,8 @@ protected override void Dispose(bool disposing) GetDataHandlers.PlayerSpawn.UnRegister(this.OnPlayerSpawn); GetDataHandlers.PlayerUpdate.UnRegister(this.OnUpdate); On.OTAPI.Hooks.MessageBuffer.InvokeGetData -= this.MessageBuffer_InvokeGetData; + On.Terraria.NPC.Spawner.GetSpawnRate -= this.Spawner_GetSpawnRate; + IL.Terraria.MessageBuffer.GetData -= this.MessageBuffer_GetData; OnTimer -= this.OnUpdatePlayerOnline; } base.Dispose(disposing); From d1fe25bd7f7239e89cca732c2f7659654c3a70ec Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Wed, 18 Mar 2026 18:08:40 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8Dspawnrate=20>>>?= =?UTF-8?q?=20birthrate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ServerTools/Command/NPCSpawnRate.cs | 2 +- src/ServerTools/README.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ServerTools/Command/NPCSpawnRate.cs b/src/ServerTools/Command/NPCSpawnRate.cs index c6405e48e..d3b272e81 100644 --- a/src/ServerTools/Command/NPCSpawnRate.cs +++ b/src/ServerTools/Command/NPCSpawnRate.cs @@ -4,7 +4,7 @@ namespace ServerTools.Command; -[Command("spawnrate", "sr")] +[Command("birthrate", "br")] [Permissions("server.tool.npcspawn")] public class NPCSpawnRate { diff --git a/src/ServerTools/README.md b/src/ServerTools/README.md index adb41659d..c6e9b1441 100644 --- a/src/ServerTools/README.md +++ b/src/ServerTools/README.md @@ -22,10 +22,10 @@ | /readplayer | servertool.readplayer.use | 读取并保存文件夹下所有存档到数据库 | | /readplayer [文件名] | servertool.readplayer.use | 读取并保存文件夹下指定文存档到数据库 | | /readplayer [文件名] [角色名] | servertool.readplayer.use | 读取存档到指定角色下 | -| /spawnrate on | server.tool.npcspawn | 启用生成率修改 | -| /spawnrate off | server.tool.npcspawn | 关闭生成率修改 | -| /spawnrate rate [速率] | server.tool.npcspawn | 修改生成速率 | -| /spawnrate max [数量] | server.tool.npcspawn | 修改生成数量 | +| /birthrate on | server.tool.npcspawn | 启用生成率修改 | +| /birthrate off | server.tool.npcspawn | 关闭生成率修改 | +| /birthrate rate [速率] | server.tool.npcspawn | 修改生成速率 | +| /birthrate max [数量] | server.tool.npcspawn | 修改生成数量 | ## REST API