You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bukkit Java开发:ArrayList在事件处理器中无法读取玩家数据求助

问题解决方案

需要修改的核心点

1. 替换错误的监听事件

你当前使用的EntityResurrectEvent是针对生物复活的事件,并不适用于玩家重生场景。应该改用PlayerRespawnEvent——该事件会在玩家完成重生操作时触发,此时给玩家重新添加夜视效果才会生效。

2. 改用UUID存储玩家标识

直接存储Player对象会导致引用失效:玩家死亡重生或重新登录后,Bukkit会生成新的Player实例,原ArrayList中的旧对象引用与新实例不匹配,contains()方法会返回false。因此需要将存储结构改为ArrayList<UUID>,用玩家的唯一UUID作为标识,确保不会因实例变化丢失数据。

3. 确保监听器已注册

在插件主类的onEnable()方法中,必须注册Gamma监听器,否则事件处理器根本不会被调用。示例代码如下:

@Override
public void onEnable() {
    getServer().getPluginManager().registerEvents(new Gamma(), this);
    getCommand("你的指令名称").setExecutor(new Gamma());
}

修改后的完整代码

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.ChatColor;
import java.util.ArrayList;
import java.util.UUID;

public class Gamma implements CommandExecutor, Listener {

    // 改用UUID存储玩家唯一标识
    private ArrayList<UUID> gammaList = new ArrayList<>();

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(ChatColor.RED + "只有玩家可以使用这个指令!");
            return true;
        }
        Player player = (Player) sender;
        UUID playerUUID = player.getUniqueId();

        if (gammaList.contains(playerUUID)) {
            gammaList.remove(playerUUID);
            player.sendMessage(ChatColor.GREEN + "Pomyslnie" + ChatColor.RED + " usunieto" + ChatColor.GREEN + " efekt gammy!");
            player.removePotionEffect(PotionEffectType.NIGHT_VISION);
        } else {
            gammaList.add(playerUUID);
            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 onPlayerRespawn(PlayerRespawnEvent event) {
        Player player = event.getPlayer();
        UUID playerUUID = player.getUniqueId();
        
        if (gammaList.contains(playerUUID)) {
            // 设置force为true,强制覆盖可能存在的旧效果
            player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 1), true);
        }
    }
}

内容的提问来源于stack exchange,提问作者KrzychuVelde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:58:18