Trying to implement the plugin that will make players drop only expensive items. Here is shortcut of the code:
public HashMap<Player , ItemStack[]> items = new HashMap<Player , ItemStack[]>();
@EventHandler
public void onDeath(PlayerDeathEvent event)
{
if (event.getEntity().getGameMode().equals(GameMode.SURVIVAL))
{
ItemStack[] content = event.getEntity().getInventory().getContents();
items.put(event.getEntity(), content);
event.getDrops().removeIf(stack -> !this.isExpensive(stack.getType().toString()));
// isExpensive method returns 1 if the itemstack is expensive, 0 either
}
}
@EventHandler
public void onRespawn(PlayerRespawnEvent event)
{
if (event.getPlayer().getGameMode().equals(GameMode.SURVIVAL) && items.containsKey(event.getPlayer()))
{
for (ItemStack stack : items.get(event.getPlayer()))
{
if (!this.isExpensive(stack.getType().toString()))
event.getPlayer().getInventory().addItem(stack);
}
items.remove(event.getPlayer());
}
}
It works fine, but there is a problem with new netherite blocks, their .typeName().toString() is "AIR", I wrote the following code in PlayerDeathEvent method to check this:
for (ItemStack stack : event.getDrops())
plugin.getLogger().info(stack.getType().toString());
and here is the result:
[01:34:40 INFO]: h4sv issued server command: /give h4sv minecraft:diamond
[01:34:40 INFO]: §7§o[h4sv: Gave 1 [Diamond] to h4sv]
[01:34:44 INFO]: h4sv issued server command: /give h4sv minecraft:netherite_ingot
[01:34:44 INFO]: §7§o[h4sv: Gave 1 [Netherite Ingot] to h4sv]
[01:34:47 INFO]: h4sv issued server command: /give h4sv minecraft:netherite_block
[01:34:47 INFO]: §7§o[h4sv: Gave 1 [Block of Netherite] to h4sv]
[01:35:00 INFO]: h4sv issued server command: /give h4sv netherite_scrap
[01:35:00 INFO]: §7§o[h4sv: Gave 1 [Netherite Scrap] to h4sv]
[01:35:05 INFO]: h4sv issued server command: /give h4sv minecraft:ancient_debris
[01:35:05 INFO]: §7§o[h4sv: Gave 1 [Ancient Debris] to h4sv]
[01:35:10 INFO]: h4sv issued server command: /give h4sv minecraft:acacia_sapling 64
[01:35:10 INFO]: §7§o[h4sv: Gave 64 [Acacia Sapling] to h4sv]
[01:35:16 INFO]: h4sv issued server command: /kill
[01:35:16 INFO]: DIAMOND
[01:35:16 INFO]: AIR
[01:35:16 INFO]: AIR
[01:35:16 INFO]: AIR
[01:35:16 INFO]: AIR
[01:35:16 INFO]: SAPLING
[01:35:16 INFO]: h4sv fell out of the world
I'm running server on Paper 1.16.4 build 337, and using Spigot 1.16.4 (latest build) as plugin library.
I think it's because at the moment when the player dies (the PlayerDeathEvent
gets triggered) his inventory already dropped the item, so the slot becomes empty this explains the AIR
value, but that's strange this is happening only with netherite items.
However you could get around this issue by using the org.bukkit.event.entity.EntityDeathEvent#getDrops
method, which returns all items, including netherite stuff.