 
这样写,开创造的时候不会触发,然后开生存反而触发还报错了,咋回事
可能是因为是看gamemode来判断的吧
不对,只有单一的if,没有else,排除
语法,缩进,名字,逻辑,这4个可能打错误排查一下
不对,只有单一的if,没有else,排除
语法,缩进,名字,逻辑,这4个可能打错误排查一下
使用==代替equals
喵啊,是爆栈了吧
请在下一个主线程task再执行切换玩家游戏模式的操作。
另外你的逻辑也大有问题,事件都是执行前触发的
请在下一个主线程task再执行切换玩家游戏模式的操作。
另外你的逻辑也大有问题,事件都是执行前触发的
你需要的用户模式不是通过当前用户正在使用的模式来判断,可以看看那个event对象,里面应该有事件发生前后用户分别的状态
缩进错了 pl
这个牛了。。。
着实是大佬。。
sky浩瀚 发表于 2021-11-24 00:03
使用==代替equals
其实一样
应该把player.getGameMode()和GameMode.CREATIVE对调一下,因为后者肯定是non-null的
已收藏  谢谢楼主分享及在座大佬的解决方法(遇到了qwq)
楼上的大哥真的搞清楚状况了么...如果不懂的话就不要随便忽悠人好么...
现在楼主的代码里有两个问题,
1. 没有意识到事件监听器是作用在事件实际发生前的。
如果在监听器代码里直接重新设置玩家的游戏模式,会导致在监听级代码执行完成后,玩家的模式依然被设置为创造。而且监听器中重设模式的行为,会再一次的触发事件,造成死循环。正确的做法是在监听器代码中取消这个事件。
2. 比较枚举使用 compareTo。
上代码。
======= Code Area =======
/***
* 监听玩家游戏模式改变的事件,如果目标模式不是生存,取消该事件。
* @param e 事件。
*/
@EventHandler
public void onModeChange(PlayerGameModeChangeEvent e) {
if (e.getNewGameMode().compareTo(GameMode.SURVIVAL) != 0) {
e.setCancelled(true);
}
}
===== End of Code Area =====
抱歉挖坟,但真心觉得楼上这些大哥太离谱了。
现在楼主的代码里有两个问题,
1. 没有意识到事件监听器是作用在事件实际发生前的。
如果在监听器代码里直接重新设置玩家的游戏模式,会导致在监听级代码执行完成后,玩家的模式依然被设置为创造。而且监听器中重设模式的行为,会再一次的触发事件,造成死循环。正确的做法是在监听器代码中取消这个事件。
2. 比较枚举使用 compareTo。
上代码。
======= Code Area =======
/***
* 监听玩家游戏模式改变的事件,如果目标模式不是生存,取消该事件。
* @param e 事件。
*/
@EventHandler
public void onModeChange(PlayerGameModeChangeEvent e) {
if (e.getNewGameMode().compareTo(GameMode.SURVIVAL) != 0) {
e.setCancelled(true);
}
}
===== End of Code Area =====
抱歉挖坟,但真心觉得楼上这些大哥太离谱了。