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

如何在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);
}

关键修改点

  1. 在if(killer != null)分支内,先重置受害者的killstreak(这里设置为0,可根据需求改为减1),再调用封装好的方法更新计分板。
  2. 将重复的受害者计分板更新逻辑提取为单独方法,减少冗余同时保证逻辑一致。
  3. 移除原代码中独立于分支外的受害者计分板更新,避免重复执行导致的逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:18:13