IXBOB 模组开发者 API¶
欢迎来到IXBOB模组API文档页面,您在这里可以查看模组联动所需的接口。
任意问题均可进Q群 589523062 交流反馈,或私聊群主~不要社恐 :p
项目导航¶
-
PlayerRevive Server
《倒地救援与背负•超多自定义》 添加了玩家濒死倒地/救援机制
-
LimbHealth Server
《肢体血量-医疗护理•超多自定义》 扩展原版单血条为身体各部位独立血条系统
-
HolyParty Server
《更好的组队•超多自定义》 添加了玩家组队/队内聊天/身份组等功能
通用约定¶
下列约定对所有项目都适用,每个 API 方法页不再重复说明。
类型注释¶
所有 API 使用 Python 2.7 兼容的注释式类型标注:
静态方法¶
所有公开 API 都是 @staticmethod / @classmethod,无需实例化,直接通过类名调用:
PlayerReviveServerAPI.getIsNeedRevive(playerId)
LimbHealthServerAPI.setLimbHealth(playerId, posTypeEnum, newHealth, isFromHurt)
HolyPartyServerAPI.getPlayerCurrentParties(playerId)
事件机制:内部 ModEventBus¶
本文档涉及的所有事件注册/分发,完全不依赖网易自定义事件(ListenForEvent / BroadcastEvent 等),而是走每个项目内部维护的 ModEventBus 总线。
具体表现:
- 注册事件用
*ServerAPI.registerEventHandler(event, func, priority, *presetArgs),不要用serverApi.ListenForEvent(...) - 取消注册用
*ServerAPI.unregisterEventHandler(event, func),不要用serverApi.UnListenForEvent(...) - 事件类是普通 Python 类(详见各项目「类型与事件」页),通过 getter 访问字段;不是网易引擎事件 dict,不需要
args["xxx"]这种取值方式 - 事件优先级通过
*EventPriorityEnum(5 级)控制
每个模组API文档内均有详细说明与用例。
事件优先级¶
所有项目都暴露一个 *EventPriorityEnum 【该具体类名/模块名可见具体模组文档】:
| 常量 | slot | 触发顺序 |
|---|---|---|
LOWEST |
0 | 最先触发 |
LOW |
1 | |
NORMAL |
2 | 默认值 |
HIGH |
3 | |
HIGHEST |
4 | 最晚触发 |
注册时若不传 priority,默认按 NORMAL 处理。
registerEventHandler 的 *presetArgs¶
所有项目的事件注册接口签名一致:
调用时附加的 *presetArgs 会在事件对象之前传入处理器。例如:
api.registerEventHandler(
api.getApiEvents().SomeEvent,
handler,
api.getEventPriorityEnum().NORMAL,
"extra-arg-1", 42,
)
def handler(extraArg1, extraNumber, event):
# extraArg1 == "extra-arg-1"
# extraNumber == 42
# event 是 SomeEvent 实例
...
⚠️ 不要在模组顶层 / 初始化阶段直接 import API¶
模组加载顺序问题
禁止在你模组的脚本文件顶部或类的 __init__ 中直接 import 本文档涉及的 API:
# ❌ 错误示范:模组顶部直接 import
from PlayerReviveScripts.server.PlayerReviveServerAPI import PlayerReviveServerAPI
from LimbHealthScripts.server.LimbHealthServerAPI import LimbHealthServerAPI
from HolyPartyScripts.server.HolyPartyServerAPI import HolyPartyServerAPI
class YourServerSystem(ServerSystem):
def __init__(self, ...):
# 此时上面三个模组可能尚未完成脚本注册,导入会有概率失败
...
原因:网易客户端的多 Addon 加载是不保证顺序的——你的模组脚本被加载、__init__ 执行时,其他模组的脚本可能还没注册,对应模块的 import 有概率抛出 ImportError。
正确做法:等到网易官方事件 LoadServerAddonScriptsAfter / LoadClientAddonScriptsAfter 触发后再 import 与调用:
# ✅ 正确:监听 LoadServerAddonScriptsAfter,事件触发后才 import 与使用
class YourServerSystem(ServerSystem):
def __init__(self, namespace, systemName):
super(YourServerSystem, self).__init__(namespace, systemName)
self.ListenForEvent(
serverApi.GetEngineNamespace(),
serverApi.GetEngineSystemName(),
"LoadServerAddonScriptsAfter",
self,
self.onAllAddonsLoaded,
)
def onAllAddonsLoaded(self, args):
# 所有 Addon Scripts 已注册,此时再 import
# 用 try/except ImportError 防御对方模组未安装的情况
try:
from PlayerReviveScripts.server.PlayerReviveServerAPI import PlayerReviveServerAPI
except ImportError:
# 联动模组未安装,按你的业务降级处理
return
# ... 注册事件、查询状态、调用 API
PlayerReviveServerAPI.registerEventHandler(...)
建议:所有跨模组 import 都延迟到方法体内执行,并对模块未加载情况做防御性处理(外部模组可能根本不存在)。