更新日志 – v1.4.3
新增功能
打字机效果 – 为文本元素添加逐字显示动画
可配置显示速度(字符间隔)
可配置开始延迟(动画开始前等待tick数)
可配置光标字符(文本末尾闪烁光标)
支持热重载,通过 /cmenu reload 生效
悬停音效 – 鼠标悬停文本元素时播放音效
可配置音效名称(支持所有Minecraft音效)
可配置音量和音调
可配置冷却时间(防止音效过于频繁)
无效音效配置时自动回退备用音效
修复
修复 config.yml 中 join-run 命令占位符不替换问题
无论是否安装 PlaceholderAPI,内置占位符均正确替换
支持: %player% 、 %player_name% 、 %player_uuid% 、 %player_displayname% 、 %player_x% 、 %player_y% 、 %player_z% 、 %player_world% 、 %player_health% 等
优化
线程安全: HoverEnlargeManager 中 HashMap 替换为 ConcurrentHashMap
内存优化: CursorMenuPlugin.getPlayerTextDisplays() 使用 Collections.emptyList()
稳定性: TypewriterEffect 添加 completed 标志防止重复清理
[MD] # 悬停放大效果 # ========== 打字机效果(新增) ========== typewriter: enabled: true # 启用打字机效果 speed: 2 # 每2个tick显示一个字符(值越小越快) start-delay: 10 # 延迟10个tick后开始显示(约0.5秒) cursor-char: "|" # 光标字符,也可以用 "_" 或 "▌" # ========== 悬停音效(新增) ========== hover-sound: name: "minecraft:block.lever.click" # 音效名称(必填) volume: 0.8 # 音量 0.0-1.0(可选,默认1.0) pitch: 1.2 # 音调 0.5-2.0(可选,默认1.0) cooldown: 20 # 冷却时间ticks(可选,默认20) [/MD]
全面配置化消息 - 所有提示信息现在都可以在lang.yml中自定义配置。
- 支持热加载,修改配置后使用/cursormenu reload即可生效
- 新增50+条可配置消息
- 配置分类:登录提示、注册提示、权限提示、命令提示、玩家管理提示、菜单提示、系统提示、NPC提示、WASD导航提示
代码:# ======================================== # CursorMenu 提示信息配置文件 # 该文件包含插件所有的提示信息配置 # 支持热加载,修改后使用 /cursormenu reload 即可生效 # ======================================== # ======================================== # 登录相关提示 # ======================================== login: success: '&a[CursorMenu] 登录成功!' wrong_password: '&c[CursorMenu] 密码错误' empty_password: '&c[CursorMenu] 密码不能为空' user_not_found: '&c[CursorMenu] 用户不存在' locked: '&c[CursorMenu] 账户已被锁定,请稍后再试' too_many_attempts: '&c[CursorMenu] 登录尝试次数过多,请稍后再试' # ======================================== # 注册相关提示 # ======================================== register: success: '&a[CursorMenu] 用户 %player_name% 注册成功!' failed: '&c[CursorMenu] 注册失败,请稍后重试' password_mismatch: '&c[CursorMenu] 两次输入的密码不一致' invalid_password_length: '&c[CursorMenu] 密码长度必须在6-12位之间' weak_password: '&c[CursorMenu] 密码过于简单,请使用更复杂的密码' user_exists: '&c[CursorMenu] 该账户已注册' empty_password: '&c[CursorMenu] 密码不能为空' empty_confirm_password: '&c[CursorMenu] 确认密码不能为空' error: '&c[CursorMenu] 注册失败,请稍后重试' ip_blacklisted: '&c[CursorMenu] 您的IP地址已被禁止注册' ip_not_in_whitelist: '&c[CursorMenu] 您的IP地址不在允许注册的列表中' # ======================================== # 输入相关提示 # ======================================== input: field_set: '&a[CursorMenu] 当前输入字段已设置为: %field%' data_saved: '&a[CursorMenu] %field% 已设置为: %value%' incomplete: '&c[CursorMenu] 请先完成所有输入项' # ======================================== # 密码可见性相关提示 # ======================================== password: visibility_toggled: '&a[CursorMenu] 密码可见性已切换' visibility_shown: '&a[CursorMenu] 密码已显示' visibility_hidden: '&a[CursorMenu] 密码已隐藏' visibility_button_shown: '[密码:隐藏]' visibility_button_hidden: '[密码:显示]' # ======================================== # 权限相关提示 # ======================================== permission: no_permission: '&c[CursorMenu] 你没有权限使用该命令' no_permission_button: '&c[CursorMenu] 你没有权限执行该按钮' no_permission_menu: '&c[CursorMenu] 你没有权限打开该菜单' player_only: '&c[CursorMenu] 仅玩家可用' # ======================================== # 命令相关提示 # ======================================== command: unknown_argument: '&c[CursorMenu] 未知参数' reload: '&a[CursorMenu] 插件重载成功...' reload_complete: '&a[CursorMenu] 插件重载完成!' menu_not_found: '&c[CursorMenu] 菜单 ''%menu%'' 未找到,请检查配置文件!' menu_opened: '&a[CursorMenu] 已为玩家 %player% 打开菜单 %menu%' text_display_opened: '&a[CursorMenu] 已为玩家 %player% 打开文字显示: %text_id%' text_display_not_found: '&c[CursorMenu] 文字显示ID不存在: %text_id%' item_disabled: '&a[CursorMenu] 已关闭物品显示' item_not_found: '&c[CursorMenu] 物品ID不存在: %item_id%' input_menu_hint: '&c[CursorMenu] 输入对应的菜单选项' menu_option_not_found: '&c[CursorMenu] 无该菜单选项' # ======================================== # 玩家管理相关提示 # ======================================== player: not_found: '&c[CursorMenu] 玩家 %player% 不存在或不在线' not_registered: '&c[CursorMenu] 玩家 %player% 不存在于注册列表中' delete_success: '&a[CursorMenu] 玩家 %player% 的注册信息已成功删除,该玩家现在可以重新注册' delete_failed: '&c[CursorMenu] 删除玩家 %player% 的注册信息失败' delete_notify: '&e[CursorMenu] 您的注册信息已被管理员删除,请重新注册' reset_password_success: '&a[CursorMenu] 玩家 %player% 的密码已成功重置' reset_password_failed: '&c[CursorMenu] 重置玩家 %player% 的密码失败' reset_password_notify: '&e[CursorMenu] 您的密码已被管理员重置,请重新登录' # ======================================== # 菜单相关提示 # ======================================== menu: require_login: '&c[CursorMenu] 请先登录后再执行此操作' already_registered: '&c[CursorMenu] 您已注册,请直接登录' condition_not_met: '&c[CursorMenu] 条件不满足,无法执行该操作' cursor_activated: '&a[CursorMenu] 光标菜单已激活!' cursor_deactivated: '&c[CursorMenu] 光标菜单已关闭!' # ======================================== # 系统相关提示 # ======================================== system: ip_warning: '&e[警告] 您的IP与注册时不同!' server_transfer_failed: '&c[CursorMenu] 跨服传送失败: %error%' config_reloaded: '&a[CursorMenu] 配置文件已重新加载' # ======================================== # NPC相关提示 # ======================================== npc: toggle_on: '&a[CursorMenu] NPC创建已启用' toggle_off: '&c[CursorMenu] NPC创建已禁用' status_enabled: '&a[CursorMenu] NPC创建状态: 已启用' status_disabled: '&c[CursorMenu] NPC创建状态: 已禁用' reloaded: '&a[CursorMenu] NPC配置已重载' rotated: '&a[CursorMenu] NPC已旋转 %angle% 度' rotate_usage: '&c[CursorMenu] 用法: /cursormenu npc rotate <角度>' invalid_angle: '&c[CursorMenu] 无效的角度值: %angle%' system_disabled: '&e[CursorMenu] NPC镜像系统未启用(需要安装FancyNpcs插件)' # ======================================== # WASD导航相关提示 # ======================================== wasd: enabled: '&a[CursorMenu] WASD导航已启用' disabled: '&c[CursorMenu] WASD导航已禁用'
更新日志 – v1.4.1
安全性更新
密码哈希算法升级 - 从不安全的 SHA-256 升级到 BCrypt 加密算法。
新注册用户自动使用 BCrypt 加密,旧用户首次登录成功后自动升级密码格式。
临时 OP 操作安全性增强 - 改进了 `[op]` 命令执行的安全机制,确保 OP 状态正确恢复。
并发安全修复
修复非线程安全集合 - 将所有 HashMap/HashSet 替换为线程安全的 ConcurrentHashMap,解决了多线程环境下可能出现的并发问题。
代码质量改进
新增命令执行工具类 - 统一了命令执行逻辑,支持 `[console]`、`[op]`、`[player]`、`[server]` 等命令前缀。
代码清理 - 清理了重复的导入语句,简化了代码结构。
新增支持 1.21.11 版本
注意事项
BCrypt 计算比 SHA-256 慢,这是正常的安全特性,无需担心性能问题。
里程碑更新
当前版本是一个分水岭,插件将在下一个版本进入1.4.0的版本。
新增功能
完全自定义的登录注册系统
完全支持玩家的注册、登录、密码显示以及玩家账号的记录存储。
支持本地 SQL 玩家数据存储。
改进
删除了与 ProtocolLib 插件相关的所有剩余无用代码。
改进了 IP 绑定和管理员 IP 白名单功能。
提高了菜单加载速度和响应性能。
修复
修复了在1.21.8版本中,传送不支持回到指定坐标点的问题。
修复了在测试版本中,玩家登录注册时密码错误的问题。
更新日志 – v1.3.6
新增功能
新增链接功能:配置中添加 link: "[link]https://xxxxxxx" ,可直接发送可点击链接并跳转至网页。
代码:# 文字组件1 layout5: permission: cursormenu.button.test.layout4 name: 加入官方Q群 # 文字组件的x轴 x: 2 # 文字组件的y轴 y: -1.0 # 文字组件的z轴 z: 3.5 tilt: x: 0.0 # 上下倾斜(俯仰) y: 0.0 # 左右倾斜(偏航) z: 0.0 # 前后倾斜(翻滚) command: [] link: "[link]https://XXXXX|&c点击加入我们的官方Q群"修复
修复了当玩家处于菜单中时,使用 /cmenu reload 命令重载配置,若开启了 camera-block-check ,退出菜单后清除的方块不会恢复的问题。
更新日志 – v1.3.5
新增内容
- 输入内容输入变量
- `%cursormenu_input_password%` 获取玩家首次输入的聊天内容
- `%cursormenu_password_visibility%` 返回输入内容当前是否可见
- `%cursormenu_input_confirm_password%` 获取玩家第二次输入的确认内容
- 同级子菜单 在同一坐标下直接展开子页面,无需退出再进
- 主菜单秒切 若世界与坐标一致,可直接刷新到另一主菜单,不再经历“关闭-再打开”流程
- 文本悬停特效 默认关闭,开启后鼠标悬停文本时显示高亮/阴影效果
- SQL 数据存储支持
- 实验性 WorldGuard 兼容 初步支持区域检测,后续持续完善
修复与优化
- 修复若干微小 bug
- 代码结构优化,提升整体性能
更新日志 – v1.3.4
新增 / 重大变更
- 核心依赖迁移完成:正式弃用 ProtocolLib,全面改用 PacketEvents,安装前请移除旧依赖。
- 支持 Velocity 跨服传送:命令列表中直接写 [server] 目标服务器 即可无缝跳转。
- 可自定义光标大小:按需调整指针尺寸,适配不同 UI 风格。
- 可自定义光标移动范围:限定光标活动区域,防止误触。
修复与优化
- 修复若干边缘小问题,清理无用代码,体积更小,运行更快。
更新日志 – v1.3.3
新增:
按钮级「随机概率命令」功能
配置 random-commands 与 random-chances 后生效
系统按给定概率(如 [10,50,40] )随机选取一条命令执行
未配置时自动回退到原有 commands 逻辑
调整
所有菜单的语言文件已同步更新,支持新随机命令提示字段
优化
内部逻辑清理,确保随机分支与旧模式零冲突
更新日志 – v1.3.2
修复
延迟命令在玩家退出菜单后仍被执行的问题已修正
config 内菜单命令失效已恢复,现可正常解析
新增
菜单支持“条件使用”——仅当满足设定条件时才允许打开/点击
其他
插件已恢复常规更新节奏,后续版本将保持持续迭代