Проблема с новыми элементами netherite в Minecraft 1.16.4

#java #plugins #minecraft #bukkit

#java #Плагины #Minecraft #буккит

Вопрос:

Пытаюсь внедрить плагин, который заставит игроков сбрасывать только дорогие предметы. Вот сокращенный код:

     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) amp;amp; 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());
        }
    }
 

Он работает нормально, но есть проблема с новыми блоками netherite, их .typeName().toString() — это «ВОЗДУХ», я написал следующий код в методе PlayerDeathEvent, чтобы проверить это:

 for (ItemStack stack : event.getDrops())
    plugin.getLogger().info(stack.getType().toString());
 

и вот результат:

 [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
 

Я запускаю сервер на бумаге 1.16.4, сборка 337, и использую Spigot 1.16.4 (последняя сборка) в качестве библиотеки плагинов.

Ответ №1:

Я думаю, это потому, что в тот момент, когда игрок умирает ( PlayerDeathEvent срабатывает), в его инвентаре уже выпал предмет, поэтому слот становится пустым, это объясняет AIR значение, но странно, что это происходит только с предметами netherite.
Однако вы можете обойти эту проблему, используя org.bukkit.event.entity.EntityDeathEvent#getDrops метод, который возвращает все элементы, включая элементы netherite.