Skip to content

事件的监听以及基类方法的调用

本页讲解如何通过QyMod来监听事件,双端通信以及调用系统类基类方法

监听游戏原生事件

原生ModSDK的监听是通过系统类的ListenForEvents方法,然而剔除类之后,QyMod提供了ListenServer以及ListenClient等接口代替了其功能

导入必须的依赖库以使用监听接口

py
from QingYunModLibs.SystemApi import *

INFO

需要注意的是,ListenServer和ListenClient都是SystemApi的接口,而在Mod注册的脚本里便提到ClientMod以及ServerMod这两个依赖库,上面的导入SystemApi字段在两个依赖库中均已完成,因此在已经导入ClientMod或ServerMod的作用域下监听事件时,无需再导入SystemApi,直接可以调用ListenServer以及ListenClient

使用装饰器ListenServer监听服务端事件

ListenServer与ListenClient分别对应服务端与客户端的事件监听功能,无法在服务端脚本使用ListenClient监听客户端事件,也无法在客户端使用ListenServer监听服务端事件,以下将展示如何用ListenServer监听玩家发送消息事件并在游戏日志中打印出玩家发送的消息内容:

py
from QingYunModLibs.ServerMod import *

@ListenServer(ServerEvents.WorldEvents.ServerChatEvent)
def OnServerChat(args):
    print args["message"]

INFO

与原生ListenForEvents方法不同的是,ListenServer以及ListenClient均为装饰器函数,可以直接装饰回调函数来监听事件,且仅需写入事件名称即可完成监听,在游戏结束时,由ListenServer以及ListenClient监听的事件均会自动销毁回收,也可以通过UnListenServer或UnListenClient函数主动销毁监听

使用QyMod完成双端通信

CallClient函数

CallClient函数用于给指定playerId客户端函数发送通信请求以调用目标函数,通过输入目标函数名称以及playerId和调用函数需要的参数即可完成通信并调用指定函数(需要客户端侧先使用Call装饰目标函数)

装饰器Call函数

装饰器Call函数用于绑定通信回调,与原生ModSDK的ListenForEvent监听自定义事件等价,与原生接口不同的是Call绑定的监听以回调函数的名称作为通信id,以下示例展示了如何从服务端监听玩家发送消息事件后通知客户端打印消息:

py
# TutoralScripts.Server
from QingYunModLibs.ServerMod import *

@ListenServer(ServerEvents.WorldEvents.ServerChatEvent)
def OnServerChat(args):
    PlayerId = args["playerId"]
    Message = args["message"]
    CallClient("OnTest", PlayerId, Message)


# TutoralScripts.Client
from QingYunModLibs.ClientMod import *
playerId = ClientApi.Player.playerId

@Call(playerId)
def OnTest(args):
    print args

INFO

Call与Callxxx等通信接口的最后一个参数AllClient或AllServer用于选择是否扩散通信作用域到全QyMod环境,QyMod提供了全框架环境的通信功能,可以从一个mod的服务端通信另一个mod的客户端

使用QyMod调用系统基类方法

除了ListenEvent这种监听接口以外,还有部分接口同样写在系统基类方法里,因此QyMod提供了ServerObj和ClientObj这两个基类实例以供开发者在未注册系统类的情况下也能正常使用基类方法

使用QyMod的ServerObj基类实例在主世界坐标(0, 100, 0)处生成一个凋零

py
from QingYunModLibs.SystemApi import *

ServerObj.CreateEngineEntityByTypeStr("minecraft:wither", (0, 100, 0), (0, 0), 0)

INFO

ServerObj以及ClientObj包含了ServerSystem和ClientSystem所有的基类方法,可以完全平替其功能,除此之外SystemApi中也封装了部分基类方法并简化了其调用步骤,使其更便于开发者使用