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

Помогите Удаление предметов в инвентаре

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

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

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

    Баллы:
    88
    Здравствуйте, пытаюсь запретить перемещать некоторые предметы в инвентаре, если сказать конкретнее, то нужно, чтобы при попытке переложить что то в инвентаре, это что то удалялось.

    Пробовал отменить событие:
    Код:
    event.setCancelled(true);
    если событие в инвентаре игрока, то работает отлично, но, если в инвентаре сундука, наковальни или чего либо другого, то этот предмет забирается из инвентаря и бросается на землю, а мне нужно его полное удаление.

    Пробовал такой вариант:
    Код:
    event.getInventory().remove(event.getCursor());
    в этом случае действия трудно предсказуемые, или не удаляется ничего, или удаляется остаток в слоте из которого взят предмет, или удаляются все аналогичные предметы в инвентаре. А мне нужно только убрать то, что только что положено в слот.

    Еще пробовал это:
    Код:
    event.getInventory().clear(event.getSlot());
    вообще ничего не происходит, хотя номер слота определяется.

    Подскажите пожалуйста в какой стороне искать решение))
     
    Последнее редактирование: 15 ноя 2014
  2. Хостинг MineCraft
    <
  3. serega6531

    serega6531 Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    shkurovs
    Какой ивент смотрите?
     
  4. Автор темы
    Korvinius

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

    Баллы:
    88
    InventoryClickEvent
     
  5. NaPsTeR

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

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    Код:
        @SuppressWarnings("deprecation")
        @EventHandler(priority = EventPriority.HIGHEST)
        public void onClick(InventoryClickEvent e) {
    
            ItemStack is = e.getCurrentItem();
            Player p = (Player) e.getWhoClicked();
    
            if(is != null && is.getType() == Material.COMMAND){
                e.setCancelled(true);
                e.setCurrentItem(null);
                p.sendMessage("Этот предмет запрещен(2)");
                p.updateInventory();
            }
    
        }
     
  6. Автор темы
    Korvinius

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

    Баллы:
    88
    к сожалению этот код ничего не меняет.

    Пошел другим путем, не знаю, правильно или нет, создал еще один @EventHandler, в итоге получилось типа так:
    Код:
        @EventHandler
        public void onInventoryClick(InventoryClickEvent event){
    // *********
         event.setCancelled(true);
    }
        @EventHandler
        public void onPlayerDropItem(PlayerDropItemEvent event){
    // *********
         event.setCancelled(true);
    }
    вроде как работает, но пока на этапе теста.
     
  7. NaPsTeR

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

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    Странно. Этот код работает прекрасно, удаляя коммандный блок из инвентаря при любом взаимодействии с ним.
     
  8. Автор темы
    Korvinius

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

    Баллы:
    88
    а вы замените командный блок на что нибудь другое, например Material.DIAMOND и проверьте, в результате действий минимум...
     
  9. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А как же setCursor?
     
  10. NaPsTeR

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

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    Минимум - в какой смысле? Проверил, все прекрасно заменяется без проблем.
     
  11. Автор темы
    Korvinius

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

    Баллы:
    88
    Все работает в инвентаре сундука, наковальни (другие не пробовал), но в инвентаре игрока, сообщение в чат выводится, а предмет не изымается, то есть, остается возможность перемещать запрещенные предметы в своем инвентаре.[DOUBLEPOST=1415137443,1415136617][/DOUBLEPOST]
    такой же вариант, в "левых" инвентарях работает, а в инвентаре игрока нет.

    Но все равно спасибо за советы, теперь я примерно представляю, как мне это можно скомбинировать, чтобы получить желаемый результат.


    И еще один вопросик, а если метод "устаревший", то есть "deprecation", это очень страшно? Ну в смысле, по логике, если устаревший, то рано или поздно перестанет работать, или нет?
     
  12. NaPsTeR

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

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    По поводу устаревшего метода - да, это предупреждение разработчикам о том, что метод в будущем будет убран или не будет работать. По поводу инвентаря, возможно я чего-то не понимаю, но в инвентаре игрока также все исчезает и заменяется и предмет переместить в другой слот даже не получается.
     
    Последнее редактирование: 5 ноя 2014
  13. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Если не ошибаюсь, то такое происходит только в креативе.
    Устаревшие методы, как уже выше сказано, должны быть удалены в будущем. Однако из всех Deprecated, которые я знаю, не работает ничего в классе дверей, а так на протяжении долгого времени тот же updateInventory работает без перебоев, хотя он уже давно был отмечен устаревшим. Ну и в свете последних событий удалять устаревшие методы уже некому :)
     
  14. Автор темы
    Korvinius

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

    Баллы:
    88
    Ага, да, именно в креативе.
     
  15. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  16. Автор темы
    Korvinius

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

    Баллы:
    88

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