From 6b243eb607710b04efec2c3e8760dfe921c7c27f Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sun, 18 Oct 2020 20:38:29 +0100 Subject: [PATCH] Add editing fields directly, add showing requirements in GUI --- .../requirements/DependencyRequirement.java | 2 +- .../requirements/LevelRequirement.java | 2 +- .../requirements/MoneyRequirement.java | 2 +- .../requirements/PlaceholderRequirement.java | 2 +- .../commands/RPGRegionsCommand.java | 1 - .../rpgregions/editor/ClassEditor.java | 26 ++ .../editor/annotate/EditableField.java | 19 ++ .../rpgregions/editor/field/EditField.java | 81 +++++ .../rpgregions/gui/DiscoveryGUI.java | 17 +- .../islandearth/rpgregions/gui/EditorGUI.java | 319 ++++++++++++------ .../data/region/ConfiguredRegion.java | 16 +- 11 files changed, 382 insertions(+), 105 deletions(-) create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java index 22ad5d2..e95deb4 100644 --- a/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/DependencyRequirement.java @@ -43,6 +43,6 @@ public class DependencyRequirement extends RegionRequirement { @Override public String getText(Player player) { - return "regions " + String.join(", ", requiredRegions); + return "Regions " + String.join(", ", requiredRegions); } } diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java index f1b398f..59bbf94 100644 --- a/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java @@ -23,7 +23,7 @@ public class LevelRequirement extends RegionRequirement { @Override public String getText(Player player) { - return "level " + level; + return "Level " + level; } public int getLevel() { diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java index baab585..3f3cfde 100644 --- a/api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java @@ -35,6 +35,6 @@ public class MoneyRequirement extends RegionRequirement { @Override public String getText(Player player) { - return "money " + money; + return "Money " + money; } } diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java index ab62608..e8fc52d 100644 --- a/api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java @@ -61,7 +61,7 @@ public class PlaceholderRequirement extends RegionRequirement { @Override public String getText(Player player) { - return "placeholder " + placeholder; + return "Placeholder " + placeholder; } public String getPlaceholder() { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java index 95131c8..49af513 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java @@ -114,7 +114,6 @@ public class RPGRegionsCommand extends BaseCommand { @CommandCompletion("@regions") public void onEdit(Player player, ConfiguredRegion configuredRegion) { new EditorGUI(plugin, player, configuredRegion).open(); - player.sendMessage(ChatColor.YELLOW + "This feature is currently being worked on!"); } @Subcommand("list|discoveries") diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java new file mode 100644 index 0000000..d9ca20f --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java @@ -0,0 +1,26 @@ +package net.islandearth.rpgregions.editor; + +import net.islandearth.rpgregions.editor.annotate.EditableField; +import net.islandearth.rpgregions.editor.field.EditField; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class ClassEditor { + + private final List editable = new ArrayList<>(); + + public ClassEditor(ConfiguredRegion clazz) { + for (Field declaredField : clazz.getClass().getDeclaredFields()) { + if (declaredField.getAnnotation(EditableField.class) != null) { + editable.add(new EditField(clazz, declaredField)); + } + } + } + + public List getEditable() { + return editable; + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java new file mode 100644 index 0000000..3ffbc56 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java @@ -0,0 +1,19 @@ +package net.islandearth.rpgregions.editor.annotate; + +import net.islandearth.rpgregions.utils.XMaterial; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface EditableField { + + XMaterial material() default XMaterial.OAK_SIGN; + + String name(); + + String description(); +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java new file mode 100644 index 0000000..6c34c8d --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java @@ -0,0 +1,81 @@ +package net.islandearth.rpgregions.editor.field; + +import net.islandearth.rpgregions.editor.annotate.EditableField; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.utils.XMaterial; +import org.bukkit.ChatColor; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +public class EditField { + + private final ConfiguredRegion clazz; + private final Field field; + private final XMaterial material; + private final String name; + private final String description; + + public EditField(ConfiguredRegion clazz, Field field) { + field.setAccessible(true); + this.clazz = clazz; + this.field = field; + EditableField editableField = field.getAnnotation(EditableField.class); + this.name = editableField.name(); + this.material = editableField.material(); + this.description = editableField.description(); + } + + public Field getField() { + return field; + } + + public XMaterial getMaterial() { + return material; + } + + public String getDescription() { + return description; + } + + public String getName() { + return name; + } + + public Object getValue() { + try { + return this.field.get(clazz); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + public String setValue(Object value) { + if (Modifier.isTransient(field.getModifiers())) { + return ChatColor.RED + "Field " + field.getName() + " is a non-modifiable field."; + } + + try { + if (getValue().getClass().isEnum()) { + field.set(clazz, Enum.valueOf((Class) field.getType(), String.valueOf(value))); + } else if (getValue() instanceof Boolean) { + field.setBoolean(clazz, (boolean) value); + } else { + try { + field.set(clazz, Integer.valueOf(String.valueOf(value))); + } catch (NumberFormatException e2) { + try { + field.set(clazz, Double.valueOf(String.valueOf(value))); + } catch (NumberFormatException e3) { + field.set(clazz, field.getType().cast(value)); + } + } + } + + return ChatColor.GREEN + "Field " + field.getName() + " has been updated with new value " + value; + } catch (ReflectiveOperationException e) { + return ChatColor.RED + "Could not set field: " + e.getMessage(); + } + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java index a9525f0..ebe95c4 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java @@ -12,6 +12,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.command.IconCommand; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.translation.Translations; import net.islandearth.rpgregions.utils.ItemStackBuilder; import net.islandearth.rpgregions.utils.StringUtils; @@ -216,6 +217,18 @@ public class DiscoveryGUI extends RPGRegionsGUI { && hasDiscovered ? Translations.TELEPORT.get(player) : null; + StringBuilder stringBuilder = new StringBuilder(); + boolean requirements = true; + if (!player.hasPermission("rpgregions.bypassentry") && configuredRegion.getRequirements() != null) { + for (RegionRequirement requirement : configuredRegion.getRequirements()) { + if (!requirement.meetsRequirements(player)) { + requirements = false; + stringBuilder.append(ChatColor.RED + "\u2718 " + requirement.getText(player)); + } else { + stringBuilder.append(ChatColor.GREEN + "\u2714 " + requirement.getText(player)); + } + } + } List translatedDiscoveredLore = new ArrayList<>(); if (configuredRegion.getDiscoveredLore() != null) { @@ -230,12 +243,14 @@ public class DiscoveryGUI extends RPGRegionsGUI { new ItemStackBuilder(configuredRegion.getUndiscoveredIcon()) .build(); + boolean finalRequirements = requirements; items.add(new GuiItem(new ItemStackBuilder(item) .withName(colour + configuredRegion.getCustomName()) .withLore(lore) .withLore(lore2) .withLore(hint) .withLore(" ") + .withLore(stringBuilder.toString()) .withLore(teleport) .addFlags(ItemFlag.HIDE_ATTRIBUTES) .build(), @@ -245,7 +260,7 @@ public class DiscoveryGUI extends RPGRegionsGUI { && player.hasPermission("rpgregions.teleport") && hasDiscovered) { if (!account.getCooldowns().contains(RPGRegionsAccount.AccountCooldown.TELEPORT)) { - if (configuredRegion.getWorld() == null) { + if (configuredRegion.getWorld() == null || !finalRequirements) { Translations.CANNOT_TELEPORT.send(player); } else { if (configuredRegion.getLocation() != null) PaperLib.teleportAsync(player, configuredRegion.getLocation()); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java index c72680d..f2ca770 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java @@ -2,128 +2,255 @@ package net.islandearth.rpgregions.gui; import com.github.stefvanschie.inventoryframework.Gui; import com.github.stefvanschie.inventoryframework.GuiItem; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; import com.github.stefvanschie.inventoryframework.pane.StaticPane; +import com.github.stefvanschie.inventoryframework.pane.util.Mask; +import me.arcaniax.hdb.api.HeadDatabaseAPI; import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.editor.ClassEditor; +import net.islandearth.rpgregions.editor.field.EditField; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.translation.Translations; import net.islandearth.rpgregions.utils.ItemStackBuilder; import net.islandearth.rpgregions.utils.XMaterial; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import net.wesjd.anvilgui.AnvilGUI; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class EditorGUI extends RPGRegionsGUI { private final Gui gui; - private static final ItemStack SET_COOLDOWN_ITEM = new ItemStackBuilder(XMaterial.NETHER_STAR.parseMaterial(true)) - .withName(ChatColor.GREEN + "Set teleport cooldown") - .withLore(Arrays.asList(ChatColor.WHITE + "Set the cooldown for teleportation", ChatColor.GRAY + "int, ticks")) - .build(); - private static final ItemStack SET_NAME_ITEM = new ItemStackBuilder(XMaterial.NAME_TAG.parseMaterial(true)) - .withName(ChatColor.GREEN + "Set name") - .withLore(Arrays.asList(ChatColor.WHITE + "Set the display name of the region", ChatColor.GRAY + "string")) - .build(); - private static final ItemStack SET_LOCATION_ITEM = new ItemStackBuilder(XMaterial.ENDER_PEARL.parseMaterial(true)) - .withName(ChatColor.GREEN + "Set teleport location") - .withLore(Arrays.asList(ChatColor.WHITE + "Set the teleport location to your current location", ChatColor.GRAY + "location")) - .build(); - private static final ItemStack EXIT_ITEM = new ItemStackBuilder(XMaterial.BARRIER.parseMaterial(true)) - .withName(ChatColor.RED + "Exit and save") - .build(); public EditorGUI(RPGRegions plugin, Player player, ConfiguredRegion region) { super(plugin, player); - this.gui = new Gui(plugin, 1, region.getCustomName()); + this.gui = new Gui(plugin, 6, region.getCustomName()); gui.setOnGlobalClick(click -> click.setCancelled(true)); - StaticPane pane = new StaticPane(0, 0, 9, 1); - pane.addItem(new GuiItem(SET_NAME_ITEM, event -> new AnvilGUI.Builder() - .onComplete((responder, text) -> { - region.setCustomName(text); - player.sendMessage(ChatColor.GREEN + "Region display name has been set."); - Bukkit.getScheduler().runTaskLater(plugin, this::open, 20L); - return AnvilGUI.Response.close(); - }) - .preventClose() - .text(region.getCustomName()) - .item(new ItemStack(Material.NAME_TAG)) - .title("Set display name") // only works in 1.14+ - .plugin(plugin) - .open(player)), 0, 0); - pane.addItem(new GuiItem(SET_LOCATION_ITEM, event -> { - region.setLocation(player.getLocation()); - player.sendMessage(ChatColor.GREEN + "Region teleport location has been set."); - this.open(); - }), 1, 0); - pane.addItem(new GuiItem(SET_COOLDOWN_ITEM, event -> new AnvilGUI.Builder() - .onComplete((responder, text) -> { - try { - int cooldown = Integer.parseInt(text); - region.setTeleportCooldown(cooldown); - player.sendMessage(ChatColor.GREEN + "Region teleport cooldown has been set."); - Bukkit.getScheduler().runTaskLater(plugin, this::open, 20L); - return AnvilGUI.Response.close(); - } catch (NumberFormatException e) { - return AnvilGUI.Response.text("Please provide a number"); - } - }) - .preventClose() - .text("" + region.getTeleportCooldown()) - .item(new ItemStack(Material.NAME_TAG)) - .title("Set teleport cooldown") // only works in 1.14+ - .plugin(plugin) - .open(player)), 2, 0); - Material toggleTeleportMaterial = region.isTeleportable() ? XMaterial.GREEN_WOOL.parseMaterial(true) : XMaterial.RED_WOOL.parseMaterial(true); - ItemStack toggleTeleport = new ItemStackBuilder(toggleTeleportMaterial) - .withName(ChatColor.GREEN + "Toggle teleport") - .withLore(Arrays.asList(ChatColor.WHITE + "Toggle whether this region can be teleported to", ChatColor.GRAY + "boolean")) - .build(); - pane.addItem(new GuiItem(toggleTeleport, event -> { - region.setTeleportable(!region.isTeleportable()); - player.closeInventory(); - new EditorGUI(plugin, player, region).open(); - player.sendMessage(ChatColor.GREEN + "Region teleporting has been toggled"); - }), 3, 0); - Material toggleDiscoverableMaterial = region.isDiscoverable() ? XMaterial.GREEN_WOOL.parseMaterial(true) : XMaterial.RED_WOOL.parseMaterial(true); - ItemStack toggleDiscoverable = new ItemStackBuilder(toggleDiscoverableMaterial) - .withName(ChatColor.GREEN + "Toggle discoverable") - .withLore(Arrays.asList(ChatColor.WHITE + "Toggle whether this region can be discovered", ChatColor.GRAY + "boolean")) - .build(); - pane.addItem(new GuiItem(toggleDiscoverable, event -> { - region.setDiscoverable(!region.isDiscoverable()); - player.closeInventory(); - new EditorGUI(plugin, player, region).open(); - player.sendMessage(ChatColor.GREEN + "Region discovering has been toggled"); - }), 4, 0); - Material toggleHiddenMaterial = region.isHidden() ? XMaterial.GREEN_WOOL.parseMaterial(true) : XMaterial.RED_WOOL.parseMaterial(true); - ItemStack toggleHidden = new ItemStackBuilder(toggleHiddenMaterial) - .withName(ChatColor.GREEN + "Toggle hidden") - .withLore(Arrays.asList(ChatColor.WHITE + "Toggle whether this region is hidden", ChatColor.GRAY + "boolean")) - .build(); - pane.addItem(new GuiItem(toggleHidden, event -> { - region.setHidden(!region.isHidden()); - player.closeInventory(); - new EditorGUI(plugin, player, region).open(); - player.sendMessage(ChatColor.GREEN + "Region visibility has been toggled"); - }), 5, 0); - pane.addItem(new GuiItem(EXIT_ITEM, event -> { - player.closeInventory(); + ClassEditor classEditor = new ClassEditor(region); + // I wish there was a cleaner way to do this :( + int backX = plugin.getConfig().getInt("settings.server.gui.back.posX"); + int backY = plugin.getConfig().getInt("settings.server.gui.back.posY"); + int backL = plugin.getConfig().getInt("settings.server.gui.back.length"); + int backH = plugin.getConfig().getInt("settings.server.gui.back.height"); + int forwardX = plugin.getConfig().getInt("settings.server.gui.forward.posX"); + int forwardY = plugin.getConfig().getInt("settings.server.gui.forward.posY"); + int forwardL = plugin.getConfig().getInt("settings.server.gui.forward.length"); + int forwardH = plugin.getConfig().getInt("settings.server.gui.forward.height"); + int exitX = plugin.getConfig().getInt("settings.server.gui.exit.posX"); + int exitY = plugin.getConfig().getInt("settings.server.gui.exit.posY"); + int exitL = plugin.getConfig().getInt("settings.server.gui.exit.length"); + int exitH = plugin.getConfig().getInt("settings.server.gui.exit.height"); + int paneX = plugin.getConfig().getInt("settings.server.gui.pane.posX"); + int paneY = plugin.getConfig().getInt("settings.server.gui.pane.posY"); + int paneL = plugin.getConfig().getInt("settings.server.gui.pane.length"); + int paneH = plugin.getConfig().getInt("settings.server.gui.pane.height"); + int oPaneX = plugin.getConfig().getInt("settings.server.gui.outlinePane.posX"); + int oPaneY = plugin.getConfig().getInt("settings.server.gui.outlinePane.posY"); + int oPaneL = plugin.getConfig().getInt("settings.server.gui.outlinePane.length"); + int oPaneH = plugin.getConfig().getInt("settings.server.gui.outlinePane.height"); + int iPaneX = plugin.getConfig().getInt("settings.server.gui.innerPane.posX"); + int iPaneY = plugin.getConfig().getInt("settings.server.gui.innerPane.posY"); + int iPaneL = plugin.getConfig().getInt("settings.server.gui.innerPane.length"); + int iPaneH = plugin.getConfig().getInt("settings.server.gui.innerPane.height"); + PaginatedPane pane = new PaginatedPane(paneX, paneY, paneL, paneH); + OutlinePane oPane = new OutlinePane(oPaneX, oPaneY, oPaneL, oPaneH); + OutlinePane innerPane = new OutlinePane(iPaneX, iPaneY, iPaneL, iPaneH); + StaticPane back = new StaticPane(backX, backY, backL, backH); + StaticPane forward = new StaticPane(forwardX, forwardY, forwardL, forwardH); + StaticPane exit = new StaticPane(exitX, exitY, exitL, exitH); + + // Inner pane + if (plugin.getConfig().getBoolean("settings.server.gui.innerPane.show")) { + innerPane.setRepeat(true); + List mask = plugin.getConfig().getStringList("settings.server.gui.innerPane.mask"); + innerPane.applyMask(new Mask(mask.toArray(new String[]{}))); + innerPane.setOnClick(inventoryClickEvent -> inventoryClickEvent.setCancelled(true)); + + innerPane.addItem(new GuiItem(new ItemStackBuilder(XMaterial.matchXMaterial( + plugin.getConfig().getString("settings.server.gui.innerPane.innerPane")).get().parseItem(true)) + .withName(" ") + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build())); + + gui.addPane(innerPane); + } + + // Outline pane + if (plugin.getConfig().getBoolean("settings.server.gui.outlinePane.show")) { + oPane.setRepeat(true); + List mask = plugin.getConfig().getStringList("settings.server.gui.outlinePane.mask"); + oPane.applyMask(new Mask(mask.toArray(new String[]{}))); + oPane.setOnClick(inventoryClickEvent -> inventoryClickEvent.setCancelled(true)); + + oPane.addItem(new GuiItem(new ItemStackBuilder(XMaterial.matchXMaterial( + plugin.getConfig().getString("settings.server.gui.outlinePane.outlinePane")).get().parseItem(true)) + .withName(" ") + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build())); + + gui.addPane(oPane); + } + + // Back item + String bm = plugin.getConfig().getString("settings.server.gui.back.back"); + ItemStack backItem = bm.startsWith("hdb-") && plugin.hasHeadDatabase() + ? + new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(bm.replace("hdb-", ""))) + .withName(Translations.PREVIOUS_PAGE.get(player)) + .withLore(Translations.PREVIOUS_PAGE_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build() + : + new ItemStackBuilder(XMaterial.matchXMaterial( + plugin.getConfig().getString("settings.server.gui.back.back")).get().parseItem(true)) + .withName(Translations.PREVIOUS_PAGE.get(player)) + .withLore(Translations.PREVIOUS_PAGE_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + + back.addItem(new GuiItem(backItem, event -> { + event.setCancelled(true); + if (pane.getPages() == 0 || pane.getPages() == 1) return; + + pane.setPage(pane.getPage() - 1); + + forward.setVisible(true); + gui.update(); + }), 0, 0); + + // Forward item + String fm = plugin.getConfig().getString("settings.server.gui.forward.forward"); + ItemStack forwardItem = fm.startsWith("hdb-") && plugin.hasHeadDatabase() + ? + new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(fm.replace("hdb-", ""))) + .withName(Translations.NEXT_PAGE.get(player)) + .withLore(Translations.NEXT_PAGE_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build() + : + new ItemStackBuilder(XMaterial.matchXMaterial( + plugin.getConfig().getString("settings.server.gui.forward.forward")).get().parseItem(true)) + .withName(Translations.NEXT_PAGE.get(player)) + .withLore(Translations.NEXT_PAGE_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + + forward.addItem(new GuiItem(forwardItem, event -> { + event.setCancelled(true); + if (pane.getPages() == 0 || pane.getPages() == 1) return; + + pane.setPage(pane.getPage() + 1); + + back.setVisible(true); + gui.update(); + }), 0, 0); + + // Exit item + if (plugin.getConfig().getBoolean("settings.server.gui.exit.show")) { + String em = plugin.getConfig().getString("settings.server.gui.exit.exit"); + ItemStack item = em.startsWith("hdb-") && plugin.hasHeadDatabase() + ? + new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(em.replace("hdb-", ""))) + .withName(Translations.EXIT.get(player)) + .withLore(Translations.EXIT_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build() + : + new ItemStackBuilder(XMaterial.matchXMaterial( + plugin.getConfig().getString("settings.server.gui.exit.exit")).get().parseItem(true)) + .withName(Translations.EXIT.get(player)) + .withLore(Translations.EXIT_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + exit.addItem(new GuiItem(item, event -> { + event.setCancelled(true); + gui.update(); + player.closeInventory(); + String command = plugin.getConfig().getString("settings.server.gui.exit.command"); + if (!command.isEmpty()) player.performCommand(command + .replace("%player%", player.getName())); + try { + player.sendMessage(ChatColor.GREEN + "Saving data..."); + long startTime = System.currentTimeMillis(); + region.save(plugin); + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + player.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)"); + } catch (IOException e) { + e.printStackTrace(); + } + }), 0, 0); + + gui.addPane(exit); + } + + gui.addPane(back); + gui.addPane(forward); + + List guiItems = new ArrayList<>(); + for (EditField editField : classEditor.getEditable()) { + ItemStack itemStack = new ItemStackBuilder(editField.getMaterial().parseMaterial(true)) + .withName(ChatColor.GREEN + editField.getName()) + .withLore(Arrays.asList(ChatColor.WHITE + editField.getDescription(), + ChatColor.GRAY + editField.getValue().getClass().getSimpleName().toLowerCase())) + .build(); + if (editField.getValue() instanceof Boolean) { + Boolean bool = (Boolean) editField.getValue(); + if (bool) { + itemStack.setType(XMaterial.GREEN_WOOL.parseMaterial(true)); + } else { + itemStack.setType(XMaterial.RED_WOOL.parseMaterial(true)); + } + } + try { - player.sendMessage(ChatColor.GREEN + "Saving data..."); - long startTime = System.currentTimeMillis(); - region.save(plugin); - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - player.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)"); - } catch (IOException e) { + if (editField.getField().get(region) instanceof Location) { + guiItems.add(new GuiItem(itemStack, event -> { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(player.getLocation()))); + this.open(); + })); + } else if (editField.getField().get(region) instanceof Boolean) { + Boolean bool = (Boolean) editField.getField().get(region); + guiItems.add(new GuiItem(itemStack, event -> { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(!bool))); + player.closeInventory(); + new EditorGUI(plugin, player, region).open(); + })); + } else { + guiItems.add(new GuiItem(itemStack, event -> { + new AnvilGUI.Builder() + .onComplete((responder, text) -> { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(text))); + Bukkit.getScheduler().runTaskLater(plugin, this::open, 20L); + return AnvilGUI.Response.close(); + }) + .preventClose() + .text(region.getCustomName()) + .item(new ItemStack(Material.NAME_TAG)) + .title("Set display name") // only works in 1.14+ + .plugin(plugin) + .open(player); + })); + } + } catch (IllegalAccessException e) { e.printStackTrace(); } - }), 8, 0); + } + + pane.populateWithGuiItems(guiItems); gui.addPane(pane); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index f2653c6..a20b78d 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import me.arcaniax.hdb.api.HeadDatabaseAPI; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.command.IconCommand; +import net.islandearth.rpgregions.editor.annotate.EditableField; import net.islandearth.rpgregions.effects.RegionEffect; import net.islandearth.rpgregions.regenerate.Regenerate; import net.islandearth.rpgregions.requirements.LevelRequirement; @@ -40,28 +41,37 @@ public class ConfiguredRegion { private final UUID world; private final String id; + @EditableField(material = XMaterial.NAME_TAG, name = "Set name", description = "Set the display name of the region") private String customName; private final List rewards; private final Sound sound; private final String icon; private final String undiscoveredIcon; private final List iconCommand; - private final boolean showCoords; + @EditableField(description = "Toggle whether the coordinates of the region are shown", name = "Toggle coordinates") + private boolean showCoords; + @EditableField(material = XMaterial.ENDER_PEARL, name = "Set teleport location", description = "Set the teleport location to your current location") private Location location; private final List hints; - private final boolean showHint; + @EditableField(description = "Toggle whether the hint is shown", name = "Toggle hint") + private boolean showHint; + @EditableField(description = "Toggle whether this region can be teleported to", name = "Toggle teleportable") private boolean teleportable; + @EditableField(name = "Toggle hidden", description = "Toggle whether this region is hidden") private boolean hidden; + @EditableField(name = "Toggle discoverable", description = "Toggle whether this region can be discovered") private boolean discoverable; private final List effects; private final List requirements; private final List discoveredLore; - private final boolean alwaysShowTitles; + @EditableField(description = "Toggle whether the title is always shown on entry after discovery", name = "Toggle always showing titles") + private boolean alwaysShowTitles; private List title; private List subtitle; private List discoveredTitle; private List discoveredSubtitle; private Regenerate regenerate; + @EditableField(material = XMaterial.NETHER_STAR, name = "Set teleport cooldown", description = "Set the cooldown for teleportation") private int teleportCooldown; public ConfiguredRegion(@Nullable World world, String id, String customName,