跳转至

通用接口

本页列出中国版模组SDK中与系统注册、组件框架、事件通信、定时器、工具函数、数学工具、本地设备及本地存储相关的基础接口。这些接口是所有中国版Python模组的核心基础设施,无论模组功能如何,均依赖这些接口完成注册、通信和工具调用。接口域总览入口见中国版ModAPI接口域索引

与国际版脚本API分开使用

本页接口属于中国版Python模组SDKmod.server.extraServerApi/mod.client.extraClientApi),不得与国际版@minecraft/server脚本API混用。两套体系在架构、语言和运行时环境上均不相同。

端与访问方式

中国版ModAPI的核心访问入口是服务端API模块与客户端API模块:

模块 导入方式 主要用途
服务端API import mod.server.extraServerApi as serverApi 注册服务端系统、服务端组件操作、服务端工具函数
客户端API import mod.client.extraClientApi as clientApi 注册客户端系统、客户端组件操作、客户端工具函数

所有接口均以这两个模块作为调用入口,部分接口需进一步通过组件工厂获取组件实例后调用。

系统注册

系统(System)是模组逻辑的主要载体。每个模组通常在服务端和客户端各注册一个系统类。系统类继承自ServerSystemClientSystem基类,通过RegisterSystem注册后,引擎会在游戏初始化阶段自动实例化并调用生命周期回调(__init__UpdateDestroy等)。

接口 参数 返回值 说明
GetServerSystemCls() 服务端 class 获取ServerSystem基类,用于继承,在模组服务端入口文件中调用。
GetClientSystemCls() 客户端 class 获取ClientSystem基类,用于继承,在模组客户端入口文件中调用。
RegisterSystem(nameSpace,systemName,cls) 服务端、客户端 nameSpace:strsystemName:strcls:class None 注册系统。nameSpace为模组命名空间,systemName为系统名称,cls为继承基类的系统类。
GetSystem(nameSpace,systemName) 服务端、客户端 nameSpace:strsystemName:str 系统实例或None 获取已注册系统的实例,常用于跨系统调用。
GetEngineNamespace() 服务端、客户端 str 获取引擎事件命名空间字符串,用于监听引擎内置事件。
GetEngineSystemName() 服务端、客户端 str 获取引擎事件系统名称字符串,用于监听引擎内置事件。
import mod.server.extraServerApi as serverApi

ServerSystem = serverApi.GetServerSystemCls()

class MyServerSystem(ServerSystem):
    def __init__(self, namespace, name):
        ServerSystem.__init__(self, namespace, name)
        self.ListenForEvent(
            serverApi.GetEngineNamespace(),
            serverApi.GetEngineSystemName(),
            "ServerChatEvent", self, self.OnChat
        )

    def OnChat(self, args):
        print("玩家说:", args.get("Message", ""))

    def Destroy(self):
        self.UnListenAllEvents()

def RegisterMyMod():
    serverApi.RegisterSystem("myMod", "myServerSystem", MyServerSystem)

组件框架

组件(Component)是附加在实体或世界(关卡)上的功能单元,分为引擎原生组件和自定义组件两类。引擎原生组件通过GetEngineCompFactory()工厂对应的CreateXxx(entityId/levelId)方法创建,自定义组件则需先注册类型再创建实例。

接口 参数 返回值 说明
GetEngineCompFactory() 服务端、客户端 引擎组件工厂实例 获取引擎原生组件工厂,然后通过CreateXxx(entityId/levelId)创建具体组件实例。
GetComponentCls() 服务端、客户端 class 获取自定义组件基类,用于继承以定义模组自定义组件。
RegisterComponent(nameSpace,compName,compCls) 服务端、客户端 nameSpace:strcompName:strcompCls:class bool 注册自定义组件类型,通常在模组初始化阶段调用。
CreateComponent(entityId,nameSpace,compName) 服务端、客户端 entityId:strnameSpace:strcompName:str 组件实例或None 在指定实体上创建已注册的自定义组件实例。
GetComponent(entityId,nameSpace,compName) 服务端、客户端 entityId:strnameSpace:strcompName:str 组件实例或None 获取指定实体上已创建的自定义组件实例。
DestroyComponent(entityId,nameSpace,compName) 服务端、客户端 entityId:strnameSpace:strcompName:str bool 销毁指定实体上的自定义组件实例。
GetLevelId() 服务端、客户端 str 获取当前世界(关卡)ID,大多数组件工厂方法以此作为levelId参数。

