mirror of
https://github.com/Auxilor/Reforges.git
synced 2025-12-31 04:46:42 +00:00
Added reforge menu customization
This commit is contained in:
@@ -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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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();
|
||||
|
||||
@@ -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<EcoPlugin> {
|
||||
/**
|
||||
* 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")
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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.'
|
||||
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user