我想制作一个插件,在输入命令后为玩家提供夜视效果,并且它正在工作,但我还想添加如果玩家在这个数组列表上,它在死亡后会产生效果,但看起来在 EventHandler 之后它没有加载数组列表中的玩家。
public class Gamma implements CommandExecutor, Listener {
private ArrayList<Player> gammaList = new ArrayList<>();
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Player player = (Player) sender;
PotionEffect potionEffect = player.getPotionEffect(PotionEffectType.NIGHT_VISION);
if (gammaList.contains(player)) {
gammaList.remove(player);
player.sendMessage(ChatColor.GREEN + "Pomyslnie" + ChatColor.RED + " usunieto" + ChatColor.GREEN + " efekt gammy!");
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
} else if (!gammaList.contains(player)) {
gammaList.add(player);
player.sendMessage(ChatColor.GREEN + "Pomyslnie" + ChatColor.DARK_GREEN + " nadano" + ChatColor.GREEN + " efekt gammy!");
player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 1));
}
return true;
}
@EventHandler
public void onPlayerDie(EntityResurrectEvent event) {
Player player = (Player) event.getEntity();
if (gammaList.contains(player)) {
player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 1));
}
}
}
Sb 知道我应该在这段代码中更改什么吗?
从开发人员的角度来看,我对 bukkit 或 spigot 的经验为零,但考虑到我的 Java 经验:您正在定义您的
ArrayList
非 static
,这意味着它很可能在整个服务器中不是唯一的,并且意味着类的每个实例都可能有自己的 ArrayList
。仅当您的 Game
类是单例时,您的方法才有效。
您可以通过引用列表
static
来规避此问题,也可以使用线程安全列表,例如CopyOnWriteArrayList。
所以类似:
private static List<Player> gammaList = new CopyOnWriteArrayList<>();
应该可以。