SagaDungeons 更新日志
版本 1.2.0.71 (2025-06-05)
新增功能
- 实现了GUI多语言系统
- 创建了GUILanguageManager类,专门管理GUI界面的多语言支持
- 添加了lang_gui.yml(中文)和lang_gui_en.yml(英文)配置文件
- 修改了AbstractGUI基类,添加多语言支持方法和辅助工具
- 成功改造了9个主要GUI类,支持根据config.yml的lang配置自动加载对应语言文件
- 包含200+条GUI文本配置,覆盖所有界面元素
功能改进
- 优化了GUI文本管理系统
- 所有GUI硬编码中文消息改为从配置文件读取
- 支持动态占位符替换,如模板名称、玩家名称等
- 实现了语言文件回退机制,确保系统稳定性
- 添加了便捷的辅助方法,简化GUI类的多语言实现
版本 1.2.0.66 (2025-06-05)
问题修复
- 修复了GUI编辑功能与模板配置文件不同步的问题
- 解决了GUI中修改创建条件开关后配置文件未更新的问题
- 在所有GUI保存操作后添加了模板重新加载机制,确保内存与配置文件同步
- 修复了创建副本时仍使用旧配置的问题,现在会使用最新的配置文件内容
- 涉及13个文件的修改:9个GUI类和4个命令类
技术改进
- 在所有saveTemplate()调用后添加reloadTemplate()确保数据一致性
- 优化了模板配置的实时同步机制,提高了配置修改的可靠性
- 遵循统一方法原则,在所有相关位置应用相同的重新加载逻辑
版本 1.2.0.30 (2025-06-05)
新增功能
- 实现了玩家离线重连副本状态恢复系统
- 解决了玩家在副本内离线后再次上线导致的状态不一致问题
- 添加了handlePlayerReconnection()方法处理玩家重新连接时的副本状态检查
- 实现了智能状态恢复机制:自动检测玩家是否在副本世界并恢复相应状态
- 添加了孤立玩家处理:当玩家在已失效的副本世界时自动传送到安全位置
功能改进
- 增强了PlayerListener.onPlayerJoin()事件处理
- 延迟1tick检查玩家状态,确保玩家完全加载后再进行状态检查
- 添加了多种重连场景的处理逻辑:状态恢复、权限验证、孤立清理
- 扩展了DungeonManager类功能
- 添加了findDungeonByWorldName()方法根据世界名称查找对应副本实例
- 将setPlayerGameMode()方法改为公有,支持状态恢复时的游戏模式设置
- 完善了副本安全系统
- 重连时自动验证玩家权限,无权限玩家将被安全移除
- 支持公开副本、私有副本、创建者等多种权限验证
消息系统更新
- 在messages.yml中添加了重连相关消息配置
- dungeon.reconnect.restored: 玩家状态恢复成功消息
- dungeon.reconnect.rejoined: 玩家重新加入副本消息
- dungeon.reconnect.orphaned: 玩家被从失效副本中移除消息
问题修复
- 修复了玩家在副本内离线后再次上线时的状态不一致问题
- 修复了重连后玩家游戏模式不正确的问题
- 修复了重连后玩家缺少合法副本进入权限的问题
- 修复了孤立玩家可能滞留在已删除副本世界的问题
[MD]
# SagaDungeons 更新日志
## 版本 1.2.0.13 (2025-06-04)
### 新增功能
- 实现了自定义遣返点功能
- 添加了`/sd admin setback`命令,管理员可设置非法玩家遣返位置
- 创建了SetBackCommand类处理遣返点设置
- 增强了DungeonSecurityManager,优先使用自定义遣返点,包含安全位置检查
- 在config.yml中添加了security.custom-kickback-location配置项
## 版本 1.1.0.99 (2025-06-04)
### 新增功能
- 实现了副本安全进入控制系统
- 添加了指令黑名单功能,阻止玩家在副本中使用非法传送指令
- 实现了合法身份检测机制,只允许通过项目合法方式进入副本
- 创建了DungeonSecurityManager类统一管理副本安全功能
## 版本 1.1.0.98 (2025-06-04)
### 新增功能
- 完成了GUI管理系统开发
- 实现了EditCommand和TemplateEditMainGUI主界面
- 完成了基础信息编辑GUI(TemplateBasicEditGUI)
- 完成了创建条件编辑GUI(TemplateConditionsEditGUI)
- 完成了奖励系统编辑GUI(TemplateRewardsEditGUI)
- 完成了通关条件和刷怪点编辑GUI(TemplateCompletionEditGUI/TemplateSpawnersEditGUI)
### 功能改进
- 实现了完整的聊天输入监听系统
- 支持数值、文本、小数输入验证
- 集成AsyncPlayerChatEvent确保Bukkit兼容性
- 使用BukkitScheduler确保线程安全
- 完成了配置数据读取系统
- 所有GUI界面现在显示配置文件中的实际数据
- 支持实时配置读取和界面更新
- 实现了高级管理界面系统
- 物品奖励管理界面(ItemRewardManageGUI)
- 命令奖励管理界面(CommandRewardManageGUI)
- 时间奖励管理界面(TimeRewardManageGUI)
- 物品条件管理界面(ItemConditionManageGUI)
- 组合条件管理界面(CompositeConditionManageGUI)
- 完成了刷怪点管理系统
- 刷怪点编辑功能(SpawnerEditGUI)
- 刷怪点传送功能
- 刷怪点添加功能(SpawnerAddGUI)
- 实现了位置设置系统
- 到达区域位置设置功能
## 版本 1.0.9.7 (2025-06-03)
### 新增功能
- 集成了bStats统计系统
- 添加了插件使用数据收集功能,帮助开发者了解插件使用情况
- 实现了自定义统计图表:活跃副本数量、可用模板数量、集成的外部插件、使用的语言
- 使用官方bStats-bukkit 3.0.2版本,确保数据安全和隐私保护
- 插件ID:26069,可在 https://bstats.org/plugin/bukkit/SagaDungeons 查看统计数据
### 技术改进
- 在build.gradle中添加了bStats依赖和shadow插件重定位配置
- 使用`implementation 'org.bstats:bstats-bukkit:3.0.2'`添加依赖
- 配置shadow插件将bStats重定位到`cn.i7mc.sagadungeons.libs.bstats`包下,避免与其他插件冲突
- 在SagaDungeons主类中添加了bStats初始化方法
- 在onEnable方法中调用initializeMetrics()方法
- 添加了四个自定义统计图表收集插件使用数据
- 为DungeonManager和TemplateManager类添加了统计方法
- 添加了`getActiveDungeonCount()`方法统计活跃副本数量
- 添加了`getTemplateCount()`方法统计可用模板数量
### 数据收集说明
- **活跃副本数量**:实时统计当前服务器上运行的副本实例数量
- **可用模板数量**:统计服务器配置的副本模板总数
- **集成的外部插件**:显示已成功集成的外部插件(Vault、PlayerPoints、MythicMobs、PlaceholderAPI)
- **使用的语言**:统计插件配置的语言设置(中文/英文等)
### 隐私保护
- bStats收集的数据完全匿名,不包含任何服务器或玩家的个人信息
- 所有数据仅用于统计分析,帮助改进插件功能和性能
- 服务器管理员可以通过bStats配置文件禁用数据收集
## 版本 1.0.9.6 (2025-06-03)
### 新增功能
- 实现了副本通关后的视觉效果系统
- 添加了通关后烟花效果:玩家每3秒放3个随机样式的烟花,持续到传送离开副本
- 实现了Title大标题显示:显示"恭喜你通关副本"和倒计时小标题
- 添加了倒计时提示系统:最后3秒前每5秒提示,最后3秒每1秒提示
- 使用Bukkit原生API处理Title显示,确保bukkit服务端兼容性
### 功能改进
- 优化了通关后的用户体验
- 将硬编码的时间值移至config.yml配置文件,支持自定义配置
- 实现了可配置的倒计时系统,管理员可自定义提示间隔和传送延迟
- 所有提示消息在消息配置文件中可自定义,避免硬编码
### 问题修复
- 修复了通关消息配置结构问题
- 解决了消息key路径不一致的问题:统一使用'dungeon.completion.success'路径
- 修正了英文消息文件messages_en.yml中completion节点位置错误的问题
- 确保中英文消息文件结构一致,避免"消息未找到"错误
### 配置更新
- 在config.yml中添加了通关相关的时间配置
```yaml
completion:
teleport-delay: 10 # 通关后传送延迟(秒)
countdown-interval: 5 # 倒计时提示间隔(秒)
final-countdown: 3 # 最后倒计时开始时间(秒)
firework-interval: 3 # 烟花发射间隔(秒)
```
- 在消息配置文件中添加了通关相关消息
- 倒计时提示消息:`dungeon.completion.countdown`
- 最后倒计时消息:`dungeon.completion.final-countdown`
- Title显示消息:`dungeon.completion.title`和`dungeon.completion.subtitle`
## 版本 1.0.9.4 (2025-05-24)
### 新增功能
- 实现了基于时间的提前通关奖励系统
- 添加了 `TimeReward` 奖励类,支持根据完成时间给予不同奖励
- 在 `DungeonTemplate` 中添加了 `timeRewards` 配置支持,使用 `TreeMap` 智能匹配最佳时间奖励
- 扩展了 `TemplateManager` 的 `parseTimeString()` 方法,支持多种时间格式:`3600`(秒)、`"1h"`(小时)、`"90m"`(分钟)、`"30s"`(秒)、`"1d"`(天)
- 在 `RewardManager` 中添加了 `giveTimeRewards()` 方法,处理时间奖励的给予和消息显示
- 修改了 `DungeonInstance.handleCompletion()` 方法,自动计算完成时间并给予相应的时间奖励
### 功能特点
- **智能时间匹配**:使用 `TreeMap.floorEntry()` 方法自动选择符合条件的最佳时间奖励
- **灵活的时间格式**:支持纯数字秒数和带单位的时间格式,自动解析转换
- **完整的消息系统**:在完成消息中显示用时,专门的时间奖励消息提示
- **向后兼容**:不影响现有的基础奖励系统,可选功能,完全遵循项目的模块化架构
### 配置示例
```yaml
# 时间奖励配置 - 根据完成时间给予不同奖励
timeRewards:
# 1小时内完成 - 最高奖励
"1h":
commands:
- "give %player% diamond 5"
- "eco give %player% 1000"
- "say %player% 在1小时内完成了副本,获得钻石奖励!"
# 1.5小时内完成 - 中等奖励
"90m":
commands:
- "give %player% gold_ingot 10"
- "eco give %player% 500"
- "say %player% 在1.5小时内完成了副本,获得金锭奖励!"
# 2小时内完成 - 基础奖励
"2h":
commands:
- "give %player% iron_ingot 20"
- "eco give %player% 200"
- "say %player% 在2小时内完成了副本,获得铁锭奖励!"
```
### 消息配置更新
- 更新了 `messages.yml` 中的完成消息,添加了用时显示
- 添加了时间奖励相关的消息配置:`dungeon.reward.time.header`、`dungeon.reward.time.description`、`dungeon.reward.time.footer`
- 更新了副本模板示例 `templates/example/config.yml`,添加了时间奖励配置示例
## 版本 1.0.9.3 (2025-05-18)
### 问题修复
- 修复了使用`/sd admin delete`命令删除副本时世界卸载失败的问题
- 实现了完整的世界卸载和删除流程:1.将玩家传送出世界 2.保存世界 3.延迟20tick 4.卸载世界 5.再延迟20tick 6.删除世界文件
- 添加了适当的延迟机制,确保每个操作都有足够的时间完成,避免NoSuchFileException错误
- 保留了玩家传送和实体清理步骤,确保安全删除
- 修复了复制世界文件时`session.lock`和`uid.dat`文件导致的问题
- 在文件复制过程中添加了对`session.lock`文件的过滤,避免复制被锁定的文件
- 在文件复制过程中添加了对`uid.dat`文件的过滤,避免创建的副本世界被识别为重复世界
- 在文件计数和大小统计过程中也忽略这些特殊文件,确保进度计算准确
### 性能优化
- 优化了副本世界生成过程,显著减少主线程卡顿
- 添加了创建锁机制,防止多个副本同时创建导致服务器过载
- 使用Java 17的新特性优化文件操作,提高文件复制和删除效率
- 改进了异步文件复制机制,使用Files.walk和Stream API替代传统的递归方法
- 优化了世界加载参数,减少资源消耗
- 添加了详细的性能日志,记录文件操作和世界加载耗时
- 使用最新的Paper 1.20.1 API,如WorldCreator的keepSpawnLoaded方法和GameRule枚举
### 代码优化
- 重构了WorldManager类中的世界卸载和删除相关方法
- 改进了deleteDungeonWorld方法,实现分步骤的世界卸载和删除流程
- 优化了deleteWorldFolder方法,添加了世界保存、延迟卸载和延迟删除机制
- 统一了世界删除逻辑,确保代码简洁高效且操作安全可靠
- 添加了更详细的调试日志,记录世界卸载和删除的每个步骤
- 优化了BukkitFileUtil类中的文件操作方法
- 改进了文件删除逻辑,使用倒序排序确保先删除文件和子目录,再删除父目录
- 优化了文件复制过程,分两步进行:先创建所有目录结构,再复制所有文件
- 添加了对特殊文件的过滤机制,避免复制被锁定的文件
- 将所有硬编码的日志信息移至debugmessage.yml文件中,使其可自定义
### 功能改进
- 改进了服务器关闭时的副本世界清理机制,确保不会留下残留世界
- 优化了世界创建过程,添加了更多游戏规则设置,如关闭火焰蔓延、随机刻等
- 改进了世界加载参数配置,减少资源消耗和服务器负载
- 添加了创建锁状态检查和提示消息,当有副本正在创建时,其他玩家会收到友好提示
- 增强了世界卸载和删除机制,添加了延迟处理和状态检查,确保操作安全可靠
- 添加了对英文版消息文件的支持,修复了"admin-close"消息键缺失的问题
[/MD]
1.修复刷怪点冷却时间管理
2.修复死亡重生到副本设定只的出生点[/sd admin setspawn]
3.增加强制进入副本的游戏模式
YAML:# 游戏模式设置 forceGameMode: true # 是否强制游戏模式(默认:true) gameMode: "ADVENTURE" # 强制的游戏模式(SURVIVAL、CREATIVE、ADVENTURE、SPECTATOR)
附件
YAML:# 时间奖励配置 - 根据完成时间给予不同奖励 # 时间格式支持:3600(秒)、"1h"(小时)、"90m"(分钟)、"30s"(秒) # 注意:时间越短奖励越好,系统会自动选择符合条件的最佳奖励 timeRewards: # 1小时内完成 - 最高奖励 "1h": commands: - "give %player% diamond 5" - "eco give %player% 1000" - "say %player% 在1小时内完成了副本,获得钻石奖励!" # 1.5小时内完成 - 中等奖励 "90m": commands: - "give %player% gold_ingot 10" - "eco give %player% 500" - "say %player% 在1.5小时内完成了副本,获得金锭奖励!" # 2小时内完成 - 基础奖励 "2h": commands: - "give %player% iron_ingot 20" - "eco give %player% 200" - "say %player% 在2小时内完成了副本,获得铁锭奖励!"
### 问题修复
- 修复了使用`/sd admin delete`命令删除副本时世界卸载失败的问题
- 采用单一有效方法:直接删除文件夹,跳过世界卸载步骤
- 保留了玩家传送和实体清理步骤,确保安全删除
### 性能优化
- 优化了副本世界生成过程,显著减少主线程卡顿
- 添加了创建锁机制,防止多个副本同时创建导致服务器过载
- 使用Java 17的新特性优化文件操作,提高文件复制和删除效率
- 改进了异步文件复制机制,使用Files.walk和Stream API替代传统的递归方法
- 优化了世界加载参数,减少资源消耗
- 添加了详细的性能日志,记录文件操作和世界加载耗时
- 使用最新的Paper 1.20.1 API,如WorldCreator的keepSpawnLoaded方法和GameRule枚举
### 代码优化
- 极度简化了WorldManager类中的世界卸载和删除相关方法
- 简化了deleteDungeonWorld方法,直接调用异步文件删除
- 优化了deleteWorldFolder方法,移除了多余的重试机制
- 统一了世界删除逻辑,确保代码简洁高效
- 优化了BukkitFileUtil类中的文件操作方法
- 改进了文件删除逻辑,使用倒序排序确保先删除文件和子目录,再删除父目录
- 优化了文件复制过程,分两步进行:先创建所有目录结构,再复制所有文件
### 功能改进
- 改进了服务器关闭时的副本世界清理机制,确保不会留下残留世界
- 优化了世界创建过程,添加了更多游戏规则设置,如关闭火焰蔓延、随机刻等
- 改进了世界加载参数配置,减少资源消耗和服务器负载
- 添加了创建锁状态检查和提示消息,当有副本正在创建时,其他玩家会收到友好提示
## 版本 1.0.9 (2025-05-17)
### 代码优化
- 优化了指令结构,将刷怪点管理指令从玩家指令移至管理员指令
- 创建了新的`SpawnerAdminCommand`类,用于管理副本刷怪点
- 修改了`AdminCommand`类,添加了对`SpawnerAdminCommand`的调用
- 更新了指令帮助信息,反映了新的指令结构
- 添加了`getCurrentDungeonId`方法到`DungeonManager`类,用于获取玩家当前所在副本ID
### 功能改进
- 改进了指令权限管理,确保只有管理员可以管理刷怪点
- 保持了与现有功能的兼容性,刷怪点管理功能不变,只是移动了指令位置
## 版本 1.0.8 (2025-05-17)
### 功能改进
- 优化了MythicMobs怪物生成机制
- 添加了`MobSpawnerManager`类,负责管理副本中的怪物生成
- 在`MythicMobsHook`类中添加了`spawnMob`方法,用于直接生成怪物
- 修改了`SpawnerCommand`类,使用新的方法生成怪物
- 在`DungeonManager`类中添加了代码,在创建副本世界成功后初始化刷怪点,并在删除副本时清理刷怪点
### 问题修复
- 修复了命令设置的副本MythicMobs怪物出生点会在MythicMobs插件目录生成持久化保存的出生点配置文件的问题
- 修复了玩家进入副本后怪物不刷新的问题,通过改进位置解析和延迟初始化刷怪点解决
- 修复了刷怪点位置错误保存临时副本世界名称(如"sd_001-fba")的问题,现在只保存坐标信息
- 修复了位置字符串包含模板名称(如"fba,x,y,z,yaw,pitch")导致无法正确解析的问题
- 改进了怪物生成逻辑,不再依赖持久化的刷怪点配置文件
- 优化了副本关闭时的怪物清理机制,确保不会留下残留实体
## 版本 1.0.7 (2025-05-17)
### 新增功能
- 实现了副本触发系统
- 添加了 `DungeonTrigger` 接口,支持自定义触发器实现
- 实现了 `LevelJumpTrigger` 类,用于处理副本关卡跳转
- 添加了 `TriggerManager` 类,用于管理和执行触发器
- 支持触发器优先级和条件组合
- 优化了触发器执行逻辑,确保线程安全
### 功能改进
- 优化了副本关卡切换机制,使用触发器系统替代原有的直接跳转
- 改进了触发器条件检查逻辑,支持更复杂的条件组合
- 增强了触发器执行的可配置性,支持自定义执行顺序和优先级
### 配置示例
```yaml
triggers:
level_jump:
type: LEVEL_JUMP
priority: 1
conditions:
- type: MOB_KILL
count: 10
- type: REACH_AREA
location: "world,100,64,100"
radius: 3.0
actions:
- type: JUMP_TO_LEVEL
target_level: 2
```
## 版本 1.0.6 (2025-05-17)
### 新增功能
- 增强了副本通关条件系统
- 添加了条件组合模式(AND/OR)支持
- 实现了条件优先级系统
- 支持多级条件组合
- 优化了条件进度显示
### 功能改进
- 优化了通关条件的配置结构,支持更灵活的条件组合
- 改进了条件进度计算逻辑,为AND/OR模式提供不同的进度计算方式
- 增强了条件描述系统,提供更详细的进度信息
### 配置示例
```yaml
completion:
# 组合条件示例
composite:
type: AND # 或 OR
priority: 1
conditions:
condition1:
killCount:
count: 10
condition2:
reachArea:
location: "world,100,64,100"
radius: 3.0
```