diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/gui/ReforgeGUI.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/gui/ReforgeGUI.java index 9da8c79..32b0191 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/reforges/gui/ReforgeGUI.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/gui/ReforgeGUI.java @@ -11,6 +11,7 @@ import com.willfp.eco.util.NumberUtils; import com.willfp.reforges.ReforgesPlugin; import com.willfp.reforges.reforges.Reforge; import com.willfp.reforges.reforges.meta.ReforgeTarget; +import com.willfp.reforges.reforges.util.ReforgeHandler; import com.willfp.reforges.reforges.util.ReforgeStatus; import com.willfp.reforges.reforges.util.ReforgeUtils; import com.willfp.reforges.vault.EconomyHandler; @@ -27,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; @UtilityClass public class ReforgeGUI { @@ -44,188 +46,137 @@ public class ReforgeGUI { @SuppressWarnings("checkstyle:MissingSwitchDefault") @ConfigUpdater public static void update(@NotNull final EcoPlugin plugin) { - menu = Menu.builder(6) - .setTitle("Reforge Item") + ReforgeHandler handler = new ReforgeHandler(plugin); + Slot activatorSlot = Slot.builder(new ItemStack(Material.ANVIL)) + .setModifier((player, menu, previous) -> { + ItemMeta meta = previous.getItemMeta(); + if (meta == null) { + return; + } + + ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player)); + + double cost = plugin.getConfigYml().getDouble("reforge.cost"); + if (status == ReforgeStatus.ALLOW) { + ItemStack item = menu.getCaptiveItems(player).get(0); + int reforges = ReforgeUtils.getReforges(item); + cost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges); + } + + switch (status) { + case INVALID_ITEM -> { + previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.invalid-item.material").toUpperCase()))); + meta.setDisplayName(plugin.getConfigYml().getString("gui.invalid-item.name")); + List lore = new ArrayList<>(); + for (String string : plugin.getConfigYml().getStrings("gui.invalid-item.lore")) { + lore.add(string.replace("%cost%", NumberUtils.format(cost))); + } + meta.setLore(lore); + } + case ALLOW -> { + previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow.material").toUpperCase()))); + meta.setDisplayName(plugin.getConfigYml().getString("gui.allow.name")); + List lore = new ArrayList<>(); + for (String string : plugin.getConfigYml().getStrings("gui.allow.lore")) { + lore.add(string.replace("%cost%", NumberUtils.format(cost))); + } + meta.setLore(lore); + } + case ALLOW_STONE -> { + previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow-stone.material").toUpperCase()))); + meta.setDisplayName(plugin.getConfigYml().getString("gui.allow-stone.name")); + List lore = new ArrayList<>(); + for (String string : plugin.getConfigYml().getStrings("gui.allow-stone.lore")) { + lore.add(string.replace("%cost%", NumberUtils.format(cost)) + .replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)).getName())); + } + meta.setLore(lore); + } + default -> { + previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.no-item.material").toUpperCase()))); + meta.setDisplayName(plugin.getConfigYml().getString("gui.no-item.name")); + List lore = new ArrayList<>(); + for (String string : plugin.getConfigYml().getStrings("gui.no-item.lore")) { + lore.add(string.replace("%cost%", NumberUtils.format(cost))); + } + meta.setLore(lore); + } + } + + previous.setItemMeta(meta); + }) + .onLeftClick(handler::handleReforgeClick) + .build(); + + String[] maskPattern = plugin.getConfigYml().getStrings("gui.mask.pattern", false).toArray(new String[0]); + Material[] maskMaterials = plugin.getConfigYml() + .getStrings("gui.mask.materials", false) + .stream() + .map(string -> Material.getMaterial(string.toUpperCase())) + .filter(Objects::nonNull) + .toArray(Material[]::new); + + Material allowMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.allow-material", false).toUpperCase()); + Material denyMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.show-allowed.deny-material", false).toUpperCase()); + assert allowMaterial != null; + assert denyMaterial != null; + + Material closeMaterial = Material.getMaterial(plugin.getConfigYml().getString("gui.close.material", false).toUpperCase()); + assert closeMaterial != null; + + menu = Menu.builder(plugin.getConfigYml().getInt("gui.rows")) + .setTitle(plugin.getLangYml().getString("menu.title")) .setMask( new FillerMask( new MaskMaterials( - Material.BLACK_STAINED_GLASS_PANE, - Material.MAGENTA_STAINED_GLASS_PANE + maskMaterials ), - "011111110", - "012202210", - "012111210", - "010111010", - "011111110", - "011101110" + maskPattern ) - ).modfiy(builder -> { + ) + .modfiy(builder -> { Slot slot = Slot.builder( - new ItemStackBuilder(Material.RED_STAINED_GLASS_PANE) + new ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE) .setDisplayName("&r") .build() ).setModifier((player, menu, previous) -> { - ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player)); if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) { - previous.setType(Material.LIME_STAINED_GLASS_PANE); + previous.setType(allowMaterial); } else { - previous.setType(Material.RED_STAINED_GLASS_PANE); + previous.setType(denyMaterial); } }).build(); - for (int i = 1; i <= 6; i++) { - builder.setSlot(i, 1, slot); - builder.setSlot(i, 9, slot); + List allowedPattern = plugin.getConfigYml().getStrings("gui.show-allowed.pattern"); + + for (int i = 1; i <= allowedPattern.size(); i++) { + String row = allowedPattern.get(i - 1); + for (int j = 1; j <= 9; j++) { + if (row.charAt(j - 1) != '0') { + builder.setSlot(i, j, slot); + } + } } - }).setSlot(4, 3, + }) + .setSlot(plugin.getConfigYml().getInt("menu.item-slot.row"), + plugin.getConfigYml().getInt("menu.item-slot.column"), Slot.builder() .setCaptive() .build() - ).setSlot(4, 7, - Slot.builder() - .setCaptive() - .build() - ).setSlot(2, 5, - Slot.builder(new ItemStack(Material.ANVIL)) - .setModifier((player, menu, previous) -> { - ItemMeta meta = previous.getItemMeta(); - if (meta == null) { - return; - } - - ReforgeStatus status = ReforgeUtils.getStatus(menu.getCaptiveItems(player)); - - double cost = plugin.getConfigYml().getDouble("reforge.cost"); - if (status == ReforgeStatus.ALLOW) { - ItemStack item = menu.getCaptiveItems(player).get(0); - int reforges = ReforgeUtils.getReforges(item); - cost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges); - } - - switch (status) { - case INVALID_ITEM -> { - previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.invalid-item.material").toUpperCase()))); - meta.setDisplayName(plugin.getConfigYml().getString("gui.invalid-item.name")); - List lore = new ArrayList<>(); - for (String string : plugin.getConfigYml().getStrings("gui.invalid-item.lore")) { - lore.add(string.replace("%cost%", NumberUtils.format(cost))); - } - meta.setLore(lore); - } - case ALLOW -> { - previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow.material").toUpperCase()))); - meta.setDisplayName(plugin.getConfigYml().getString("gui.allow.name")); - List lore = new ArrayList<>(); - for (String string : plugin.getConfigYml().getStrings("gui.allow.lore")) { - lore.add(string.replace("%cost%", NumberUtils.format(cost))); - } - meta.setLore(lore); - } - case ALLOW_STONE -> { - previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.allow-stone.material").toUpperCase()))); - meta.setDisplayName(plugin.getConfigYml().getString("gui.allow-stone.name")); - List lore = new ArrayList<>(); - for (String string : plugin.getConfigYml().getStrings("gui.allow-stone.lore")) { - lore.add(string.replace("%cost%", NumberUtils.format(cost)) - .replace("%stone%", ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)).getName())); - } - meta.setLore(lore); - } - default -> { - previous.setType(Objects.requireNonNull(Material.getMaterial(plugin.getConfigYml().getString("gui.no-item.material").toUpperCase()))); - meta.setDisplayName(plugin.getConfigYml().getString("gui.no-item.name")); - List lore = new ArrayList<>(); - for (String string : plugin.getConfigYml().getStrings("gui.no-item.lore")) { - lore.add(string.replace("%cost%", NumberUtils.format(cost))); - } - meta.setLore(lore); - } - } - - previous.setItemMeta(meta); - }) - .onLeftClick((event, slot, menu) -> { - Player player = (Player) event.getWhoClicked(); - ItemStack toReforge = menu.getCaptiveItems(player).isEmpty() ? null : menu.getCaptiveItems(player).get(0); - if (toReforge == null) { - return; - } - - ReforgeTarget target = ReforgeTarget.getForMaterial(toReforge.getType()); - assert target != null; - - Reforge reforge = null; - boolean usedStone = false; - - if (menu.getCaptiveItems(player).size() == 2) { - Reforge stone = ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)); - if (stone != null) { - if (Arrays.stream(stone.getTarget()).anyMatch(reforgeTarget -> reforgeTarget.getMaterials().contains(toReforge.getType()))) { - reforge = stone; - usedStone = true; - } - } - } - - if (reforge == null) { - reforge = ReforgeUtils.getRandomReforge(target); - } - - if (reforge == null) { - return; - } - - double cost = plugin.getConfigYml().getDouble("reforge.cost"); - int reforges = ReforgeUtils.getReforges(toReforge); - cost *= Math.pow(plugin.getConfigYml().getDouble("reforge.cost-exponent"), reforges); - - if (!EconomyHandler.getInstance().has(player, cost)) { - player.sendMessage(plugin.getLangYml().getMessage("insufficient-money")); - - player.playSound( - player.getLocation(), - Sound.valueOf(plugin.getConfigYml().getString("gui.insufficient-money-sound.id").toUpperCase()), - 1f, - (float) plugin.getConfigYml().getDouble("gui.insufficient-money-sound.pitch") - ); - - return; - } - - player.sendMessage(plugin.getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName())); - - ReforgeUtils.incrementReforges(toReforge); - - EconomyHandler.getInstance().withdrawPlayer(player, cost); - - ReforgeUtils.setReforge(toReforge, reforge); - - if (usedStone) { - ItemStack stone = menu.getCaptiveItems(player).get(1); - stone.setItemMeta(null); - stone.setAmount(0); - - player.playSound( - player.getLocation(), - Sound.valueOf(plugin.getConfigYml().getString("gui.stone-sound.id").toUpperCase()), - 1f, - (float) plugin.getConfigYml().getDouble("gui.stone-sound.pitch") - ); - } - - player.playSound( - player.getLocation(), - Sound.valueOf(plugin.getConfigYml().getString("gui.sound.id").toUpperCase()), - 1f, - (float) plugin.getConfigYml().getDouble("gui.sound.pitch") - ); - }).build() ) - .setSlot(6, 5, + .setSlot(plugin.getConfigYml().getInt("menu.stone-slot.row"), + plugin.getConfigYml().getInt("menu.stone-slot.column"), + Slot.builder() + .setCaptive() + .build() + ) + .setSlot(2, 5, activatorSlot) + .setSlot(plugin.getConfigYml().getInt("menu.close.location.row"), + plugin.getConfigYml().getInt("menu.close.location.column"), Slot.builder( - new ItemStackBuilder(Material.BARRIER) - .setDisplayName("&cClose") + new ItemStackBuilder(closeMaterial) + .setDisplayName(plugin.getLangYml().getString("menu.close.material")) .build() ).onLeftClick((event, slot) -> { event.getWhoClicked().closeInventory(); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeHandler.java b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeHandler.java new file mode 100644 index 0000000..7d84169 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/reforges/reforges/util/ReforgeHandler.java @@ -0,0 +1,106 @@ +package com.willfp.reforges.reforges.util; + +import com.willfp.eco.core.EcoPlugin; +import com.willfp.eco.core.PluginDependent; +import com.willfp.eco.core.gui.menu.Menu; +import com.willfp.eco.core.gui.slot.Slot; +import com.willfp.reforges.reforges.Reforge; +import com.willfp.reforges.reforges.meta.ReforgeTarget; +import com.willfp.reforges.vault.EconomyHandler; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public class ReforgeHandler extends PluginDependent { + /** + * Pass an {@link EcoPlugin} in order to interface with it. + * + * @param plugin The plugin to manage. + */ + public ReforgeHandler(@NotNull EcoPlugin plugin) { + super(plugin); + } + + public void handleReforgeClick(@NotNull final InventoryClickEvent event, + @NotNull final Slot slot, + @NotNull final Menu menu) { + Player player = (Player) event.getWhoClicked(); + ItemStack toReforge = menu.getCaptiveItems(player).isEmpty() ? null : menu.getCaptiveItems(player).get(0); + if (toReforge == null) { + return; + } + + ReforgeTarget target = ReforgeTarget.getForMaterial(toReforge.getType()); + assert target != null; + + Reforge reforge = null; + boolean usedStone = false; + + if (menu.getCaptiveItems(player).size() == 2) { + Reforge stone = ReforgeUtils.getReforgeStone(menu.getCaptiveItems(player).get(1)); + if (stone != null) { + if (Arrays.stream(stone.getTarget()).anyMatch(reforgeTarget -> reforgeTarget.getMaterials().contains(toReforge.getType()))) { + reforge = stone; + usedStone = true; + } + } + } + + if (reforge == null) { + reforge = ReforgeUtils.getRandomReforge(target); + } + + if (reforge == null) { + return; + } + + double cost = this.getPlugin().getConfigYml().getDouble("reforge.cost"); + int reforges = ReforgeUtils.getReforges(toReforge); + cost *= Math.pow(this.getPlugin().getConfigYml().getDouble("reforge.cost-exponent"), reforges); + + if (!EconomyHandler.getInstance().has(player, cost)) { + player.sendMessage(this.getPlugin().getLangYml().getMessage("insufficient-money")); + + player.playSound( + player.getLocation(), + Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.insufficient-money-sound.id").toUpperCase()), + 1f, + (float) this.getPlugin().getConfigYml().getDouble("gui.insufficient-money-sound.pitch") + ); + + return; + } + + player.sendMessage(this.getPlugin().getLangYml().getMessage("applied-reforge").replace("%reforge%", reforge.getName())); + + ReforgeUtils.incrementReforges(toReforge); + + EconomyHandler.getInstance().withdrawPlayer(player, cost); + + ReforgeUtils.setReforge(toReforge, reforge); + + if (usedStone) { + ItemStack stone = menu.getCaptiveItems(player).get(1); + stone.setItemMeta(null); + stone.setAmount(0); + + player.playSound( + player.getLocation(), + Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.stone-sound.id").toUpperCase()), + 1f, + (float) this.getPlugin().getConfigYml().getDouble("gui.stone-sound.pitch") + ); + } + + player.playSound( + player.getLocation(), + Sound.valueOf(this.getPlugin().getConfigYml().getString("gui.sound.id").toUpperCase()), + 1f, + (float) this.getPlugin().getConfigYml().getDouble("gui.sound.pitch") + ); + } +} diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml index c8c7526..d0b72df 100644 --- a/eco-core/core-plugin/src/main/resources/config.yml +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -6,11 +6,60 @@ discover-recipes: true gui: + rows: 6 + + mask: + # The way the mask works is by having a list of materials + # And then a pattern to use those materials. + + # The pattern is the rows in the GUI + # Each line must be 9 long, and the amount of rows should be the amount of rows in the GUI + # A zero represents nothing + # A 1 represents the first material + # A 2 represents the second material + # And so on, you can add up to 9. + + materials: + - black_stained_glass_pane + - magenta_stained_glass_pane + pattern: + - "011111110" + - "012202210" + - "012111210" + - "010111010" + - "011111110" + - "011101110" + show-allowed: + allow-material: lime_stained_glass_pane + deny-material: red_stained_glass_pane + + pattern: + - "100000001" + - "100000001" + - "100000001" + - "100000001" + - "100000001" + - "100000001" + + stone-slot: + row: 4 + column: 7 + + item-slot: + row: 4 + column: 3 + + close: + material: barrier + location: + row: 6 + column: 5 + allow: material: anvil name: "&aReforge Item" lore: - - '&7Reforges the above item, giving' + - '&7Reforges the item on the left, giving' - '&7it a random item modifier that' - '&7boosts its stats.' - '' @@ -22,7 +71,7 @@ gui: material: anvil name: "&aReforge Item" lore: - - '&7Reforges the above item with' + - '&7Reforges the item on the left with' - '&7a reforge stone, giving it' - '&7the %stone%&7 reforge to' - '&7boost its stats.' diff --git a/eco-core/core-plugin/src/main/resources/lang.yml b/eco-core/core-plugin/src/main/resources/lang.yml index 0fa7523..9d6a87a 100644 --- a/eco-core/core-plugin/src/main/resources/lang.yml +++ b/eco-core/core-plugin/src/main/resources/lang.yml @@ -12,4 +12,8 @@ messages: invalid-stone: "&cInvalid reforge!" give-success: "Gave &a%reforge%&r reforge stone to &a%recipient%" +menu: + title: "Reforge Item" + close: "&cClose" + description-color: "&7&o" \ No newline at end of file