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

Помогите Слишком тупой вопрос, как запретить перемещать предметы в инвентарь?

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

Статус темы:
Закрыта.
  1. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Собственно вопрос, как запретить перемещать предметы в определенный инвентарь?
    Большинство евентов (InventoryClick, InventoryInteract) позволяют получить только инвентарь в котором проводится действие, а не тот в который будет перемещен предмет..
    P.S. Сам понимаю насколько туп вопрос, да.
     
  2. Хостинг MineCraft
    <
  3. iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    InventoryDragEvent
     
  4. Larin

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

    Баллы:
    103
    А что нужно сделать?
     
  5. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Ща тестану
    Собсна, запретить перемещать любые предметы в определенные инвентари[DOUBLEPOST=1492623863,1492623338][/DOUBLEPOST]Чет не пашет.. InventoryDragEvent..
    Код:
        @EventHandler
        public void onInventoryDrag(InventoryDragEvent event) {
            System.out.println("Drag event");
            if (shop_inventories.containsKey(event.getInventory())) {
                System.out.println("Drag cancelled");
                event.setCancelled(true);
            }
        }
    Даже первого soutа нет... Когда он ваще вызывается?[DOUBLEPOST=1492623933][/DOUBLEPOST]Хотя нет, иногда вижу и первый sout и второй, но так и не понял когда он вызывается, но переносить вещи можно
     
  6. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Drag event - растягивание вещей, перенос сенсорным режимом. Возможно при шифте.

    Click event - при клике.
    Кликнул что бы поднять вещь - ивент.
    Кликнул чтобы опустить - ивент.

    дальше куришь доки.
     
  7. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    В общем, вопрос точнее:
    как отменить перемещение предмета из инвентаря в инвентарь, если инвентарь в который предмет перемещается содержится в коллекции shop_inventories
    ?[DOUBLEPOST=1492624083,1492624040][/DOUBLEPOST]
    Уже интереснее, попытаюсь курнуть..[DOUBLEPOST=1492624207][/DOUBLEPOST]
    Полагаю мне это надо?
    [​IMG]
     
  8. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Код:
    @EventHandler
    public void onInventoryDrag(InventoryDragEvent e){
        if (e.getInventory()==null) return;
        if (e.getView().getTopInventory()==null) return;
        Player p = (Player) e.getWhoClicked();
        if (GUI.getInventories().containsKey(e.getView().getTopInventory())) {
            for (int i: e.getRawSlots()){
                if (i<e.getView().getTopInventory().getSize()) {
                    e.setCancelled(true);
                    p.updateInventory();
                    return;
                }
            }
        }
    }
    
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e){
        if (e.getInventory()==null) return;
        if (getClickedInventory(e)==null) return;
    
        if (GUI.getInventories().containsKey(e.getView().getTopInventory())) {
            //weeee, it's my event!
            Player p = (Player) e.getWhoClicked();
       
            if (e.getClick().isShiftClick()){p.updateInventory(); e.setCancelled(true);}       
            if (getClickedInventory(e).equals(e.getView().getTopInventory())) e.setCancelled(true); else return;
        }
    }
    
    Это обеспечивает фулл защиту на инвентари с коллекции. стырил из своего гуишопа.
    getClickedInventory - есть в спиготе, но не в ведре, использую свой метод.
    Код:
    /**
    * Love bukkit (no)
    * There is no method "getClickedInventory" in bukkit inventoryClickEvent, so I use this
    * @param e
    * @return
    */
    public static Inventory getClickedInventory(InventoryClickEvent e){
        if (e==null)return null;
        if (e.getView()==null) return null;
        if (e.getSlot()==e.getRawSlot()) {
            return e.getView().getTopInventory();     
        }else{
            return e.getView().getBottomInventory();
        }
    }
    
     
  9. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Во, все, пасибь
    Код:
        @EventHandler
        public void onInventoryClick(InventoryClickEvent event) {
            InventoryAction action = event.getAction();
            System.out.println("click action = " + action);
            if (action == InventoryAction.MOVE_TO_OTHER_INVENTORY && shop_inventories.containsKey(event.getInventory())) {
                event.setCancelled(true);
            }
        }
    
     
Статус темы:
Закрыта.

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