引擎原生组件工厂的常用创建方法如下:

组件用途 创建方法 可用端 典型目标
实体特性 CreateAttr(entityId) 服务端、客户端 实体、玩家
实体位置 CreatePos(entityId) 服务端、客户端 实体、玩家
实体旋转 CreateRot(entityId) 服务端、客户端 实体、玩家
身体旋转 CreateBodyRot(entityId) 服务端、客户端 实体、玩家
实体缩放 CreateScale(entityId) 服务端 实体、玩家
引擎类型与标识 CreateEngineType(entityId) 服务端、客户端 实体、玩家
实体名称 CreateName(entityId) 服务端、客户端 实体、玩家
实体事件与组件组 CreateEntityEvent(entityId) 服务端 实体、玩家
实体运动器 CreateActorMotion(entityId) 服务端、客户端 实体
实体状态效果 CreateEffect(entityId) 服务端、客户端 实体、玩家
物品操作 CreateItem(entityId) 服务端、客户端 实体、玩家
实体维度传送 CreateDimension(entityId/levelId) 服务端 实体、玩家
玩家经验 CreateExp(playerId) 服务端 玩家
玩家等级 CreateLv(playerId) 服务端 玩家
玩家特有操作 CreatePlayer(playerId) 服务端、客户端 玩家
游戏规则与定时器 CreateGame(levelId) 服务端、客户端 世界
指令执行 CreateCommand(levelId) 服务端 世界
天气控制 CreateWeather(levelId) 服务端 世界
时间控制 CreateTime(levelId) 服务端、客户端 世界
方块状态 CreateBlockState(levelId) 服务端 世界
方块信息读写 CreateBlockInfo(levelId) 服务端、客户端 世界
自定义音效 CreateCustomAudio(levelId) 客户端 世界
本地配置存储 CreateConfig(entityId) 客户端 玩家
摄像机 CreateCamera(levelId) 服务端、客户端 世界、玩家
记分板 CreateGame(levelId) 服务端、客户端 世界(记分板相关接口也挂在Game组件上)
import mod.server.extraServerApi as serverApi

levelId = serverApi.GetLevelId()
gameComp = serverApi.GetEngineCompFactory().CreateGame(levelId)
# 使用gameComp进行游戏规则、定时器、记分板等操作

事件通信

事件通信接口是ServerSystemClientSystem实例的方法,用于系统间通信及客户端与服务端之间的数据传递。

