Thanks to visit codestin.com
Credit goes to github.com

Skip to content

LoosePrince/MC-is-Events

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

MC is Events(mc_events)

一个用于“数据包 ↔ 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.mcmetaminecraft:loadminecraft: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_funcscheck/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 交互”的更多设想与样例,一起把通道本身打磨得更扎实。

About

【MCDR插件】通过数据包从MC中获取更多事件

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published