From 022e2dea8a4d5dd163b4eb7ef964caaa5b8776c8 Mon Sep 17 00:00:00 2001 From: Cai <13110818005@qq.com> Date: Sat, 4 May 2024 11:37:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9APart5=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Document/Part5.md | 499 +++++++++++++++++++++++++++++++++++++++++++++- Document/Part6.md | 495 --------------------------------------------- 2 files changed, 498 insertions(+), 496 deletions(-) diff --git a/Document/Part5.md b/Document/Part5.md index 027f67f..d30444a 100644 --- a/Document/Part5.md +++ b/Document/Part5.md @@ -461,4 +461,501 @@ else | anglerQuestsFinished | int | 玩家已完成渔夫任务数 | | golferScoreAccumulated | int | 玩家已经获得的高尔夫球分数 | | difficulty | byte | 玩家角色难度(软核0,中核1,硬核2,旅行3) | -| SelectedItem | int | 玩家当前手持物品的slot(背包索引) | \ No newline at end of file +| SelectedItem | int | 玩家当前手持物品的slot(背包索引) | + + +## 习题:​ + +### 1.编写指令/dead,执行后返回当前死亡玩家列表\(绿色成功消息\)​ + +![1704012547985.png](Resourse/6656_d571440d3a3b0520e36566e778acae7c.png "1704012547985.png") + + +
+参考答案 + +```csharp +using System.Reflection; +using Terraria; +using TerrariaApi.Server; +using TShockAPI; + +namespace Plugin +{ + [ApiVersion(2, 1)] + public class Plugin : TerrariaPlugin + { + //定义插件的作者名称 + public override string Author => "Cai"; + //插件的一句话描述 + public override string Description => "Player"; + //插件的名称 + public override string Name => "Player"; + //插件的版本 + public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; + + + //插件的构造器 + public Plugin(Main game) : base(game) + { + } + + //插件加载时执行的代码 + public override void Initialize() + { + Commands.ChatCommands.Add(new Command(Dead, "dead")); + } + + private void Dead(CommandArgs args) + { + var plrs = TShock.Players.Where(p => p != null && p.Dead); //通过获取死亡的玩家对象 + if (plrs.Count() == 0) + { + //玩家对象不存在 + args.Player.SendSuccessMessage($"当前没有玩家死亡"); + return; + } + args.Player.SendSuccessMessage($"当前死亡玩家: {string.Join(',',plrs.Select(p=>p.Name))}"); + } + + + //插件卸载时执行的代码 + protected override void Dispose(bool disposing) + { + if (disposing) + { + var asm = Assembly.GetExecutingAssembly(); + Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 + } + base.Dispose(disposing); + } + } +} +``` +
+ + + +### 2.编写指令"/看看你 \{玩家名\} ",执行后返回玩家的 生命/生命最大值\(魔力无加成最大值\)、魔力/魔力最大值\(魔力无加成最大值\)、玩家的难度\(旅行、软、中、硬核\)、幸运值luck\(绿色成功消息\)​ + +![1704012556825.png](Resourse/6657_2b805c780258d59ba8fa8a7b81cddb4b.png "1704012556825.png") + + +
+参考答案 + +```csharp +using System.Reflection; +using Terraria; +using TerrariaApi.Server; +using TShockAPI; + +namespace Plugin +{ + [ApiVersion(2, 1)] + public class Plugin : TerrariaPlugin + { + //定义插件的作者名称 + public override string Author => "Cai"; + //插件的一句话描述 + public override string Description => "Player"; + //插件的名称 + public override string Name => "Player"; + //插件的版本 + public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; + + //插件的构造器 + public Plugin(Main game) : base(game) + { + } + + //插件加载时执行的代码 + public override void Initialize() + { + Commands.ChatCommands.Add(new Command(See, "看看你")); + } + + private void See(CommandArgs args) + { + TSPlayer plr; + if (args.Parameters.Count == 0) + { + args.Player.SendErrorMessage($"格式错误!正确格式:{TShock.Config.Settings.CommandSpecifier}看看你 玩家名"); + return; + } + List plrs = TSPlayer.FindByNameOrID(args.Parameters[0]); + //args.Parameters[0]为玩家名字或索引 + //如果参数为 tsi:2 则表示索引为2的玩家 + //如果参数为 tsn:233 则表示名字为233的玩家 + if (plrs.Count == 0) + { + args.Player.SendErrorMessage("玩家不存在!"); //发送错误消息 + return; + } + else if (plrs.Count > 1) + { + args.Player.SendMultipleMatchError(plrs.Select(p => p.Name)); //发送多个匹配结果错误 + //会向玩家发送: + //找到多个匹配项-无法判断哪个是正确的: + //玩家1,玩家2.... + //用"半角双引号"包裹关键字来搜索名字带有空格的物品 + //使用 tsi:序号 或者 tsn:名称 来区分含有数字的名称. + return; + } + else + { + plr = plrs[0]; + string difficult = ""; + switch (plr.Difficulty) + { + case 3: + difficult = "旅行"; + break; + case 0: + difficult = "软核"; + break; + case 1: + difficult = "中核"; + break; + case 2: + difficult = "硬核"; + break; + } + args.Player.SendSuccessMessage($"{plr.Name}:"); + args.Player.SendSuccessMessage($"生命:{plr.TPlayer.statLife}/{plr.TPlayer.statLifeMax2}({plr.TPlayer.statLifeMax})"); + args.Player.SendSuccessMessage($"魔力:{plr.TPlayer.statMana}/{plr.TPlayer.statManaMax2}({plr.TPlayer.statManaMax})"); + args.Player.SendSuccessMessage($"难度:{difficult}"); + args.Player.SendSuccessMessage($"幸运值:{plr.TPlayer.luck}"); + //找到匹配的玩家对象 + } + } + //插件卸载时执行的代码 + protected override void Dispose(bool disposing) + { + if (disposing) + { + var asm = Assembly.GetExecutingAssembly(); + Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 + } + base.Dispose(disposing); + } + } +} +``` +
+ + +### 3.编写指令"/看看你的 \{玩家名\} ",执行后返回玩家猪猪储蓄罐的钱币详情​ + +![1704013371999.png](Resourse/6658_bd45d438d93e57664d2d7edb8448ffdd.png "1704013371999.png") + +
+参考答案 + +```csharp +using System.Reflection; +using Terraria; +using Terraria.ID; +using TerrariaApi.Server; +using TShockAPI; + +namespace Plugin +{ + [ApiVersion(2, 1)] + public class Plugin : TerrariaPlugin + { + //定义插件的作者名称 + public override string Author => "Cai"; + + //插件的一句话描述 + public override string Description => "Player"; + + //插件的名称 + public override string Name => "Player"; + + //插件的版本 + public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; + + //插件的构造器 + public Plugin(Main game) : base(game) + { + } + + //插件加载时执行的代码 + public override void Initialize() + { + Commands.ChatCommands.Add(new Command(See, "看看你的")); + } + + private void See(CommandArgs args) + { + TSPlayer plr; + if (args.Parameters.Count == 0) + { + args.Player.SendErrorMessage($"格式错误!正确格式:{TShock.Config.Settings.CommandSpecifier}看看你的 玩家名"); + return; + } + List plrs = TSPlayer.FindByNameOrID(args.Parameters[0]); + //args.Parameters[0]为玩家名字或索引 + //如果参数为 tsi:2 则表示索引为2的玩家 + //如果参数为 tsn:233 则表示名字为233的玩家 + if (plrs.Count == 0) + { + args.Player.SendErrorMessage("玩家不存在!"); //发送错误消息 + return; + } + else if (plrs.Count > 1) + { + args.Player.SendMultipleMatchError(plrs.Select(p => p.Name)); //发送多个匹配结果错误 + //会向玩家发送: + //找到多个匹配项-无法判断哪个是正确的: + //玩家1,玩家2.... + //用"半角双引号"包裹关键字来搜索名字带有空格的物品 + //使用 tsi:序号 或者 tsn:名称 来区分含有数字的名称. + return; + } + else + { + plr = plrs[0]; + int copper = 0, silver = 0, gold = 0, platinum = 0; + foreach (Item item in plr.TPlayer.bank.item) + { + switch (item.netID) + { + case ItemID.CopperCoin: + copper += item.stack; + break; + case ItemID.SilverCoin: + silver += item.stack; + break; + case ItemID.GoldCoin: + gold += item.stack; + break; + case ItemID.PlatinumCoin: + platinum += item.stack; + break; + } + } + args.Player.SendSuccessMessage($"{plr.Name}的小猪储蓄罐硬币情况如下:"); + args.Player.SendSuccessMessage($"[i:{ItemID.PlatinumCoin}]{platinum}"); + args.Player.SendSuccessMessage($"[i:{ItemID.GoldCoin}]{gold}"); + args.Player.SendSuccessMessage($"[i:{ItemID.SilverCoin}]{silver}"); + args.Player.SendSuccessMessage($"[i:{ItemID.CopperCoin}]{copper}"); + } + } + + //插件卸载时执行的代码 + protected override void Dispose(bool disposing) + { + if (disposing) + { + var asm = Assembly.GetExecutingAssembly(); + Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 + } + base.Dispose(disposing); + } + } +} +``` +
+ +### 4.实现自动队伍,当玩家登录或加入世界,玩家有以下权限就切换对应的队伍​ + +| 权限 | 队伍 | +| --- | --- | +| team.red | 红队\(1\) | +| team.green | 绿队\(2\) | +| team.blue | 蓝队\(3\) | +| team.yellow | 黄队\(4\) | +| team.pink | 粉队\(5\) | + +> 钩子: TShockAPI.Hooks.PlayerHooks.PlayerPostLogin、ServerApi.Hooks.NetGreetPlayer +> 设置队伍: TSPlayer.SetTeam\(int team\) \(无队伍0,红队1,绿队2,蓝队3,黄队4,粉队5\) + +
+参考答案 + +```csharp +using System.Reflection; +using Terraria; +using Terraria.ID; +using TerrariaApi.Server; +using TShockAPI; +using TShockAPI.Hooks; + + +namespace Plugin +{ + [ApiVersion(2, 1)] + public class Plugin : TerrariaPlugin + { + //定义插件的作者名称 + public override string Author => "Cai"; + + + //插件的一句话描述 + public override string Description => "自动队伍"; + + + //插件的名称 + public override string Name => "AutoTeam"; + + + //插件的版本 + public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; + + + //插件的构造器 + public Plugin(Main game) : base(game) + { + } + + + //插件加载时执行的代码 + public override void Initialize() + { + PlayerHooks.PlayerPostLogin+=OnLogin; + ServerApi.Hooks.NetGreetPlayer.Register(this,OnGreetPlayers); + } + + + private void OnGreetPlayers(GreetPlayerEventArgs args) + { + CheckTeam(TShock.Players[args.Who]); + } + + + private void OnLogin(PlayerPostLoginEventArgs e) + { + CheckTeam(e.Player); + } + + + private void CheckTeam(TSPlayer plr) + { + if (plr.HasPermission("*")) + { + return; + } + int team = 0; + int count = 0; + if (plr.HasPermission("team.red")) + { + team = 1; + count++; + } + if (plr.HasPermission("team.green")) + { + team = 2; + count++; + } + if (plr.HasPermission("team.blue")) + { + team = 3; + count++; + } + if (plr.HasPermission("team.yellow")) + { + team = 4; + count++; + } + if (plr.HasPermission("team.pink")) + { + team = 5; + count++; + } + if (count == 0) + { + plr.SendWarningMessage("[自动队伍]你所处的玩家组没有配置自动队伍!"); + return; + } + if (count > 1) + { + plr.SendErrorMessage("[自动队伍]你所处的玩家组配置了多个队伍!"); + return; + } + plr.SetTeam(team); + } + + + //插件卸载时执行的代码 + protected override void Dispose(bool disposing) + { + if (disposing) + { + PlayerHooks.PlayerPostLogin -= OnLogin; + ServerApi.Hooks.NetGreetPlayer.Deregister(this, OnGreetPlayers); + } + base.Dispose(disposing); + } + } +} +``` +
+ + + +### 5.当玩家在墓地环境移动时,通过TSPlayer.DamagePlayer\(\)对其造成5点伤害 +> 钩子: GetDataHandlers.PlayerUpdate + +
+参考答案 + +```csharp +using System.Reflection; +using Terraria; +using Terraria.ID; +using TerrariaApi.Server; +using TShockAPI; +using TShockAPI.Hooks; + +namespace Plugin +{ + [ApiVersion(2, 1)] + public class Plugin : TerrariaPlugin + { + //定义插件的作者名称 + public override string Author => "Cai"; + + //插件的一句话描述 + public override string Description => "墓地"; + + //插件的名称 + public override string Name => "ZoneGraveyard"; + + //插件的版本 + public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; + + //插件的构造器 + public Plugin(Main game) : base(game) + { + } + + //插件加载时执行的代码 + public override void Initialize() + { + GetDataHandlers.PlayerUpdate.Register(OnPlayerUpdatePhysics); + } + + private void OnPlayerUpdatePhysics(object? sender, GetDataHandlers.PlayerUpdateEventArgs e) + { + if (e.Player.TPlayer.ZoneGraveyard) + { + e.Player.DamagePlayer(5); + } + } + + + //插件卸载时执行的代码 + protected override void Dispose(bool disposing) + { + if (disposing) + { + GetDataHandlers.PlayerUpdate.UnRegister(OnPlayerUpdatePhysics); + } + base.Dispose(disposing); + } + } +} +``` +
\ No newline at end of file diff --git a/Document/Part6.md b/Document/Part6.md index 239d48e..d623f81 100644 --- a/Document/Part6.md +++ b/Document/Part6.md @@ -494,499 +494,4 @@ Item[] dye = tplr.Loadouts[1].Dye; | difficulty | byte | 玩家角色难度\(软核0,中核1,硬核2,旅行3\) | | SelectedItem | int | 玩家当前手持物品的slot\(背包索引\) | -### 习题:​ - -### 1.编写指令/dead,执行后返回当前死亡玩家列表\(绿色成功消息\)​ - -![1704012547985.png](Resourse/6656_d571440d3a3b0520e36566e778acae7c.png "1704012547985.png") - - -
-参考答案 - -```csharp -using System.Reflection; -using Terraria; -using TerrariaApi.Server; -using TShockAPI; - -namespace Plugin -{ - [ApiVersion(2, 1)] - public class Plugin : TerrariaPlugin - { - //定义插件的作者名称 - public override string Author => "Cai"; - //插件的一句话描述 - public override string Description => "Player"; - //插件的名称 - public override string Name => "Player"; - //插件的版本 - public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; - - - //插件的构造器 - public Plugin(Main game) : base(game) - { - } - - //插件加载时执行的代码 - public override void Initialize() - { - Commands.ChatCommands.Add(new Command(Dead, "dead")); - } - - private void Dead(CommandArgs args) - { - var plrs = TShock.Players.Where(p => p != null && p.Dead); //通过获取死亡的玩家对象 - if (plrs.Count() == 0) - { - //玩家对象不存在 - args.Player.SendSuccessMessage($"当前没有玩家死亡"); - return; - } - args.Player.SendSuccessMessage($"当前死亡玩家: {string.Join(',',plrs.Select(p=>p.Name))}"); - } - - - //插件卸载时执行的代码 - protected override void Dispose(bool disposing) - { - if (disposing) - { - var asm = Assembly.GetExecutingAssembly(); - Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 - } - base.Dispose(disposing); - } - } -} -``` -
- - - -### 2.编写指令"/看看你 \{玩家名\} ",执行后返回玩家的 生命/生命最大值\(魔力无加成最大值\)、魔力/魔力最大值\(魔力无加成最大值\)、玩家的难度\(旅行、软、中、硬核\)、幸运值luck\(绿色成功消息\)​ - -![1704012556825.png](Resourse/6657_2b805c780258d59ba8fa8a7b81cddb4b.png "1704012556825.png") - - -
-参考答案 - -```csharp -using System.Reflection; -using Terraria; -using TerrariaApi.Server; -using TShockAPI; - -namespace Plugin -{ - [ApiVersion(2, 1)] - public class Plugin : TerrariaPlugin - { - //定义插件的作者名称 - public override string Author => "Cai"; - //插件的一句话描述 - public override string Description => "Player"; - //插件的名称 - public override string Name => "Player"; - //插件的版本 - public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; - - //插件的构造器 - public Plugin(Main game) : base(game) - { - } - - //插件加载时执行的代码 - public override void Initialize() - { - Commands.ChatCommands.Add(new Command(See, "看看你")); - } - - private void See(CommandArgs args) - { - TSPlayer plr; - if (args.Parameters.Count == 0) - { - args.Player.SendErrorMessage($"格式错误!正确格式:{TShock.Config.Settings.CommandSpecifier}看看你 玩家名"); - return; - } - List plrs = TSPlayer.FindByNameOrID(args.Parameters[0]); - //args.Parameters[0]为玩家名字或索引 - //如果参数为 tsi:2 则表示索引为2的玩家 - //如果参数为 tsn:233 则表示名字为233的玩家 - if (plrs.Count == 0) - { - args.Player.SendErrorMessage("玩家不存在!"); //发送错误消息 - return; - } - else if (plrs.Count > 1) - { - args.Player.SendMultipleMatchError(plrs.Select(p => p.Name)); //发送多个匹配结果错误 - //会向玩家发送: - //找到多个匹配项-无法判断哪个是正确的: - //玩家1,玩家2.... - //用"半角双引号"包裹关键字来搜索名字带有空格的物品 - //使用 tsi:序号 或者 tsn:名称 来区分含有数字的名称. - return; - } - else - { - plr = plrs[0]; - string difficult = ""; - switch (plr.Difficulty) - { - case 3: - difficult = "旅行"; - break; - case 0: - difficult = "软核"; - break; - case 1: - difficult = "中核"; - break; - case 2: - difficult = "硬核"; - break; - } - args.Player.SendSuccessMessage($"{plr.Name}:"); - args.Player.SendSuccessMessage($"生命:{plr.TPlayer.statLife}/{plr.TPlayer.statLifeMax2}({plr.TPlayer.statLifeMax})"); - args.Player.SendSuccessMessage($"魔力:{plr.TPlayer.statMana}/{plr.TPlayer.statManaMax2}({plr.TPlayer.statManaMax})"); - args.Player.SendSuccessMessage($"难度:{difficult}"); - args.Player.SendSuccessMessage($"幸运值:{plr.TPlayer.luck}"); - //找到匹配的玩家对象 - } - } - //插件卸载时执行的代码 - protected override void Dispose(bool disposing) - { - if (disposing) - { - var asm = Assembly.GetExecutingAssembly(); - Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 - } - base.Dispose(disposing); - } - } -} -``` -
- - -### 3.编写指令"/看看你的 \{玩家名\} ",执行后返回玩家猪猪储蓄罐的钱币详情​ - -![1704013371999.png](Resourse/6658_bd45d438d93e57664d2d7edb8448ffdd.png "1704013371999.png") - -
-参考答案 - -```csharp -using System.Reflection; -using Terraria; -using Terraria.ID; -using TerrariaApi.Server; -using TShockAPI; - -namespace Plugin -{ - [ApiVersion(2, 1)] - public class Plugin : TerrariaPlugin - { - //定义插件的作者名称 - public override string Author => "Cai"; - - //插件的一句话描述 - public override string Description => "Player"; - - //插件的名称 - public override string Name => "Player"; - - //插件的版本 - public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; - - //插件的构造器 - public Plugin(Main game) : base(game) - { - } - - //插件加载时执行的代码 - public override void Initialize() - { - Commands.ChatCommands.Add(new Command(See, "看看你的")); - } - - private void See(CommandArgs args) - { - TSPlayer plr; - if (args.Parameters.Count == 0) - { - args.Player.SendErrorMessage($"格式错误!正确格式:{TShock.Config.Settings.CommandSpecifier}看看你的 玩家名"); - return; - } - List plrs = TSPlayer.FindByNameOrID(args.Parameters[0]); - //args.Parameters[0]为玩家名字或索引 - //如果参数为 tsi:2 则表示索引为2的玩家 - //如果参数为 tsn:233 则表示名字为233的玩家 - if (plrs.Count == 0) - { - args.Player.SendErrorMessage("玩家不存在!"); //发送错误消息 - return; - } - else if (plrs.Count > 1) - { - args.Player.SendMultipleMatchError(plrs.Select(p => p.Name)); //发送多个匹配结果错误 - //会向玩家发送: - //找到多个匹配项-无法判断哪个是正确的: - //玩家1,玩家2.... - //用"半角双引号"包裹关键字来搜索名字带有空格的物品 - //使用 tsi:序号 或者 tsn:名称 来区分含有数字的名称. - return; - } - else - { - plr = plrs[0]; - int copper = 0, silver = 0, gold = 0, platinum = 0; - foreach (Item item in plr.TPlayer.bank.item) - { - switch (item.netID) - { - case ItemID.CopperCoin: - copper += item.stack; - break; - case ItemID.SilverCoin: - silver += item.stack; - break; - case ItemID.GoldCoin: - gold += item.stack; - break; - case ItemID.PlatinumCoin: - platinum += item.stack; - break; - } - } - args.Player.SendSuccessMessage($"{plr.Name}的小猪储蓄罐硬币情况如下:"); - args.Player.SendSuccessMessage($"[i:{ItemID.PlatinumCoin}]{platinum}"); - args.Player.SendSuccessMessage($"[i:{ItemID.GoldCoin}]{gold}"); - args.Player.SendSuccessMessage($"[i:{ItemID.SilverCoin}]{silver}"); - args.Player.SendSuccessMessage($"[i:{ItemID.CopperCoin}]{copper}"); - } - } - - //插件卸载时执行的代码 - protected override void Dispose(bool disposing) - { - if (disposing) - { - var asm = Assembly.GetExecutingAssembly(); - Commands.ChatCommands.RemoveAll(c => c.CommandDelegate.Method?.DeclaringType?.Assembly == asm); //卸载命令 - } - base.Dispose(disposing); - } - } -} -``` -
- -### 4.实现自动队伍,当玩家登录或加入世界,玩家有以下权限就切换对应的队伍​ - -| 权限 | 队伍 | -| --- | --- | -| team.red | 红队\(1\) | -| team.green | 绿队\(2\) | -| team.blue | 蓝队\(3\) | -| team.yellow | 黄队\(4\) | -| team.pink | 粉队\(5\) | - -钩子:TShockAPI.Hooks.PlayerHooks.PlayerPostLogin、ServerApi.Hooks.NetGreetPlayer -设置队伍:TSPlayer.SetTeam\(int team\) \(无队伍0,红队1,绿队2,蓝队3,黄队4,粉队5\) - -
-参考答案 - -```csharp -using System.Reflection; -using Terraria; -using Terraria.ID; -using TerrariaApi.Server; -using TShockAPI; -using TShockAPI.Hooks; - - -namespace Plugin -{ - [ApiVersion(2, 1)] - public class Plugin : TerrariaPlugin - { - //定义插件的作者名称 - public override string Author => "Cai"; - - - //插件的一句话描述 - public override string Description => "自动队伍"; - - - //插件的名称 - public override string Name => "AutoTeam"; - - - //插件的版本 - public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; - - - //插件的构造器 - public Plugin(Main game) : base(game) - { - } - - - //插件加载时执行的代码 - public override void Initialize() - { - PlayerHooks.PlayerPostLogin+=OnLogin; - ServerApi.Hooks.NetGreetPlayer.Register(this,OnGreetPlayers); - } - - - private void OnGreetPlayers(GreetPlayerEventArgs args) - { - CheckTeam(TShock.Players[args.Who]); - } - - - private void OnLogin(PlayerPostLoginEventArgs e) - { - CheckTeam(e.Player); - } - - - private void CheckTeam(TSPlayer plr) - { - if (plr.HasPermission("*")) - { - return; - } - int team = 0; - int count = 0; - if (plr.HasPermission("team.red")) - { - team = 1; - count++; - } - if (plr.HasPermission("team.green")) - { - team = 2; - count++; - } - if (plr.HasPermission("team.blue")) - { - team = 3; - count++; - } - if (plr.HasPermission("team.yellow")) - { - team = 4; - count++; - } - if (plr.HasPermission("team.pink")) - { - team = 5; - count++; - } - if (count == 0) - { - plr.SendWarningMessage("[自动队伍]你所处的玩家组没有配置自动队伍!"); - return; - } - if (count > 1) - { - plr.SendErrorMessage("[自动队伍]你所处的玩家组配置了多个队伍!"); - return; - } - plr.SetTeam(team); - } - - - //插件卸载时执行的代码 - protected override void Dispose(bool disposing) - { - if (disposing) - { - PlayerHooks.PlayerPostLogin -= OnLogin; - ServerApi.Hooks.NetGreetPlayer.Deregister(this, OnGreetPlayers); - } - base.Dispose(disposing); - } - } -} -``` -
- - - -5.当玩家在墓地环境移动时,通过TSPlayer.DamagePlayer\(\)对其造成5点伤害 -钩子: GetDataHandlers.PlayerUpdate - -
-参考答案 - -```csharp -using System.Reflection; -using Terraria; -using Terraria.ID; -using TerrariaApi.Server; -using TShockAPI; -using TShockAPI.Hooks; - -namespace Plugin -{ - [ApiVersion(2, 1)] - public class Plugin : TerrariaPlugin - { - //定义插件的作者名称 - public override string Author => "Cai"; - - //插件的一句话描述 - public override string Description => "墓地"; - - //插件的名称 - public override string Name => "ZoneGraveyard"; - - //插件的版本 - public override Version Version => Assembly.GetExecutingAssembly().GetName().Version; - - //插件的构造器 - public Plugin(Main game) : base(game) - { - } - - //插件加载时执行的代码 - public override void Initialize() - { - GetDataHandlers.PlayerUpdate.Register(OnPlayerUpdatePhysics); - } - - private void OnPlayerUpdatePhysics(object? sender, GetDataHandlers.PlayerUpdateEventArgs e) - { - if (e.Player.TPlayer.ZoneGraveyard) - { - e.Player.DamagePlayer(5); - } - } - - - //插件卸载时执行的代码 - protected override void Dispose(bool disposing) - { - if (disposing) - { - GetDataHandlers.PlayerUpdate.UnRegister(OnPlayerUpdatePhysics); - } - base.Dispose(disposing); - } - } -} -``` -