跳转至

TCY服务器的妙妙小工具目前实现的功能

如果网页有bug或者没有及时更新最新数据,请尝试按ctrl+F5刷新网页重载,如果还是有问题,请在qq群@糖醋鱼反馈

本文暂未把全部实现的功能都编入,后续更新!暂时只写了玩家可能用的比较多的指令。

📝 /tcynote记事本 (箱子 GUI) 酒狐特供ver

指令 核心功能 交互方式 权限
/tcynote <内容> 即时记录 酒狐会一边嚼零食一边帮你记录,自动生成秒级ID 所有玩家
/tcynote history 管理个人笔记 弹出箱子界面,酒狐会根据笔记数量吐槽或讨食 仅本人
/tcynote trashcan 翻垃圾堆 打开回收站界面,查看或恢复最近删除的笔记 仅本人
/tcynote history <玩家ID> 偷看他人笔记 弹出箱子界面,只读模式(不可修改) 全员或管理员
/tcynote delete <笔记ID> 指令删除 将笔记移入回收站(也可在GUI内操作) 仅本人或管理员

注:游戏内指令按tab自动补齐可能还会显示restore_internaldelete_trash_internalinternal_page ,这些是给 GUI 按钮用的内部指令,玩家一般不需要手动输入 举例说明:纯GUI交互实测很难行得通,直接在后台调用函数会冲突从而无法实现功能。 但Minecraft 对指令的处理优先级非常高,且流程独立,让按钮执行 /tcynote internal_page <页码> <目标> ,我让“下一页”按钮来代替玩家执行此操作,即可实现笔记本翻页

单条笔记字符上限?

通常来说,由于我们的内容会展示到物品“纸”的lore(显示端(物品 Lore))里,mc原版输入指令的聊天框(输入端(聊天栏))也许也有输入长度限制,考虑这些情况下 限制在 240 个字符左右 是最安全的。

输入端的瓶颈(主要限制)

这是最大的瓶颈。Minecraft Java 版客户端的聊天栏输入上限通常是 256 个字符。 - 你的指令前缀 /tcynote (含空格)占用了 9 个字符。 - 所以,玩家实际能输入的笔记内容大约是 256 - 9 = 247 个字符(注:如果是中文,也是按 1 个字符计算,但视觉上会更宽。)

2. 显示端的表现(Lore 自动换行)

在我们的脚本中,为了防止一行字太长超出屏幕,我写了一个自动换行逻辑:

for (let j = 0; j < rawText.length; j += 25) {
    // 每 25 个字符切一段
    loreList.push(getJsonText(rawText.substring(j, ...), "white"));
}

这意味着: - 如果你写满了 245 个字。 - 在物品 Lore 里会显示为 10 行 左右的文字。 - 10 行 Lore 在 Minecraft 界面里是非常舒服的长度,完全不会超出屏幕。

游戏内功能展示

  • 1


    笔记仓库

  • 1


    垃圾桶

  • 1


    聊天栏提示示例

🎮 界面交互说明

  1. 记录 (Input)

    • 玩家输入 /tcynote 今天挖了一组钻石 (支持空格/符号) 后,系统会自动生成 yyyyMMddHHmmss 格式的时间戳 ID。

    • 数据通过 TCYPerf.writeAsync 异步存入 kubejs/tcy_note_storage/玩家名.json,同时酒狐会反馈她“写好了”。

  2. 浏览与管理 (GUI)

    • 左键点击笔记“抄作业”。酒狐会将内容打印到聊天栏,点击文字即可复制到剪贴板(并吐槽玩家太懒)。

    • 中键点击笔记“大喇叭”。酒狐会护主心切,将这条笔记内容全服广播给所有人看。

    • 右键点击笔记“扔掉”。将笔记移入回收站,酒狐会表示嫌弃。

    • 底部控制栏:包含翻页箭头与 下界之星(提示按 ESC 退出,点击会触发酒狐想吃宵夜的语音)。

  3. 查看他人 (Social/Admin)

    • 当使用 /tcynote history <玩家ID> 查看别人时,界面标题会标注 (只读)

    • 此时 右键 的删除逻辑会被锁定,无法修改他人的任何数据。

  4. 垃圾堆管理 (Trashcan GUI)

    • 左键点击笔记“捡回来”。笔记恢复至主列表顶部,酒狐会求夸奖(“给粘回来了!”)。

    • 右键点击笔记“喂食”永久删除该条记录,酒狐会把它“吃掉”(彻底销毁)。

    • 机制说明:回收站自动保留最近 100条 删除记录,超过限制自动顶替旧数据。


