网易我的世界论坛

标题: BlockUseEvent等事件过多触发的解决办法 [打印本页]

作者: 天天早晨    时间: 2021-8-13 14:47
标题: BlockUseEvent等事件过多触发的解决办法
官方示例中写到:如果一直点着右键会发现背包一下子就被钻石剑填满了。这是因为ServerBlockUseEvent事件每一帧(tick)都会触发,开发者在阅读文档时也应留意。
那么,如何解决这个问题呢?
首先,在服务端初始化时记录时间
def __init__(self, namespace, systemName):
      # ...
      self.timecomp = serverApi.GetEngineCompFactory().CreateTime(0)
      self.Time = self.timecomp.GetTime()

然后,在事件处理函数中,检测事件和上次执行事件是否存在足够间隔,如果没有,就取消执行
def OnServerBlockUseEvent(self, args):
        if self.timecomp.GetTime() < self.Time + self.INTERVAL:
            return "帧数过高,取消执行"
        else:
            self.Time = self.timecomp.GetTime()
其中,self.INTERVAL是间隔帧数

可以完美解决问题
作者: 方戨阙    时间: 2021-8-13 15:18
本质就是通过一个变量来控制它
作者: sevenstars    时间: 2021-8-21 00:29
不需要GetTime,只需要一个类全局变量就行
在手机上点击一次方块只会触发一次BlockUseEvent,电脑上右键方块才会多次触发。所以如果不打算上架电脑,可以不处理此问题。
监听客户端使用方块的事件。再监听鼠标右键,如果玩家右键方块,就判断全局变量是不是True,是的话就return,不是的话就往下走,并把这个变量设为True,然后执行逻辑(如发事件到服务端)。玩家松开鼠标右键时,把这个变量再次设为False。
作者: 方戨阙    时间: 2021-8-21 10:41
我是通过客户端或者服务端自定义一个component,comp里面放着各种控制开关,这个更佳舒服省事,而且它是由entityid创建的comp,各个玩家使用相互不影响,不用担心线程




欢迎光临 网易我的世界论坛 (http://mc.netease.com/) Powered by Discuz! X3.3