调整地图插件(事件侦听与回调)
这一篇以官方地图属性插件(neteaseMapAttrs)为例,讲怎么读懂一个官方插件、并在它基础上微调加新功能。学会这套方法,任何官方插件你都能拿来改。
地图属性插件能做什么
neteaseMapAttrs 用于设置整张地图的通用属性:主城保护、禁止藤蔓生长、禁止流体流动、定时清理掉落物、浮空文字、地图边界(走出边界传送回合法位置)、禁止丢弃/捡起物品、地图替换等。它支持一个运营指令:设置指定服务器的地图边界。
试用插件
- MC Studio →【新建】→【基岩版网络服】,命名如「地图属性插件微调」,填开发机信息
- 大厅服 Mod 下拉 →【获取公共 Mod】→ 选地图属性插件 →【全部下载】
- 大厅服选中
neteaseMapAttrs,控制服选中neteaseMapAttrsMaster(功能服/代理服无此插件,跳过) - 部署 →【开发测试】进游戏体验
读懂插件的方法
拿到一个不熟悉的官方插件,按这个顺序分析,效率最高:
1. 找源码
下载的插件在 C:\MCStudioDownload\ApolloMod\{开发者账号} 下;也可在 Studio【服务器 Mod】选中插件 →【更多 → 打开目录】。把源码复制到本地代码目录,方便加注释和调试。
2. 从 readme 入手
readme 里的功能列表、运营指令,是判断插件结构的第一手信息。地图属性插件的 readme 说明它没有多服协作功能、只有一个运营指令——由此可推断 Master(控制服)Mod 仅仅是运营指令的入口,与游戏逻辑关系不大。
3. 按目录结构定位
结合功能、文件名、文件大小,给每个代码文件定位。地图属性插件只有两个 Mod:
neteaseMapAttrs # 大厅服/游戏服
├── behavior_packs/…Script # 客户端 Mod
│ ├── mapAttrsClientSys.py # 客户端 system 类
│ ├── textBoardMgr.py # 浮空文字管理(对应"浮空文字"功能)
│ └── modMain.py # 客户端入口
└── developer_mods/…Script # 服务端 Mod
├── mapAttrsServerSys.py # 服务端 system 类
├── playerMgr.py # 玩家管理(对应"地图边界"功能)
├── coroutineMgrGas.py # 用 yield 实现的延时执行管理
└── modMain.py # 服务端入口
neteaseMapAttrsMaster # 控制服(仅接收/反馈运营指令)小结:每个端的 Mod 通常只有一个 system 文件 + 一两个管理类。抓住 system 类和管理类,就抓住了插件主干。
事件侦听与回调
网络服插件的核心是事件驱动:各端 system 通过监听事件、发送事件来协作。
ListenForEvent(namespace, systemName, eventName, self, callback):注册监听,事件触发时执行callback- 引擎事件由引擎抛出,插件监听后做处理
- 自定义事件(
NotifyToClient/NotifyToServer)用于客户端↔服务端通信
微调地图插件的思路就是:监听更多引擎事件,在回调里加判断和拦截。
微调实战:拦截更多破坏行为
在官方"主城保护"基础上,额外阻止:破坏耕地、触发压力板、踩红石矿、踩拌线钩。做法是在服务端 system 里监听对应引擎事件,在回调里判断并取消:
# mapAttrsServerSys.py
def Init(self):
self.ListenForEvent(
serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(),
"OnStepOnBlockServerEvent", self, self.OnStepOnBlock)
def OnStepOnBlock(self, args):
blockName = args.get("fullName", "")
if blockName in ("minecraft:tripwire_hook", "minecraft:wooden_pressure_plate"):
args["cancel"] = True # 拦截触发改完后重新部署该网络服,即可用上修改后的插件。
拦截类事件的通用套路
判断 args 里的方块/物品名 → 满足条件时把 args["cancel"] 或对应取消字段设为 True。具体事件名和 args 字段,查 ModSDK 事件文档。
地图插件是单机逻辑,不需要跨服。下一篇调整聊天插件会引入功能服(Service)——跨服通信必须用到它。回到基岩版网络游戏首页。
