From e62d0df9dfde4d4b484d2c3901caac0e733c01f3 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 23 Feb 2025 01:22:52 +0100 Subject: [PATCH] Refactor potion healing to exclude non-teammates. Split logic into smaller methods for clarity and maintainability. Added `shouldHeal` to determine team eligibility and `calculateActualHealing` to handle precise healing calculations. Updated intensity handling to exclude non-teammates during healing. --- .../com/alttd/ctf/events/OtherGameEvents.java | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/alttd/ctf/events/OtherGameEvents.java b/src/main/java/com/alttd/ctf/events/OtherGameEvents.java index 20de13d..0fc72f7 100644 --- a/src/main/java/com/alttd/ctf/events/OtherGameEvents.java +++ b/src/main/java/com/alttd/ctf/events/OtherGameEvents.java @@ -13,6 +13,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.PotionSplashEvent; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.Optional; @@ -64,23 +65,44 @@ public class OtherGameEvents implements Listener { if (optionalTeamPlayer.isEmpty()) return; + TeamPlayer teamPlayer = optionalTeamPlayer.get(); + + event.getAffectedEntities().stream() + .filter(livingEntity -> livingEntity instanceof Player) + .map(livingEntity -> (Player) livingEntity) + .forEach(target -> { + if (shouldHeal(teamPlayer, target)) { + return; + } + event.setIntensity(target, 0); + }); + double totalHealing = thrownPotion.getEffects().stream() .filter(effect -> effect.getType() == PotionEffectType.INSTANT_HEALTH) .flatMapToDouble(effect -> event.getAffectedEntities().stream() .filter(livingEntity -> livingEntity instanceof Player) .map(livingEntity -> (Player) livingEntity) - .mapToDouble(target -> { - AttributeInstance playerMaxHealth = target.getAttribute(Attribute.GENERIC_MAX_HEALTH); - if (playerMaxHealth == null) { - return 0; - } - double missingHealth = playerMaxHealth.getValue() - target.getHealth(); - double potentialHealing = (effect.getAmplifier() + 1) * event.getIntensity(target); - return Math.min(potentialHealing, missingHealth); - })) + .mapToDouble(target -> calculateActualHealing(target, effect, event.getIntensity(target)))) .sum(); - optionalTeamPlayer.get().increaseStat(Stat.DAMAGE_HEALED, totalHealing); + teamPlayer.increaseStat(Stat.DAMAGE_HEALED, totalHealing); + } + + private boolean shouldHeal(TeamPlayer healer, Player target) { + Optional optionalTeamTarget = gameManager.getTeamPlayer(target); + return optionalTeamTarget.isPresent() && healer.getTeam() == optionalTeamTarget.get().getTeam(); + } + + private double calculateActualHealing(Player target, PotionEffect effect, double intensity) { + AttributeInstance playerMaxHealth = target.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (playerMaxHealth == null) { + return 0; + } + + double missingHealth = playerMaxHealth.getValue() - target.getHealth(); + //Only counts healing on teammates since intensity was set to 0 for non teammates + double potentialHealing = (effect.getAmplifier() + 1) * intensity; + return Math.min(potentialHealing, missingHealth); } }