From c11991307195c71de5b5b4ed39e318dd0f96db39 Mon Sep 17 00:00:00 2001 From: jannis Date: Thu, 8 Oct 2026 22:46:05 +0200 Subject: [PATCH] added Anti Player Loot despawn --- .../AntiPlayerLootDespawn.java | 14 +++++ .../AntiPlayerLootDespawnListener.java | 51 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawn.java create mode 100644 craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawn.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawn.java new file mode 100644 index 0000000..7a48301 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawn.java @@ -0,0 +1,14 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class AntiPlayerLootDespawn extends Appliance { + @Override + protected @NotNull List listeners() { + return List.of(new AntiPlayerLootDespawnListener()); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java new file mode 100644 index 0000000..f408bb0 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java @@ -0,0 +1,51 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.entity.ItemSpawnEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.Locale; + +public class AntiPlayerLootDespawnListener extends ApplianceListener { + private static final int extraCycles = 5; + private static final String namespace = AntiPlayerLootDespawnListener.class.getSimpleName().toLowerCase(Locale.ROOT); + public static NamespacedKey cyclesKey = new NamespacedKey(namespace, "item_deaths_cycles".toLowerCase()); + private Location lastDeathLocation; + private long lastDeathTick = -1; + + @EventHandler + public void onDeath(PlayerDeathEvent event) { + this.lastDeathLocation = event.getEntity().getLocation(); + this.lastDeathTick = event.getPlayer().getWorld().getGameTime(); + } + + @EventHandler + public void onItemSpawn(ItemSpawnEvent event) { + Item item = event.getEntity(); + + if(this.lastDeathLocation == null) return; + if(!item.getWorld().equals(this.lastDeathLocation.getWorld())) return; + if (item.getWorld().getGameTime() != this.lastDeathTick) return; + if(item.getLocation().distanceSquared(this.lastDeathLocation) > 9) return; + + item.getPersistentDataContainer().set(cyclesKey, PersistentDataType.INTEGER, extraCycles); + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) { + PersistentDataContainer data = event.getEntity().getPersistentDataContainer(); + Integer cycles = data.get(cyclesKey, PersistentDataType.INTEGER); + + if(cycles == null || cycles <= 0) return; + + data.set(cyclesKey, PersistentDataType.INTEGER, cycles - 1); + event.setCancelled(true); + } +}