diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java
new file mode 100644
index 0000000..66dd936
--- /dev/null
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/AbstractAskGui.java
@@ -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:
+ *
+ * - B: "cancel" button.
+ * - 0: default background item.
+ *
+ *
+ * @return The gui's pattern.
+ */
+ protected abstract Pattern getGuiPattern();
+
+}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ConfirmActionGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
similarity index 58%
rename from src/main/java/xyz/alexcrea/cuanvil/gui/config/ConfirmActionGui.java
rename to src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
index 96f08c9..5b962ed 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ConfirmActionGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/ConfirmActionGui.java
@@ -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.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.bukkit.Material;
@@ -12,50 +10,20 @@ 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.Collections;
import java.util.function.Supplier;
import java.util.logging.Level;
-public class ConfirmActionGui extends ChestGui {
-
- 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 class ConfirmActionGui extends AbstractAskGui {
public ConfirmActionGui(@NotNull String title, String actionDescription,
Gui backOnCancel, Gui backOnConfirm, Supplier onConfirm) {
- super(3, title, CustomAnvil.instance);
+ super(3, title, backOnCancel);
- Pattern pattern = new Pattern(
- GuiSharedConstant.EMPTY_GUI_FULL_LINE,
- "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 -> {
+ // Save item
+ this.pane.bindItem('S', new GuiItem(GuiSharedConstant.CONFIRM_ITEM, event -> {
event.setCancelled(true);
HumanEntity player = event.getWhoClicked();
@@ -80,6 +48,7 @@ public class ConfirmActionGui extends ChestGui {
}, CustomAnvil.instance));
+ // Info item
ItemStack infoItem = new ItemStack(Material.PAPER);
ItemMeta infoMeta = infoItem.getItemMeta();
@@ -91,4 +60,13 @@ public class ConfirmActionGui extends ChestGui {
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
+ );
+ }
+
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java
new file mode 100644
index 0000000..0ca2a38
--- /dev/null
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/ask/SelectItemTypeGui.java
@@ -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 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 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"
+ );
+ }
+}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
index 80bd84a..ff1249b 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/CustomRecipeSubSettingGui.java
@@ -11,7 +11,7 @@ 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.config.ConfirmActionGui;
+import xyz.alexcrea.cuanvil.gui.config.ask.ConfirmActionGui;
import xyz.alexcrea.cuanvil.gui.config.global.CustomRecipeConfigGui;
import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui;
import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
index 9f239ab..9a64977 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java
@@ -14,9 +14,9 @@ import xyz.alexcrea.cuanvil.config.ConfigHolder;
import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup;
import xyz.alexcrea.cuanvil.group.EnchantConflictGroup;
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.SelectGroupContainer;
+import xyz.alexcrea.cuanvil.gui.config.ask.ConfirmActionGui;
import xyz.alexcrea.cuanvil.gui.config.global.EnchantConflictGui;
import xyz.alexcrea.cuanvil.gui.config.settings.EnchantSelectSettingGui;
import xyz.alexcrea.cuanvil.gui.config.settings.GroupSelectSettingGui;
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java
index 8f44e5e..d88452a 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/ItemSettingGui.java
@@ -58,29 +58,8 @@ public class ItemSettingGui extends AbstractSettingGui {
public void prepareStaticItems(){
prepareReturnToDefault();
- ItemStack item = new ItemStack(Material.YELLOW_TERRACOTTA);
- 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);
- 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);
+ GuiItem temporaryLeave = GuiGlobalItems.temporaryCloseGuiToSelectItem(Material.YELLOW_TERRACOTTA, this);
+ getPane().bindItem('s', temporaryLeave);
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java
index f8b4656..89ed6b6 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java
@@ -5,6 +5,7 @@ import com.github.stefvanschie.inventoryframework.gui.type.util.Gui;
import com.github.stefvanschie.inventoryframework.pane.PatternPane;
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;
@@ -350,4 +351,29 @@ public class GuiGlobalItems {
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);
+ }
+
}
diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java
index 731b775..0ad90a6 100644
--- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java
+++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java
@@ -6,9 +6,12 @@ import com.github.stefvanschie.inventoryframework.pane.PatternPane;
import com.github.stefvanschie.inventoryframework.pane.util.Pattern;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
+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.Collections;
import java.util.Comparator;
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);
+ }
+
+
}