通用系统端API
适用于服务端/客户端的通用基本功能 其中 serverApi / clientApi, levelId 之类的对象将默认被包含以便快速开发
游戏事件监听
事件监听是MOD开发的基础组成部分 QuMod提供了多种事件处理机制选择
装饰器静态监听
python
# Server/Client.py
from QuModLibs.Server import *
# from QuModLibs.Client import *
@Listen("OnScriptTickServer")
def OnScriptTickServer(_={}):
# 此处将监听游戏Tick 持续执行该函数
# 静态监听的内容不支持运行时动态取消 在游戏关闭时自动销毁
print("tick!!")
# 也可以通过内置的Events类表注册监听 方便开发工具的补全提示
@Listen(Events.OnCarriedNewItemChangedServerEvent)
def OnCarriedNewItemChangedServerEvent(args={}):
# type: (dict) -> None
playerId = args['playerId'] # 触发事件的玩家
comp = serverApi.GetEngineCompFactory().CreateCommand(levelId)
comp.SetCommand("/say 我切换了手持物品", playerId)
游戏事件
相关游戏事件触发时机及参数可查询网易我的世界API文档表
动态监听与反监听
python
# Server/Client.py
from QuModLibs.Server import *
# from QuModLibs.Client import *
# 在class中使用 可手动管理注销监听
class TestCls:
def __init__(self):
# 初始化时注册监听
ListenForEvent("OnScriptTickServer", self, self.onTick)
def onTick(self, args={}):
# tick事件
print("tick")
def free(self):
# 释放方法 销毁监听(反监听)
UnListenForEvent("OnScriptTickServer", self, self.onTick)
游戏销毁处理
当游戏关闭时 一些业务逻辑需要做回收处理 例如用户数据保存
装饰器声明 ^1.3.0
python
# 双端通用
@DestroyFunc
def onGameClose():
print("当游戏关闭时触发该函数")
旧版方案 已废弃
python
# 定义QuDestroy函数 将在游戏关闭时调用(仅适用于动态注册的文件)
def QuDestroy():
print("当游戏关闭时触发该函数")
跨系统端通信
跨端之间的通信需要通过网络发包的方式完成 QuMod中简化了此流程
AllowCall 调用权限声明
python
# 双端通用
@AllowCall
def thisAFucntion():
# 使用AllowCall装饰器声明的函数将被登记到通信调用中(不影响常规调用)以便远程调用
pass
Call 调用远程可执行对象
python
# 客户端
Call("函数名", ...) # 可以携带任意数量的参数
# 服务端
Call("玩家ID", "函数名", ...)
# 服务端的Call多了一个玩家Id参数 用于指定玩家 其中 "*" 作为保留字段用于全体玩家广播
# 通过Call + AllowCall即可轻易的完成双端通信
注意事项
远程通信涉及I/O开销 请勿高频调用 (本地环境下Call为本机环回)
MultiClientsCall 批量调用 ^1.2.0
python
# MultiClientsCall为服务端独占功能 用于给多个玩家同时发包调用对立客户端函数
# 该方法相比for循环+Call的批量发包性能更好
MultiClientsCall(["-123", "-456", ...], "函数名", ...)
Entity 实体类
QuMod提供的一个简易的实体封装类 用于快捷的操作实体属性
python
from QuModLibs.Server import *
entityId = "12345" # 假定一个实体ID,实际项目开发时可自行获取
print(Entity(entityId).Health.Value) # 获取实体生命值
print(Entity(entityId).Health.Max) # 获取实体最大生命值
Entity(entityId).Health.Value = 6666 # 设置当前实体生命值为6666
print(Entity(entityId).Pos) # 获取实体Pos位置(x,y,z)
print(Entity(entityId).FootPos) # 获取实体脚部位置
Entity(entityId).Pos = (0,0,0) # 设置实体位置
print(Entity(entityId).Rot) # 获取实体旋转角度
Entity(entityId).Rot = (10,-30) # 设置实体旋转角度
print(Entity(entityId).Identifier) # 获取实体Identifier
print(Entity(entityId).Dm) # 获取实体所在维度
print(Entity(entityId).DirFromRot) # 获取实体的面向向量
...
数据储存管理
QuMod提供了便捷的数据储存管理 无缝对接运行时
python
from QuModLibs.Server import *
# 对于客户端还将多一项参数 指定是当前地图还是全局
@QuDataStorage.AutoSave(version = 1) # version有助于数据结构大型变更时放弃旧版数据
class Data: # 当属性新旧类型不同时也将会放弃旧的类型数据
count = 0 # 记录玩家长按物品使用次数
@Listen(Events.ServerItemTryUseEvent)
def ServerItemTryUseEvent(_={}):
Data.count += 1 # float / int 将被一致视为number类型
print(Data.count)
# QuDataStorage.saveData() 手动调用更新(在重要数据时确保及时储存)
注意事项
QuDataStorage默认只在游戏关闭时调用储存 如果玩家通过大退出后台/非常规退出 可能丢失保存 因此在一些重要数据保存时开发者应手动调用储存更新