接口 参数 返回值 说明
ListenForEvent(nameSpace,systemName,eventName,instance,func) 服务端、客户端 nameSpace:strsystemName:streventName:strinstance:objectfunc:function 监听事件。引擎内置事件使用GetEngineNamespace()GetEngineSystemName()指定来源。
UnListenForEvent(nameSpace,systemName,eventName,instance,func) 服务端、客户端 同上 取消监听指定事件。
UnListenAllEvents() 服务端、客户端 取消当前系统实例的全部事件监听,建议在Destroy中调用。
BroadcastEvent(eventName,eventData) 服务端 eventName:streventData:dict 在服务端系统间广播事件,所有服务端系统中监听该事件的回调均会收到。
BroadcastToAllClient(eventName,eventData) 服务端 eventName:streventData:dict 向所有在线玩家的客户端广播事件。
NotifyToClient(playerId,eventName,eventData) 服务端 playerId:streventName:streventData:dict 向指定玩家的客户端发送事件。
NotifyToMultiClients(playerIds,eventName,eventData) 服务端 playerIds:list(str)eventName:streventData:dict 向多个指定玩家的客户端发送事件。
NotifyToServer(eventName,eventData) 客户端 eventName:streventData:dict 从客户端向服务端发送事件。
CreateEventData(eventName) 服务端、客户端 eventName:str dict 创建指定事件的空数据字典,填充字段后再广播或发送。
# 服务端系统接收攻击事件后通知客户端
class MyServerSystem(ServerSystem):
    def __init__(self, namespace, name):
        ServerSystem.__init__(self, namespace, name)
        ns = serverApi.GetEngineNamespace()
        sn = serverApi.GetEngineSystemName()
        self.ListenForEvent(ns, sn, "PlayerAttackEntityEvent", self, self.OnAttack)
        self.ListenForEvent("myMod", "myClientSystem", "myMod:AskHealth", self, self.OnAskHealth)

    def OnAttack(self, args):
        playerId = args["playerId"]
        self.NotifyToClient(playerId, "myMod:HitFeedback", {"victimId": args["victimId"]})

    def OnAskHealth(self, args):
        pass  # 处理来自客户端的请求

定时器

定时器接口通过GetEngineCompFactory().CreateGame(levelId)获取的GameComponent实例调用。服务端定时器在服务端刻中触发,客户端定时器在客户端帧中触发。

接口 参数 返回值 说明
AddTimer(delay,func,*args,**kwargs) 服务端、客户端 delay:floatfunc:function*args**kwargs CallLaterNone 添加单次定时器,delay单位为秒,到期后执行一次。func非函数时返回None
AddRepeatedTimer(delay,func,*args,**kwargs) 服务端、客户端 delay:floatfunc:function*args**kwargs CallLaterNone 添加重复定时器,以delay秒为间隔持续循环执行。
CancelTimer(timer) 服务端、客户端 timer:CallLater 取消一个定时器,之后不再触发。
import mod.server.extraServerApi as serverApi

levelId = serverApi.GetLevelId()
gameComp = serverApi.GetEngineCompFactory().CreateGame(levelId)

def onRepeated():
    print("每5秒触发一次")

timer = gameComp.AddRepeatedTimer(5.0, onRepeated)
# 需要取消时:gameComp.CancelTimer(timer)

# 单次延迟任务
gameComp.AddTimer(2.0, lambda: print("2秒后执行一次"))

工具函数

以下接口为extraServerApiextraClientApi的直接方法。

接口 参数 返回值 说明
GetMinecraftEnum() 服务端、客户端 枚举表对象 获取引擎枚举表,包含AttrTypeGameTypeItemPosType等所有枚举类型。
GetModConfigJson(path) 服务端、客户端 path:str dictNone 读取模组资源包中的JSON配置文件,path相对于模组资源根目录(不含资源包名称)。
GetLocalPlayerId() 客户端 str 获取本地玩家的实体ID,仅在客户端可用。
GetFps() 客户端 int 获取当前客户端帧率。
GetHostPlayerId() 服务端 strNone 获取本地游戏房主玩家的实体ID;Apollo网络服环境下返回None
GetServerTickTime() 服务端 int 获取当前服务端累计游戏刻数。
ImportModule(modName,libFolder) 服务端、客户端 modName:strlibFolder:str module 从行为包内指定的库文件夹导入Python模块,绕过普通import的路径限制。
StartCoroutine(generator) 服务端、客户端 generator:generator 协程任务对象 启动一个Python生成器协程,每刻推进一次。
StopCoroutine(task) 服务端、客户端 task 停止一个正在运行的协程。
CheckNameValid(name) 服务端 name:str bool 检查玩家名是否只包含合法字符集。
CheckWordsValid(words,callback) 服务端、客户端 words:strcallback:function 异步检查词语是否通过内容审核,回调参数为(result:bool, words:str)
GetChinese(s) 服务端、客户端 s:str str 将非标准编码的中文字符串转换为标准中文字符串。
IsMultiPlayer() 服务端、客户端 bool 获取当前是否为多人游戏。
IsSinglePlayer() 服务端、客户端 bool 获取当前是否为单人游戏。
GenerateColor(colorName) 服务端、客户端 colorName:str str 根据颜色名称(如"RED""GREEN")返回Minecraft格式化颜色代码。

