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);
}
}