跳转至

IXBOB 模组开发者 API

欢迎来到IXBOB模组API文档页面,您在这里可以查看模组联动所需的接口。

任意问题均可进Q群 589523062 交流反馈,或私聊群主~不要社恐 :p

项目导航

  • PlayerRevive Server


    《倒地救援与背负•超多自定义》 添加了玩家濒死倒地/救援机制

  • LimbHealth Server


    《肢体血量-医疗护理•超多自定义》 扩展原版单血条为身体各部位独立血条系统

  • HolyParty Server


    《更好的组队•超多自定义》 添加了玩家组队/队内聊天/身份组等功能

通用约定

下列约定对所有项目都适用,每个 API 方法页不再重复说明。

类型注释

所有 API 使用 Python 2.7 兼容的注释式类型标注:

def methodName(playerId, isFromHurt):
    # type: (str, bool) -> None
    ...

静态方法

所有公开 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

所有项目的事件注册接口签名一致:

def registerEventHandler(event, func, priority=None, *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 都延迟到方法体内执行,并对模块未加载情况做防御性处理(外部模组可能根本不存在)。