Помогите ItemDrop(Фикс)

ItzFirstException

Новичок
Пользователь
Баллы
11
Имя в Minecraft
FirstException
Всем привет, недавно добрые люди реализовали код на отмену выпадения вещей с лором.
И так в чём проблема:
- Когда игрок умирает, он может случайно или его выкинут с сервера, и вещи обратно он уже не получит.

Код:
public final class TestPlugin extends JavaPlugin implements Listener
{
    private final Map<Player, ItemStack[]> items = new WeakHashMap<>();
    @Override
    public void onEnable()
    {
        this.getServer().getPluginManager().registerEvents(this, this);
    }
    @EventHandler
    public void onDeath(PlayerDeathEvent event)
    {
        // Удаляем из дропа всё, что можно сохранить
        event.getDrops().removeIf(TestPlugin::needSave);
        // Удаляем из инвентаря всё, что нельзя сохранить
        Inventory inv = event.getEntity().getInventory();
        for (int i = 0; i < inv.getSize(); i++)
        {
            ItemStack item = inv.getItem(i);
            if (item != null && !needSave(item))
                inv.setItem(i, null);
        }
        // Запоминаем инвентарь
        this.items.put(event.getEntity(), inv.getContents());
    }
    @EventHandler
    public void onRespawn(PlayerRespawnEvent event)
    {
        Player player = event.getPlayer();
        ItemStack[] oldArr = this.items.remove(player); // Удаляем инвентарь и сохраняем ссылку на него в переменную
        if (oldArr != null)
        {
            Inventory inv = player.getInventory();
            ItemStack[] newArr = inv.getContents();
            mergeOrDrop(player.getLocation(), newArr, oldArr); // Добавляем сохранённые предметы в инвентарь к игроку или дропаем их, если слоты уже заняты
            inv.setContents(newArr);
        }
    }
    private static boolean needSave(ItemStack item)
    {
        return item != null && item.hasItemMeta() && item.getItemMeta().hasLore();
    }
    private static void mergeOrDrop(Location location, ItemStack[] newArr, ItemStack[] oldArr)
    {
        int length = Math.min(newArr.length, oldArr.length);
        for (int i = 0; i < length; i++)
        {
            ItemStack item = oldArr[i];
            if (item != null)
                if (newArr[i] == null)
                    newArr[i] = item; // Добавляем предмет
                else
                    location.getWorld().dropItem(location, item); // Дропаем предмет, если слот занят
        }
    }
}
 
Можно сохранять предметы не в Map, а в какой-нибудь файл, который грузить и удалять при воскрешении игрока.
 
Ну дык правильно, игрок вышел и объекты слились вместе с ним.
 
Назад
Верх