WarZDuelTime —— 经典单挑插件的重制版|1.13-1.21+ | 多竞技场 / 排位 / 商城 / Folia 支持

二次开发 游戏模式 WarZDuelTime —— 经典单挑插件的重制版|1.13-1.21+ | 多竞技场 / 排位 / 商城 / Folia 支持 2.6.17

完成注册/登录后下载
更新总结 (v1.8.6)
1. 配置文件更新 ( config.yml )

- 在 Arena.classic 下新增了 anti-farming (防刷分)配置模块。
- 默认配置已写入文件:
```
# 防刷分设置 (防止小号互刷)
anti-farming:
enabled:
false # 是否开
启防刷分检测 (默认 false)
time-window:
300 # 检测的时间
窗口,单位秒 (默认 300秒/5分钟)
max-matches:
2 # 在时间窗口
内允许的最大获胜次数 (默认 2次)
penalty-exp-percentage: 100.
0 # 触发限制后扣除经验的百分比
(100.0 代表扣除所有奖励)
penalty-point-percentage:
100.0 # 触发限制后扣除积分的百分
比
```
修复平局后的权限问题
- 问题描述 : 之前版本中,当 Classic Arena (1v1) 比赛因时间耗尽平局结束时,玩家被传送回大厅后仍然被判定为“游戏中”,导致无法移动或交互(提示无权限)。
- 修复方案 : 修正了 ClassicArena.java 中的时间结束处理逻辑。
- 技术细节 : 将原有的 this.end() 调用替换为 WarZDuelTime.getInstance().getArenaManager().end(getId()) 。这确保了 ArenaManager 会先执行 removeGamerFromMap() 将玩家从游戏映射表中移除,彻底解除玩家的“游戏中”状态。
更新内容 (v1.8.4)
1. 修复附加功能缺失问题 :

- 修复了经典模式(Classic Arena)无法通过 /dt arena function 添加附加功能的问题。
- 现在可以正常添加以下功能了:
- dueltime:countdown (开始前倒计时)
- dueltime:spectate (观战点)
- dueltime:time_limit (比赛限时)
- dueltime:pre_game_command (赛前指令)
- dueltime:inventory_check_keyword (背包检查-关键词)
- dueltime:inventory_check_type (背包检查-材质)
- dueltime:ban_entity_spawn (禁止实体生成)
2. 版本号更新 :

- 插件版本已更新至 1.8.4 。
本次更新主要为了 增强对附属插件的支持 ,修复了之前阻碍 WarZDuelTimeTeam 正常工作的两个核心问题:

1. 修复竞技场类型识别错误 (ArenaTypeManager) :

- 问题 : 之前系统强制为所有竞技场类型 ID 添加 dueltime: 前缀,导致附属插件注册的类型(如 warzdueltimeteam:team )无法被识别。
- 修复 : 优化了 ID 解析逻辑,现在支持识别带有自定义前缀的 ID,并增加了后缀匹配(如输入 team 可自动匹配到 warzdueltimeteam:team )。
2. 放宽创建流程验证 (Progress) :

- 问题 : 之前创建流程的 ID 必须以 dueltime 或主插件名开头,导致附属插件的创建流程被拦截报错。
- 修复 : 移除了对 ID 前缀的强制限制,现在允许附属插件使用自己的命名空间注册创建流程。
- 新增 PvP 时间限制功能 :

- 在 config.yml 中新增了 time-limit 配置项,允许自定义竞技场的时间限制。
- 功能默认开启(可关闭),默认时长为 300 秒。
- 新增时间耗尽惩罚机制 :

- 支持自定义时间耗尽后的比赛结果。
- DRAW (默认): 平局,双方不加分也不扣分(原版逻辑)。
- DEDUCT : 双方判负,双方都会被扣除经验和积分(如同失败一样),以此激励玩家在时限内决出胜负。
- 配置项说明 ( config.yml ) :

```
Arena:
classic:
# ...
# 时间限制设置
time-limit:
enabled: true # 是否开
启时间限制
time: 300 # 限制时
长(秒)
# 时间耗尽后的结果:
# DRAW - 平局 (不扣分)
# DEDUCT - 双方判负 (扣分)
result: DEDUCT
```
本次更新主要修复了玩家在竞技场(Arena)1v1 结束后,原版经验(Minecraft Vanilla Experience)被重置的问题。

详细修复内容:

1. 经验保存 :

- 修改了 ClassicGamerData.java ,在玩家加入竞技场时,记录其当前的等级(Level)和经验进度(Exp)。
- ClassicGamerData.java
2. 经验恢复 :

- 修改了 ClassicArena.java 的 end() 方法,在竞技场比赛结束(无论胜负或平局)传送回大厅或原点后,将玩家的等级和经验恢复为比赛开始前记录的数值。
- ClassicArena.java
3. 防止意外掉落 :

- 修改了 ClassicArenaListener.java ,在玩家于竞技场内死亡时,设置 keepLevel 为 true 且掉落经验为 0 ,防止因死亡机制导致的原版经验丢失,确保后续恢复逻辑能正常工作。
- ClassicArenaListener.java
修复说明
问题出在 ChatListener.java 中。原有的代码逻辑在设置聊天格式时,直接使用段位显示的配置覆盖了原有的聊天格式(包含了玩家名和聊天内容),导致聊天内容丢失。
修复命令别称错误问题
1. 核心修复:商城缓存污染 (Critical Fix)
- 问题现象 : 商城刚开始可用,但在玩家购买物品后(特别是 ItemsAdder 物品或堆叠物品),菜单随即损坏打不开。
- 根本原因 : 插件在发放奖励时直接使用了缓存中的物品对象引用。当 player.getInventory().addItem() 修改物品数量(例如扣除堆叠)时, 缓存中的原始数据也被同步修改了 (变成了空或数量为0),导致后续打开菜单读取到坏数据而报错。
- 修复方案 : 在 ShopListener.java 中,发放物品前强制执行 .clone() ,确保缓存数据永远保持纯净,不再受玩家背包操作影响。
2. 异常防御:空指针崩溃修复
- GUI 容错 : 在 GUIItem.java 中增加了对商品数据的校验。如果某个商品数据损坏(如变成了空气),现在会在菜单中显示为一个红色的 “Error Item” (屏障) ,而不是直接导致整个插件报错崩溃。
- 工具类增强 : UtilItemBuilder.java 中为所有 ItemMeta 操作(设置Lore、显示名称等)增加了空指针检查,极大提高了插件的稳定性。
- 竞技场移动事件 : 修复了 PlayerMoveEvent 中因竞技场功能数据(Functions Map)为空导致的 NullPointerException 报错。
3. 功能支持:ItemsAdder 物品
- 此前 ItemsAdder 物品在商城中容易失效正是因为上述的“缓存污染”问题(NBT数据丢失或损坏)。
- 修复后,只要 ItemsAdder 物品能被正常保存到数据库,即可在商城中正常显示和交易。
针对 PlayerMoveEvent 导致的 NullPointerException 崩溃问题,主要修复了以下两点:

1. 修复 BaseArenaData.java 中的空指针风险

- 修改了 getFunctionData 方法,增加对 functions 映射表的空值检查。如果 functions 为 null ,现在会安全返回 null 而不是抛出异常。
2. 增强 ClassicArenaListener.java 的健壮性

- 在尝试获取观战功能数据( CLASSIC_SPECTATE )之前,添加了 hasFunction 检查。确保只有在竞技场确实启用了该功能且数据存在时,才会尝试读取数据。
后退
顶部 底部