一个用于“数据包 ↔ MCDReforged”交互的桥接插件。项目更关注“交互通道能否做到、能做到多可靠/多安全/多可扩展”,而不是堆砌具体功能;功能性内容仅作为演示样例,用于验证思路与讨论,不承诺长期稳定的具体行为。
项目目标:探索并沉淀一套通用、安全、可扩展的交互范式,让数据包侧产生的状态/事件能够被 MCDR 捕获;同时让 MCDR 可以把配置/指令下发给数据包侧并即时生效。
- Minecraft Java 1.21.x(数据包 pack_format=48)
- MCDReforged v2
- Windows PowerShell(示例指令)
- 将文件夹
mc_events放到 MCDR 的plugins/下,目录结构示例:plugins/mc_events/(插件目录)mc_events/__init__.py(插件代码)mc_events/datapacks/mc_events/(内置数据包模板)
server/<level-name>/datapacks/mc_events/(插件自动同步到此处的“世界数据包”目录)
- 插件启动/服务器启动时会自动:
- 同步数据包模板到
server/<level-name>/datapacks/mc_events/ - 根据配置与示例素材生成/刷新必要的函数与标签
- 尝试启用/刷新数据包(优先
datapack enable/disable/enable,失败回退reload)
- 同步数据包模板到
- 将
mc_events放到plugins/下,启动 MCDR 与服务器。 - 运行
!!mce apply以同步模板并刷新演示数据包。 - 在控制台观察以
[MC_EVENTS]为前缀的输出,用于验证通道与样例是否工作。
- 通过函数标签将数据包侧逻辑与 MCDR 生成器衔接,形成“约定式”对接面。
- 统一输出前缀
[MC_EVENTS]用于观测与日志归集(详情以实际实现为准)。 - 以最小可用样例驱动:内置演示能力仅用于验证通道,不代表最终能力边界。
- 启动流程:
- 插件加载时注册命令并设置数据目录;若服务器已运行则尝试自动应用。
- 服务器启动事件会再次触发应用,确保数据包与函数最新。
- 应用动作(模板 → 脚手架 → 生成 → 接线 → 启用):
- 同步内置数据包模板到
server/<level-name>/datapacks/mc_events/。 - 生成脚手架:写入
pack.mcmeta、minecraft:load与minecraft:tick标签分别指向mc_events:load/mc_events:tick,并创建check/、util/、setup/、event/目录。 - 生成功能:
- 基于
items.json生成“逐物品检测函数”与函数标签#mc_events:to_watch_funcs,并生成初始化/快照函数。 - 生成基于统计分数的 PVP 检测函数(初始化、每刻检测与事件发射)。
- 基于
- 接线:在
mc_events:load追加setup/_generated_pvp,在mc_events:tick追加check/pvp执行。 - 启用/刷新:优先尝试
datapack enable/disable/enable,失败回退reload。
- 同步内置数据包模板到
- 运行时:
tick每刻按玩家执行#mc_events:to_watch_funcs与check/pvp,由数据包侧通过聊天输出统一前缀[MC_EVENTS]的行。- 插件侧监听包含该前缀的服务端消息并记录到
plugins/mc_events/log/log.txt,便于审计与联动。
-
物品检测(Inventory / Ender Chest):
- 监听
items.json中声明的物品是否存在于玩家背包或末影箱。 - 首次检测到任一目标物品时,数据包侧输出一次事件:
any_item_gained <item_id>。 - 通过
mce_tmp / mce_emitted / mce_has_any记分板变量做去抖与“初始快照”,避免服务器启动或同刻多条重复上报。
- 监听
-
PVP 检测(基于统计分数增量):
- 使用
minecraft.custom:damage_dealt / damage_taken计算每刻增量,受击者为触发源。 - 当玩家本刻受到伤害时,先发出
player_attack victim @<victim>,再在 6 格内选取本刻伤害增量大于 0 的最近玩家作为attacker并发出player_attack attacker @<attacker>。 - 通过
mce_pvp_emitted保证每个受击者每刻仅上报一次,随后写回prev_*作为下一刻基线。
- 使用
!!mce add <item_id>:添加待监测物品 ID!!mce remove <item_id>:移除待监测物品 ID!!mce clear:清空物品列表!!mce list:查看当前物品列表!!mce apply:基于items.json重新生成并刷新数据包
- 事件上行:怎样让更多样的状态/事件以低开销、低误报的方式上报。
- 配置下行:怎样安全地把参数/指令下发并即时生效,避免刷屏或竞争态。
- 可靠性:在启停/重载/多人/大负载场景下的幂等、去抖与日志一致性。
- 性能边界:函数标签规模、tick 频率、NBT 检测复杂度的影响评估。
- 欢迎就交互模型、边界与最佳实践开 issue 讨论;也欢迎提交最小可复现的样例或实验数据。
- 如世界目录不在默认
./server/<level-name>,可自行调整源码中的resolve_world_datapack_root()并反馈场景。
- 如遇异常或不符合预期,请开启 issue 并附上最小复现步骤与相关日志(含控制台与
plugins/mc_events/log/log.txt)。
- 见仓库根目录
LICENSE
本仓库欢迎围绕“数据包 ↔ MCDReforged 交互”的更多设想与样例,一起把通道本身打磨得更扎实。