Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем ItzFirstException, 6 мар 2017.

  1. Автор темы
    ItzFirstException

    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); // Дропаем предмет, если слот занят
            }
        }
    }
     
  2. Хостинг MineCraft
    <
  3. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Можно сохранять предметы не в Map, а в какой-нибудь файл, который грузить и удалять при воскрешении игрока.
     
  4. Автор темы
    ItzFirstException

    ItzFirstException Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Поможете реализовать?
     
  5. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
  6. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ну дык правильно, игрок вышел и объекты слились вместе с ним.
     
  7. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Дайте ему готовое.
     
  8. Автор темы
    ItzFirstException

    ItzFirstException Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Буду очень благодарен :)
     

Поделиться этой страницей