From f2b039b96236abcb2f2074ccb40b94c03be9838c Mon Sep 17 00:00:00 2001 From: Yomamaeatstoes <114538961+Yomamaeatstoes@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:19:31 -0400 Subject: [PATCH] Fix for handling damage event for invincible effect (#205) * handle damage event for invincible effect * Update comment to be more informative --------- Co-authored-by: HSGamer Co-authored-by: TechnicallyCoded --- .../BetterRTP/player/events/Damage.java | 27 +++++++++++++++++++ .../player/events/EventListener.java | 6 +++++ .../player/rtp/effects/RTPEffect_Potions.java | 3 ++- .../player/playerdata/PlayerData.java | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Damage.java diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Damage.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Damage.java new file mode 100644 index 0000000..8211420 --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Damage.java @@ -0,0 +1,27 @@ +package me.SuperRonanCraft.BetterRTP.player.events; + +import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageEvent; + +public class Damage { + static boolean canCancel(EntityDamageEvent.DamageCause damageCause) { + return true; // TODO: Allow for filtering damage causes + } + + static boolean isInInvincibleMode(Player player) { + return HelperPlayer.getData(player).getInvincibleEndTime() > System.currentTimeMillis(); + } + + static void onEntityDamage(EntityDamageEvent event) { + Entity entity = event.getEntity(); + if (!(entity instanceof Player)) return; + Player player = (Player) entity; + + if (!canCancel(event.getCause())) return; + if (!isInInvincibleMode(player)) return; + + event.setCancelled(true); + } +} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java index e6c877b..3ad430a 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java @@ -5,6 +5,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.*; import org.bukkit.event.world.WorldLoadEvent; @@ -67,4 +68,9 @@ private void worldLoad(WorldLoadEvent e) { private void onRespawn(PlayerRespawnEvent e) { Death.respawnEvent(e); } + + @EventHandler + private void onDamage(EntityDamageEvent e) { + Damage.onEntityDamage(e); + } } \ No newline at end of file diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Potions.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Potions.java index 7c98d7b..7c4d8e3 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Potions.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/effects/RTPEffect_Potions.java @@ -2,6 +2,7 @@ import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.references.file.FileOther; +import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer; import me.SuperRonanCraft.BetterRTP.versions.AsyncHandler; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; @@ -52,7 +53,7 @@ void load() { public void giveEffects(Player p) { AsyncHandler.syncAtEntity(p, () -> { if (invincibleEnabled) - p.setNoDamageTicks(invincibleTime * 20); + HelperPlayer.getData(p).setInvincibleEndTime(System.currentTimeMillis() + (invincibleTime * 1000L)); if (potionEnabled) { List effects = new ArrayList<>(); for (PotionEffectType e : potionEffects.keySet()) { diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/player/playerdata/PlayerData.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/player/playerdata/PlayerData.java index 23f8f3b..56e2e9e 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/player/playerdata/PlayerData.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/player/playerdata/PlayerData.java @@ -22,6 +22,7 @@ public class PlayerData { @Getter @Setter boolean rtping; @Getter @Setter int rtpCount; @Getter @Setter long globalCooldown; + @Getter @Setter long invincibleEndTime; PlayerData(Player player) { this.player = player;