//以下为示例代码,看不懂没事,我们慢慢学
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 => "拒绝脏话";
//插件的名称
public override string Name => "Fuck";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
ServerApi.Hooks.ServerChat.Register(this, OnChat); //注册聊天钩子
}
private void OnChat(ServerChatEventArgs args)
{
TSPlayer plr = TShock.Players[args.Who]; //获取TShock玩家对象
if (args.Text.Contains("wdnmd")) //检测聊天是否含有脏话"wdnmd"
{
plr.Kick("不许说脏脏!", true); //踢出玩家
}
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
ServerApi.Hooks.ServerChat.Deregister(this, OnChat); //卸载聊天钩子
}
base.Dispose(disposing);
}
}
}
//插件加载时执行的代码
public override void Initialize()
{
ServerApi.Hooks.ServerChat.Register(this, OnChat); //注册聊天钩子
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
ServerApi.Hooks.ServerChat.Deregister(this, OnChat); //卸载聊天钩子
}
base.Dispose(disposing);
}
//插件加载时执行的代码
public override void Initialize()
{
ServerApi.Hooks.ServerChat.Register(this, OnChat); //注册ServerApi钩子(玩家聊天)
}
//回调函数
private void OnChat(ServerChatEventArgs args)
{
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
ServerApi.Hooks.ServerChat.Deregister(this, OnChat); //卸载ServerApi钩子(玩家聊天)
}
base.Dispose(disposing);
}
private void OnChat(ServerChatEventArgs args)
{
//args.Who(有的地方是WhoAmI)是玩家索引的意思,也就是在玩家对象数组中的下标(索引)。Who和WhoAmI等同于TSPlayer中的Index,Who和WhoAmI也可能表示的是生物(NPC)或者弹幕(Projectile)等的索引,这要取决于你的钩子
//TShock.Players是TShock玩家对象(TSPlayer)数组,TShock玩家对象中的绝大部分属性、变量、方法都为插件编写服务,大部分都可以在服务端使用
//Main.player是Terraria玩家对象(Player)数组,Terraria玩家对象是Terraria客服端和服务端都使用的,所以其中的属性、变量、方法在服务器中可能不会生效
TSPlayer plr = TShock.Players[args.Who]; //获取TShock玩家对象,说白点就是用下标获取数组元素
Player player = Main.player[args.Who]; //获取TShock玩家对象
}
•TShockAPI钩子
类型 | 包含钩子 |
---|---|
AccountHooks | AccountCreate(创建账号)、AccountDelete(删除账号) |
PlayerHooks | PlayerChat(玩家聊天)、PlayerCommand(玩家执行命令)、PlayerLogout(玩家登出)、PlayerPreLogin(玩家登录前)、PlayerPostLogin(玩家登录后)、PlayerPermission(权限检查)、PlayerHasBuildPermission(玩家建筑权限检查)、PlayerProjbanPermission(玩家服务器忽略禁用弹幕权限检查)、 PlayerTilebanPermission(玩家服务器忽略禁用图格权限检查)、 PlayerItembanPermission(玩家服务器忽略违禁物品权限检查) |
GeneralHooks | ReloadEvent(服务器重载[使用/reload命令]) |
RegionHooks | RegionCreated(区域创建)、RegionDeleted(区域删除)、RegionRenamed(区域重命名)、RegionEntered(玩家进入区域)、 RegionLeft(玩家离开区域) |
//插件加载时执行的代码
public override void Initialize()
{
TShockAPI.Hooks.AccountHooks.AccountCreate += AccountHooks_AccountCreate;//注册TShockAPI钩子(玩家创建账号)
}
//回调函数
private void AccountHooks_AccountCreate(TShockAPI.Hooks.AccountCreateEventArgs e)
{
TShock.Utils.Broadcast($"[欢迎新人]{e.Account.Name}注册了新账号,快举小花欢迎吧~", 0, 255, 120); //发送全服广播
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
TShockAPI.Hooks.AccountHooks.AccountCreate -= AccountHooks_AccountCreate; ; //卸载TShockAPI钩子(玩家创建账号)
}
base.Dispose(disposing);
}
//插件加载时执行的代码
public override void Initialize()
{
GetDataHandlers.KillMe.Register(OnKillPlayer); //注册GetDataHandlers数据包钩子(玩家死亡)
}
//回调函数
private void OnKillPlayer(object? sender, GetDataHandlers.KillMeEventArgs e)
{
TShock.Utils.Broadcast($"[死亡]{e.Player.Name}挂掉啦,快来嘲笑他吧!", 0, 255, 120); //发送全服广播
e.Handled = false; //是否处理这个事件,默认为false,如果你标记为true,这个事件将会被忽略,会导致TShock直接忽略这个玩家死亡(不进行重生倒计时)
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
GetDataHandlers.KillMe.UnRegister(OnKillPlayer); //卸载GetDataHandlers数据包钩子(玩家死亡)
}
base.Dispose(disposing);
}
TSPlayer plr = TShock.Players[args.Who]; //获取TShock玩家对象,args.Who是玩家的索引
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 => "钩子测试";
//插件的名称
public override string Name => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
ServerApi.Hooks.ServerJoin.Register(this, OnJoin); //注册钩子
ServerApi.Hooks.ServerLeave.Register(this, OnLeave);
}
private void OnJoin(JoinEventArgs args)
{
TSPlayer plr = TShock.Players[args.Who]; //获取TShock玩家对象,args.Who是玩家的索引
TShock.Utils.Broadcast($"欢迎玩家{plr.Name}加入服务器!", 255, 255, 255); //发送广播Broadcast(内容,R,G,B) R,G,B是对应的RGB颜色代码
}
private void OnLeave(LeaveEventArgs args)
{
TSPlayer plr = TShock.Players[args.Who]; //获取TShock玩家对象,args.Who是玩家的索引
TShock.Utils.Broadcast($"玩家{plr.Name}离开服务器!", 255, 255, 255); //发送广播Broadcast(内容,R,G,B) R,G,B是对应的RGB颜色代码
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
ServerApi.Hooks.ServerJoin.Deregister(this, OnJoin); //注销钩子
ServerApi.Hooks.ServerLeave.Deregister(this, OnLeave);
}
base.Dispose(disposing);
}
}
}
ServerApi.Hooks.GameInitialize.Register(this,(args) => { Console.WriteLine("触发GameInitialize"); });
ServerApi.Hooks.GamePostInitialize.Register(this,(args) => { Console.WriteLine("触发GamePostInitialize"); });
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 => "钩子测试";
//插件的名称
public override string Name => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
ServerApi.Hooks.GamePostInitialize.Register(this, OnGamePostInitialize); //注册钩子
}
private void OnGamePostInitialize(EventArgs args)
{
Console.WriteLine("服务器已经加载完啦!");
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
ServerApi.Hooks.GamePostInitialize.Deregister(this, OnGamePostInitialize); //卸载钩子
}
base.Dispose(disposing);
}
}
}
string ip = e.Player.IP;
using System.Reflection;
using Terraria;
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 => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
PlayerHooks.PlayerPostLogin += PlayerHooks_PlayerPostLogin; //注册钩子
}
private void PlayerHooks_PlayerPostLogin(PlayerPostLoginEventArgs e)
{
e.Player.SendSuccessMessage($"您的登录IP是:{e.Player.IP}");
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
PlayerHooks.PlayerPostLogin -= PlayerHooks_PlayerPostLogin; //注销钩子
}
base.Dispose(disposing);
}
}
}
参考答案
using System.Reflection;
using Terraria;
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 => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
GeneralHooks.ReloadEvent += GeneralHooks_ReloadEvent;
}
private void GeneralHooks_ReloadEvent(ReloadEventArgs e)
{
//这个钩子非常常用,可以让你用/reload统一重载插件
TSPlayer.All.SendWarningMessage("服务器正在重载!!!"); //这是发送全服广播的另一种方法,TSPlayer.All对象可以代表全服所有玩家
//上面代码也可以换为
//TShock.Utils.Broadcast("服务器正在重载!!!",255,135,0);
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
GeneralHooks.ReloadEvent -= GeneralHooks_ReloadEvent;
}
base.Dispose(disposing);
}
}
}
int chestIndex = Chest.FindChest(e.X,e.Y); //找到箱子的索引
Chest chest = Main.chest[chestIndex]; //获取箱子对象
//箱子名称: chest.name, 箱子X坐标: chest.x, 箱子Y坐标: chest.y, 箱子物品数组: chest.item
using System.Reflection;
using Terraria;
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 => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
GetDataHandlers.ChestOpen.Register(ChestOpen); //注册钩子
}
private void ChestOpen(object? sender, GetDataHandlers.ChestOpenEventArgs e)
{
int chestIndex = Chest.FindChest(e.X,e.Y); //找到箱子的索引
Chest chest = Main.chest[chestIndex]; //获取箱子对象
TSPlayer.All.SendWarningMessage($"玩家{e.Player}打开了箱子{chest.name}位于({chest.x}, {chest.y})");
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
GetDataHandlers.ChestOpen.UnRegister(ChestOpen); //注销钩子
}
base.Dispose(disposing);
}
}
}
//只写日志
TShock.Log.Info("信息Log");
TShock.Log.Warn("警告Log");
TShock.Log.Error("错误Log");
TShock.Log.Debug("调试Log,要在Config打开Debug才会生效哦");
//写日志并打印到控制台
TShock.Log.ConsoleInfo("信息Log,会打印在控制台上哦");
TShock.Log.ConsoleWarn("警告Log,会打印在控制台上哦");
TShock.Log.ConsoleError("错误Log,会打印在控制台上哦");
TShock.Log.ConsoleDebug("调试Log,会打印在控制台上哦,要在Config打开Debug才会生效哦");
bool pvp = e.Pvp //切换前状态为!e.pvp
e.Player.SetPvP(bool);
using System.Reflection;
using Terraria;
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 => "Hooks";
//插件的版本
public override Version Version => Assembly.GetExecutingAssembly().GetName().Version;
//插件的构造器
public Plugin(Main game) : base(game)
{
}
//插件加载时执行的代码
public override void Initialize()
{
GetDataHandlers.TogglePvp.Register(TogglePvp); //注册钩子
}
private void TogglePvp(object? sender, GetDataHandlers.TogglePvpEventArgs e)
{
e.Player.SendErrorMessage("本服务器禁止切换PVP模式"); //给玩家发送消息
TShock.Log.ConsoleInfo($"玩家{e.Player.Name}试图{(e.Pvp?"打开":"关闭")}PVP"); //输出日志
e.Player.SetPvP(!e.Pvp); //设置PVP(和e.Pvp相反)
e.Handled = true; //标记为已处理,即忽略这个事件
}
//插件卸载时执行的代码
protected override void Dispose(bool disposing)
{
if (disposing)
{
GetDataHandlers.TogglePvp.UnRegister(TogglePvp); //注销钩子
}
base.Dispose(disposing);
}
}
}