From c11991307195c71de5b5b4ed39e318dd0f96db39 Mon Sep 17 00:00:00 2001 From: jannis Date: Thu, 8 Oct 2026 22:46:05 +0200 Subject: [PATCH 1/4] 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); + } +} -- 2.47.3 From 73fa6649aff99d9023f41f5322d78bbc031a2b8f Mon Sep 17 00:00:00 2001 From: jannis Date: Wed, 14 Oct 2026 00:14:08 +0200 Subject: [PATCH 2/4] fixed issues in AntiPlayerLootDespawn --- .../AntiPlayerLootDespawn.java | 16 +++++++ .../AntiPlayerLootDespawnListener.java | 44 ++++++------------- 2 files changed, 30 insertions(+), 30 deletions(-) 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 index 7a48301..f2af66e 100644 --- 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 @@ -1,12 +1,28 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.NamespacedKey; import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Locale; public class AntiPlayerLootDespawn extends Appliance { + 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()); + + public void getItems(List item) { + item.forEach(itemStack -> + itemStack.editPersistentDataContainer(persistentDataContainer -> + persistentDataContainer.set(cyclesKey, PersistentDataType.INTEGER, extraCycles) + ) + ); + } + @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 index f408bb0..c079d8d 100644 --- 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 @@ -1,51 +1,35 @@ 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.inventory.ItemStack; 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; +class AntiPlayerLootDespawnListener extends ApplianceListener { @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); + this.getAppliance().getItems(event.getDrops()); } @EventHandler public void onItemDespawn(ItemDespawnEvent event) { - PersistentDataContainer data = event.getEntity().getPersistentDataContainer(); - Integer cycles = data.get(cyclesKey, PersistentDataType.INTEGER); + Item item = event.getEntity(); + ItemStack itemStack = item.getItemStack(); - if(cycles == null || cycles <= 0) return; + int cycles = itemStack.getPersistentDataContainer() + .getOrDefault(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, 0); - data.set(cyclesKey, PersistentDataType.INTEGER, cycles - 1); + if(cycles <= 0) return; + + itemStack.editPersistentDataContainer(data -> + data.set(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, cycles - 1) + ); + + item.setItemStack(itemStack); event.setCancelled(true); } } -- 2.47.3 From 1180af64a1cf91283efbb716165db90ab188eb3b Mon Sep 17 00:00:00 2001 From: jannis Date: Wed, 14 Oct 2026 01:23:32 +0200 Subject: [PATCH 3/4] moved logic from listener to appliance --- .../AntiPlayerLootDespawn.java | 18 ++++++++++++++++- .../AntiPlayerLootDespawnListener.java | 20 ++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) 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 index f2af66e..b7901da 100644 --- 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 @@ -2,6 +2,7 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayer import eu.mhsl.craftattack.spawn.core.appliance.Appliance; import org.bukkit.NamespacedKey; +import org.bukkit.entity.Item; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; @@ -15,7 +16,7 @@ public class AntiPlayerLootDespawn extends Appliance { private static final String namespace = AntiPlayerLootDespawnListener.class.getSimpleName().toLowerCase(Locale.ROOT); public static NamespacedKey cyclesKey = new NamespacedKey(namespace, "item_deaths_cycles".toLowerCase()); - public void getItems(List item) { + public void markItems(List item) { item.forEach(itemStack -> itemStack.editPersistentDataContainer(persistentDataContainer -> persistentDataContainer.set(cyclesKey, PersistentDataType.INTEGER, extraCycles) @@ -23,6 +24,21 @@ public class AntiPlayerLootDespawn extends Appliance { ); } + public boolean AboveMaxAge(Item item) { + ItemStack itemStack = item.getItemStack(); + + int cycles = itemStack.getPersistentDataContainer() + .getOrDefault(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, 0); + + itemStack.editPersistentDataContainer(data -> + data.set(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, cycles - 1) + ); + + item.setItemStack(itemStack); + + return cycles > 0; + } + @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 index c079d8d..d950b42 100644 --- 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 @@ -1,35 +1,19 @@ package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; -import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataType; class AntiPlayerLootDespawnListener extends ApplianceListener { @EventHandler public void onDeath(PlayerDeathEvent event) { - this.getAppliance().getItems(event.getDrops()); + this.getAppliance().markItems(event.getDrops()); } @EventHandler public void onItemDespawn(ItemDespawnEvent event) { - Item item = event.getEntity(); - ItemStack itemStack = item.getItemStack(); - - int cycles = itemStack.getPersistentDataContainer() - .getOrDefault(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, 0); - - if(cycles <= 0) return; - - itemStack.editPersistentDataContainer(data -> - data.set(AntiPlayerLootDespawn.cyclesKey, PersistentDataType.INTEGER, cycles - 1) - ); - - item.setItemStack(itemStack); - event.setCancelled(true); + event.setCancelled(this.getAppliance().AboveMaxAge(event.getEntity())); } } -- 2.47.3 From 5b7910b69707fa470bef3990aebab00fa0d1776d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Wed, 14 Oct 2026 12:31:05 +0200 Subject: [PATCH 4/4] Renamed method `AboveMaxAge` to `isItemAboveMaxAge` --- .../antiPlayerLootDespawn/AntiPlayerLootDespawn.java | 3 +-- .../antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) 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 index b7901da..8825be4 100644 --- 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 @@ -24,7 +24,7 @@ public class AntiPlayerLootDespawn extends Appliance { ); } - public boolean AboveMaxAge(Item item) { + public boolean isItemAboveMaxAge(Item item) { ItemStack itemStack = item.getItemStack(); int cycles = itemStack.getPersistentDataContainer() @@ -35,7 +35,6 @@ public class AntiPlayerLootDespawn extends Appliance { ); item.setItemStack(itemStack); - return cycles > 0; } 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 index d950b42..883702d 100644 --- 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 @@ -14,6 +14,6 @@ class AntiPlayerLootDespawnListener extends ApplianceListener