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

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

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 проблемы.
 
Код:
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 ничего не говорил. Ты говорил только про функциональные интерфейсы, а какие именно не говорил!
Код:
public interface Button {
    public void pressed();
}
Код:
public class ButtonChangeName implements Button {

    @Override
    public void pressed() {
        // TODO Auto-generated method stub
    }
}
 
Про Consumer ты мне ничего про Consumer ничего не говорил. Ты говорил только про функциональные интерфейсы, а какие именно не говорил!
Я те сказал юзать функциональные интерфейсы, а какой именно юзать сам не можешь что ли догадаться? приходит клик, с ним совершается действие, это консумер. Для perplayer видимости игроков ты можешь использовать еще и Predicate.
Сори, но эт уже твои траблы, фингю какую-то спрашиваешь.
 
Я те сказал юзать функциональные интерфейсы, а какой именно юзать сам не можешь что ли догадаться? приходит клик, с ним совершается действие, это консумер. Для perplayer видимости игроков ты можешь использовать еще и Predicate.
Сори, но эт уже твои траблы, фингю какую-то спрашиваешь.
Смотри. У меня есть меню с двумя(пока) типами кнопок. Первый который когда нажимаешь что-то происходит. А второй это когда нажимаешь и меняется имя кнопки и так по кругу.
Для кликов я и так юзаю Consumer.
PHP:
public ItemButton(ItemStack btn, Consumer<InventoryClickEvent> action) {
        this.action = action;
        this.btn = btn;
    }
 
Смотри. У меня есть меню с двумя(пока) типами кнопок. Первый который когда нажимаешь что-то происходит. А второй это когда нажимаешь и меняется имя кнопки и так по кругу.
Для кликов я и так юзаю Consumer.
PHP:
public ItemButton(ItemStack btn, Consumer<InventoryClickEvent> action) {
        this.action = action;
        this.btn = btn;
    }
ну в консумере совершай действия для изменения предмета или че ты там хочешь сделать
 
Короче вот те пример с "по кругу".

Код:
        List<String> string = new ArrayList<String>();
        string.add("1");
        string.add("2");
        string.add("3");
        string.add("4");
        string.add("5");
        string.add("6");
        int i = 0;
        for(;;) {
            if(i==string.size()) {
                i = 0;
            }
            System.out.println(string.get(i));
            i++;
        }
 
ТАк а для чего я по вашему массив с именами кнопки сделал?
Ну ты должен был сделать его в классе, реализующем Consumer для изменения состояния предмета, который хранит у себя список и крутит их, а не в том виде, как у тебя.
 
Ну ты должен был сделать его в классе, реализующем Consumer для изменения состояния предмета, который хранит у себя список и крутит их, а не в том виде, как у тебя.
Типо okay. Спасибо большое всем за ответы!
 
Не робит чёт.
PHP:
int i = 0;
    public void init(){
        ArrayList<String> names = new ArrayList<>();
        names.add("§aФорма: §3ЛИНИЯ");
        names.add("§aФорма: §3КВАДРАТ");
        ItemButton form_type = new ItemButton(new ButtonBuilder(Material.STONE).setName("§aФорма: §3КВАДРАТ"));
        form_type.setAction(event -> {
            HumanEntity who = event.getWhoClicked();
            if(who instanceof Player) {
                try {
                    event.getWhoClicked().sendMessage(names.get(i));
                    if (i == names.size()) {
                        debug("Equals size of list");
                        i = 0;
                        debug("Index");
                    }
                    Player player = (Player) event.getWhoClicked();
                    form_type.setName(names.get(i));
                    debug("Name was changed");
                    addComponent(0, form_type);
                    open(player);
                    i++;
                    debug("index was upped");
                } catch (Exception e){

                }
            }
        });
        //form_type.setAction(event -> event.getWhoClicked().sendMessage("BUTTON WORKS!!"));
        addComponent(0,form_type);
    }
 
Последнее редактирование:
Не робит чёт.
PHP:
int i = 0;
    public void init(){
        ArrayList<String> names = new ArrayList<>();
        names.add("§aФорма: §3ЛИНИЯ");
        names.add("§aФорма: §3КВАДРАТ");
        ItemButton form_type = new ItemButton(new ButtonBuilder(Material.STONE).setName("§aФорма: §3КВАДРАТ"));
        form_type.setAction(event -> {
            HumanEntity who = event.getWhoClicked();
            if(who instanceof Player) {
                try {
                    event.getWhoClicked().sendMessage(names.get(i));
                    if (i == names.size()) {
                        debug("Equals size of list");
                        i = 0;
                        debug("Index");
                    }
                    Player player = (Player) event.getWhoClicked();
                    form_type.setName(names.get(i));
                    debug("Name was changed");
                    addComponent(0, form_type);
                    open(player);
                    i++;
                    debug("index was upped");
                } catch (Exception e){

                }
            }
        });
        //form_type.setAction(event -> event.getWhoClicked().sendMessage("BUTTON WORKS!!"));
        addComponent(0,form_type);
    }
Мда, ничего не понял из того, что тебе сказали - выбрасывай.
 
Мда, ничего не понял из того, что тебе сказали - выбрасывай.
Я, конечно, делал класс с реализацией Consumer, но чёт не получилось и я перешёл обратно. Но класс с Consumer у меня есть и он реализовывал то что ты говорил. Но как мне быть с тем что мне выбрасывает IOOBE. Почему-то игнорируется строка где проверяется ровняется ли индекс размеру листа.
 
Ну это уже твои траблы, да мб я хреново объяснил и новичку сложно понять, но по-другому я не умею и возится с тобой не буду.
Я заметил. Но как ты думаешь, почему игнорируется проверка?
 
Вообщем я решил проблему! Оказалось что я тупой и не заметил, что сообщение, которое выводится, когда нажимаешь, стоит перед проверкой, поэтому и вылетал IOOBE. Я всё пофиксил и таки послушал совет и сделал всё в отдельном классе с реализацией Consumer. Всем спасибо за ответы, показа нового принципа ООП. Тему закрываю!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх