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
相关产品推荐
相关产品推荐