数学工具

数学工具为extraServerApi/extraClientApi的直接方法,用于方向向量与旋转角度的互相转换及坐标变换。

接口 参数 返回值 说明
GetDirFromRot(rot) 服务端、客户端 rot:tuple(float,float) tuple(float,float,float) (俯仰角, 偏航角)旋转元组(度数)转换为归一化方向向量。
GetRotFromDir(dir) 服务端、客户端 dir:tuple(float,float,float) tuple(float,float) 将方向单位向量转换为(俯仰角, 偏航角)旋转元组(度数)。
GetIntPos(pos) 服务端、客户端 pos:tuple(float,float,float) tuple(int,int,int) 将浮点坐标各分量向下取整,返回所在方块的整数坐标。
GetLocalPosFromWorld(pos,entityId) 服务端、客户端 pos:tuple(float,float,float)entityId:str tuple(float,float,float) 将世界坐标转换为相对于指定实体的局部坐标,可能存在浮点精度偏差。
GetWorldPosFromLocal(pos,entityId) 服务端、客户端 pos:tuple(float,float,float)entityId:str tuple(float,float,float) 将相对于指定实体的局部坐标转换为世界坐标,可能存在浮点精度偏差。
import mod.server.extraServerApi as serverApi

comp = serverApi.GetEngineCompFactory().CreateRot(entityId)
rot = comp.GetRot()
direction = serverApi.GetDirFromRot(rot)
# direction 为实体当前朝向的单位向量 (x, y, z)

blockPos = serverApi.GetIntPos(someFloatPos)

本地设备

以下接口用于获取客户端或服务端设备相关信息,均为extraServerApi/extraClientApi的直接方法。

接口 参数 返回值 说明
GetEngineVersion() 客户端 tuple(int,int,int) 获取引擎版本号,格式为(主版本, 次版本, 修订版本)
GetMinecraftVersion() 服务端、客户端 str 获取Minecraft游戏版本字符串,如"1.20.10.01"
GetPlatform() 客户端 int 获取当前运行平台枚举值,对应MinecraftEnum.GamePlatform
IsInApollo() 服务端 bool 判断当前是否运行在Apollo网络服环境中。
IsInServer() 客户端 bool 判断客户端当前是否处于连接服务器状态(非本地单人存档)。
GetIP() 服务端 tuple(str,int) 获取服务器IP地址和端口号,格式为(IP字符串, 端口号)

本地存储

本地存储接口仅在客户端可用,通过GetEngineCompFactory().CreateConfig(entityId)entityId传入本地玩家ID)获取ConfigCompClient实例后调用。配置数据持久化存储在本地设备,适合保存玩家个人偏好设置,不依赖服务器。

接口 参数 返回值 说明
GetConfigData(name) 客户端 name:str objectNone 读取以name为键的本地持久化配置数据,若不存在则返回None
SetConfigData(name,value) 客户端 name:strvalue:object bool name为键存储本地持久化配置数据,支持基本Python数据类型。
import mod.client.extraClientApi as clientApi

localPlayerId = clientApi.GetLocalPlayerId()
configComp = clientApi.GetEngineCompFactory().CreateConfig(localPlayerId)

# 存储设置
configComp.SetConfigData("myMod:ui:scale", 1.5)

# 读取设置,提供默认值
scale = configComp.GetConfigData("myMod:ui:scale") or 1.0