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

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

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 проблемы.
 
Ну я погуглил что абстракция это когда ты делаешь примерное описание поведения класса. Как-то так я это понял. То что я читал
https://ru.stackoverflow.com/questions/277561/Абстракция-в-java
По ссылкам мало толкового, лишь расплывчатое описание, лучше сразу смотри ответ. Если хоть немного разбираешься в программировании, то всё поймёшь.
 
Ну я погуглил что абстракция это когда ты делаешь примерное описание поведения класса. Как-то так я это понял. То что я читал
Рекомендую этот плейлист, с 10-го урока можешь смотреть, но этого недостаточно, так что читай книги параллельно и гугли непонятные моменты
https://www.youtube.com/playlist?list=PL786bPIlqEjRDXpAKYbzpdTaOYsWyjtCX
 
Немного почитав(ещё раз) у меня появились новые вопросы и ушли старые:
меняется это костыль
Почему это костыль? Мне нужно создавать объекты кнопки а не менять имена?
при малейшем изменении требований все переписывать нужно?
Что нужно переписывать? Какие требования?
Используй функциональные интерфейсы
Я должен создать свой? Или использовать готовый?
абстракцию поведение предмета при клике с разными реализациями. Одинаковый для всех, для конкретного игрока и т. п.
Какой уровень мне нужно использовать? Судя по тому, что ты сказал с разными реализациями, я думаю мне нужно использовать либо абстрактные классы, либо интерфейсы. Как вообще понять абстракция поведения предмета?
 
Как вообще понимать понятие абстракция поведения предмета? В чем она заключается? Как ей пользоваться?
 
Что то типо.
Код:
public class Stack {
    private ItemStack stack;
    private String command;

    public Stack(ItemStack stack, String command) {
        this.stack = stack;
        this.command = command;
    }

    public ItemStack getItem() {
        return this.stack;
    }

    public String getommand() {
        return this.command;
    }
}
Ииииииии... Зачем это? У меня примерно также класс устроен. Ты только что написал сообщение с
Код:
public class Button<T>{...}
И что мне в тип совать?
 
Ииииииии... Зачем это? У меня примерно также класс устроен. Ты только что написал сообщение с
Код:
public class Button<T>{...}
И что мне в тип совать?
Это пример контейера. Туда можно помещать любой объект и потом вынимать без каста.
 
По поводу класса выше. Он юзается примерно так.

Код:
public class Menu implements InventoryHolder {

    private Inventory inventory;
    private List<Stack> stack;

    public Menu(String title) {
        this.inventory = Bukkit.createInventory(this, 9, title);
        this.stack = new ArrayList<Stack>();
    }

    @Override
    public Inventory getInventory() {
        return this.inventory;
    }

    public void addItem(Stack stack) {
        this.inventory.addItem(stack.getItem());
        this.stack.add(stack);
    }

    public Stack getItem(int index) {
        return this.stack.get(index);
    }
}
 
По поводу класса выше. Он юзается примерно так.

Код:
public class Menu implements InventoryHolder {

    private Inventory inventory;
    private List<Stack> stack;

    public Menu(String title) {
        this.inventory = Bukkit.createInventory(this, 9, title);
        this.stack = new ArrayList<Stack>();
    }

    @Override
    public Inventory getInventory() {
        return this.inventory;
    }

    public void addItem(Stack stack) {
        this.inventory.addItem(stack.getItem());
        this.stack.add(stack);
    }

    public Stack getItem(int index) {
        return this.stack.get(index);
    }
}
А где собсно юз контейнера?
 
Там не очень понятно что к чему относится. Ты бы хоть комментарии добавил.
Button<MyObject> button = new Button<MyObject>(MyObject.class);
И ещё зачем вот это?
Button<MyObject>(MyObject.class);
 
Там не очень понятно что к чему относится. Ты бы хоть комментарии добавил.
Ну там цепочка с условиями, номер слота, максимальный уровень и уровень когда откроется новое звено. Все собирается в методе setupGui
 
Мне не это надо. Мне надо чтобы когда нажимаешь на кнопку, менялось имя.
 
Я те сказал, делай Consumer с состоянием клика и в меню храни по слоту предметы, у которых может быть разная реализация, некоторые из них реализуй, чтобы менялись при клике, некоторые просто принимают клик.
 
Я те сказал, делай Consumer с состоянием клика и в меню храни по слоту предметы, у которых может быть разная реализация, некоторые из них реализуй, чтобы менялись при клике, некоторые просто принимают клик.
Код:
package ru.armagidon.aeasybuild;

import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.*********ventory.ItemFlag;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.ItemMeta;
import ru.armagidon.aeasybuild.utils.buttons.ButtonBuilder;
import ru.armagidon.aeasybuild.utils.buttons.Choosable;

import java.util.Optional;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.function.Consumer;

public class ItemButton implements Choosable
{
    private final Consumer<InventoryClickEvent> action;
    private String[] names;
    private final ItemStack btn;
    private SortedMap<Integer, Optional<ItemButton>> variants = new TreeMap<>();
    private int currentindex = 0;

    public ItemButton(ItemStack stack,Consumer<InventoryClickEvent> action,String[] names){
        this.btn = stack;
        this.action = action;
        this.names = names;
        if(names == null){
            this.names = new String[]{""};
        }
        for (int i = 0; i < names.length; i++) {
            ItemButton btn = new ItemButton(new ButtonBuilder(Material.STONE).setName(names[i]));
            variants.put(i,Optional.of(btn));
        }

    }

    public ItemButton(ItemStack stack){
        this(stack,event -> {});
    }

    public ItemButton(ItemStack btn, Consumer<InventoryClickEvent> action) {
        this.action = action;
        this.btn = btn;
    }

    public ItemStack getBtn() {
        return variants.get(currentindex).get().getBtn();
    }

    public void action(InventoryClickEvent event){
        action.accept(event);
    }

    @Override
    public void indexUp() {
        if(currentindex>= variants.size()) currentindex=0;
        currentindex++;
    }

    public Consumer<InventoryClickEvent> getAction() {
        return action;
    }

    public String[] getNames() {
        return names;
    }
}
Про Consumer ты мне ничего про Consumer ничего не говорил. Ты говорил только про функциональные интерфейсы, а какие именно не говорил!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх