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

Помогите ItemDrop

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

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

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Задача сделать так, чтобы когда игрок погибал, все предметы имеющие лор записывались в HashMap,
    далее выдавались игроку, а без лора выпадали на землю.
    И броня тоже, если имеет лор, то не выпадает, как реализовать?
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
  4. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    вот только из-за этого не хочу отвечать

    (и кстати, подобная тема уже была не так давно)
     
  5. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Ну подскажите пожалуйста :3
     
  6. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    то ли я плохо поиском работаю, то ли тема в небытие улетела.

    посему вот код
    Код:
    private static HashMap<Player, ItemStack[]> items = new HashMap<>();
        @EventHandler
        public void onDeath(PlayerDeathEvent e){
            for (int i = e.getDrops().size()-1; i>=0; i--){ //запускаем такую форку, дабы не вылезти за пределы массива
                ItemStack item = e.getDrops().get(i);
                if (item==null) continue;
                if (!item.hasItemMeta()) continue;
                if (item.getItemMeta().hasLore()){
                    e.getDrops().remove(i);
                }
            }
            /*
            * теперь вещи с лором не выпадут
            * осталось добавить их сохранение
            */
            Inventory inv = e.getEntity().getInventory();
            for (int i=0; i<inv.getSize(); i++){ //для начала чистим инвентарь от ненужных вещей. Тут можно было запустить и обычный foreach, но мне как то лень
                ItemStack item = inv.getItem(i);
                if (item==null) continue;
                if (item.hasItemMeta())
                    if (item.getItemMeta().hasLore()) continue;
                inv.setItem(i, new ItemStack(Material.AIR));         
            }//все, сейчас в инвентаре лежат только вещи с лором
         
            items.put(e.getEntity(),inv.getContents()); //сохранили инвентарь
        }
        @EventHandler
        public void onRespawn(PlayerRespawnEvent e){
            if (items.containsKey(e.getPlayer())){ //если для этого игрока сохранен инвентарь то выдаем его
                e.getPlayer().getInventory().setContents(items.get(e.getPlayer()));
            }
        }
     
  7. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    В onRespawn следует использовать items.remove(e.getPlayer()) вместо items.get(e.getPlayer()), чтобы не было дюпа.
     
  8. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Спасибо.
     
  9. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Правильно заданный вопрос имеет уже половину ответа.
     
  10. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Улучшенный вариант сохранения предметов (устранена утечка памяти; добавлено адекватное поведение, если кто-то уже внёс изменения в инвентарь):
    Код:
    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); // Дропаем предмет, если слот занят
            }
        }
    }
     
  11. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Только мне нужно сделать так, чтобы вещи с лором оставлялись, а без лора просто выпадали на землю.
     
  12. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    ну как бы коды которые тебе предоставил выполняют именно эту задачу
     
  13. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Какой из них именно? Я просто пробую у меня получается дюп предметов.
     
  14. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon

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

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Я не понял, что такое NeedSave, и понять как это используют.
     
  16. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    возможно включен Gamerule keepInventory или есть другие плагины на сохранение инвентаря (Scavenger)[DOUBLEPOST=1488447496,1488447455][/DOUBLEPOST]
    Метод который возвращает True или false в зависимости от того что за вещь он получил, и какие проверки указаны в самом методе
     
  17. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    upload_2017-3-2_12-39-14.png [DOUBLEPOST=1488447608,1488447557][/DOUBLEPOST]У меня он просто не видит метод.[DOUBLEPOST=1488447801][/DOUBLEPOST]Что делать, кто подскажет?[DOUBLEPOST=1488447836][/DOUBLEPOST]Что делать, кто подскажет? Я просто не знаю, ибо с методом, что-то, ибо с ide.
     
  18. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    на java 8 переехать
     
  19. Автор темы
    ItzFirstException

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

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    У меня уже стоит java 8
     
  20. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Попробуйте так:
    Код:
    Main::needSave
     
  21. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    мало ли что она стоит. тебе надо установить в св-вах проэкта используемую версию jdk на 1.8
     

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