From 4e6478224ceef9bb708caa9266a32ac5b0352dee Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 9 Feb 2025 10:24:13 -0500 Subject: [PATCH] Fix loot tables getting removed with essentials.keepinv (#6036) --- .../earth2me/essentials/EssentialsEntityListener.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java index 1305ba91ce3..ee0d998e253 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java @@ -190,7 +190,15 @@ public void onPlayerDeathInvEvent(final PlayerDeathEvent event) { final User user = ess.getUser(event.getEntity()); if (user.isAuthorized("essentials.keepinv")) { event.setKeepInventory(true); - event.getDrops().clear(); + // We don't do getDrops().clear() here because it would remove any loot tables that were added by other plugins/datapacks. + // Instead, we remove the items from the drops that are in the player's inventory. This way, the loot tables can still drop items. + // This is the same behavior as the vanilla /gamerule keepInventory. + final ItemStack[] inventory = Inventories.getInventory(event.getEntity(), true); + for (final ItemStack item : inventory) { + if (item != null) { + event.getDrops().remove(item); + } + } final ISettings.KeepInvPolicy vanish = ess.getSettings().getVanishingItemsPolicy(); final ISettings.KeepInvPolicy bind = ess.getSettings().getBindingItemsPolicy(); if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01) && (vanish != ISettings.KeepInvPolicy.KEEP || bind != ISettings.KeepInvPolicy.KEEP)) {