Помогите Сборник багов спигота

Статус
Закрыто для дальнейших ответов.

Energy warrior

Активный участник
Пользователь
Баллы
76
1)Делаю плагин, в котором есть GUI. Делаю с помощью холдера. То есть у меня есть главный класс GUI Display он имплементирует InventoryHolder. Я создаю другие классы наследующие класс Display. В InventoryClickEvent делаю нечто следующее
PHP:
@EventHandler
    public void click(InventoryClickEvent event){
        InventoryHolder holder = event.getClickedInventory().getHolder();
        if(event.getSlotType() == InventoryType.SlotType.OUTSIDE) return;
        if(holder != null) {
            if (holder instanceof Display) {
                event.setCancelled(true);
                ((Display)holder).click(event);
            }
        }
    }
И когда я кликаю в область где нет инвентаря
message_part_real
Мне вылетает NPE и жалуется на строчку: InventoryHolder holder = event.getClickedInventory().getHolder();
2) Делаю переключатель. Нажимаешь и появляется следующая функция. Делаю так.
Есть массив с именами функций. Есть переменная текущего индекса. Когда я нажимаю на кнопку, индекс увеличивается и имя кнопки меняется. Вчера ещё работало. А сегодня нажимаю ничего не происходит. Помогите решить эти 2 проблемы.
 
Причем тут баги спигота, ты проверку на OUTSIDE делаешь после получения холдера, npe вылетает, т. к. твой getClickedInventory() == null.

Получай лучше не clickedInventory, а Inventory и даже если в нижнем инвентаре или вне клик будет, то вернет тот инвентарь, что сверху и отменяй эвент, если холдер твой. Ну а метод click свой запускай только если rawSlot < inventory.getSize().

Ну и убери проверку холдера на нулл, null instanceof всегда false.
 
2) Делаю переключатель. Нажимаешь и появляется следующая функция. Делаю так.
Есть массив с именами функций. Есть переменная текущего индекса. Когда я нажимаю на кнопку, индекс увеличивается и имя кнопки меняется. Вчера ещё работало. А сегодня нажимаю ничего не происходит. Помогите решить эти 2 проблемы.
Нормально скажи или лучше код скидывай, посмотрим шо за хрень ты там настрочил.
 
Нормально скажи или лучше код скидывай, посмотрим шо за хрень ты там настрочил.
Код:
public void render(){
        btn = new ItemButton(new Item(Material.STONE).setName("§aФорма блока: "+names[current_index]),event -> {
            try {
                if(current_index < names.length) {
                    current_index++;
                } else {
                    current_index=0;
                }
                addComponent(event.getSlot() + 1, btn);
                open((Player) event.getWhoClicked());
            } catch (ArrayIndexOutOfBoundsException e){
                e.printStackTrace();
            }
        });
        addComponent(12,btn);
    }
 
Я outside поэтому и добавил, что у меня NPE вылетал.
Глупый что ли, у тебя NPE вылетает до проверки, делай как я написал.

Код:
public void render(){
        btn = new ItemButton(new Item(Material.STONE).setName("§aФорма блока: "+names[current_index]),event -> {
            try {
                if(current_index < names.length) {
                    current_index++;
                } else {
                    current_index=0;
                }
                addComponent(event.getSlot() + 1, btn);
                open((Player) event.getWhoClicked());
            } catch (ArrayIndexOutOfBoundsException e){
                e.printStackTrace();
            }
        });
        addComponent(12,btn);
    }
Что за костыли, нормально напиши, что ты хочешь сделать в итоге.
 
Я, к сожалению, говнокодер. И не владею программистскими терминами.
Ну ты понимаешь, что у тебя массив в котором имя предмета хранится и меняется это костыль и при малейшем изменении требований все переписывать нужно? Используй функциональные интерфейсы и абстракция поведение предмета при клике с разными реализациями. Одинаковый для всех, для конкретного игрока и т. п.
 
Ну ты понимаешь, что у тебя массив в котором имя предмета хранится и меняется это костыль и при малейшем изменении требований все переписывать нужно? Используй функциональные интерфейсы и абстракция поведение предмета при клике с разными реализациями. Одинаковый для всех, для конкретного игрока и т. п.
Я, к сожалению, говнокодер. И не владею программистскими терминами.
Ну ты понимаешь, что у тебя массив в котором имя предмета хранится и меняется это костыль.

меняется это костыль
Почему?
при малейшем изменении требований все переписывать нужно?
Как это?
Используй функциональные интерфейсы
Какие?
абстракцию поведение предмета при клике с разными реализациями. Одинаковый для всех, для конкретного игрока и т. п.
Что это значит?

Мне бы лит-ру какую-нибудь. Для осмысления.
 


Почему?

Как это?

Какие?

Что это значит?

Мне бы лит-ру какую-нибудь. Для осмысления.
Ясно все с тобой, иди учи для начала java и ооп.
Литература schildt java 8
И докуменатацию jdk тоже почитай.
Ну и если сложно букавки читать параллельно можешь смотреть видео этого челика, для новичков сойдет:
https://www.youtube.com/playlist?list=PL786bPIlqEjRDXpAKYbzpdTaOYsWyjtCX
 
Ну так делай абстракцию состояния того, что меняется и се
Немного почитав, я могу предположить, что делать абстракцию состояния того, что меняется, значит сделать так называемый "чертёж" этого состояния?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх