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..8825be4 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawn.java @@ -0,0 +1,45 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; + +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; +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 markItems(List item) { + item.forEach(itemStack -> + itemStack.editPersistentDataContainer(persistentDataContainer -> + persistentDataContainer.set(cyclesKey, PersistentDataType.INTEGER, extraCycles) + ) + ); + } + + public boolean isItemAboveMaxAge(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 new file mode 100644 index 0000000..883702d --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/metaGameplay/antiPlayerLootDespawn/AntiPlayerLootDespawnListener.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.metaGameplay.antiPlayerLootDespawn; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.entity.PlayerDeathEvent; + +class AntiPlayerLootDespawnListener extends ApplianceListener { + + @EventHandler + public void onDeath(PlayerDeathEvent event) { + this.getAppliance().markItems(event.getDrops()); + } + + @EventHandler + public void onItemDespawn(ItemDespawnEvent event) { + event.setCancelled(this.getAppliance().isItemAboveMaxAge(event.getEntity())); + } +}