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);
- }
- }
-}
-```
-