Войти или зарегистрироваться

Помогите [1.19.2] Опять neverlessy, опять инвентари :(

Посмотреть вложение 63695

Посмотреть вложение 63696

по моему переопределение уже считается использованием интерфейса, я же написал свое поведение для метода - значит использовал
Ну вот ты их переопределил, а для каких целей? Они там не просто так
 
Могу предложить такой вариант:
PHP:
public class SettingsHolder implements InventoryHolder {

    private final FileConfiguration settings;
    private final File file;
    private final Inventory inventory;
    private final Map<Integer, SettingItem<?>> items = new HashMap<>();

    public SettingsHolder(FileConfiguration settings, File file) {
        this.settings = settings;
        this.file = file;
        this.inventory = Bukkit.createInventory(this, 27, "Settings");
        items.put(12, new BoolSettingItem("Глобальный чат", "chat.global", settings.getBoolean("chat.global"),
                (event, item) -> event.getWhoClicked().sendMessage("Только глобальный чат: " +
                        (item.getValue() ? "§aВключён" : "§cВыключен"))));
        items.forEach((key, value) -> inventory.setItem(key, value.getItemStack()));
    }

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

    public void onInventoryClick(InventoryClickEvent e) {
        if (!(e.getInventory().getHolder() instanceof SettingsHolder)) return;
        e.setCancelled(true);
        SettingsHolder holder = (SettingsHolder) e.getInventory().getHolder();
        SettingItem<?> item = holder.items.get(e.getSlot());
        if (item == null) return;
        item.onClick(e);
        e.getInventory().setItem(e.getSlot(), item.getItemStack());
        settings.set(item.getKey(), item.getValue());
        try {
            save();
        } catch (IOException ex) {
            e.getWhoClicked().sendMessage("Системная ошибка.");
            throw new RuntimeException(ex);
        }
    }

    public void save() throws IOException {
        settings.save(file);
    }
}

class SettingsListener implements Listener {
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {
        if (e.getInventory().getHolder() instanceof SettingsHolder) {
            SettingsHolder holder = (SettingsHolder) e.getInventory().getHolder();
            holder.onInventoryClick(e);
        }
    }
}

interface SettingItem<T> {
    ItemStack getItemStack();

    String getKey();

    T getValue();

    void setValue(T value);

    void onClick(InventoryClickEvent event);
}

class BoolSettingItem implements SettingItem<Boolean> {

    private final ItemStack enabledStack;
    private final ItemStack disabledStack;
    private final String key;
    private final BiConsumer<InventoryClickEvent, BoolSettingItem> clickAction;
    private boolean state;

    public BoolSettingItem(String display, String key) {
        this(display, key, false, null);
    }

    public BoolSettingItem(String display, String key, boolean value) {
        this(display, key, value, null);
    }

    public BoolSettingItem(String display, String key, boolean value, BiConsumer<InventoryClickEvent, BoolSettingItem> clickAction) {
        this.key = key;
        this.state = value;
        this.clickAction = clickAction;
        enabledStack = new ItemStack(Material.LIME_STAINED_GLASS_PANE);
        ItemMeta meta = enabledStack.getItemMeta();
        meta.setDisplayName(display + ": §aOn");
        enabledStack.setItemMeta(meta);
        disabledStack = new ItemStack(Material.RED_STAINED_GLASS_PANE);
        meta = disabledStack.getItemMeta();
        meta.setDisplayName(display + ": §cOff");
        disabledStack.setItemMeta(meta);
    }

    @Override
    public ItemStack getItemStack() {
        return state ? enabledStack : disabledStack;
    }

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public Boolean getValue() {
        return state;
    }

    @Override
    public void setValue(Boolean value) {
        this.state = value;
    }

    @Override
    public void onClick(InventoryClickEvent event) {
        state = !state;
        if (clickAction != null)
            clickAction.accept(event, this);
    }
}
В целом, под себя подправишь и всё будет работать. Не забудь классы по файлам разбросать и слушатель зарегистрировать.
 
Назад
Верх