Bukkit Java - ArrayList 在 Event 中不起作用

问题描述 投票:0回答:1

我想制作一个插件,在输入命令后为玩家提供夜视效果,并且它正在工作,但我还想添加如果玩家在这个数组列表上,它在死亡后会产生效果,但看起来在 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 知道我应该在这段代码中更改什么吗?

java bukkit spigot
1个回答
0
投票

从开发人员的角度来看,我对 bukkit 或 spigot 的经验为零,但考虑到我的 Java 经验:您正在定义您的

ArrayList
static
,这意味着它很可能在整个服务器中不是唯一的,并且意味着类的每个实例都可能有自己的
ArrayList
。仅当您的
Game
类是单例时,您的方法才有效。

您可以通过引用列表

static
来规避此问题,也可以使用线程安全列表,例如CopyOnWriteArrayList

所以类似:

private static List<Player> gammaList = new CopyOnWriteArrayList<>();

应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.