查看: 1058|回复: 3
打印 上一主题 下一主题

[求助] 请问应该如何注册事件监听?

[复制链接]

22

主题

727

回帖

208

积分

Lv.5 农牧专家

UID
624989
小麦
-1
金锭
865
下界之星
0
跳转到指定楼层
楼主
发表于 2019-8-2 09:53:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 IP:山东
本帖最后由 超神的清凉 于 2019-8-2 09:56 编辑

如题,在官方的示例模组里添加了一个新的事件监听,但是不起作用,在modPC中调试时只注册了"ServerChatEvent"没有注册"OnScriptTickServer"
我想请教一下官方API上最近更新的那个注册方法是不正确的吗,或者是我遗漏了什么?只能注册一个事件监听吗?
modPC运行效果:官方的能够运行,添加的红色代码运行毫无效果

代码如下:
# -*- coding: utf-8 -*-

# 获取引擎服务端API的模块
import server.extraServerApi as serverApi
# 获取引擎服务端System的基类,System都要继承于ServerSystem来调用相关函数
ServerSystem = serverApi.GetServerSystemCls()

# 在modMain中注册的Server System类
class TutorialServerSystem(ServerSystem):

    # ServerSystem的初始化函数
    def __init__(self, namespace, systemName):
        # 首先调用父类的初始化函数
        super(TutorialServerSystem, self).__init__(namespace, systemName)
        print "===== TutorialServerSystem init ====="
        # 初始时调用监听函数监听事件
        self.ListenEvent()

    # 监听函数,用于定义和监听函数。函数名称除了强调的其他都是自取的,这个函数也是。
    def ListenEvent(self):
        # 在自定义的ServerSystem中监听引擎的事件ServerChatEvent,回调函数为OnServerChat
        self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "ServerChatEvent", self, self.OnServerChat)
        self.ListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "OnScriptTickServer", self, self.OnTick)

    # 反监听函数,用于反监听事件,在代码中有创建注册就对应了销毁反注册是一个好的编程习惯,不要依赖引擎来做这些事。
    def UnListenEvent(self):
        self.UnListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "ServerChatEvent", self, self.OnServerChat)
        self.UnListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "DestroyBlockEvent", self, self.OnDestroyBlock)

    # 监听ServerChatEvent的回调函数
    def OnServerChat(self, args):
        print "==== OnServerChat ==== ", args
        # 生成掉落物品
        # 当我们输入的信息等于右边这个值时,创建相应的物品
        if args["message"] == "钻石剑":
            # 创建Component,用来完成特定的功能,这里是为了创建Item物品
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            # 给这个Component赋值,参数参考《MODSDK文档》
            comp.addItems = [("minecraft:diamond_sword", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            # 这一步很重要,它告诉系统需要更新这个Component,继而完成响应的功能
            self.NeedsUpdate(comp)
        elif args["message"] == "钻石镐":
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            comp.addItems = [("minecraft:diamond_pickaxe", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            self.NeedsUpdate(comp)
        elif args["message"] == "钻石头盔":
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            comp.addItems = [("minecraft:diamond_helmet", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            self.NeedsUpdate(comp)
        elif args["message"] == "钻石胸甲":
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            comp.addItems = [("minecraft:diamond_chestplate", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            self.NeedsUpdate(comp)
        elif args["message"] == "钻石护腿":
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            comp.addItems = [("minecraft:diamond_leggings", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            self.NeedsUpdate(comp)
        elif args["message"] == "钻石靴子":
            comp = serverApi.CreateComponent(serverApi.GetLevelId(), "Minecraft", "item")
            comp.addItems = [("minecraft:diamond_boots", 1, 0, True, {"to": "inventory", "playerId": args["playerId"]})]
            self.NeedsUpdate(comp)
        else:
            print "==== Sorry man ===="

    def Tick(self, args):
        print "get"


    # 函数名为Destroy才会被调用,在这个System被引擎回收的时候会调这个函数来销毁一些内容
    def Destroy(self):
        print "===== TutorialServerSystem Destroy ====="
        # 调用上面的反监听函数来销毁
        self.UnListenEvent()



0

主题

1

回帖

0

积分

Lv.1 新手木匠

UID
366637
小麦
0
金锭
24
下界之星
0
沙发
发表于 2019-8-2 14:44:31 | 只看该作者 IP:广东
本帖最后由 mc雨果 于 2019-8-2 14:53 编辑

1. self.OnTick 和  def Tick(self, args):  函数名称写错了2. def OnTick(self):  没有参数的
3. self.UnListenForEvent(serverApi.GetEngineNamespace(), serverApi.GetEngineSystemName(), "DestroyBlockEvent", self, self.OnDestroyBlock) 这个事件没有监听也就不用UnListen

    def OnTick(self):
        print "get"


7

主题

19

回帖

14

积分

Lv.1 新手木匠

UID
5928425
小麦
0
金锭
111
下界之星
0
板凳
发表于 2019-8-2 19:04:43 来自手机 | 只看该作者 IP:浙江
我却连代码一行都看不懂

22

主题

727

回帖

208

积分

Lv.5 农牧专家

UID
624989
小麦
-1
金锭
865
下界之星
0
地板
 楼主| 发表于 2019-8-2 19:44:22 | 只看该作者 IP:山东
mc雨果 发表于 2019-8-2 14:44
1. self.OnTick 和  def Tick(self, args):  函数名称写错了2. def OnTick(self):  没有参数的
3. self.Un ...

谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部