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

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

Discussion in 'Разработка плагинов для новичков' started by ItzFirstException, Mar 6, 2017.

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

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

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

    Code:
    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 Старожил Пользователь

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

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

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

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

    Trophy Points:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
  6. alexandrage

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

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

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

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

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

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

Share This Page