💾 技术底层支撑

  • 读取机制:通过 TCYPerf.readAllText 同步读取 JSON 字符串,再由 KubeJS 进行对象解析。确保界面打开无延迟。

  • 写入机制:通过 TCYPerf.writeAsync 实现非阻塞式 IO,保证在保存大量笔记时,无论是记录、删除还是恢复,都不会导致服务器主线程卡顿。

  • 存储结构:数据存储在 玩家名.json 中,包含 id, time, text 三个核心字段。

    • 主库kubejs/tcy_note_storage/玩家名.json (活跃数据)。

    • 回收站kubejs/tcy_note_storage_trash/玩家名.json (已删数据)。

  • 交互优化:底层采用 gui.getSlot(x, y) 坐标定位法,并配合 ClickType 逻辑修正,解决 Shift+右键 在部分服务端无法检测的问题,改为更稳定的 纯右键/中键 触发。

常见问题🦊 1. 普通玩家会误删别人的笔记吗?

绝对不会!一万个放心!

底层原理: 在我的代码逻辑里,每个玩家的数据是物理隔离的。

  • 存储方式kubejs/tcy_note_storage/玩家A.jsonkubejs/tcy_note_storage/玩家B.json 是两个完全不同的文件。

  • 删除逻辑

    JavaScript

    // deleteNote 函数第一行:
    let data = loadData(player.username); // 只能读取【下指令的人】的文件
    

    当玩家 A 输入 /tcynote delete 20251221120000 时,系统只会打开 玩家A 的本子,找这个 ID,撕掉。 哪怕 玩家B 在同一秒也有一个一模一样的 ID 20251221120000,系统根本看都不会看玩家B的文件一眼。

酒狐吐槽:

“哼,本狐虽然贪吃,但记性很好的!每个人的本子都是分开藏在不同树洞里的,A抢不走B的零食,也撕不掉B的笔记!”


👑 2. 管理员如何删除指定玩家的“同ID”笔记?

既然普通删除指令只能操作自己,那管理员想删别人的,确实需要一个新的特权指令。我们需要明确告诉系统:“我要删 玩家B那个ID”。

酒狐增加了一个管理员专属指令: /tcynote admin_delete <目标玩家ID> <笔记ID>

只会用来管熊孩子,但实际上可能不如直接去本地json进行大调查来得快(?)


🦊 /foxqqh 酒狐悄悄话

指令 核心功能 交互方式 权限
/foxqqh on 开启陪伴 重置计时器,开始发送悄悄话 所有玩家
/foxqqh off 安静模式 停止发送悄悄话,酒狐进入休眠 所有玩家
/foxqqh <分钟> 频率设置 设置发送间隔 (支持 1-30 分钟) 所有玩家

游戏内功能展示

  • 1


    *聊天框设置提示

🎮 系统交互说明

  1. 智能计时 (Logic)

    • 进服时,系统通过 TCYPerf.readAllText 读取玩家配置,并无条件发送欢迎界面(酒狐大脸) 。

    • 计时器基于服务器 Tick 运行,每秒累加一次 。

    • foxTimer 达到设定分钟数时,从语录库中随机抽取一条文本发送 。

  2. 语录库管理 (Content)

    • 语录存储于 kubejs/server_scripts/酒狐文本存储foxqqh用.txt

    • 系统启动时通过 TCYPerf.readAllText 一次性读入内存并按行分割 ,确保随机抽取时达到零延迟。

    • 支持 Minecraft 原生颜色代码(如 &d 自动转换为 §d) 。

  3. 配置持久化 (Persistence)

    • 读取:利用 TCYPerf.readAllText 绕过 KubeJS 沙箱,同步获取 JSON 配置。

    • 写入:修改开关或频率时,调用 TCYPerf.writeAsync 异步保存。

    • 非阻塞:即使有大量玩家同时修改设置,得益于 IO_EXECUTOR 单线程池,也不会造成服务器瞬时卡顿(MSPT 飙升)。


💾 技术底层支撑

  • 读取机制:通过 TCYPerf.readAllText 同步读取。该方法在 Java 层直接调用 Files.readAllBytes,相比脚本层更稳定且不受类过滤器拦截。

  • 写入机制:通过 TCYPerf.writeAsync 实现。它将 JSON 字符串提交至后台线程池处理,避免了主线程在执行 Files.write 时产生的 IO 等待。

  • 存储结构

    • 配置酒狐foxqqh各玩家配置保存.json,结构包含 enabled (开关), interval (频率), name (最后在线ID)。

    • 语录.txt 文档,每行代表一条独立语录。