如何在onPlayerDeath的if(killer!=null)分支中更新受害者计分板
问题分析与解决方案
问题根源
原代码中,受害者的击杀数(killstreak)修改逻辑仅在非玩家造成死亡时触发:
// 仅当死亡原因不是玩家攻击时,才减少受害者的killstreak if (cause != EntityDamageEvent.DamageCause.ENTITY_ATTACK && cause != EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK) { // ...减少killstreak的代码 }
当玩家被其他玩家击杀时(对应上述两种玩家攻击的伤害类型),受害者的killstreak数值没有被修改,直接执行更新计分板的代码自然看不到变化,这就是你导入的代码未生效的核心原因。
修复方案
在if(killer != null)分支内,先重置(或调整)受害者的killstreak,再执行计分板更新逻辑。以下是修改后的完整代码:
@EventHandler public void onPlayerDeath(PlayerDeathEvent event) { Player victim = event.getEntity(); Player killer = victim.getKiller(); // 检查最后伤害来源 EntityDamageEvent lastDamage = victim.getLastDamageCause(); EntityDamageEvent.DamageCause cause = lastDamage != null ? lastDamage.getCause() : null; // 非玩家导致死亡时,减少受害者的killstreak并更新计分板 if (cause != EntityDamageEvent.DamageCause.ENTITY_ATTACK && cause != EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK) { UUID victimId = victim.getUniqueId(); int victimKillStreak = killStreaks.getOrDefault(victimId, 0); if (victimKillStreak > 0) { killStreaks.put(victimId, victimKillStreak - 1); victim.sendMessage(ChatColor.RED + "你的击杀数因死亡减少了。"); } updateVictimScoreboard(victim); } if (killer != null) { UUID killerId = killer.getUniqueId(); int killerKillStreak = killStreaks.getOrDefault(killerId, 0); if (killerKillStreak < 5) { killStreaks.put(killerId, killerKillStreak + 1); killer.sendMessage(ChatColor.GREEN + "你获得了+1击杀数!当前击杀数: " + (killerKillStreak + 1)); } // 应用击杀数对应的特殊效果 if (killerKillStreak + 1 >= 1) { killer.addPotionEffect(new PotionEffect(PotionEffectType.LUCK, Integer.MAX_VALUE, 0)); // 无限时长幸运I killer.addPotionEffect(new PotionEffect(PotionEffectType.HERO_OF_THE_VILLAGE, Integer.MAX_VALUE, 0)); // 无限时长村庄英雄I killer.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0)); // 无限时长速度I } // 攻击速度属性调整 AttributeInstance attackSpeedAttribute = killer.getAttribute(Attribute.GENERIC_ATTACK_SPEED); if (attackSpeedAttribute != null) { if (killerKillStreak + 1 >= 2) { attackSpeedAttribute.setBaseValue(1024); } else { attackSpeedAttribute.setBaseValue(4.0); // 玩家默认攻击速度 } } // 击退抗性属性调整 AttributeInstance knockbackResistanceAttribute = killer.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE); if (knockbackResistanceAttribute != null) { if (killerKillStreak + 1 >= 3) { knockbackResistanceAttribute.setBaseValue(1.0); } else { knockbackResistanceAttribute.setBaseValue(0.0); // 玩家默认击退抗性 } } if (killerKillStreak + 1 >= 4) { killer.addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST, Integer.MAX_VALUE, 0)); // 无限时长生命提升I } if (killerKillStreak + 1 >= 5) { killer.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, Integer.MAX_VALUE, 0)); // 无限时长力量I } // 更新杀手的计分板 int limitedKillStreak = Math.min(killerKillStreak + 1, 5); ChatColor killStreakColor = getColorForKillStreak(limitedKillStreak); String coloredKillStreak = killStreakColor + String.valueOf(limitedKillStreak); killer.setPlayerListName(killer.getName() + " " + killStreakColor + "[" + coloredKillStreak + "]" + ChatColor.RESET); updatePlayerScoreboard(killer); // 玩家被玩家击杀时,重置受害者的killstreak并更新计分板 UUID victimId = victim.getUniqueId(); killStreaks.put(victimId, 0); // 若需要改为减1,可替换为 killStreaks.getOrDefault(victimId, 0) - 1 victim.sendMessage(ChatColor.RED + "你被玩家击杀,击杀数已重置。"); updateVictimScoreboard(victim); saveKillStreaks(); } } // 提取重复的受害者计分板更新逻辑为单独方法,避免代码冗余 private void updateVictimScoreboard(Player victim) { UUID victimId = victim.getUniqueId(); int victimKillStreak = killStreaks.getOrDefault(victimId, 0); int limitedVictimKillStreak = Math.min(victimKillStreak, 5); ChatColor victimKillStreakColor = getColorForKillStreak(limitedVictimKillStreak); String coloredVictimKillStreak = victimKillStreakColor + String.valueOf(limitedVictimKillStreak); victim.setPlayerListName(victim.getName() + " " + victimKillStreakColor + "[" + coloredVictimKillStreak + "]" + ChatColor.RESET); updatePlayerScoreboard(victim); }
关键修改点
- 在
if(killer != null)分支内,先重置受害者的killstreak(这里设置为0,可根据需求改为减1),再调用封装好的方法更新计分板。 - 将重复的受害者计分板更新逻辑提取为单独方法,减少冗余同时保证逻辑一致。
- 移除原代码中独立于分支外的受害者计分板更新,避免重复执行导致的逻辑冲突。
内容的提问来源于stack exchange,提问作者gamer boi
相关产品推荐
相关产品推荐

