Sky_God_
本帖最后由 Sky_God_ 于 2021-7-23 14:09 编辑

我使用的是spigot-1.8.8-r0.1核心。
我想做一个临时观看某个地点的功能,主要要用到使玩家坐下,而在规定时间内,不能按shift下去。于是,我写了一个简单的代码(如下),
  1. Entity seat = player.getWorld().spawnEntity(tempPlayerPlace.add(0, -1.15, 0), EntityType.ARMOR_STAND);
  2.                 ArmorStand as = ((ArmorStand) seat);
  3.                 as.setBasePlate(false);
  4.                 as.setVisible(false);
  5.                 as.setGravity(false);
  6.                 seat.getLocation().setDirection(tempPlayerPlace.getDirection());
  7.                     tempSit = true;
  8.                     seat.setPassenger(player);
  9.                     player.setGameMode(GameMode.SPECTATOR);
复制代码
当然,这里的“tempPlayerPlace”指的是一个Location。
我也知道一般用的是监听的手段,取消该事件的继续进行,但是当我去查找javadoc的时候,发现了一个名为“EntityDismountEvent”的事件,我点了进去看,很高兴的发现了里面确实有取消事件“setCancelled​(boolean cancel)”,正当我要去我的代码里面付诸行动时,我发现了一个严重的问题:我发现这个类里面没有“setCancelled​(boolean cancel)”方法,如图:

。我顿时明白这是版本导致的问题,于是我想,既然无法“setCancelled​(boolean cancel)”,那我就监听这个事件,让玩家按Shift之后退出。在我监听这个事件后,当我测试的时候按下了Shift,却没有任何作用的时候,我认为可能是没过这个监听,然后我“System.out.println(1);”输出了确认了之后,才发现离开坐骑的时候根本就没走这个事件。
然后我去排查,我知道Player有个方法叫做"eject".
具体的意思就是“驱逐任何乘客。如果有乘客,则返回真。”。然后我就去顺着这个思路去反过去找,找啊找,找到了这里:
具体查找的步骤(如果知道了就可以不用看):
事实证明,在驱逐玩家的时候,确实走了这个地方,但是我监听的时候却没过呢?更加离谱的是,我把这个地方所有经过的事件全部监听了一遍,发现只有一个事件过了:“EntityMountEvent”只有这个事件走了一遍,其他没走。
我认为是我按LShift的问题才没走,于是我让他自然的eject()。我想这样肯定可以过,结果答案依然如此,我彻底懵逼了。一个事件都没过,本来想条件不符合的问题,可是他里面确实有if else啊,if的条件不符合,总有else可以过吧,那个事件总得过吧,但是都没过,后台也都没报错。
还有坐到盔甲架上之后,怎么取消显示这个?

请求大佬帮忙,这对我真的很重要。


结冰的离季
何不换个思路,当坐上去之后,启动一个task,每tick都设置玩家坐在盔甲架上,即使玩家下来也会被设置回去

Sky_God_
结冰的离季 发表于 2021-7-23 00:28
何不换个思路,当坐上去之后,启动一个task,每tick都设置玩家坐在盔甲架上,即使玩家下来也会被设置回去 ...

我现在就是这么做的。。。

第一页 上一页 下一页 最后一页