冰上云梦
使用的前置插件: Atlas一下是原帖描述:[ 原帖地址 ]

Description

What is Atlas?
[size=14.6667px]Atlas is an all-in-one and cohesive API for developers who want to improve their Bukkit plugins or anti-cheats.

What does it include?
[size=14.6667px]一下是我参考的原帖的方法写的监听器


[size=14.6667px]


我如何让他监听具有特定NBT的箱子的打开与关闭操作呢?

飞翔之歌
本帖最后由 飞翔之歌 于 2020-6-16 23:50 编辑

你这个代码写的应该是新事件吧。。。@季末旋律



冰上云梦
飞翔之歌 发表于 2020-6-16 23:44
你这个写的应该是监听器@季末旋律

不是吧,我跟着那个教程写的,应该是监听器吧……,第一次写自定义监听器,不知道这东西长什么样子。

飞翔之歌
季末旋律 发表于 2020-6-16 23:51
不是吧,我跟着那个教程写的,应该是监听器吧……,第一次写自定义监听器,不知道这东西长什么样子。 ...

这是个新事件类
监听器函数使用@EventHandler注解
所监听的事件作为监听器函数的参数
就像这样(伪代码)
@EventHandler
public static void xxx(xxx e){
    xxx
}
这样就会监听xxx事件
至于监听特定NBT的箱子
在函数里判断被打开的箱子是否为特定NBT的箱子,不是则return;

冰上云梦
本帖最后由 季末旋律 于 2020-6-17 00:03 编辑
飞翔之歌 发表于 2020-6-16 23:55
这是个新事件类
监听器函数使用@EventHandler注解
所监听的事件作为监听器函数的参数


我知道我为啥写这个了,监听器会在主方法内写
这个就是负责提供一个异步的事件,然后让监听器监听这个事件后处理
所以,怎么让他知道自己什么时候触发这个事件呢?
如果使用系统的,可能普通箱子也会被一同监听。我怕这样会导致插件耗能过大,毕竟我就是好多箱子里面找东西的玩家

飞翔之歌
本帖最后由 飞翔之歌 于 2020-6-17 00:10 编辑
季末旋律 发表于 2020-6-17 00:01
我知道我为啥写这个了,监听器会在主方法内写
这个就是负责提供一个异步的事件,然后让监听器监听这个事 ...

你或许可以实时监听带有特定NBT的箱子,如果该箱子被开启则触发事件
话说你这是插件呀,TileEntity难道不需要生艹NMS吗?(我没看前置插件sorry))
(而且这样如果这些箱子多了,消耗还是很大)


冰上云梦
飞翔之歌 发表于 2020-6-17 00:05
你或许可以实时监听带有特定NBT的箱子,如果该箱子被开启则触发事件
话说你这是插件呀,TileEntity难 ...

所以我才异步处理这个东西以防消耗过大,并且这个东西理论上也不会超过50个还有冷却。
主要是和玩家的开箱操作分开(有一些GUI也是箱子),所以怎么做这个事件?

飞翔之歌
季末旋律 发表于 2020-6-17 00:56
所以我才异步处理这个东西以防消耗过大,并且这个东西理论上也不会超过50个还有冷却。
主要是和玩家的开 ...

监听所有这个箱子
如果被打开就发布该事件
(还需要判断该箱子周围的玩家是否在开这个箱子)
(事实上可以套娃事件,通过监听事件来触发事件)

南柯郡守
粗略看了下回帖

没必要

没必要自己自定义Event  因为你自定义的Event还是在Bukkit的Event的基础上
你可以直接像楼上说的监听箱子打开事件 然后获取箱子的NBT判断是否return
都已经异步监听了 更不用怕什么卡住主线程的问题了

冰上云梦
本帖最后由 季末旋律 于 2020-6-17 12:29 编辑
南柯郡守 发表于 2020-6-17 09:10
粗略看了下回帖

没必要


那我就直接监听箱子打开事件,然后判断一下就可以了吗?

于简
大佬膜拜我来水经验啦

南柯郡守
季末旋律 发表于 2020-6-17 12:22
那我就直接监听箱子打开事件,然后判断一下就可以了吗?

是的 如果能监听到打开箱子事件

也可以通过监听玩家与方块的交互事件  
比如PlayerInteractEvent
然后判断是不是箱子
再判断是不是要监听的特殊箱子

冰上云梦
南柯郡守 发表于 2020-6-17 15:12
是的 如果能监听到打开箱子事件

也可以通过监听玩家与方块的交互事件  

能告诉我怎么让事件知道自己需要监听什么,我还是想自己新建出来一个事件,然后自己去监听。
毕竟这样都是异步的,我觉得我需要这样的方式。

南柯郡守
本帖最后由 南柯郡守 于 2020-6-17 20:15 编辑
季末旋律 发表于 2020-6-17 20:05
能告诉我怎么让事件知道自己需要监听什么,我还是想自己新建出来一个事件,然后自己去监听。
毕竟这样都 ...

当这件事发生的时候
比如
  1. player.teleport(loc);
  2. Bukkit.getPluginManager().callEvent(new MyPlayerTeleportEvent(player,loc));
复制代码

这样就是了 会在玩家传送的时候触发一个MyPlayerTeleportEvent如果要监听就是
  1. @EventHandler
  2. public void onPlayerTeleport(MyPlayerTeleportEvent e) {
  3.     //do something
  4. }
复制代码


然而你不可能在mc的代码里加入第一段代码
所以你只能先监听Bukkit提供的事件
然后判断是不是你要的功能 再去callEvent