added Anti Player Loot despawn #16

Merged
MineTec merged 6 commits from feature/AntiPlayerLootDespawn into master 2026-10-14 10:31:29 +00:00
Member
No description provided.
jannis added 1 commit 2026-10-12 14:22:26 +00:00
MineTec added 1 commit 2026-10-13 20:05:21 +00:00
@@ -0,0 +14,4 @@
import java.util.Locale;
public class AntiPlayerLootDespawnListener extends ApplianceListener<AntiPlayerLootDespawn> {
private static final int extraCycles = 5;
Owner

alle Konstanten zur appliance, nicht in den listener

alle Konstanten zur appliance, nicht in den listener
MineTec marked this conversation as resolved
@@ -0,0 +13,4 @@
import java.util.Locale;
public class AntiPlayerLootDespawnListener extends ApplianceListener<AntiPlayerLootDespawn> {
Owner

die klasse kann package-private sein, dann sieht nur die Appliance den Listener, und nicht das ganze Projekt. Dazu einfach das Public ersatzlos wegnehmen.

die klasse kann package-private sein, dann sieht nur die Appliance den Listener, und nicht das ganze Projekt. Dazu einfach das Public ersatzlos wegnehmen.
MineTec marked this conversation as resolved
@@ -0,0 +17,4 @@
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;
Owner

dieses Vorgehen wird schwirig, oder sogar garnicht mehr funktionieren, sobald mehr als ein Spieler Pro Spiel-Tick sterben sollten...

siehe unten für Lösung.

dieses Vorgehen wird schwirig, oder sogar garnicht mehr funktionieren, sobald mehr als ein Spieler Pro Spiel-Tick sterben sollten... siehe unten für Lösung.
MineTec marked this conversation as resolved
@@ -0,0 +27,4 @@
}
@EventHandler
public void onItemSpawn(ItemSpawnEvent event) {
Owner

dieser Weg ist sehr sehr Hacky... Und es gibt einen viel besseren Weg: es gibt PlayerDeathEvent#getDrops. Dort können direkt alle ItemStacks welche resultiertend aus dem Tod gedroppt werden. Kein Distance-Check, keine Race conditions, mit Items die zufällit normal in dem Bereich im selbigen Tick gedroppt werden.

Sowas wie event.getDrops().forEach(item -> item.editPersistentDataContainer(persistentDataContainer -> persistentDataContainer.set(cyclesKey, PersistentDataType.INTEGER, extraCycles));

Die Variablen und der Listener fallen weg.

dieser Weg ist sehr sehr Hacky... Und es gibt einen viel besseren Weg: es gibt PlayerDeathEvent#getDrops. Dort können direkt alle ItemStacks welche resultiertend aus dem Tod gedroppt werden. Kein Distance-Check, keine Race conditions, mit Items die zufällit normal in dem Bereich im selbigen Tick gedroppt werden. Sowas wie `event.getDrops().forEach(item -> item.editPersistentDataContainer(persistentDataContainer -> persistentDataContainer.set(cyclesKey, PersistentDataType.INTEGER, extraCycles));` Die Variablen und der Listener fallen weg.
MineTec marked this conversation as resolved
@@ -0,0 +41,4 @@
@EventHandler
public void onItemDespawn(ItemDespawnEvent event) {
PersistentDataContainer data = event.getEntity().getPersistentDataContainer();
Integer cycles = data.get(cyclesKey, PersistentDataType.INTEGER);
Owner

statt dem Nullcheck wäre ein PersistentDataContainer#getOrDefault schöner mit 0 als default...

statt dem Nullcheck wäre ein PersistentDataContainer#getOrDefault schöner mit `0` als default...
MineTec marked this conversation as resolved
jannis added 1 commit 2026-10-13 22:14:12 +00:00
@@ -0,0 +15,4 @@
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<ItemStack> item) {
Owner

getItems passt nicht. Vielleicht markItems

`getItems` passt nicht. Vielleicht `markItems`
MineTec marked this conversation as resolved
@@ -0,0 +22,4 @@
)
);
}
Owner

Wenn das Markieren von Items hier als Logik in der Appliance liegt, sollte das testen auf markierte Items auch hier liegen. Dann ist die Logik "was ist ein markiertes Item?" hier zusammen und nicht geteilt.

Sowas wie boolean shouldDelete(ItemStack stack) {}
Dann wird hier auch der counter berechnet und das event bricht dann nur anhand des booleans ab.

Wenn das Markieren von Items hier als Logik in der Appliance liegt, sollte das testen auf markierte Items auch hier liegen. Dann ist die Logik "was ist ein markiertes Item?" hier zusammen und nicht geteilt. Sowas wie `boolean shouldDelete(ItemStack stack) {}` Dann wird hier auch der counter berechnet und das event bricht dann nur anhand des booleans ab.
MineTec marked this conversation as resolved
jannis added 1 commit 2026-10-13 23:23:37 +00:00
@@ -0,0 +24,4 @@
);
}
public boolean AboveMaxAge(Item item) {
Owner

methoden werden kleingeschrieben
isItemAboveMaxAge
ich hatte nur das Max noch einfügen wollen, nicht das 'isItem' streichen.
Ich war halt am handy.

methoden werden kleingeschrieben `isItemAboveMaxAge` ich hatte nur das Max noch einfügen wollen, nicht das 'isItem' streichen. Ich war halt am handy.
MineTec marked this conversation as resolved
MineTec added 1 commit 2026-10-14 10:31:08 +00:00
MineTec added 1 commit 2026-10-14 10:31:21 +00:00
MineTec merged commit d08fd927dc into master 2026-10-14 10:31:29 +00:00
MineTec deleted branch feature/AntiPlayerLootDespawn 2026-10-14 10:31:29 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: CraftAttack/spawn#16