mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
Unit repair config gui (#6)
This commit is contained in:
commit
59ed7dd1e4
30 changed files with 1398 additions and 294 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.global;
|
package xyz.alexcrea.cuanvil.gui.config;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
|
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
|
||||||
|
|
@ -8,6 +8,7 @@ import io.delilaheve.CustomAnvil;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.global.*;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
|
|
||||||
|
|
@ -87,11 +88,20 @@ public class MainConfigGui extends ChestGui {
|
||||||
wipMeta.setDisplayName("\u00A7cWIP");
|
wipMeta.setDisplayName("\u00A7cWIP");
|
||||||
wipItemstack.setItemMeta(wipMeta);
|
wipItemstack.setItemMeta(wipMeta);
|
||||||
|
|
||||||
GuiItem wip5 = new GuiItem(wipItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
|
GuiItem wip = new GuiItem(wipItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
|
||||||
GuiItem wip6 = new GuiItem(wipItemstack, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
|
|
||||||
|
|
||||||
pane.bindItem('5', wip5);
|
pane.bindItem('5', wip);
|
||||||
pane.bindItem('6', wip6);
|
|
||||||
|
// Unit repair item
|
||||||
|
ItemStack unirRepairItemstack = new ItemStack(Material.DIAMOND);
|
||||||
|
ItemMeta unitRepairMeta = unirRepairItemstack.getItemMeta();
|
||||||
|
|
||||||
|
unitRepairMeta.setDisplayName("\u00A7aUnit Repair");
|
||||||
|
unitRepairMeta.setLore(Collections.singletonList("\u00A77Click here to open anvil custom recipe menu"));
|
||||||
|
unirRepairItemstack.setItemMeta(unitRepairMeta);
|
||||||
|
|
||||||
|
GuiItem unitRepairItem = GuiGlobalItems.goToGuiItem(unirRepairItemstack, UnitRepairConfigGui.INSTANCE);
|
||||||
|
pane.bindItem('6', unitRepairItem);
|
||||||
|
|
||||||
// Custom recipe item
|
// Custom recipe item
|
||||||
ItemStack customRecipeItemstack = new ItemStack(Material.CRAFTING_TABLE);
|
ItemStack customRecipeItemstack = new ItemStack(Material.CRAFTING_TABLE);
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.ask;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
|
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
|
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
|
||||||
|
public abstract class AbstractAskGui extends ChestGui {
|
||||||
|
|
||||||
|
protected PatternPane pane;
|
||||||
|
AbstractAskGui(int rows, @NotNull String name,
|
||||||
|
Gui backOnCancel){
|
||||||
|
super(rows, name, CustomAnvil.instance);
|
||||||
|
|
||||||
|
Pattern pattern = getGuiPattern();
|
||||||
|
this.pane = new PatternPane(0, 0, pattern.getLength(), pattern.getHeight(), pattern);
|
||||||
|
addPane(this.pane);
|
||||||
|
|
||||||
|
this.pane.bindItem('0', GuiGlobalItems.backgroundItem());
|
||||||
|
this.pane.bindItem('B', new GuiItem(GuiSharedConstant.CANCEL_ITEM, GuiGlobalActions.openGuiAction(backOnCancel), CustomAnvil.instance));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to get the gui pattern.
|
||||||
|
* Reserved character are:
|
||||||
|
* <ul>
|
||||||
|
* <li><b>B</b>: "cancel" button.</li>
|
||||||
|
* <li><b>0</b>: default background item.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @return The gui's pattern.
|
||||||
|
*/
|
||||||
|
protected abstract Pattern getGuiPattern();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config;
|
package xyz.alexcrea.cuanvil.gui.config.ask;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
import com.github.stefvanschie.inventoryframework.gui.type.ChestGui;
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
|
||||||
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
import io.delilaheve.CustomAnvil;
|
import io.delilaheve.CustomAnvil;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
|
@ -12,50 +10,20 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class ConfirmActionGui extends ChestGui {
|
public class ConfirmActionGui extends AbstractAskGui {
|
||||||
|
|
||||||
private static final ItemStack CANCEL_ITEM;
|
|
||||||
private static final ItemStack CONFIRM_ITEM;
|
|
||||||
|
|
||||||
static {
|
|
||||||
CANCEL_ITEM = new ItemStack(Material.RED_TERRACOTTA);
|
|
||||||
ItemMeta meta = CANCEL_ITEM.getItemMeta();
|
|
||||||
meta.setDisplayName("\u00A7cCancel");
|
|
||||||
meta.setLore(Collections.singletonList("\u00A77Cancel current action and return to previous menu."));
|
|
||||||
CANCEL_ITEM.setItemMeta(meta);
|
|
||||||
|
|
||||||
CONFIRM_ITEM = new ItemStack(Material.GREEN_TERRACOTTA);
|
|
||||||
meta = CONFIRM_ITEM.getItemMeta();
|
|
||||||
meta.setDisplayName("\u00A7aConfirm");
|
|
||||||
meta.setLore(Arrays.asList("\u00A77Confirm current action.",
|
|
||||||
"\u00A74Cation: This action can't be canceled."));
|
|
||||||
CONFIRM_ITEM.setItemMeta(meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ConfirmActionGui(@NotNull String title, String actionDescription,
|
public ConfirmActionGui(@NotNull String title, String actionDescription,
|
||||||
Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm) {
|
Gui backOnCancel, Gui backOnConfirm, Supplier<Boolean> onConfirm) {
|
||||||
super(3, title, CustomAnvil.instance);
|
super(3, title, backOnCancel);
|
||||||
|
|
||||||
Pattern pattern = new Pattern(
|
// Save item
|
||||||
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
|
this.pane.bindItem('S', new GuiItem(GuiSharedConstant.CONFIRM_ITEM, event -> {
|
||||||
"00B0I0S00",
|
|
||||||
GuiSharedConstant.EMPTY_GUI_FULL_LINE
|
|
||||||
);
|
|
||||||
PatternPane pane = new PatternPane(0, 0, pattern.getLength(), pattern.getHeight(), pattern);
|
|
||||||
addPane(pane);
|
|
||||||
|
|
||||||
pane.bindItem('0', GuiGlobalItems.backgroundItem());
|
|
||||||
|
|
||||||
pane.bindItem('B', new GuiItem(CANCEL_ITEM, GuiGlobalActions.openGuiAction(backOnCancel), CustomAnvil.instance));
|
|
||||||
pane.bindItem('S', new GuiItem(CONFIRM_ITEM, event -> {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
HumanEntity player = event.getWhoClicked();
|
HumanEntity player = event.getWhoClicked();
|
||||||
|
|
||||||
|
|
@ -80,6 +48,7 @@ public class ConfirmActionGui extends ChestGui {
|
||||||
|
|
||||||
}, CustomAnvil.instance));
|
}, CustomAnvil.instance));
|
||||||
|
|
||||||
|
// Info item
|
||||||
ItemStack infoItem = new ItemStack(Material.PAPER);
|
ItemStack infoItem = new ItemStack(Material.PAPER);
|
||||||
ItemMeta infoMeta = infoItem.getItemMeta();
|
ItemMeta infoMeta = infoItem.getItemMeta();
|
||||||
|
|
||||||
|
|
@ -91,4 +60,13 @@ public class ConfirmActionGui extends ChestGui {
|
||||||
pane.bindItem('I', new GuiItem(infoItem, GuiGlobalActions.stayInPlace, CustomAnvil.instance));
|
pane.bindItem('I', new GuiItem(infoItem, GuiGlobalActions.stayInPlace, CustomAnvil.instance));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern getGuiPattern() {
|
||||||
|
return new Pattern(
|
||||||
|
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
|
||||||
|
"00B0I0S00",
|
||||||
|
GuiSharedConstant.EMPTY_GUI_FULL_LINE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.ask;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
|
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class SelectItemTypeGui extends AbstractAskGui {
|
||||||
|
|
||||||
|
private ItemStack selectedItem;
|
||||||
|
public SelectItemTypeGui(@NotNull String title,
|
||||||
|
@NotNull String actionDescription,
|
||||||
|
@NotNull Gui backOnCancel,
|
||||||
|
@NotNull BiConsumer<ItemStack, HumanEntity> onSave,
|
||||||
|
boolean materialOnly) {
|
||||||
|
super(3, title, backOnCancel);
|
||||||
|
this.selectedItem = null;
|
||||||
|
|
||||||
|
// Save item
|
||||||
|
GuiItem confirmItem = new GuiItem(GuiSharedConstant.CONFIRM_ITEM, event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
HumanEntity player = event.getWhoClicked();
|
||||||
|
|
||||||
|
if (!player.hasPermission(CustomAnvil.editConfigPermission)) {
|
||||||
|
player.closeInventory();
|
||||||
|
player.sendMessage(GuiGlobalActions.NO_EDIT_PERM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
onSave.accept(this.selectedItem, player);
|
||||||
|
|
||||||
|
}, CustomAnvil.instance);
|
||||||
|
this.pane.bindItem('S', GuiGlobalItems.backgroundItem());
|
||||||
|
|
||||||
|
// Select item
|
||||||
|
ItemStack selectItem = setDisplayMeta(new ItemStack(Material.BARRIER), actionDescription);
|
||||||
|
|
||||||
|
AtomicReference<GuiItem> selectGuiItem = new AtomicReference<>();
|
||||||
|
selectGuiItem.set(new GuiItem(selectItem, event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
ItemStack cursor = event.getWhoClicked().getItemOnCursor();
|
||||||
|
if(cursor.getType().isAir()) return;
|
||||||
|
|
||||||
|
ItemStack finalItem;
|
||||||
|
if(materialOnly){
|
||||||
|
finalItem = setDisplayMeta(new ItemStack(cursor.getType()), actionDescription);
|
||||||
|
}else{
|
||||||
|
finalItem = cursor.clone();
|
||||||
|
}
|
||||||
|
this.selectedItem = finalItem.clone();
|
||||||
|
|
||||||
|
selectGuiItem.get().setItem(finalItem);
|
||||||
|
this.pane.bindItem('S', confirmItem);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}, CustomAnvil.instance));
|
||||||
|
|
||||||
|
this.pane.bindItem('V', selectGuiItem.get());
|
||||||
|
|
||||||
|
// Temporary leave item
|
||||||
|
GuiItem temporaryLeave = GuiGlobalItems.temporaryCloseGuiToSelectItem(Material.YELLOW_TERRACOTTA, this);
|
||||||
|
|
||||||
|
this.pane.bindItem('s', temporaryLeave);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private ItemStack setDisplayMeta(ItemStack item, String actionDescription){
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName("\u00A7ePlace an item here");
|
||||||
|
meta.setLore(Arrays.asList(actionDescription.split("\n")));
|
||||||
|
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pattern getGuiPattern() {
|
||||||
|
return new Pattern(
|
||||||
|
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
|
||||||
|
"0000V000s",
|
||||||
|
"B0000000S"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -11,6 +11,7 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,15 @@ import org.bukkit.inventory.ItemFlag;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.subsetting.CustomRecipeSubSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.list.elements.CustomRecipeSubSettingGui;
|
||||||
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe;
|
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe;
|
||||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CustomRecipeConfigGui extends MappedElementListConfigGui<AnvilCustomRecipe, CustomRecipeSubSettingGui> {
|
public class CustomRecipeConfigGui extends MappedGuiListConfigGui<AnvilCustomRecipe, CustomRecipeSubSettingGui> {
|
||||||
|
|
||||||
|
|
||||||
public final static CustomRecipeConfigGui INSTANCE = new CustomRecipeConfigGui();
|
public final static CustomRecipeConfigGui INSTANCE = new CustomRecipeConfigGui();
|
||||||
|
|
@ -41,7 +42,7 @@ public class CustomRecipeConfigGui extends MappedElementListConfigGui<AnvilCusto
|
||||||
// edit displayed item
|
// edit displayed item
|
||||||
ItemMeta meta = displaydItem.getItemMeta();
|
ItemMeta meta = displaydItem.getItemMeta();
|
||||||
|
|
||||||
meta.setDisplayName("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(recipe.getName()) + " \u00A7fCustom recipe");
|
meta.setDisplayName("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(recipe.toString()) + " \u00A7fCustom recipe");
|
||||||
meta.addItemFlags(ItemFlag.values());
|
meta.addItemFlags(ItemFlag.values());
|
||||||
|
|
||||||
boolean shouldWork = recipe.validate();
|
boolean shouldWork = recipe.validate();
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,15 @@ import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
|
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
|
||||||
import xyz.alexcrea.cuanvil.group.IncludeGroup;
|
import xyz.alexcrea.cuanvil.group.IncludeGroup;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.subsetting.EnchantConflictSubSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.list.elements.EnchantConflictSubSettingGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class EnchantConflictGui extends MappedElementListConfigGui<EnchantConflictGroup, EnchantConflictSubSettingGui> {
|
public class EnchantConflictGui extends MappedGuiListConfigGui<EnchantConflictGroup, EnchantConflictSubSettingGui> {
|
||||||
|
|
||||||
public final static EnchantConflictGui INSTANCE = new EnchantConflictGui();
|
public final static EnchantConflictGui INSTANCE = new EnchantConflictGui();
|
||||||
|
|
||||||
|
|
@ -57,7 +58,7 @@ public class EnchantConflictGui extends MappedElementListConfigGui<EnchantConfli
|
||||||
|
|
||||||
ItemMeta meta = item.getItemMeta();
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
meta.setDisplayName("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(conflict.getName()) + " \u00A7fConflict");
|
meta.setDisplayName("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(conflict.toString()) + " \u00A7fConflict");
|
||||||
meta.setLore(Arrays.asList(
|
meta.setLore(Arrays.asList(
|
||||||
"\u00A77Enchantment count: \u00A7e" + conflict.getEnchants().size(),
|
"\u00A77Enchantment count: \u00A7e" + conflict.getEnchants().size(),
|
||||||
"\u00A77Group count: \u00A7e" + conflict.getCantConflictGroup().getGroups().size(),
|
"\u00A77Group count: \u00A7e" + conflict.getCantConflictGroup().getGroups().size(),
|
||||||
|
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.global;
|
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
|
||||||
import io.delilaheve.CustomAnvil;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.HumanEntity;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.subsetting.MappedToListSubSettingGui;
|
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
|
||||||
import xyz.alexcrea.cuanvil.interfaces.Named;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public abstract class MappedElementListConfigGui< T extends Named, S extends MappedToListSubSettingGui> extends ElementListGlobalConfigGui< T > {
|
|
||||||
|
|
||||||
|
|
||||||
protected final HashMap<T, S> elementGuiMap;
|
|
||||||
public MappedElementListConfigGui(@NotNull String title) {
|
|
||||||
super(title);
|
|
||||||
this.elementGuiMap = new HashMap<>();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiItem prepareCreateNewItem(){
|
|
||||||
// Create new conflict item
|
|
||||||
ItemStack createItem = new ItemStack(Material.PAPER);
|
|
||||||
ItemMeta createMeta = createItem.getItemMeta();
|
|
||||||
|
|
||||||
createMeta.setDisplayName("\u00A7aCreate new "+genericDisplayedName());
|
|
||||||
createMeta.setLore(Arrays.asList(
|
|
||||||
"\u00A77Create a new "+genericDisplayedName()+".",
|
|
||||||
"\u00A77You will be asked to name the "+genericDisplayedName()+" in chat.",
|
|
||||||
"\u00A77Then, you should edit the "+genericDisplayedName()+" config as you need"
|
|
||||||
));
|
|
||||||
|
|
||||||
createItem.setItemMeta(createMeta);
|
|
||||||
|
|
||||||
return new GuiItem(createItem, (clickEvent) -> {
|
|
||||||
clickEvent.setCancelled(true);
|
|
||||||
HumanEntity player = clickEvent.getWhoClicked();
|
|
||||||
|
|
||||||
// check permission
|
|
||||||
if (!player.hasPermission(CustomAnvil.editConfigPermission)) {
|
|
||||||
player.closeInventory();
|
|
||||||
player.sendMessage(GuiGlobalActions.NO_EDIT_PERM);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
player.closeInventory();
|
|
||||||
|
|
||||||
player.sendMessage("\u00A7eWrite the "+genericDisplayedName()+" name you want to create in the chat.\n" +
|
|
||||||
"\u00A7eOr write \u00A7ccancel \u00A7eto go back to "+genericDisplayedName()+" config menu");
|
|
||||||
|
|
||||||
CustomAnvil.Companion.getChatListener().setListenedCallback(player, prepareCreateItemConsumer(player));
|
|
||||||
|
|
||||||
}, CustomAnvil.instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reloadValues() {
|
|
||||||
this.elementGuiMap.forEach((conflict, gui) -> gui.cleanUnused());
|
|
||||||
this.elementGuiMap.clear();
|
|
||||||
|
|
||||||
super.reloadValues();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void updateGeneric(T generic, ItemStack usedItem) {
|
|
||||||
S gui = this.elementGuiMap.get(generic);
|
|
||||||
|
|
||||||
GuiItem guiItem;
|
|
||||||
if (gui == null) {
|
|
||||||
// Create new sub setting gui
|
|
||||||
guiItem = new GuiItem(usedItem, CustomAnvil.instance);
|
|
||||||
gui = newInstanceOfGui(generic, guiItem);
|
|
||||||
|
|
||||||
guiItem.setAction(GuiGlobalActions.openGuiAction(gui));
|
|
||||||
|
|
||||||
this.elementGuiMap.put(generic, gui);
|
|
||||||
addToPage(guiItem);
|
|
||||||
} else {
|
|
||||||
// Replace item with the updated one
|
|
||||||
guiItem = gui.getParentItemForThisGui();
|
|
||||||
guiItem.setItem(usedItem);
|
|
||||||
}
|
|
||||||
gui.updateLocal();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected GuiItem findGuiItemForRemoval(T generic) {
|
|
||||||
S gui = this.elementGuiMap.get(generic);
|
|
||||||
if (gui == null) return null;
|
|
||||||
|
|
||||||
this.elementGuiMap.remove(generic);
|
|
||||||
return gui.getParentItemForThisGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Consumer<String> prepareCreateItemConsumer(HumanEntity player){
|
|
||||||
AtomicReference<Consumer<String>> selfRef = new AtomicReference<>();
|
|
||||||
Consumer<String> selfCallback = (message) -> {
|
|
||||||
if (message == null) return;
|
|
||||||
|
|
||||||
// check permission
|
|
||||||
if (!player.hasPermission(CustomAnvil.editConfigPermission)) {
|
|
||||||
player.sendMessage(GuiGlobalActions.NO_EDIT_PERM);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = message.toLowerCase(Locale.ROOT);
|
|
||||||
if ("cancel".equalsIgnoreCase(message)) {
|
|
||||||
player.sendMessage(genericDisplayedName()+" creation cancelled...");
|
|
||||||
show(player);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
message = message.replace(' ', '_');
|
|
||||||
|
|
||||||
// Try to find if it already exists in a for loop
|
|
||||||
// Not the most efficient on large number of conflict, but it should not run often.
|
|
||||||
for (T generic : getEveryDisplayableInstanceOfGeneric()) {
|
|
||||||
if (generic.getName().equalsIgnoreCase(message)) {
|
|
||||||
player.sendMessage("\u00A7cPlease enter a "+genericDisplayedName()+" name that do not already exist...");
|
|
||||||
// wait next message.
|
|
||||||
CustomAnvil.Companion.getChatListener().setListenedCallback(player, selfRef.get());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
T generic = createAndSaveNewEmptyGeneric(message);
|
|
||||||
|
|
||||||
updateValueForGeneric(generic, true);
|
|
||||||
|
|
||||||
// show the new conflict config to the player
|
|
||||||
this.elementGuiMap.get(generic).show(player);
|
|
||||||
|
|
||||||
update();
|
|
||||||
};
|
|
||||||
|
|
||||||
selfRef.set(selfCallback);
|
|
||||||
return selfCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract S newInstanceOfGui(T generic, GuiItem item);
|
|
||||||
|
|
||||||
protected abstract String genericDisplayedName();
|
|
||||||
|
|
||||||
protected abstract T createAndSaveNewEmptyGeneric(String name);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.global;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.ask.SelectItemTypeGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.list.MappedGuiListConfigGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.list.UnitRepairElementListGui;
|
||||||
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class UnitRepairConfigGui extends MappedGuiListConfigGui<Material, UnitRepairElementListGui> {
|
||||||
|
|
||||||
|
public final static UnitRepairConfigGui INSTANCE = new UnitRepairConfigGui();
|
||||||
|
|
||||||
|
static {
|
||||||
|
INSTANCE.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private UnitRepairConfigGui() {
|
||||||
|
super("Unit Repair Config");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected UnitRepairElementListGui newInstanceOfGui(Material material, GuiItem item) {
|
||||||
|
UnitRepairElementListGui element = new UnitRepairElementListGui(material, this, item);
|
||||||
|
element.init();
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ItemStack createItemForGeneric(Material material) {
|
||||||
|
ConfigurationSection materialSection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(material.name().toLowerCase());
|
||||||
|
String materialName = CasedStringUtil.snakeToUpperSpacedCase(material.name().toLowerCase());
|
||||||
|
|
||||||
|
if(material.isAir()){
|
||||||
|
material = Material.BARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
int reparableItemCount = materialSection == null ? 0 : materialSection.getKeys(false).size(); // Probably an expensive call but... why not
|
||||||
|
|
||||||
|
ItemStack item = new ItemStack(material);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName("\u00A7eRepaired by " +materialName);
|
||||||
|
meta.setLore(Arrays.asList(
|
||||||
|
"\u00A77There is currently \u00A7e" +reparableItemCount+ " \u00A77reparable item with "+materialName,
|
||||||
|
"\u00A77Click here to open the menu to edit reparable item by " + materialName
|
||||||
|
));
|
||||||
|
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Material> getEveryDisplayableInstanceOfGeneric() {
|
||||||
|
ArrayList<Material> materials = new ArrayList<>();
|
||||||
|
|
||||||
|
for (String matName : ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getKeys(false)) {
|
||||||
|
Material mat = Material.getMaterial(matName.toUpperCase());
|
||||||
|
if(mat != null){
|
||||||
|
materials.add(mat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return materials;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem prepareCreateNewItem() {
|
||||||
|
// Create new conflict item
|
||||||
|
ItemStack createItem = new ItemStack(Material.PAPER);
|
||||||
|
ItemMeta createMeta = createItem.getItemMeta();
|
||||||
|
|
||||||
|
createMeta.setDisplayName("\u00A7aSelect a new unit material");
|
||||||
|
createMeta.setLore(Arrays.asList(
|
||||||
|
"\u00A77Select a new unit material to be used.",
|
||||||
|
"\u00A77You will be asked the material to use."
|
||||||
|
));
|
||||||
|
|
||||||
|
createItem.setItemMeta(createMeta);
|
||||||
|
|
||||||
|
return new GuiItem(createItem, (clickEvent) -> {
|
||||||
|
clickEvent.setCancelled(true);
|
||||||
|
|
||||||
|
new SelectItemTypeGui(
|
||||||
|
"Select unit repair item.",
|
||||||
|
"\u00A77Click here with an item to set the item\n" +
|
||||||
|
"\u00A77You like to be an unit repair item",
|
||||||
|
this,
|
||||||
|
(itemStack, player) -> {
|
||||||
|
Material type = itemStack.getType();
|
||||||
|
// Add new material
|
||||||
|
updateValueForGeneric(type, true);
|
||||||
|
|
||||||
|
// Display material edit setting
|
||||||
|
this.elementGuiMap.get(type).getMappedGui().show(player);
|
||||||
|
},
|
||||||
|
true
|
||||||
|
).show(clickEvent.getWhoClicked());
|
||||||
|
}, CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Not used in this implementation.
|
||||||
|
protected String genericDisplayedName() {
|
||||||
|
return "this function Should not be used.";
|
||||||
|
}
|
||||||
|
@Override // Not used in this implementation.
|
||||||
|
protected Material createAndSaveNewEmptyGeneric(String name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.global;
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.Orientable;
|
import com.github.stefvanschie.inventoryframework.pane.Orientable;
|
||||||
|
|
@ -14,6 +14,7 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
|
||||||
|
|
@ -22,22 +23,16 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public abstract class ElementListGlobalConfigGui< T > extends ValueUpdatableGui {
|
public abstract class ElementListConfigGui< T > extends ValueUpdatableGui {
|
||||||
|
|
||||||
private final String namePrefix;
|
private final String namePrefix;
|
||||||
|
|
||||||
public ElementListGlobalConfigGui(@NotNull String title) {
|
|
||||||
super(6, title, CustomAnvil.instance);
|
|
||||||
this.namePrefix = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected OutlinePane firstPage;
|
|
||||||
protected ArrayList<OutlinePane> pages;
|
|
||||||
protected HashMap<UUID, Integer> pageMap;
|
|
||||||
protected PatternPane backgroundPane;
|
protected PatternPane backgroundPane;
|
||||||
|
|
||||||
public void init() {
|
public ElementListConfigGui(@NotNull String title) {
|
||||||
|
super(6, title, CustomAnvil.instance);
|
||||||
|
this.namePrefix = title;
|
||||||
|
|
||||||
// Back item panel
|
// Back item panel
|
||||||
Pattern pattern = new Pattern(
|
Pattern pattern = new Pattern(
|
||||||
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
|
GuiSharedConstant.EMPTY_GUI_FULL_LINE,
|
||||||
|
|
@ -48,9 +43,16 @@ public abstract class ElementListGlobalConfigGui< T > extends ValueUpdatableGui
|
||||||
"B11L1R11C"
|
"B11L1R11C"
|
||||||
);
|
);
|
||||||
this.backgroundPane = new PatternPane(0, 0, 9, 6, Pane.Priority.LOW, pattern);
|
this.backgroundPane = new PatternPane(0, 0, 9, 6, Pane.Priority.LOW, pattern);
|
||||||
|
|
||||||
GuiGlobalItems.addBackItem(this.backgroundPane, MainConfigGui.INSTANCE);
|
GuiGlobalItems.addBackItem(this.backgroundPane, MainConfigGui.INSTANCE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected OutlinePane firstPage;
|
||||||
|
protected ArrayList<OutlinePane> pages;
|
||||||
|
protected HashMap<UUID, Integer> pageMap;
|
||||||
|
|
||||||
|
public void init() { // Why I'm using an init function ?
|
||||||
GuiGlobalItems.addBackgroundItem(this.backgroundPane);
|
GuiGlobalItems.addBackgroundItem(this.backgroundPane);
|
||||||
this.backgroundPane.bindItem('1', GuiSharedConstant.SECONDARY_BACKGROUND_ITEM);
|
this.backgroundPane.bindItem('1', GuiSharedConstant.SECONDARY_BACKGROUND_ITEM);
|
||||||
addPane(this.backgroundPane);
|
addPane(this.backgroundPane);
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
|
|
||||||
|
public interface ElementMappedToListGui {
|
||||||
|
|
||||||
|
GuiItem getParentItemForThisGui();
|
||||||
|
|
||||||
|
void updateLocal();
|
||||||
|
|
||||||
|
void cleanAndBeUnusable();
|
||||||
|
|
||||||
|
Gui getMappedGui();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public abstract class MappedElementListConfigGui< T, S > extends ElementListConfigGui< T > {
|
||||||
|
|
||||||
|
protected final HashMap<T, S> elementGuiMap;
|
||||||
|
public MappedElementListConfigGui(@NotNull String title) {
|
||||||
|
super(title);
|
||||||
|
this.elementGuiMap = new HashMap<>();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem prepareCreateNewItem(){
|
||||||
|
// Create new conflict item
|
||||||
|
ItemStack createItem = new ItemStack(Material.PAPER);
|
||||||
|
ItemMeta createMeta = createItem.getItemMeta();
|
||||||
|
|
||||||
|
createMeta.setDisplayName("\u00A7aCreate new "+genericDisplayedName());
|
||||||
|
createMeta.setLore(Arrays.asList(
|
||||||
|
"\u00A77Create a new "+genericDisplayedName()+".",
|
||||||
|
"\u00A77You will be asked to name the "+genericDisplayedName()+" in chat.",
|
||||||
|
"\u00A77Then, you should edit the "+genericDisplayedName()+" config as you need"
|
||||||
|
));
|
||||||
|
|
||||||
|
createItem.setItemMeta(createMeta);
|
||||||
|
|
||||||
|
return new GuiItem(createItem, (clickEvent) -> {
|
||||||
|
clickEvent.setCancelled(true);
|
||||||
|
HumanEntity player = clickEvent.getWhoClicked();
|
||||||
|
|
||||||
|
// check permission
|
||||||
|
if (!player.hasPermission(CustomAnvil.editConfigPermission)) {
|
||||||
|
player.closeInventory();
|
||||||
|
player.sendMessage(GuiGlobalActions.NO_EDIT_PERM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
player.closeInventory();
|
||||||
|
|
||||||
|
player.sendMessage("\u00A7eWrite the "+genericDisplayedName()+" name you want to create in the chat.\n" +
|
||||||
|
"\u00A7eOr write \u00A7ccancel \u00A7eto go back to "+genericDisplayedName()+" config menu");
|
||||||
|
|
||||||
|
CustomAnvil.Companion.getChatListener().setListenedCallback(player, prepareCreateItemConsumer(player));
|
||||||
|
|
||||||
|
}, CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateGeneric(T generic, ItemStack usedItem) {
|
||||||
|
S element = this.elementGuiMap.get(generic);
|
||||||
|
|
||||||
|
GuiItem guiItem;
|
||||||
|
if (element == null) {
|
||||||
|
// Create new sub setting element
|
||||||
|
guiItem = new GuiItem(usedItem, CustomAnvil.instance);
|
||||||
|
|
||||||
|
element = newElementRequested(generic, guiItem);
|
||||||
|
|
||||||
|
this.elementGuiMap.put(generic, element);
|
||||||
|
|
||||||
|
addToPage(guiItem);
|
||||||
|
} else {
|
||||||
|
// Replace item with the updated one
|
||||||
|
guiItem = findItemFromElement(generic, element);
|
||||||
|
guiItem.setItem(usedItem);
|
||||||
|
}
|
||||||
|
updateElement(generic, element);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void updateElement(T generic, S element);
|
||||||
|
|
||||||
|
protected abstract S newElementRequested(T generic, GuiItem newItem);
|
||||||
|
|
||||||
|
protected abstract GuiItem findItemFromElement(T generic, S element);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem findGuiItemForRemoval(T generic) {
|
||||||
|
S element = this.elementGuiMap.get(generic);
|
||||||
|
if (element == null) return null;
|
||||||
|
|
||||||
|
this.elementGuiMap.remove(generic);
|
||||||
|
return findGuiItemForRemoval(generic, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract GuiItem findGuiItemForRemoval(T generic, S element);
|
||||||
|
|
||||||
|
protected abstract Consumer<String> prepareCreateItemConsumer(HumanEntity player);
|
||||||
|
|
||||||
|
protected abstract String genericDisplayedName();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,103 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public abstract class MappedGuiListConfigGui< T, S extends ElementMappedToListGui> extends MappedElementListConfigGui< T, S > {
|
||||||
|
|
||||||
|
public MappedGuiListConfigGui(@NotNull String title) {
|
||||||
|
super(title);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reloadValues() {
|
||||||
|
this.elementGuiMap.forEach((conflict, gui) -> gui.cleanAndBeUnusable());
|
||||||
|
this.elementGuiMap.clear();
|
||||||
|
|
||||||
|
super.reloadValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected S newElementRequested(T generic, GuiItem newItem) {
|
||||||
|
S element = newInstanceOfGui(generic, newItem);
|
||||||
|
|
||||||
|
newItem.setAction(GuiGlobalActions.openGuiAction(element.getMappedGui()));
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem findItemFromElement(T generic, S element) {
|
||||||
|
return element.getParentItemForThisGui();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateElement(T generic, S element) {
|
||||||
|
element.updateLocal();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem findGuiItemForRemoval(T generic, S element) {
|
||||||
|
return element.getParentItemForThisGui();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Consumer<String> prepareCreateItemConsumer(HumanEntity player){
|
||||||
|
AtomicReference<Consumer<String>> selfRef = new AtomicReference<>();
|
||||||
|
Consumer<String> selfCallback = (message) -> {
|
||||||
|
if (message == null) return;
|
||||||
|
|
||||||
|
// check permission
|
||||||
|
if (!player.hasPermission(CustomAnvil.editConfigPermission)) {
|
||||||
|
player.sendMessage(GuiGlobalActions.NO_EDIT_PERM);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = message.toLowerCase(Locale.ROOT);
|
||||||
|
if ("cancel".equalsIgnoreCase(message)) {
|
||||||
|
player.sendMessage(genericDisplayedName()+" creation cancelled...");
|
||||||
|
show(player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = message.replace(' ', '_');
|
||||||
|
|
||||||
|
// Try to find if it already exists in a for loop
|
||||||
|
// Not the most efficient on large number of conflict, but it should not run often.
|
||||||
|
for (T generic : getEveryDisplayableInstanceOfGeneric()) {
|
||||||
|
if (generic.toString().equalsIgnoreCase(message)) {
|
||||||
|
player.sendMessage("\u00A7cPlease enter a "+genericDisplayedName()+" name that do not already exist...");
|
||||||
|
// wait next message.
|
||||||
|
CustomAnvil.Companion.getChatListener().setListenedCallback(player, selfRef.get());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
T generic = createAndSaveNewEmptyGeneric(message);
|
||||||
|
|
||||||
|
updateValueForGeneric(generic, true);
|
||||||
|
|
||||||
|
// show the new conflict config to the player
|
||||||
|
this.elementGuiMap.get(generic).getMappedGui().show(player);
|
||||||
|
|
||||||
|
update();
|
||||||
|
};
|
||||||
|
|
||||||
|
selfRef.set(selfCallback);
|
||||||
|
return selfCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract S newInstanceOfGui(T generic, GuiItem item);
|
||||||
|
|
||||||
|
protected abstract String genericDisplayedName();
|
||||||
|
|
||||||
|
protected abstract T createAndSaveNewEmptyGeneric(String name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public abstract class SettingGuiListConfigGui< T, S extends AbstractSettingGui.SettingGuiFactory> extends ElementListConfigGui< T >{
|
||||||
|
|
||||||
|
protected HashMap<T, GuiItem> guiItemMap;
|
||||||
|
protected HashMap<T, S> factoryMap;
|
||||||
|
public SettingGuiListConfigGui(@NotNull String title) {
|
||||||
|
super(title);
|
||||||
|
this.guiItemMap = new HashMap<>();
|
||||||
|
this.factoryMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem prepareCreateNewItem() {
|
||||||
|
ItemStack createItem = new ItemStack(Material.PAPER);
|
||||||
|
ItemMeta createMeta = createItem.getItemMeta();
|
||||||
|
|
||||||
|
createMeta.setDisplayName(createItemName());
|
||||||
|
createMeta.setLore(getCreateItemLore());
|
||||||
|
|
||||||
|
createItem.setItemMeta(createMeta);
|
||||||
|
return new GuiItem(createItem, getCreateClickConsumer(), CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateValueForGeneric(T generic, boolean shouldUpdate) {
|
||||||
|
S factory = this.factoryMap.get(generic);
|
||||||
|
if(factory == null){
|
||||||
|
// Create new item & factory
|
||||||
|
factory = createFactory(generic);
|
||||||
|
GuiItem newItem = itemFromFactory(generic, factory);
|
||||||
|
|
||||||
|
addToPage(newItem);
|
||||||
|
this.guiItemMap.put(generic, newItem);
|
||||||
|
this.factoryMap.put(generic, factory);
|
||||||
|
}else{
|
||||||
|
// Update old item
|
||||||
|
GuiItem oldItem = this.guiItemMap.get(generic);
|
||||||
|
|
||||||
|
GuiItem newItem = itemFromFactory(generic, factory);
|
||||||
|
updateGuiItem(oldItem, newItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(shouldUpdate){
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void reloadValues() {
|
||||||
|
this.guiItemMap.clear();
|
||||||
|
this.factoryMap.clear();
|
||||||
|
|
||||||
|
super.reloadValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateGuiItem(GuiItem oldITem, GuiItem newItem){
|
||||||
|
oldITem.setItem(newItem.getItem());
|
||||||
|
oldITem.setProperties(newItem.getProperties());
|
||||||
|
oldITem.setVisible(newItem.isVisible());
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected GuiItem findGuiItemForRemoval(T generic) {
|
||||||
|
return this.guiItemMap.get(generic);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Not used
|
||||||
|
protected void updateGeneric(T generic, ItemStack usedItem) {}
|
||||||
|
@Override // Not used
|
||||||
|
protected ItemStack createItemForGeneric(T generic) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract List<String> getCreateItemLore();
|
||||||
|
protected abstract Consumer<InventoryClickEvent> getCreateClickConsumer();
|
||||||
|
protected abstract String createItemName();
|
||||||
|
|
||||||
|
protected abstract S createFactory(T generic);
|
||||||
|
protected abstract GuiItem itemFromFactory(T generic, S factory);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,197 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.list;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.inventory.meta.Damageable;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.ask.SelectItemTypeGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.settings.DoubleSettingGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
import xyz.alexcrea.cuanvil.util.MetricsUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class UnitRepairElementListGui extends SettingGuiListConfigGui<String, DoubleSettingGui.DoubleSettingFactory> implements ElementMappedToListGui {
|
||||||
|
|
||||||
|
private final GuiItem parentItem;
|
||||||
|
private final Material material;
|
||||||
|
private final UnitRepairConfigGui parentGui;
|
||||||
|
private final String materialName;
|
||||||
|
|
||||||
|
private boolean shouldWork = true;
|
||||||
|
public UnitRepairElementListGui(@NotNull Material material,
|
||||||
|
@NotNull UnitRepairConfigGui parentGui,
|
||||||
|
@NotNull GuiItem parentItem) {
|
||||||
|
super("\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(material.name().toLowerCase()) + " \u00A7rUnit repair");
|
||||||
|
this.parentItem = parentItem;
|
||||||
|
this.material = material;
|
||||||
|
this.parentGui = parentGui;
|
||||||
|
this.materialName = CasedStringUtil.snakeToUpperSpacedCase(material.name().toLowerCase());
|
||||||
|
|
||||||
|
GuiGlobalItems.addBackItem(this.backgroundPane, parentGui);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SettingGuiListConfigGui methods
|
||||||
|
@Override
|
||||||
|
protected List<String> getCreateItemLore() {
|
||||||
|
return Arrays.asList(
|
||||||
|
"\u00A77Select a new item to be repairable.",
|
||||||
|
"\u00A77You will be asked the material to use."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Consumer<InventoryClickEvent> getCreateClickConsumer() {
|
||||||
|
return event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
if(!this.shouldWork){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
new SelectItemTypeGui(
|
||||||
|
"Select item to be repaired.",
|
||||||
|
"\u00A77Click here with an item to set the item\n" +
|
||||||
|
"\u00A77You like to be repaired by " + this.materialName,
|
||||||
|
this,
|
||||||
|
(itemStack, player) -> {
|
||||||
|
ItemMeta meta = itemStack.getItemMeta();
|
||||||
|
Material type = itemStack.getType();
|
||||||
|
|
||||||
|
if(!(meta instanceof Damageable) || (type.getMaxDurability() <= 0)) {
|
||||||
|
player.sendMessage("\u00A7cThis item can't be damaged, so it can't be repaired.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(type == this.material){
|
||||||
|
player.sendMessage("\u00A7cItem can't repair something of the same type.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String materialName = type.name().toLowerCase();
|
||||||
|
|
||||||
|
// Add new material
|
||||||
|
ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().set(material.name().toLowerCase()+"."+materialName,0.25);
|
||||||
|
|
||||||
|
MetricsUtil.INSTANCE.notifyChange(ConfigHolder.UNIT_REPAIR_HOLDER, "");
|
||||||
|
if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) {
|
||||||
|
ConfigHolder.UNIT_REPAIR_HOLDER.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gui
|
||||||
|
updateValueForGeneric(materialName, true);
|
||||||
|
this.parentGui.updateValueForGeneric(this.material, true);
|
||||||
|
|
||||||
|
|
||||||
|
// Display material edit setting
|
||||||
|
this.factoryMap.get(materialName).create().show(player);
|
||||||
|
},
|
||||||
|
true
|
||||||
|
).show(event.getWhoClicked());
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String createItemName() {
|
||||||
|
return "\u00A7aAdd a new item reparable by " + this.materialName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected DoubleSettingGui.DoubleSettingFactory createFactory(String materialName) {
|
||||||
|
return DoubleSettingGui.doubleFactory(
|
||||||
|
"\u00A70%\u00A78" +CasedStringUtil.snakeToUpperSpacedCase(materialName)+" Repair",
|
||||||
|
this,
|
||||||
|
material.name().toLowerCase()+"."+materialName,
|
||||||
|
ConfigHolder.UNIT_REPAIR_HOLDER,
|
||||||
|
2,
|
||||||
|
true, true,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0.25,
|
||||||
|
0.01, 0.05, 0.25
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GuiItem itemFromFactory(String materialName, DoubleSettingGui.DoubleSettingFactory factory) {
|
||||||
|
return factory.getItem(materialFromName(materialName),
|
||||||
|
"\u00A77%\u00A7a" + CasedStringUtil.snakeToUpperSpacedCase(materialName)+ " \u00A7erepaired by \u00A7a" + this.materialName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<String> getEveryDisplayableInstanceOfGeneric() {
|
||||||
|
ArrayList<String> keys = new ArrayList<>();
|
||||||
|
if(!this.shouldWork){
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigurationSection materialSection = ConfigHolder.UNIT_REPAIR_HOLDER.getConfig().getConfigurationSection(material.name().toLowerCase());
|
||||||
|
if(materialSection == null){
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
keys.addAll(materialSection.getKeys(false));
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Material materialFromName(String materialName){
|
||||||
|
Material mat = Material.getMaterial(materialName.toUpperCase());
|
||||||
|
if(mat == null || mat.isAir()) return Material.BARRIER;
|
||||||
|
return mat;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateGuiValues() {
|
||||||
|
super.updateGuiValues();
|
||||||
|
this.parentGui.updateValueForGeneric(this.material, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ElementMappedToListGui methods
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiItem getParentItemForThisGui() {
|
||||||
|
return this.parentItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override // Not used in this implementation
|
||||||
|
public void updateLocal() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cleanAndBeUnusable() {
|
||||||
|
this.shouldWork = false;
|
||||||
|
this.backgroundPane.bindItem('S', GuiGlobalItems.backgroundItem(Material.BLACK_STAINED_GLASS_PANE));
|
||||||
|
this.backgroundPane.bindItem('L', GuiGlobalItems.backgroundItem(Material.BLACK_STAINED_GLASS_PANE));
|
||||||
|
this.backgroundPane.bindItem('R', GuiGlobalItems.backgroundItem(Material.BLACK_STAINED_GLASS_PANE));
|
||||||
|
|
||||||
|
for (HumanEntity viewer : getViewers()) {
|
||||||
|
viewer.sendMessage("This config do not exist anymore");
|
||||||
|
this.parentGui.show(viewer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Gui getMappedGui() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void show(@NotNull HumanEntity humanEntity) {
|
||||||
|
if(!this.shouldWork){
|
||||||
|
humanEntity.closeInventory();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
super.show(humanEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.settings.subsetting;
|
package xyz.alexcrea.cuanvil.gui.config.list.elements;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
|
|
@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.ConfirmActionGui;
|
import xyz.alexcrea.cuanvil.gui.config.ask.ConfirmActionGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui;
|
import xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
|
||||||
|
|
@ -37,7 +37,7 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
|
||||||
@NotNull CustomRecipeConfigGui parent,
|
@NotNull CustomRecipeConfigGui parent,
|
||||||
@NotNull AnvilCustomRecipe anvilRecipe,
|
@NotNull AnvilCustomRecipe anvilRecipe,
|
||||||
@NotNull GuiItem parentItemForThisGui) {
|
@NotNull GuiItem parentItemForThisGui) {
|
||||||
super(parentItemForThisGui, 3, "\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(anvilRecipe.getName()) + " \u00A78Config");
|
super(parentItemForThisGui, 3, "\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(anvilRecipe.toString()) + " \u00A78Config");
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.anvilRecipe = anvilRecipe;
|
this.anvilRecipe = anvilRecipe;
|
||||||
|
|
||||||
|
|
@ -77,24 +77,24 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
|
||||||
|
|
||||||
IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE();
|
IntRange costRange = AnvilCustomRecipe.Companion.getXP_COST_CONFIG_RANGE();
|
||||||
this.exactCountFactory = BoolSettingsGui.boolFactory("\u00A78Exact count ?", this,
|
this.exactCountFactory = BoolSettingsGui.boolFactory("\u00A78Exact count ?", this,
|
||||||
this.anvilRecipe.getName()+"."+AnvilCustomRecipe.EXACT_COUNT_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
this.anvilRecipe + "." + AnvilCustomRecipe.EXACT_COUNT_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
||||||
AnvilCustomRecipe.Companion.getDEFAULT_EXACT_COUNT_CONFIG());
|
AnvilCustomRecipe.Companion.getDEFAULT_EXACT_COUNT_CONFIG());
|
||||||
|
|
||||||
this.xpCostFactory = IntSettingsGui.intFactory("\u00A78Recipe Xp Cost", this,
|
this.xpCostFactory = IntSettingsGui.intFactory("\u00A78Recipe Xp Cost", this,
|
||||||
this.anvilRecipe.getName()+"."+AnvilCustomRecipe.XP_COST_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
this.anvilRecipe +"."+AnvilCustomRecipe.XP_COST_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
||||||
costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.Companion.getDEFAULT_XP_COST_CONFIG(), 1, 5, 10);
|
costRange.getFirst(), costRange.getLast(), AnvilCustomRecipe.Companion.getDEFAULT_XP_COST_CONFIG(), 1, 5, 10);
|
||||||
|
|
||||||
|
|
||||||
this.leftItemFactory = ItemSettingGui.itemFactory("\u00A7eRecipe Left \u00A78Item", this,
|
this.leftItemFactory = ItemSettingGui.itemFactory("\u00A7eRecipe Left \u00A78Item", this,
|
||||||
this.anvilRecipe.getName()+"."+AnvilCustomRecipe.LEFT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
this.anvilRecipe + "." + AnvilCustomRecipe.LEFT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
||||||
AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG());
|
AnvilCustomRecipe.Companion.getDEFAULT_LEFT_ITEM_CONFIG());
|
||||||
|
|
||||||
this.rightItemFactory = ItemSettingGui.itemFactory("\u00A7eRecipe Right \u00A78Item", this,
|
this.rightItemFactory = ItemSettingGui.itemFactory("\u00A7eRecipe Right \u00A78Item", this,
|
||||||
this.anvilRecipe.getName()+"."+AnvilCustomRecipe.RIGHT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
this.anvilRecipe + "." + AnvilCustomRecipe.RIGHT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
||||||
AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG());
|
AnvilCustomRecipe.Companion.getDEFAULT_RIGHT_ITEM_CONFIG());
|
||||||
|
|
||||||
this.resultItemFactory = ItemSettingGui.itemFactory("\u00A7aRecipe Result \u00A78Item", this,
|
this.resultItemFactory = ItemSettingGui.itemFactory("\u00A7aRecipe Result \u00A78Item", this,
|
||||||
this.anvilRecipe.getName()+"."+AnvilCustomRecipe.RESULT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
this.anvilRecipe + "." + AnvilCustomRecipe.RESULT_ITEM_CONFIG, ConfigHolder.CUSTOM_RECIPE_HOLDER,
|
||||||
AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG());
|
AnvilCustomRecipe.Companion.getDEFAULT_RESULT_ITEM_CONFIG());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -109,10 +109,10 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
|
||||||
this.parent.removeGeneric(this.anvilRecipe);
|
this.parent.removeGeneric(this.anvilRecipe);
|
||||||
|
|
||||||
// Remove self
|
// Remove self
|
||||||
cleanUnused();
|
cleanAndBeUnusable();
|
||||||
|
|
||||||
// Update config file storage
|
// Update config file storage
|
||||||
ConfigHolder.CUSTOM_RECIPE_HOLDER.getConfig().set(this.anvilRecipe.getName(), null);
|
ConfigHolder.CUSTOM_RECIPE_HOLDER.getConfig().set(this.anvilRecipe.toString(), null);
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
|
|
@ -123,7 +123,7 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
|
||||||
return success;
|
return success;
|
||||||
};
|
};
|
||||||
|
|
||||||
return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.anvilRecipe.getName()) + "\u00A7c?",
|
return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.anvilRecipe.toString()) + "\u00A7c?",
|
||||||
"\u00A77Confirm that you want to delete this conflict.",
|
"\u00A77Confirm that you want to delete this conflict.",
|
||||||
this, this.parent, deleteSupplier
|
this, this.parent, deleteSupplier
|
||||||
);
|
);
|
||||||
|
|
@ -159,7 +159,7 @@ public class CustomRecipeSubSettingGui extends MappedToListSubSettingGui {
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cleanUnused() {
|
public void cleanAndBeUnusable() {
|
||||||
for (HumanEntity viewer : getViewers()) {
|
for (HumanEntity viewer : getViewers()) {
|
||||||
this.parent.show(viewer);
|
this.parent.show(viewer);
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.settings.subsetting;
|
package xyz.alexcrea.cuanvil.gui.config.list.elements;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
|
|
@ -14,9 +14,9 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup;
|
import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup;
|
||||||
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
|
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
|
||||||
import xyz.alexcrea.cuanvil.group.EnchantConflictManager;
|
import xyz.alexcrea.cuanvil.group.EnchantConflictManager;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.ConfirmActionGui;
|
|
||||||
import xyz.alexcrea.cuanvil.gui.config.SelectEnchantmentContainer;
|
import xyz.alexcrea.cuanvil.gui.config.SelectEnchantmentContainer;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.SelectGroupContainer;
|
import xyz.alexcrea.cuanvil.gui.config.SelectGroupContainer;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.ask.ConfirmActionGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.EnchantConflictGui;
|
import xyz.alexcrea.cuanvil.gui.config.global.EnchantConflictGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantSelectSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantSelectSettingGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.GroupSelectSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.GroupSelectSettingGui;
|
||||||
|
|
@ -46,7 +46,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
@NotNull GuiItem parentItemForThisGui) {
|
@NotNull GuiItem parentItemForThisGui) {
|
||||||
super(parentItemForThisGui,
|
super(parentItemForThisGui,
|
||||||
3,
|
3,
|
||||||
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.getName()) + " \u00A78Config");
|
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.toString()) + " \u00A78Config");
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.enchantConflict = enchantConflict;
|
this.enchantConflict = enchantConflict;
|
||||||
|
|
||||||
|
|
@ -85,7 +85,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
this.enchantSettingItem = new GuiItem(new ItemStack(Material.ENCHANTED_BOOK), (event) -> {
|
this.enchantSettingItem = new GuiItem(new ItemStack(Material.ENCHANTED_BOOK), (event) -> {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
EnchantSelectSettingGui enchantGui = new EnchantSelectSettingGui(
|
EnchantSelectSettingGui enchantGui = new EnchantSelectSettingGui(
|
||||||
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.getName()) + " \u00A75Enchantments",
|
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(enchantConflict.toString()) + " \u00A75Enchantments",
|
||||||
this, this, 0);
|
this, this, 0);
|
||||||
enchantGui.show(event.getWhoClicked());
|
enchantGui.show(event.getWhoClicked());
|
||||||
}, CustomAnvil.instance);
|
}, CustomAnvil.instance);
|
||||||
|
|
@ -93,14 +93,14 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
this.groupSettingItem = new GuiItem(new ItemStack(Material.PAPER), (event) -> {
|
this.groupSettingItem = new GuiItem(new ItemStack(Material.PAPER), (event) -> {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
GroupSelectSettingGui enchantGui = new GroupSelectSettingGui(
|
GroupSelectSettingGui enchantGui = new GroupSelectSettingGui(
|
||||||
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.enchantConflict.getName()) + " \u00A73Groups",
|
"\u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.enchantConflict.toString()) + " \u00A73Groups",
|
||||||
this, this, 0);
|
this, this, 0);
|
||||||
enchantGui.show(event.getWhoClicked());
|
enchantGui.show(event.getWhoClicked());
|
||||||
}, CustomAnvil.instance);
|
}, CustomAnvil.instance);
|
||||||
|
|
||||||
this.minBeforeActiveSettingFactory = IntSettingsGui.intFactory(
|
this.minBeforeActiveSettingFactory = IntSettingsGui.intFactory(
|
||||||
"\u00A78Minimum enchantment count",
|
"\u00A78Minimum enchantment count",
|
||||||
this, this.enchantConflict.getName() + ".maxEnchantmentBeforeConflict", ConfigHolder.CONFLICT_HOLDER,
|
this, this.enchantConflict + ".maxEnchantmentBeforeConflict", ConfigHolder.CONFLICT_HOLDER,
|
||||||
0, 255, 0, 1
|
0, 255, 0, 1
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -126,10 +126,10 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
this.parent.removeGeneric(this.enchantConflict);
|
this.parent.removeGeneric(this.enchantConflict);
|
||||||
|
|
||||||
// Remove self
|
// Remove self
|
||||||
cleanUnused();
|
cleanAndBeUnusable();
|
||||||
|
|
||||||
// Update config file storage
|
// Update config file storage
|
||||||
ConfigHolder.CONFLICT_HOLDER.getConfig().set(this.enchantConflict.getName(), null);
|
ConfigHolder.CONFLICT_HOLDER.getConfig().set(this.enchantConflict.toString(), null);
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
boolean success = true;
|
boolean success = true;
|
||||||
|
|
@ -140,7 +140,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
return success;
|
return success;
|
||||||
};
|
};
|
||||||
|
|
||||||
return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.enchantConflict.getName()) + "\u00A7c?",
|
return new ConfirmActionGui("\u00A7cDelete \u00A7e" + CasedStringUtil.snakeToUpperSpacedCase(this.enchantConflict.toString()) + "\u00A7c?",
|
||||||
"\u00A77Confirm that you want to delete this conflict.",
|
"\u00A77Confirm that you want to delete this conflict.",
|
||||||
this, this.parent, deleteSupplier
|
this, this.parent, deleteSupplier
|
||||||
);
|
);
|
||||||
|
|
@ -149,7 +149,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
@Override
|
@Override
|
||||||
public void updateGuiValues() {
|
public void updateGuiValues() {
|
||||||
// update value from config to conflict
|
// update value from config to conflict
|
||||||
int minBeforeBlock = ConfigHolder.CONFLICT_HOLDER.getConfig().getInt(this.enchantConflict.getName()+'.'+EnchantConflictManager.ENCH_MAX_PATH, 0);
|
int minBeforeBlock = ConfigHolder.CONFLICT_HOLDER.getConfig().getInt(this.enchantConflict.toString()+'.'+EnchantConflictManager.ENCH_MAX_PATH, 0);
|
||||||
this.enchantConflict.setMinBeforeBlock(minBeforeBlock);
|
this.enchantConflict.setMinBeforeBlock(minBeforeBlock);
|
||||||
|
|
||||||
// Parent should call updateLocal with this call
|
// Parent should call updateLocal with this call
|
||||||
|
|
@ -234,7 +234,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cleanUnused() {
|
public void cleanAndBeUnusable() {
|
||||||
for (HumanEntity viewer : getViewers()) {
|
for (HumanEntity viewer : getViewers()) {
|
||||||
this.parent.show(viewer);
|
this.parent.show(viewer);
|
||||||
}
|
}
|
||||||
|
|
@ -267,7 +267,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
@Override
|
@Override
|
||||||
public boolean setSelectedEnchantments(Set<Enchantment> enchantments) {
|
public boolean setSelectedEnchantments(Set<Enchantment> enchantments) {
|
||||||
if (!this.shouldWork) {
|
if (!this.shouldWork) {
|
||||||
CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict.getName() + " enchants but sub config is destroyed");
|
CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict + " enchants but sub config is destroyed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -280,12 +280,12 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
for (Enchantment enchantment : enchantments) {
|
for (Enchantment enchantment : enchantments) {
|
||||||
enchantKeys[index++] = enchantment.getKey().getKey();
|
enchantKeys[index++] = enchantment.getKey().getKey();
|
||||||
}
|
}
|
||||||
ConfigHolder.CONFLICT_HOLDER.getConfig().set(enchantConflict.getName() + ".enchantments", enchantKeys);
|
ConfigHolder.CONFLICT_HOLDER.getConfig().set(enchantConflict + ".enchantments", enchantKeys);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
updateGuiValues();
|
updateGuiValues();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating enchants for " + this.enchantConflict.getName(), e);
|
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating enchants for " + this.enchantConflict, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -312,7 +312,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
@Override
|
@Override
|
||||||
public boolean setSelectedGroups(Set<AbstractMaterialGroup> groups) {
|
public boolean setSelectedGroups(Set<AbstractMaterialGroup> groups) {
|
||||||
if (!this.shouldWork) {
|
if (!this.shouldWork) {
|
||||||
CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict.getName() + " groups but sub config is destroyed");
|
CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict.toString() + " groups but sub config is destroyed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -325,12 +325,12 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl
|
||||||
for (AbstractMaterialGroup group : groups) {
|
for (AbstractMaterialGroup group : groups) {
|
||||||
groupsNames[index++] = group.getName();
|
groupsNames[index++] = group.getName();
|
||||||
}
|
}
|
||||||
ConfigHolder.CONFLICT_HOLDER.getConfig().set(this.enchantConflict.getName() + ".notAffectedGroups", groupsNames);
|
ConfigHolder.CONFLICT_HOLDER.getConfig().set(this.enchantConflict + ".notAffectedGroups", groupsNames);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
updateGuiValues();
|
updateGuiValues();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating group for " + this.enchantConflict.getName(), e);
|
CustomAnvil.instance.getLogger().log(Level.WARNING, "An error occurred while updating group for " + this.enchantConflict, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save file configuration to disk
|
// Save file configuration to disk
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
package xyz.alexcrea.cuanvil.gui.config.settings.subsetting;
|
package xyz.alexcrea.cuanvil.gui.config.list.elements;
|
||||||
|
|
||||||
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
import io.delilaheve.CustomAnvil;
|
import io.delilaheve.CustomAnvil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.list.ElementMappedToListGui;
|
||||||
|
|
||||||
public abstract class MappedToListSubSettingGui extends ValueUpdatableGui {
|
public abstract class MappedToListSubSettingGui extends ValueUpdatableGui implements ElementMappedToListGui {
|
||||||
|
|
||||||
private final GuiItem item;
|
private final GuiItem item;
|
||||||
public MappedToListSubSettingGui(
|
public MappedToListSubSettingGui(
|
||||||
|
|
@ -16,13 +18,15 @@ public abstract class MappedToListSubSettingGui extends ValueUpdatableGui {
|
||||||
this.item = item;
|
this.item = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public GuiItem getParentItemForThisGui() {
|
public GuiItem getParentItemForThisGui() {
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Gui getMappedGui() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void updateLocal(); // TODO
|
|
||||||
|
|
||||||
public abstract void cleanUnused(); // TODO
|
|
||||||
}
|
}
|
||||||
|
|
@ -55,7 +55,7 @@ public abstract class AbstractSettingGui extends ChestGui {
|
||||||
*
|
*
|
||||||
* @param parent Parent gui to go back when completed.
|
* @param parent Parent gui to go back when completed.
|
||||||
*/
|
*/
|
||||||
private void initBase(ValueUpdatableGui parent) {
|
protected void initBase(ValueUpdatableGui parent) {
|
||||||
Pattern pattern = getGuiPattern();
|
Pattern pattern = getGuiPattern();
|
||||||
pane = new PatternPane(0, 0, pattern.getLength(), pattern.getHeight(), pattern);
|
pane = new PatternPane(0, 0, pattern.getLength(), pattern.getHeight(), pattern);
|
||||||
addPane(pane);
|
addPane(pane);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,464 @@
|
||||||
|
package xyz.alexcrea.cuanvil.gui.config.settings;
|
||||||
|
|
||||||
|
import com.github.stefvanschie.inventoryframework.gui.GuiItem;
|
||||||
|
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
|
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
|
import io.delilaheve.CustomAnvil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import xyz.alexcrea.cuanvil.config.ConfigHolder;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant;
|
||||||
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
import xyz.alexcrea.cuanvil.util.MetricsUtil;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class DoubleSettingGui extends AbstractSettingGui {
|
||||||
|
|
||||||
|
protected final DoubleSettingFactory holder;
|
||||||
|
protected final boolean asPercentage;
|
||||||
|
protected final boolean nullOnZero;
|
||||||
|
@NotNull
|
||||||
|
protected final BigDecimal before;
|
||||||
|
@NotNull
|
||||||
|
protected BigDecimal now;
|
||||||
|
protected BigDecimal step;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a double setting config gui.
|
||||||
|
*
|
||||||
|
* @param holder Configuration factory of this setting.
|
||||||
|
* @param now The defined value of this setting.
|
||||||
|
* @param asPercentage If the value represent a %
|
||||||
|
* @param nullOnZero If the value should be set as null on zero
|
||||||
|
*/
|
||||||
|
protected DoubleSettingGui(DoubleSettingFactory holder, @NotNull BigDecimal now,
|
||||||
|
boolean asPercentage, boolean nullOnZero) {
|
||||||
|
super(3, holder.getTitle(), holder.parent);
|
||||||
|
assert holder.steps.length > 0 && holder.steps.length <= 9;
|
||||||
|
this.holder = holder;
|
||||||
|
this.asPercentage = asPercentage;
|
||||||
|
this.nullOnZero = nullOnZero;
|
||||||
|
|
||||||
|
this.before = now;
|
||||||
|
this.now = now;
|
||||||
|
this.step = holder.steps[0];
|
||||||
|
|
||||||
|
initStepsValue();
|
||||||
|
prepareReturnToDefault();
|
||||||
|
updateValueDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final ItemStack DELETE_ITEM_STACK = new ItemStack(Material.RED_TERRACOTTA);
|
||||||
|
static {
|
||||||
|
ItemMeta meta = DELETE_ITEM_STACK.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName("\u00A7cDisable item being repaired ?");
|
||||||
|
meta.setLore(Arrays.asList("\u00A77Confirm disabling unit repair for this item..",
|
||||||
|
"\u00A74Cation: This action can't be canceled."));
|
||||||
|
|
||||||
|
DELETE_ITEM_STACK.setItemMeta(meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GuiItem askDelete;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initBase(ValueUpdatableGui parent) {
|
||||||
|
super.initBase(parent);
|
||||||
|
|
||||||
|
this.askDelete = new GuiItem(DELETE_ITEM_STACK,
|
||||||
|
GuiGlobalActions.saveSettingAction(this, parent),
|
||||||
|
CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
boolean shouldDelete = isNull() && hadChange();
|
||||||
|
|
||||||
|
GuiItem tempSaveItem = this.saveItem;
|
||||||
|
if(shouldDelete){
|
||||||
|
this.saveItem = this.askDelete;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.update();
|
||||||
|
|
||||||
|
if(shouldDelete){
|
||||||
|
this.saveItem = tempSaveItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pattern getGuiPattern() {
|
||||||
|
return new Pattern(
|
||||||
|
"abcdefghi",
|
||||||
|
"D0-0v0+00",
|
||||||
|
"B0000000S"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected GuiItem returnToDefault;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare "return to default value" gui item.
|
||||||
|
*/
|
||||||
|
protected void prepareReturnToDefault() {
|
||||||
|
ItemStack item = new ItemStack(Material.COMMAND_BLOCK);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName("\u00A7eReset to default value");
|
||||||
|
meta.setLore(Collections.singletonList("\u00A77Default value is " + displayValue(holder.defaultVal)));
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
returnToDefault = new GuiItem(item, event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
now = holder.defaultVal;
|
||||||
|
updateValueDisplay();
|
||||||
|
update();
|
||||||
|
}, CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update item using the setting value to match the new value.
|
||||||
|
*/
|
||||||
|
protected void updateValueDisplay() {
|
||||||
|
|
||||||
|
PatternPane pane = getPane();
|
||||||
|
|
||||||
|
//minus item
|
||||||
|
GuiItem minusItem;
|
||||||
|
if (now.compareTo(holder.min) > 0) {
|
||||||
|
BigDecimal planned = holder.min.max(now.subtract(step));
|
||||||
|
|
||||||
|
minusItem = getSetValueItem(Material.RED_TERRACOTTA, planned, "\u00A7c-");
|
||||||
|
} else {
|
||||||
|
minusItem = GuiGlobalItems.backgroundItem(Material.BARRIER);
|
||||||
|
}
|
||||||
|
pane.bindItem('-', minusItem);
|
||||||
|
|
||||||
|
//plus item
|
||||||
|
GuiItem plusItem;
|
||||||
|
if (now.compareTo(holder.max) < 0) {
|
||||||
|
BigDecimal planned = holder.max.min(now.add(step));
|
||||||
|
|
||||||
|
plusItem = getSetValueItem(Material.GREEN_TERRACOTTA, planned, "\u00A7a+");
|
||||||
|
} else {
|
||||||
|
plusItem = GuiGlobalItems.backgroundItem(Material.BARRIER);
|
||||||
|
}
|
||||||
|
pane.bindItem('+', plusItem);
|
||||||
|
|
||||||
|
// "result" display
|
||||||
|
ItemStack resultPaper = new ItemStack(Material.PAPER);
|
||||||
|
ItemMeta resultMeta = resultPaper.getItemMeta();
|
||||||
|
resultMeta.setDisplayName("\u00A7eValue: " + displayValue(now));
|
||||||
|
resultPaper.setItemMeta(resultMeta);
|
||||||
|
GuiItem resultItem = new GuiItem(resultPaper, GuiGlobalActions.stayInPlace, CustomAnvil.instance);
|
||||||
|
|
||||||
|
pane.bindItem('v', resultItem);
|
||||||
|
|
||||||
|
// reset to default
|
||||||
|
GuiItem returnToDefault;
|
||||||
|
if (now.compareTo(holder.defaultVal) != 0) {
|
||||||
|
returnToDefault = this.returnToDefault;
|
||||||
|
} else {
|
||||||
|
returnToDefault = GuiGlobalItems.backgroundItem();
|
||||||
|
}
|
||||||
|
pane.bindItem('D', returnToDefault);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private GuiItem getSetValueItem(Material mat, BigDecimal planned, String numberPrefix){
|
||||||
|
ItemStack item = new ItemStack(mat);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
meta.setDisplayName("\u00A7e" + displayValue(now) + " -> " + displayValue(planned)
|
||||||
|
+ " \u00A7r(" + numberPrefix + (displayValue(planned.subtract(now).abs()) + "\u00A7r)"));
|
||||||
|
meta.setLore(AbstractSettingGui.CLICK_LORE);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
|
||||||
|
return new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param planned Value to change current setting to.
|
||||||
|
* @return A consumer to update the current setting's value.
|
||||||
|
*/
|
||||||
|
protected Consumer<InventoryClickEvent> updateNowConsumer(BigDecimal planned) {
|
||||||
|
return event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
now = planned;
|
||||||
|
updateValueDisplay();
|
||||||
|
update();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise step items.
|
||||||
|
*/
|
||||||
|
protected void initStepsValue() {
|
||||||
|
// Put background glass on the background of 'a' to 'b'
|
||||||
|
GuiItem background = GuiGlobalItems.backgroundItem();
|
||||||
|
PatternPane pane = getPane();
|
||||||
|
|
||||||
|
for (char i = 'a'; i < (getMidStepChar() - 'a') * 2 + 1; i++) {
|
||||||
|
pane.bindItem(i, background);
|
||||||
|
}
|
||||||
|
// Then update legit step values
|
||||||
|
updateStepValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update steps items value.
|
||||||
|
*/
|
||||||
|
protected void updateStepValue() {
|
||||||
|
if (holder.steps.length <= 1) return;
|
||||||
|
// We assume steps have a length of 2k+1 cause its more pretty
|
||||||
|
char val = getMidStepChar();
|
||||||
|
// Offset to start (not the best way to do it)
|
||||||
|
val -= (char) ((holder.steps.length - 1) / 2);
|
||||||
|
|
||||||
|
// Then place items
|
||||||
|
PatternPane pane = getPane();
|
||||||
|
for (int i = 0; i < holder.steps.length; i++) {
|
||||||
|
pane.bindItem(val + i, stepGuiItem(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Step use lower case character from 'a' to a certain char.
|
||||||
|
*
|
||||||
|
* @return The middle value of the character set for steps.
|
||||||
|
*/
|
||||||
|
protected char getMidStepChar() {
|
||||||
|
return 'e';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a step item from a step value.
|
||||||
|
*
|
||||||
|
* @param stepIndex the index of the step item.
|
||||||
|
* @return A step item corresponding to its index value.
|
||||||
|
*/
|
||||||
|
protected GuiItem stepGuiItem(int stepIndex) {
|
||||||
|
BigDecimal stepValue = holder.steps[stepIndex];
|
||||||
|
|
||||||
|
// Get material properties
|
||||||
|
Material stepMat;
|
||||||
|
StringBuilder stepName = new StringBuilder("\u00A7");
|
||||||
|
List<String> stepLore;
|
||||||
|
Consumer<InventoryClickEvent> clickEvent;
|
||||||
|
if (stepValue.compareTo(step) == 0) {
|
||||||
|
stepMat = Material.GREEN_STAINED_GLASS_PANE;
|
||||||
|
stepName.append('a');
|
||||||
|
stepLore = Collections.singletonList("\u00A77Value is changing by " + displayValue(stepValue));
|
||||||
|
clickEvent = GuiGlobalActions.stayInPlace;
|
||||||
|
} else {
|
||||||
|
stepMat = Material.RED_STAINED_GLASS_PANE;
|
||||||
|
stepName.append('c');
|
||||||
|
stepLore = Collections.singletonList("\u00A77Click here to change the value by " + displayValue(stepValue));
|
||||||
|
clickEvent = updateStepValue(stepValue);
|
||||||
|
}
|
||||||
|
stepName.append("Step of ").append(displayValue(stepValue));
|
||||||
|
|
||||||
|
// Create item stack then gui item
|
||||||
|
ItemStack item = new ItemStack(stepMat);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName(stepName.toString());
|
||||||
|
meta.setLore(stepLore);
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
|
||||||
|
return new GuiItem(item, clickEvent, CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param stepValue Value to change current step to.
|
||||||
|
* @return A consumer to update the current step of this setting.
|
||||||
|
*/
|
||||||
|
protected Consumer<InventoryClickEvent> updateStepValue(BigDecimal stepValue) {
|
||||||
|
return event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
this.step = stepValue;
|
||||||
|
updateStepValue();
|
||||||
|
updateValueDisplay();
|
||||||
|
update();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onSave() {
|
||||||
|
if(isNull()){
|
||||||
|
this.holder.config.getConfig().set(this.holder.configPath, null);
|
||||||
|
}else{
|
||||||
|
this.holder.config.getConfig().set(this.holder.configPath, now.doubleValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
MetricsUtil.INSTANCE.notifyChange(this.holder.config, this.holder.configPath);
|
||||||
|
if (GuiSharedConstant.TEMPORARY_DO_SAVE_TO_DISK_EVERY_CHANGE) {
|
||||||
|
return holder.config.saveToDisk(GuiSharedConstant.TEMPORARY_DO_BACKUP_EVERY_SAVE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hadChange() {
|
||||||
|
return now.compareTo(before) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNull(){
|
||||||
|
return this.nullOnZero && (this.now.compareTo(BigDecimal.ZERO) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final BigDecimal PERCENTAGE_OFFSET = BigDecimal.valueOf(100);
|
||||||
|
public String displayValue(BigDecimal value){
|
||||||
|
return displayValue(value, this.asPercentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String displayValue(BigDecimal value, boolean isAsPercentage){
|
||||||
|
if(isAsPercentage){
|
||||||
|
return value.multiply(PERCENTAGE_OFFSET).setScale(value.scale()-2, RoundingMode.HALF_UP) + "%";
|
||||||
|
}
|
||||||
|
return value.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a double setting factory from setting's parameters.
|
||||||
|
*
|
||||||
|
* @param title The title of the gui.
|
||||||
|
* @param parent Parent gui to go back when completed.
|
||||||
|
* @param configPath Configuration path of this setting.
|
||||||
|
* @param config Configuration holder of this setting.
|
||||||
|
* @param scale The scale of the decimal.
|
||||||
|
* @param asPercentage If we should display the value as a %.
|
||||||
|
* @param nullOnZero Set the value as null (deleting it) when equal to 0
|
||||||
|
* @param min Minimum value of this setting.
|
||||||
|
* @param max Maximum value of this setting.
|
||||||
|
* @param defaultVal Default value if not found on the config.
|
||||||
|
* @param steps List of step the value can increment/decrement.
|
||||||
|
* List's size should be between 1 (included) and 5 (included).
|
||||||
|
* it is visually preferable to have an odd number of step.
|
||||||
|
* If step only contain 1 value, no step item should be displayed.
|
||||||
|
* @return A factory for a double setting gui.
|
||||||
|
*/
|
||||||
|
public static DoubleSettingFactory doubleFactory(@NotNull String title, ValueUpdatableGui parent,
|
||||||
|
String configPath, ConfigHolder config,
|
||||||
|
int scale, boolean asPercentage, boolean nullOnZero,
|
||||||
|
double min, double max, double defaultVal, double... steps) {
|
||||||
|
return new DoubleSettingFactory(
|
||||||
|
title, parent,
|
||||||
|
configPath, config,
|
||||||
|
scale, asPercentage, nullOnZero,
|
||||||
|
min, max, defaultVal, steps);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A factory for a double setting gui that hold setting's information.
|
||||||
|
*/
|
||||||
|
public static class DoubleSettingFactory extends SettingGuiFactory {
|
||||||
|
@NotNull
|
||||||
|
String title;
|
||||||
|
ValueUpdatableGui parent;
|
||||||
|
|
||||||
|
int scale;
|
||||||
|
boolean asPercentage;
|
||||||
|
boolean nullOnZero;
|
||||||
|
BigDecimal min;
|
||||||
|
BigDecimal max;
|
||||||
|
BigDecimal defaultVal;
|
||||||
|
BigDecimal[] steps;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for a double setting gui factory.
|
||||||
|
*
|
||||||
|
* @param title The title of the gui.
|
||||||
|
* @param parent Parent gui to go back when completed.
|
||||||
|
* @param configPath Configuration path of this setting.
|
||||||
|
* @param config Configuration holder of this setting.
|
||||||
|
* @param scale The scale of the decimal.
|
||||||
|
* @param asPercentage If we should display the value as a %.
|
||||||
|
* @param nullOnZero Set the value as null (deleting it) when equal to 0
|
||||||
|
* @param min Minimum value of this setting.
|
||||||
|
* @param max Maximum value of this setting.
|
||||||
|
* @param defaultVal Default value if not found on the config.
|
||||||
|
* @param steps List of step the value can increment/decrement.
|
||||||
|
* List's size should be between 1 (included) and 5 (included).
|
||||||
|
* it is visually preferable to have an odd number of step.
|
||||||
|
* If step only contain 1 value, no step item should be displayed.
|
||||||
|
*/
|
||||||
|
protected DoubleSettingFactory(
|
||||||
|
@NotNull String title, ValueUpdatableGui parent,
|
||||||
|
String configPath, ConfigHolder config,
|
||||||
|
int scale, boolean asPercentage, boolean nullOnZero,
|
||||||
|
double min, double max, double defaultVal, double... steps) {
|
||||||
|
super(configPath, config);
|
||||||
|
this.title = title;
|
||||||
|
this.parent = parent;
|
||||||
|
this.scale = scale;
|
||||||
|
this.asPercentage = asPercentage;
|
||||||
|
this.nullOnZero = nullOnZero;
|
||||||
|
this.min = BigDecimal.valueOf(min).setScale(scale, RoundingMode.HALF_UP);
|
||||||
|
this.max = BigDecimal.valueOf(max).setScale(scale, RoundingMode.HALF_UP);
|
||||||
|
this.defaultVal = BigDecimal.valueOf(defaultVal).setScale(scale, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
this.steps = new BigDecimal[steps.length];
|
||||||
|
for (int i = 0; i < steps.length; i++) {
|
||||||
|
this.steps[i] = BigDecimal.valueOf(steps[i]).setScale(scale, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Get setting's gui title
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The configured value for the associated setting.
|
||||||
|
*/
|
||||||
|
public BigDecimal getConfiguredValue() {
|
||||||
|
ConfigurationSection section = this.config.getConfig();
|
||||||
|
if(section.isDouble(this.configPath)){
|
||||||
|
return BigDecimal.valueOf(section.getDouble(this.configPath)).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
return this.defaultVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AbstractSettingGui create() {
|
||||||
|
// Get value or default
|
||||||
|
BigDecimal now = getConfiguredValue();
|
||||||
|
// create new gui
|
||||||
|
return new DoubleSettingGui(this, now, this.asPercentage, this.nullOnZero);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public GuiItem getItem(Material itemMat, String name){
|
||||||
|
// Get item properties
|
||||||
|
BigDecimal value = getConfiguredValue();
|
||||||
|
StringBuilder itemName = new StringBuilder("\u00A7a").append(name);
|
||||||
|
|
||||||
|
return GuiGlobalItems.createGuiItemFromProperties(this, itemMat, itemName, displayValue(value, this.asPercentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
public GuiItem getItem(Material itemMat){
|
||||||
|
// Get item properties
|
||||||
|
String configPath = GuiGlobalItems.getConfigNameFromPath(getConfigPath());
|
||||||
|
|
||||||
|
return getItem(itemMat, CasedStringUtil.detectToUpperSpacedCase(configPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -58,29 +58,8 @@ public class ItemSettingGui extends AbstractSettingGui {
|
||||||
public void prepareStaticItems(){
|
public void prepareStaticItems(){
|
||||||
prepareReturnToDefault();
|
prepareReturnToDefault();
|
||||||
|
|
||||||
ItemStack item = new ItemStack(Material.YELLOW_TERRACOTTA);
|
GuiItem temporaryLeave = GuiGlobalItems.temporaryCloseGuiToSelectItem(Material.YELLOW_TERRACOTTA, this);
|
||||||
ItemMeta meta = item.getItemMeta();
|
getPane().bindItem('s', temporaryLeave);
|
||||||
|
|
||||||
meta.setDisplayName("\u00A7eTemporary close this menu");
|
|
||||||
meta.setLore(Collections.singletonList("\u00A77Allow you to chose other item then return here."));
|
|
||||||
item.setItemMeta(meta);
|
|
||||||
GuiItem guiItem = new GuiItem(item, event -> {
|
|
||||||
event.setCancelled(true);
|
|
||||||
|
|
||||||
HumanEntity player = event.getWhoClicked();
|
|
||||||
|
|
||||||
CustomAnvil.Companion.getChatListener().setListenedCallback(player, (message) ->{
|
|
||||||
|
|
||||||
if(message == null) return;
|
|
||||||
show(player);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
player.sendMessage("\u00A7eWrite something in chat to return to the item config menu.");
|
|
||||||
player.closeInventory();
|
|
||||||
}, CustomAnvil.instance);
|
|
||||||
|
|
||||||
getPane().bindItem('s', guiItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
import io.delilaheve.CustomAnvil;
|
import io.delilaheve.CustomAnvil;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.HumanEntity;
|
||||||
|
import org.bukkit.inventory.ItemFlag;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
@ -15,7 +17,6 @@ import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.settings.ItemSettingGui;
|
import xyz.alexcrea.cuanvil.gui.config.settings.ItemSettingGui;
|
||||||
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
import xyz.alexcrea.cuanvil.util.CasedStringUtil;
|
||||||
|
|
||||||
import java.nio.charset.MalformedInputException;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -318,7 +319,7 @@ public class GuiGlobalItems {
|
||||||
* Will not update automatically, if the setting's value change, the item need to be created again.
|
* Will not update automatically, if the setting's value change, the item need to be created again.
|
||||||
* @return A formatted GuiItem that will create and open a GUI for the setting.
|
* @return A formatted GuiItem that will create and open a GUI for the setting.
|
||||||
*/
|
*/
|
||||||
private static GuiItem createGuiItemFromProperties(
|
public static GuiItem createGuiItemFromProperties(
|
||||||
@NotNull AbstractSettingGui.SettingGuiFactory factory,
|
@NotNull AbstractSettingGui.SettingGuiFactory factory,
|
||||||
@NotNull Material itemMat,
|
@NotNull Material itemMat,
|
||||||
@NotNull StringBuilder itemName,
|
@NotNull StringBuilder itemName,
|
||||||
|
|
@ -330,6 +331,7 @@ public class GuiGlobalItems {
|
||||||
|
|
||||||
itemMeta.setDisplayName(itemName.toString());
|
itemMeta.setDisplayName(itemName.toString());
|
||||||
itemMeta.setLore(Collections.singletonList(SETTING_ITEM_LORE_PREFIX + value));
|
itemMeta.setLore(Collections.singletonList(SETTING_ITEM_LORE_PREFIX + value));
|
||||||
|
itemMeta.addItemFlags(ItemFlag.values());
|
||||||
|
|
||||||
item.setItemMeta(itemMeta);
|
item.setItemMeta(itemMeta);
|
||||||
// Create GuiItem
|
// Create GuiItem
|
||||||
|
|
@ -350,4 +352,29 @@ public class GuiGlobalItems {
|
||||||
return path.substring(indexOfDot + 1);
|
return path.substring(indexOfDot + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static GuiItem temporaryCloseGuiToSelectItem(Material itemMaterial, Gui openBack){
|
||||||
|
ItemStack item = new ItemStack(itemMaterial);
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
|
||||||
|
meta.setDisplayName("\u00A7eTemporary close this menu");
|
||||||
|
meta.setLore(Collections.singletonList("\u00A77Allow you to chose other item then return here."));
|
||||||
|
item.setItemMeta(meta);
|
||||||
|
|
||||||
|
return new GuiItem(item, event -> {
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
HumanEntity player = event.getWhoClicked();
|
||||||
|
|
||||||
|
CustomAnvil.Companion.getChatListener().setListenedCallback(player, (message) ->{
|
||||||
|
|
||||||
|
if(message == null) return;
|
||||||
|
openBack.show(player);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
player.sendMessage("\u00A7eWrite something in chat to return to the item config menu.");
|
||||||
|
player.closeInventory();
|
||||||
|
}, CustomAnvil.instance);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,12 @@ import com.github.stefvanschie.inventoryframework.pane.PatternPane;
|
||||||
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.MainConfigGui;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -50,4 +53,23 @@ public class GuiSharedConstant {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final ItemStack CANCEL_ITEM;
|
||||||
|
public static final ItemStack CONFIRM_ITEM;
|
||||||
|
|
||||||
|
static {
|
||||||
|
CANCEL_ITEM = new ItemStack(Material.RED_TERRACOTTA);
|
||||||
|
ItemMeta meta = CANCEL_ITEM.getItemMeta();
|
||||||
|
meta.setDisplayName("\u00A7cCancel");
|
||||||
|
meta.setLore(Collections.singletonList("\u00A77Cancel current action and return to previous menu."));
|
||||||
|
CANCEL_ITEM.setItemMeta(meta);
|
||||||
|
|
||||||
|
CONFIRM_ITEM = new ItemStack(Material.GREEN_TERRACOTTA);
|
||||||
|
meta = CONFIRM_ITEM.getItemMeta();
|
||||||
|
meta.setDisplayName("\u00A7aConfirm");
|
||||||
|
meta.setLore(Arrays.asList("\u00A77Confirm current action.",
|
||||||
|
"\u00A74Cation: This action can't be canceled."));
|
||||||
|
CONFIRM_ITEM.setItemMeta(meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import org.bukkit.command.Command
|
||||||
import org.bukkit.command.CommandExecutor
|
import org.bukkit.command.CommandExecutor
|
||||||
import org.bukkit.command.CommandSender
|
import org.bukkit.command.CommandSender
|
||||||
import org.bukkit.entity.HumanEntity
|
import org.bukkit.entity.HumanEntity
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.MainConfigGui
|
import xyz.alexcrea.cuanvil.gui.config.MainConfigGui
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions
|
import xyz.alexcrea.cuanvil.gui.util.GuiGlobalActions
|
||||||
|
|
||||||
class EditConfigExecutor : CommandExecutor {
|
class EditConfigExecutor : CommandExecutor {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import xyz.alexcrea.cuanvil.gui.config.global.BasicConfigGui
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.EnchantConflictGui
|
import xyz.alexcrea.cuanvil.gui.config.global.EnchantConflictGui
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.EnchantCostConfigGui
|
import xyz.alexcrea.cuanvil.gui.config.global.EnchantCostConfigGui
|
||||||
import xyz.alexcrea.cuanvil.gui.config.global.EnchantLimitConfigGui
|
import xyz.alexcrea.cuanvil.gui.config.global.EnchantLimitConfigGui
|
||||||
|
import xyz.alexcrea.cuanvil.gui.config.global.UnitRepairConfigGui
|
||||||
import xyz.alexcrea.cuanvil.util.MetricsUtil
|
import xyz.alexcrea.cuanvil.util.MetricsUtil
|
||||||
|
|
||||||
class ReloadExecutor : CommandExecutor {
|
class ReloadExecutor : CommandExecutor {
|
||||||
|
|
@ -43,6 +44,7 @@ class ReloadExecutor : CommandExecutor {
|
||||||
EnchantCostConfigGui.INSTANCE.updateGuiValues()
|
EnchantCostConfigGui.INSTANCE.updateGuiValues()
|
||||||
EnchantLimitConfigGui.INSTANCE.updateGuiValues()
|
EnchantLimitConfigGui.INSTANCE.updateGuiValues()
|
||||||
EnchantConflictGui.INSTANCE.reloadValues()
|
EnchantConflictGui.INSTANCE.reloadValues()
|
||||||
|
UnitRepairConfigGui.INSTANCE.reloadValues()
|
||||||
|
|
||||||
// & update metric
|
// & update metric
|
||||||
MetricsUtil.testIfConfigIsDefault()
|
MetricsUtil.testIfConfigIsDefault()
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,12 @@ package xyz.alexcrea.cuanvil.group
|
||||||
import io.delilaheve.CustomAnvil
|
import io.delilaheve.CustomAnvil
|
||||||
import org.bukkit.Material
|
import org.bukkit.Material
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import xyz.alexcrea.cuanvil.interfaces.Named
|
|
||||||
|
|
||||||
class EnchantConflictGroup(
|
class EnchantConflictGroup(
|
||||||
private val name: String,
|
private val name: String,
|
||||||
private val cantConflict: AbstractMaterialGroup,
|
private val cantConflict: AbstractMaterialGroup,
|
||||||
var minBeforeBlock: Int
|
var minBeforeBlock: Int
|
||||||
): Named {
|
) {
|
||||||
|
|
||||||
private val enchantments = HashSet<Enchantment>()
|
private val enchantments = HashSet<Enchantment>()
|
||||||
|
|
||||||
|
|
@ -63,7 +62,7 @@ class EnchantConflictGroup(
|
||||||
return Material.ENCHANTED_BOOK
|
return Material.ENCHANTED_BOOK
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun toString(): String {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -139,9 +139,9 @@ class EnchantConflictManager {
|
||||||
|
|
||||||
var result = ConflictType.NO_CONFLICT
|
var result = ConflictType.NO_CONFLICT
|
||||||
for (conflict in conflictList) {
|
for (conflict in conflictList) {
|
||||||
CustomAnvil.verboseLog("Is against ${conflict.getName()}")
|
CustomAnvil.verboseLog("Is against $conflict")
|
||||||
val conflicting = conflict.allowed(base, mat)
|
val conflicting = conflict.allowed(base, mat)
|
||||||
CustomAnvil.verboseLog("Was against ${conflict.getName()} and conflicting: $conflicting ")
|
CustomAnvil.verboseLog("Was against $conflict and conflicting: $conflicting ")
|
||||||
if (!conflicting) {
|
if (!conflicting) {
|
||||||
if (conflict.getEnchants().size <= 1) {
|
if (conflict.getEnchants().size <= 1) {
|
||||||
result = ConflictType.SMALL_CONFLICT
|
result = ConflictType.SMALL_CONFLICT
|
||||||
|
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
package xyz.alexcrea.cuanvil.interfaces
|
|
||||||
|
|
||||||
interface Named {
|
|
||||||
|
|
||||||
fun getName(): String
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -5,7 +5,6 @@ import org.bukkit.configuration.ConfigurationSection
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
import xyz.alexcrea.cuanvil.config.ConfigHolder
|
||||||
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant
|
import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant
|
||||||
import xyz.alexcrea.cuanvil.interfaces.Named
|
|
||||||
|
|
||||||
class AnvilCustomRecipe(
|
class AnvilCustomRecipe(
|
||||||
private val name: String,
|
private val name: String,
|
||||||
|
|
@ -18,7 +17,7 @@ class AnvilCustomRecipe(
|
||||||
var leftItem: ItemStack?,
|
var leftItem: ItemStack?,
|
||||||
var rightItem: ItemStack?,
|
var rightItem: ItemStack?,
|
||||||
var resultItem: ItemStack?,
|
var resultItem: ItemStack?,
|
||||||
): Named {
|
) {
|
||||||
|
|
||||||
// Static config name
|
// Static config name
|
||||||
companion object {
|
companion object {
|
||||||
|
|
@ -162,7 +161,7 @@ class AnvilCustomRecipe(
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getName(): String {
|
override fun toString(): String {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,10 @@ object MetricsUtil {
|
||||||
isDefaultItemGroupsConfig = false
|
isDefaultItemGroupsConfig = false
|
||||||
} else if (ConfigHolder.UNIT_REPAIR_HOLDER.equals(holder)) {
|
} else if (ConfigHolder.UNIT_REPAIR_HOLDER.equals(holder)) {
|
||||||
isDefaultUnitRepairItemConfig = false
|
isDefaultUnitRepairItemConfig = false
|
||||||
|
} else if (ConfigHolder.CUSTOM_RECIPE_HOLDER.equals(holder)) {
|
||||||
|
isDefaultCustomAnvilCraftConfig = false
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addCustomMetric(metric: Metrics) {
|
fun addCustomMetric(metric: Metrics) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue