解读Towny事件系统:150+自定义事件如何让你开发强力扩展插件

📅 2026/8/22 13:53:03
解读Towny事件系统:150+自定义事件如何让你开发强力扩展插件
解读Towny事件系统150自定义事件如何让你开发强力扩展插件【免费下载链接】TownyTowny Advanced Minecraft plugin for Bukkit/Spigot.项目地址: https://gitcode.com/gh_mirrors/to/TownyTowny 是一款运行在 Minecraft 服务器Paper/Folia上的经典领地管理插件而它的事件系统是插件开发者的宝藏——Towny/src/main/java/com/palmergames/bukkit/towny/event/目录下定义了235 个自定义事件类覆盖建镇、占地、经济交易、战争伤害等几乎所有游戏行为。学会监听这些Towny 自定义事件你无需修改一行 Towny 源码就能开发出强力扩展插件。 为什么 Towny 的事件系统值得研究很多插件只依赖 Bukkit 原生事件但 Towny 的领地归属税率敌友关系等核心逻辑是插件私有数据原生事件根本感知不到。Towny 的解法是在每一个关键业务节点主动广播自定义事件把决策权交给生态。这种设计的直接好处✅松耦合——Towny 自身功能也通过监听自己的事件实现见下文扩展与核心代码完全隔离✅可取消——大部分前置事件支持拦截相当于给你的插件一个一票否决权✅可修改——部分事件参数如建镇价格允许第三方实时改写✅异步安全——所有事件构造器都通过super(!Bukkit.getServer().isPrimaryThread())声明线程安全天然适配 Folia 多线程服务器️ 20 事件分类从一块地到整个国家事件按业务域划分在event/下的子包中这也是你查事件最快的路径分类目录事件示例典型用途town/NewTownEvent、TownConqueredEvent、TownMayorChangeEvent建镇/灭城/镇长变更通知nation/PreNewNationEvent、NationMergeEvent建国拦截、国家合并监听plot/PlotClaimEvent、PlotSetForSaleEvent、PlotTrustAddEvent占地、售地、信任委托economy/TownPreTransactionEvent、TownEntersBankruptcyEvent交易审核、破产提醒damage/TownBlockPVPTestEvent、WildernessPVPTestEvent自定义 PVP 与伤害规则actions/TownyBuildEvent、TownyDestroyEvent建造/破坏细粒度管控deathprice/DeathPriceEvent死亡罚款逻辑定制teleport/ResidentSpawnEvent、UnjailedResidentTeleportEvent传送与出狱逻辑time/PreNewDayEvent、NewHourEvent每日税收、整点任务resident/ResidentPreJailEvent、ResidentJailEvent监禁流程定制 技巧找事件时先看包名对应业务域再按Pre*/ 动词 命名规则过滤10 秒定位。 核心模式Pre 与 Post 双阶段事件Towny 事件最重要的设计是两阶段命名法理解它就理解了 80% 的事件前置事件Pre*Event行动前的拦截与改写以 PreNewTownEvent.java 为例它携带玩家、镇名、位置、价格四个参数其中价格是可写的——第三方插件可以在监听器里直接setPrice()实现VIP 玩家建镇半价这类功能。后置事件*Event行动完成后的通知NewTownEvent.java 在城镇真正创建后广播只暴露最终的Town对象。它不可取消适合做建镇烟花庆祝新镇排行榜刷新这类副作用。一句话记忆Pre管能不能做、代价多少无Pre管做了什么。 CancellableTownyEvent优雅地拒绝玩家所有可取消的前置事件都继承自 CancellableTownyEvent.java它在标准 Bukkit 的Cancellable接口之上多了一个关键成员——cancelMessage你取消事件时可以用setCancelMessage()附一条给玩家的友好提示置空字符串则静默拒绝不打扰玩家Towny 内部通过CancelledEventException把这条消息回传给执行者这意味着你的扩展插件不仅能拦截还能用玩家听得懂的语言解释为什么被拦截——比如该区域为保护区禁止建镇体验远好于 Bukkit 原生事件里只能event.setCancelled(true)的沉默拒绝。 实战完整走一遍建镇事件流以玩家执行/town new为例事件流在 TownCommand.java 中清晰可见广播PreNewTownEvent——价格取自配置但此时第三方插件可以改写或取消BukkitTools.ifCancelledThenThrow会把取消转化为异常中断流程按事件里可能被修改过的价格校验玩家钱包弹出确认框玩家确认后创建城镇对象广播NewTownEventTowny 自己的监听器 TownyCustomListener.java 接手在领地上撒粒子特效、10 秒后提醒镇长预留维护费、发放奖励地皮第 4 步是精髓Towny 的核心逻辑不写在命令类里而是作为事件的第一个消费者。你的扩展插件和它站在同一起跑线上——同一条事件总线只是注册顺序不同。️ 插件开发最该监听的 5 个高价值事件事件所在模块能做出什么扩展TownBlockPVPTestEventdamage/战争模式插件按时间段动态开关 PVPTownPreTransactionEventeconomy/财务审计插件拦截可疑转账、记账入数据库TownyBuildEventactions/建筑管控插件限制方块白名单PreNewDayEventtime/活动插件每日结算排行榜、发放登录奖励NationMergeEventnation/史书记录插件自动归档国家合并大事记另外两个容易被忽略的入口TownyActionEventExecutor.java建造、破坏、点火等动作事件的统一执行器理解了它就能理解权限判定与事件的衔接StatusScreenEvent 系列玩家打开状态屏时触发是定制 HUD 展示信息的理想钩子⚡ 三步上手在你的插件中接入 TownyAPI引入依赖——参考根目录 pom.xml 中的坐标配置在 IDE 中通过 Maven 引入 Towny 依赖获取实例——通过 TownyAPI.java 获取核心 API配合事件携带的对象Town、Nation、TownBlock读取数据注册监听器——在你的onEnable中用Bukkit.getPluginManager().registerEvents()注册监听器即可如果需要在本地编译 Towny 对照源码学习可克隆仓库git clone https://gitcode.com/gh_mirrors/to/Towny进入Towny/目录执行mvn clean package即可产出插件。✅ 最佳实践与常见坑优先级要选好MONITOR做记录NORMAL做业务LOWEST做兜底——参照 Towny 内部监听器 TownyCustomListener.java 的写法可取消事件记得加ignoreCancelled true避免为已被别人取消的事件做无用功取消时务必设置 cancelMessage这是 Towny 生态的礼仪玩家体验差一截不要在 Pre 事件里做重 I/O——事件可能运行在任意线程Folia 环境异步任务请用 Towny 自带的任务调度器别重复造轮子先搜event/目录确认是否已有对应事件再考虑自定义总结Towny 事件系统用235 个事件类把领地、经济、战争三大系统的每个决策点都开放给了生态Pre事件给你否决权和改写权后置事件给你知情权cancelMessage给了你与玩家对话的通道。对扩展插件开发者而言这是 Minecraft 插件领域事件驱动设计的教科书级实践——读懂它你就掌握了开发强力 Towny 扩展的钥匙。【免费下载链接】TownyTowny Advanced Minecraft plugin for Bukkit/Spigot.项目地址: https://gitcode.com/gh_mirrors/to/Towny创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考