diff --git a/api/src/main/java/net/islandearth/rpgregions/effects/RegionEffect.java b/api/src/main/java/net/islandearth/rpgregions/effects/RegionEffect.java index a61a119..63d6803 100644 --- a/api/src/main/java/net/islandearth/rpgregions/effects/RegionEffect.java +++ b/api/src/main/java/net/islandearth/rpgregions/effects/RegionEffect.java @@ -1,13 +1,14 @@ package net.islandearth.rpgregions.effects; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.IGuiEditable; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.List; -public abstract class RegionEffect { +public abstract class RegionEffect implements IGuiEditable { private final boolean wearingRequired; private final List ignoreItems; diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java b/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java index 074bd13..a831334 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.managers; import net.islandearth.rpgregions.api.integrations.IntegrationManager; +import net.islandearth.rpgregions.gui.element.IGuiFieldElementRegistry; import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry; @@ -15,5 +16,7 @@ public interface IRPGRegionsManagers { IRegenerationManager getRegenerationManager(); + IGuiFieldElementRegistry getGuiFieldElementRegistry(); + IRPGRegionsRegistry getRegistry(Class> clazz); } diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java index fabef18..b923e6d 100644 --- a/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java @@ -1,11 +1,12 @@ package net.islandearth.rpgregions.requirements; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.IGuiEditable; import org.bukkit.entity.Player; -public abstract class RegionRequirement { +public abstract class RegionRequirement implements IGuiEditable { - private final IRPGRegionsAPI api; + private final transient IRPGRegionsAPI api; private final PreventType preventType; public RegionRequirement(IRPGRegionsAPI api) { diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java index 3e825e8..a9e5ca8 100644 --- a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java +++ b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java @@ -1,11 +1,12 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.IGuiEditable; import org.bukkit.entity.Player; -public abstract class DiscoveryReward { +public abstract class DiscoveryReward implements IGuiEditable { - private final IRPGRegionsAPI api; + private final transient IRPGRegionsAPI api; public DiscoveryReward(IRPGRegionsAPI api) { this.api = api; diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsConversationPrefix.java b/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsConversationPrefix.java new file mode 100644 index 0000000..4988f8f --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsConversationPrefix.java @@ -0,0 +1,15 @@ +package net.islandearth.rpgregions.chat; + +import org.bukkit.ChatColor; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationPrefix; +import org.jetbrains.annotations.NotNull; + +public class RPGRegionsConversationPrefix implements ConversationPrefix { + + @NotNull + @Override + public String getPrefix(@NotNull ConversationContext context) { + return ChatColor.GOLD + "RPGRegions > " + ChatColor.AQUA; + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsStringPrompt.java b/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsStringPrompt.java new file mode 100644 index 0000000..e2e8c75 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/chat/RPGRegionsStringPrompt.java @@ -0,0 +1,29 @@ +package net.islandearth.rpgregions.chat; + +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class RPGRegionsStringPrompt extends StringPrompt { + + private final String promptText; + + public RPGRegionsStringPrompt(String promptText) { + this.promptText = promptText; + } + + @NotNull + @Override + public String getPromptText(@NotNull ConversationContext context) { + return promptText; + } + + @Nullable + @Override + public Prompt acceptInput(@NotNull ConversationContext context, @Nullable String input) { + context.setSessionData("input", input); + return Prompt.END_OF_CONVERSATION; + } +} 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 4be478e..555857a 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java @@ -12,7 +12,7 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.api.integrations.IntegrationType; import net.islandearth.rpgregions.gui.DiscoveryGUI; -import net.islandearth.rpgregions.gui.EditorGUI; +import net.islandearth.rpgregions.gui.RegionCreateGUI; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; import net.islandearth.rpgregions.regenerate.Regenerate; @@ -116,7 +116,7 @@ public class RPGRegionsCommand extends BaseCommand { @CommandPermission("rpgregions.edit") @CommandCompletion("@regions") public void onEdit(Player player, ConfiguredRegion configuredRegion) { - new EditorGUI(plugin, player, configuredRegion).open(); + new RegionCreateGUI(plugin, player, configuredRegion).open(); } @Subcommand("list|discoveries") diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/AddRegionElementGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/AddRegionElementGUI.java new file mode 100644 index 0000000..9ec1fe7 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/AddRegionElementGUI.java @@ -0,0 +1,96 @@ +package net.islandearth.rpgregions.gui; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.github.stefvanschie.inventoryframework.pane.Pane; +import com.github.stefvanschie.inventoryframework.pane.StaticPane; +import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.effects.RegionEffect; +import net.islandearth.rpgregions.effects.RegionEffectRegistry; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry; +import net.islandearth.rpgregions.requirements.RegionRequirement; +import net.islandearth.rpgregions.requirements.RegionRequirementRegistry; +import net.islandearth.rpgregions.rewards.DiscoveryReward; +import net.islandearth.rpgregions.rewards.RegionRewardRegistry; +import net.islandearth.rpgregions.translation.Translations; +import net.islandearth.rpgregions.utils.ItemStackBuilder; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class AddRegionElementGUI extends RPGRegionsGUI { + + private final RPGRegions plugin; + private final Player player; + private final ConfiguredRegion region; + private final IRPGRegionsRegistry registry; + private ChestGui gui; + + protected AddRegionElementGUI(RPGRegions plugin, Player player, ConfiguredRegion region, IRPGRegionsRegistry registry) { + super(plugin, player); + this.plugin = plugin; + this.player = player; + this.region = region; + this.registry = registry; + } + + @Override + public void render() { + this.gui = new ChestGui(6, region.getId()); + gui.setOnGlobalClick(click -> click.setCancelled(true)); + + PaginatedPane pane = super.generateDefaultConfig(); + StaticPane exit = new StaticPane(exitX, exitY, exitL, exitH, Pane.Priority.HIGHEST); + // Exit item + Material em = Material.valueOf(plugin.getConfig().getString("settings.server.gui.exit.exit")); + ItemStack exitItem = new ItemStackBuilder(em) + .withName(Translations.EXIT.get(player)) + .withLore(Translations.EXIT_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + exit.addItem(new GuiItem(exitItem, event -> { + new RegionCreateGUI(plugin, player, region).open(); + player.playSound(player.getLocation(), Sound.BLOCK_TRIPWIRE_CLICK_ON, 1f, 1f); + }), 0, 0); + gui.addPane(exit); + + List items = new ArrayList<>(); + registry.get().forEach((name, clazz) -> { + ItemStack item = new ItemStackBuilder(Material.WRITTEN_BOOK).withName("&6" + name).generation(null).build(); + GuiItem guiItem = new GuiItem(item, click -> { + Object newInstance = registry.getNew(name, plugin, region); + if (newInstance == null) { + player.sendMessage(ChatColor.RED + "This requires a plugin which is not installed."); + player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_LAND, 1f, 1f); + return; + } + + if (registry instanceof RegionEffectRegistry) { + region.getEffects().add((RegionEffect) newInstance); + } else if (registry instanceof RegionRewardRegistry) { + region.getRewards().add((DiscoveryReward) newInstance); + } else if (registry instanceof RegionRequirementRegistry) { + region.getRequirements().add((RegionRequirement) newInstance); + } + + player.playSound(player.getLocation(), Sound.BLOCK_ENCHANTMENT_TABLE_USE, 1f, 1f); + }); + items.add(guiItem); + }); + pane.populateWithGuiItems(items); + gui.update(); + } + + @Override + public ChestGui getGui() { + return gui; + } +} 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 0041f06..f0a4d51 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/DiscoveryGUI.java @@ -4,6 +4,7 @@ import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import com.github.stefvanschie.inventoryframework.pane.OutlinePane; import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.github.stefvanschie.inventoryframework.pane.Pane; import com.github.stefvanschie.inventoryframework.pane.StaticPane; import com.github.stefvanschie.inventoryframework.pane.util.Mask; import io.papermc.lib.PaperLib; @@ -29,43 +30,26 @@ import java.util.List; public class DiscoveryGUI extends RPGRegionsGUI { - private final ChestGui gui; + private final RPGRegions plugin; + private final Player player; + private ChestGui gui; public DiscoveryGUI(RPGRegions plugin, Player player) { super(plugin, player); + this.plugin = plugin; + this.player = player; + } + + @Override + public void render() { this.gui = new ChestGui(plugin.getConfig().getInt("settings.server.gui.general.rows"), Translations.REGIONS.get(player)); gui.setOnGlobalClick(click -> click.setCancelled(true)); - // 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); + PaginatedPane pane = new PaginatedPane(paneX, paneY, paneL, paneH, Pane.Priority.HIGHEST); 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); + StaticPane back = new StaticPane(backX, backY, backL, backH, Pane.Priority.HIGHEST); + StaticPane forward = new StaticPane(forwardX, forwardY, forwardL, forwardH, Pane.Priority.HIGHEST); + StaticPane exit = new StaticPane(exitX, exitY, exitL, exitH, Pane.Priority.HIGH); // Inner pane if (plugin.getConfig().getBoolean("settings.server.gui.innerPane.show")) { @@ -306,7 +290,6 @@ public class DiscoveryGUI extends RPGRegionsGUI { } })); } - pane.populateWithGuiItems(items); gui.addPane(pane); }).exceptionally(error -> { @@ -317,7 +300,7 @@ public class DiscoveryGUI extends RPGRegionsGUI { } @Override - public void open() { - gui.show(getPlayer()); + public ChestGui getGui() { + return gui; } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditRegionElementGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditRegionElementGUI.java new file mode 100644 index 0000000..4648179 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditRegionElementGUI.java @@ -0,0 +1,97 @@ +package net.islandearth.rpgregions.gui; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.github.stefvanschie.inventoryframework.pane.Pane; +import com.github.stefvanschie.inventoryframework.pane.StaticPane; +import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.effects.RegionEffect; +import net.islandearth.rpgregions.effects.RegionEffectRegistry; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.managers.registry.IRPGRegionsRegistry; +import net.islandearth.rpgregions.requirements.RegionRequirement; +import net.islandearth.rpgregions.requirements.RegionRequirementRegistry; +import net.islandearth.rpgregions.rewards.DiscoveryReward; +import net.islandearth.rpgregions.rewards.RegionRewardRegistry; +import net.islandearth.rpgregions.translation.Translations; +import net.islandearth.rpgregions.utils.ItemStackBuilder; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class EditRegionElementGUI extends RPGRegionsGUI { + + private final RPGRegions plugin; + private final Player player; + private final ConfiguredRegion region; + private final IRPGRegionsRegistry registry; + private ChestGui gui; + + public EditRegionElementGUI(RPGRegions plugin, Player player, ConfiguredRegion region, IRPGRegionsRegistry registry) { + super(plugin, player); + this.plugin = plugin; + this.player = player; + this.region = region; + this.registry = registry; + } + + @Override + public void render() { + this.gui = new ChestGui(6, region.getId()); + gui.setOnGlobalClick(click -> click.setCancelled(true)); + + PaginatedPane pane = super.generateDefaultConfig(); + StaticPane exit = new StaticPane(exitX, exitY, exitL, exitH, Pane.Priority.HIGHEST); + // Exit item + Material em = Material.valueOf(plugin.getConfig().getString("settings.server.gui.exit.exit")); + ItemStack exitItem = new ItemStackBuilder(em) + .withName(Translations.EXIT.get(player)) + .withLore(Translations.EXIT_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + exit.addItem(new GuiItem(exitItem, event -> { + new RegionCreateGUI(plugin, player, region).open(); + player.playSound(player.getLocation(), Sound.BLOCK_TRIPWIRE_CLICK_ON, 1f, 1f); + }), 0, 0); + gui.addPane(exit); + + List items = new ArrayList<>(); + if (registry instanceof RegionEffectRegistry) { + for (RegionEffect effect : region.getEffects()) { + items.add(getDefaultGuiItem(effect, registry)); + } + } else if (registry instanceof RegionRewardRegistry) { + for (DiscoveryReward reward : region.getRewards()) { + items.add(getDefaultGuiItem(reward, registry)); + } + } else if (registry instanceof RegionRequirementRegistry) { + for (RegionRequirement requirement : region.getRequirements()) { + items.add(getDefaultGuiItem(requirement, registry)); + } + } + pane.populateWithGuiItems(items); + gui.update(); + } + + public GuiItem getDefaultGuiItem(IGuiEditable guiEditable, IRPGRegionsRegistry registry) { + ItemStack item = new ItemStackBuilder(registry.getIcon()) + .withName("&6" + guiEditable.getName()) + .withLore("&7No additional data to display") + .build(); + return new GuiItem(item, click -> { + new EditGuiElementGUI(plugin, player, region, guiEditable).open(); + player.playSound(player.getLocation(), Sound.BLOCK_ENCHANTMENT_TABLE_USE, 1f, 1f); + }); + } + + @Override + public ChestGui getGui() { + return gui; + } +} 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 77f9427..7685d7d 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java @@ -29,41 +29,28 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +/** + * @deprecated It is preferable to use the new RegionCreateGUI class. + * This will be removed in version 1.3.6. + * @see net.islandearth.rpgregions.gui.RegionCreateGUI + */ +@Deprecated public class EditorGUI extends RPGRegionsGUI { + private final RPGRegions plugin; + private final Player player; + private final ConfiguredRegion region; private final ChestGui gui; public EditorGUI(RPGRegions plugin, Player player, ConfiguredRegion region) { super(plugin, player); + this.plugin = plugin; + this.player = player; + this.region = region; this.gui = new ChestGui(6, region.getCustomName()); gui.setOnGlobalClick(click -> click.setCancelled(true)); 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); @@ -250,7 +237,12 @@ public class EditorGUI extends RPGRegionsGUI { } @Override - public void open() { - gui.show(getPlayer()); + public void render() { + + } + + @Override + public ChestGui getGui() { + return gui; } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RPGRegionsGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RPGRegionsGUI.java index d5fdd30..991690f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RPGRegionsGUI.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RPGRegionsGUI.java @@ -1,16 +1,79 @@ package net.islandearth.rpgregions.gui; +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.github.stefvanschie.inventoryframework.pane.Pane; +import com.github.stefvanschie.inventoryframework.pane.StaticPane; +import com.github.stefvanschie.inventoryframework.pane.util.Mask; import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.translation.Translations; +import net.islandearth.rpgregions.utils.ItemStackBuilder; +import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.util.List; public abstract class RPGRegionsGUI { private final RPGRegions plugin; private final Player player; + protected final int backX; + protected final int backY; + protected final int backL; + protected final int backH; + protected final int forwardX; + protected final int forwardY; + protected final int forwardL; + protected final int forwardH; + protected final int exitX; + protected final int exitY; + protected final int exitL; + protected final int exitH; + protected final int paneX; + protected final int paneY; + protected final int paneL; + protected final int paneH; + protected final int oPaneX; + protected final int oPaneY; + protected final int oPaneL; + protected final int oPaneH; + protected final int iPaneX; + protected final int iPaneY; + protected final int iPaneL; + protected final int iPaneH; protected RPGRegionsGUI(RPGRegions plugin, Player player) { this.plugin = plugin; this.player = player; + // I wish there was a cleaner way to do this :( + this.backX = plugin.getConfig().getInt("settings.server.gui.back.posX"); + this.backY = plugin.getConfig().getInt("settings.server.gui.back.posY"); + this.backL = plugin.getConfig().getInt("settings.server.gui.back.length"); + this.backH = plugin.getConfig().getInt("settings.server.gui.back.height"); + this.forwardX = plugin.getConfig().getInt("settings.server.gui.forward.posX"); + this.forwardY = plugin.getConfig().getInt("settings.server.gui.forward.posY"); + this.forwardL = plugin.getConfig().getInt("settings.server.gui.forward.length"); + this.forwardH = plugin.getConfig().getInt("settings.server.gui.forward.height"); + this.exitX = plugin.getConfig().getInt("settings.server.gui.exit.posX"); + this.exitY = plugin.getConfig().getInt("settings.server.gui.exit.posY"); + this.exitL = plugin.getConfig().getInt("settings.server.gui.exit.length"); + this.exitH = plugin.getConfig().getInt("settings.server.gui.exit.height"); + this.paneX = plugin.getConfig().getInt("settings.server.gui.pane.posX"); + this.paneY = plugin.getConfig().getInt("settings.server.gui.pane.posY"); + this.paneL = plugin.getConfig().getInt("settings.server.gui.pane.length"); + this.paneH = plugin.getConfig().getInt("settings.server.gui.pane.height"); + this.oPaneX = plugin.getConfig().getInt("settings.server.gui.outlinePane.posX"); + this.oPaneY = plugin.getConfig().getInt("settings.server.gui.outlinePane.posY"); + this.oPaneL = plugin.getConfig().getInt("settings.server.gui.outlinePane.length"); + this.oPaneH = plugin.getConfig().getInt("settings.server.gui.outlinePane.height"); + this.iPaneX = plugin.getConfig().getInt("settings.server.gui.innerPane.posX"); + this.iPaneY = plugin.getConfig().getInt("settings.server.gui.innerPane.posY"); + this.iPaneL = plugin.getConfig().getInt("settings.server.gui.innerPane.length"); + this.iPaneH = plugin.getConfig().getInt("settings.server.gui.innerPane.height"); } public RPGRegions getPlugin() { @@ -21,5 +84,117 @@ public abstract class RPGRegionsGUI { return player; } - public abstract void open(); + public abstract void render(); + + public PaginatedPane generateDefaultConfig() { + ChestGui gui = getGui(); + + gui.setOnGlobalClick(click -> click.setCancelled(true)); + + 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); + + pane.setPriority(Pane.Priority.HIGHEST); + back.setPriority(Pane.Priority.HIGH); + forward.setPriority(Pane.Priority.HIGH); + exit.setPriority(Pane.Priority.HIGH); + + // 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(Material.valueOf( + plugin.getConfig().getString("settings.server.gui.innerPane.innerPane"))) + .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(Material.valueOf( + plugin.getConfig().getString("settings.server.gui.outlinePane.outlinePane"))) + .withName(" ") + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build())); + + gui.addPane(oPane); + } + + // Back item + Material bm = Material.valueOf(plugin.getConfig().getString("settings.server.gui.back.back")); + ItemStack backItem = new ItemStackBuilder(bm) + .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 + Material fm = Material.valueOf(plugin.getConfig().getString("settings.server.gui.forward.forward")); + ItemStack forwardItem = new ItemStackBuilder(fm) + .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 + Material em = Material.valueOf(plugin.getConfig().getString("settings.server.gui.exit.exit")); + ItemStack item = new ItemStackBuilder(em) + .withName(Translations.EXIT.get(player)) + .withLore(Translations.EXIT_LORE.getList(player)) + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build(); + exit.addItem(new GuiItem(item, event -> { + gui.update(); + player.closeInventory(); + }), 0, 0); + + gui.addPane(exit); + gui.addPane(back); + gui.addPane(forward); + gui.addPane(pane); + + return pane; + } + + public abstract ChestGui getGui(); + + public void open() { + player.closeInventory(); + render(); + getGui().show(player); + } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RegionCreateGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RegionCreateGUI.java new file mode 100644 index 0000000..71a500f --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/RegionCreateGUI.java @@ -0,0 +1,248 @@ +package net.islandearth.rpgregions.gui; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.pane.OutlinePane; +import com.github.stefvanschie.inventoryframework.pane.Pane; +import com.github.stefvanschie.inventoryframework.pane.StaticPane; +import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.chat.RPGRegionsConversationPrefix; +import net.islandearth.rpgregions.chat.RPGRegionsStringPrompt; +import net.islandearth.rpgregions.effects.RegionEffectRegistry; +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.RegionRequirementRegistry; +import net.islandearth.rpgregions.rewards.RegionRewardRegistry; +import net.islandearth.rpgregions.utils.ItemStackBuilder; +import net.islandearth.rpgregions.utils.XSound; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; + +public class RegionCreateGUI extends RPGRegionsGUI { + + private final RPGRegions plugin; + private final Player player; + private final ConfiguredRegion region; + private ChestGui gui; + + public RegionCreateGUI(RPGRegions plugin, Player player, ConfiguredRegion region) { + super(plugin, player); + this.plugin = plugin; + this.player = player; + this.region = region; + } + + @Override + public void render() { + this.gui = new ChestGui(6, region.getId()); + gui.setOnGlobalClick(click -> click.setCancelled(true)); + + OutlinePane oPane = new OutlinePane(0, 1, 9, 1, Pane.Priority.HIGHEST); + oPane.setRepeat(true); + oPane.addItem(new GuiItem(new ItemStackBuilder(Material.GRAY_STAINED_GLASS_PANE) + .withName(" ") + .addFlags(ItemFlag.HIDE_ATTRIBUTES) + .build())); + gui.addPane(oPane); + + StaticPane questInfo = new StaticPane(4, 0, 1, 1, Pane.Priority.HIGH); + ItemStack questInfoItem = new ItemStackBuilder(Material.TOTEM_OF_UNDYING) + .withName("&6" + region.getCustomName()) + .withLore("&7" + region.getDiscoveredLore(), "&e&lClick &7to save the region.") + .build(); + questInfo.addItem(new GuiItem(questInfoItem, event -> { + region.save(plugin); + player.playSound(player.getLocation(), Sound.ITEM_ARMOR_EQUIP_GENERIC, 1f, 1f); + }),0, 0); + gui.addPane(questInfo); + + StaticPane displayName = new StaticPane(0, 2, 1, 1, Pane.Priority.HIGH); + ItemStack displayNameItem = new ItemStackBuilder(Material.PAPER) + .withName("&6Set region display name &7- &6" + region.getCustomName()) + .withLore("&7Your region can be renamed at any time.", "&e&lClick &7to rename the region.") + .build(); + displayName.addItem(new GuiItem(displayNameItem, event -> { + ConversationFactory factory = new ConversationFactory(plugin) + .withModality(true) + .withPrefix(new RPGRegionsConversationPrefix()) + .withFirstPrompt(new RPGRegionsStringPrompt("What display name should this region have?")) + .withEscapeSequence("quit") + .withLocalEcho(true) + .withTimeout(60); + Conversation conversation = factory.buildConversation(player); + conversation.begin(); + conversation.addConversationAbandonedListener(abandonedEvent -> { + region.setCustomName((String) abandonedEvent.getContext().getSessionData("input")); + open(); + }); + player.closeInventory(); + }),0, 0); + gui.addPane(displayName); + + /*StaticPane description = new StaticPane(0, 3, 1, 1, Pane.Priority.HIGH); + ItemStack descriptionItem = new ItemStackBuilder(Material.PAPER) + .withName("&6Set region description &7- &6" + region.getDiscoveredLore()) + .withLore("&7What description the region should have.", "&e&lClick &7to set the region description.") + .build(); + description.addItem(new GuiItem(descriptionItem, event -> { + ConversationFactory factory = new ConversationFactory(plugin) + .withModality(true) + .withPrefix(new RPGRegionsConversationPrefix()) + .withFirstPrompt(new RPGRegionsStringPrompt("What description should this region have?")) + .withEscapeSequence("quit") + .withLocalEcho(true) + .withTimeout(60); + Conversation conversation = factory.buildConversation(player); + conversation.begin(); + conversation.addConversationAbandonedListener(abandonedEvent -> { + region.setDescription((String) abandonedEvent.getContext().getSessionData("input")); + open(); + }); + player.closeInventory(); + }),0, 0); + gui.addPane(description);*/ + + StaticPane delete = new StaticPane(0, 3, 1, 1, Pane.Priority.HIGH); + ItemStack deleteItem = new ItemStackBuilder(Material.REDSTONE) + .withName("&c&lDelete Region") + .withLore(" ", "&cThis action cannot be undone.", " ", "&c&lShift-Click &7to delete the region.") + .build(); + delete.addItem(new GuiItem(deleteItem, event -> { + if (event.getClick() == ClickType.SHIFT_LEFT) { + //TODO chat delete + } + player.closeInventory(); + }),0, 0); + gui.addPane(delete); + + StaticPane requirements = new StaticPane(4, 2, 1, 1, Pane.Priority.HIGH); + ItemStack requirementsItem = new ItemStackBuilder(Material.COMPARATOR) + .withName("&6Requirements") + .withLore("&7Requirements before a region can", "&7be entered by a player", "&e&lClick &7to edit region requirements.") + .build(); + requirements.addItem(new GuiItem(requirementsItem, event -> { + player.playSound(player.getLocation(), Sound.BLOCK_COMPARATOR_CLICK, 1f, 1f); + ItemStack editRequirements = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Edit requirements") + .build(); + ItemStack addObjectives = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Add requirements") + .build(); + GuiItem editRequirementGuiItem = new GuiItem(editRequirements, click -> { + new EditRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionRequirementRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player, 1f, 1f); + }); + GuiItem addRequirementGuiItem = new GuiItem(addObjectives, click -> { + new AddRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionRequirementRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player, 1f, 1f); + }); + new QueryGUI(plugin, player, Arrays.asList(addRequirementGuiItem, editRequirementGuiItem)).open(); + }),0, 0); + gui.addPane(requirements); + + StaticPane effects = new StaticPane(6, 2, 1, 1, Pane.Priority.HIGH); + ItemStack effectsItem = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Effects") + .withLore("&7Effects that are present within a region.", "&e&lClick &7to edit region effects.") + .build(); + effects.addItem(new GuiItem(effectsItem, event -> { + XSound.ITEM_BOOK_PAGE_TURN.play(player); + ItemStack editEffects = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Edit effects") + .build(); + ItemStack addEffects = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Add effects") + .build(); + GuiItem editEffectGuiItem = new GuiItem(editEffects, click -> { + new EditRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionEffectRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player); + }); + GuiItem addEffectGuiItem = new GuiItem(addEffects, click -> { + new AddRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionEffectRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player); + }); + new QueryGUI(plugin, player, Arrays.asList(addEffectGuiItem, editEffectGuiItem)).open(); + }),0, 0); + gui.addPane(effects); + + StaticPane hidden = new StaticPane(6, 3, 1, 1, Pane.Priority.HIGH); + ItemStack hiddenItem = new ItemStackBuilder(Material.ORANGE_BANNER) + .withName("&6Toggle hidden region &7- &6" + region.isHidden()) + .withLore("&7A hidden region does", "&7not appear in GUIs.", "&c&lShift-Click &7to toggle hidden region.") + .build(); + hidden.addItem(new GuiItem(hiddenItem, event -> { + if (event.getClick() == ClickType.SHIFT_LEFT) { + region.setHidden(!region.isHidden()); + player.playSound(player.getLocation(), Sound.BLOCK_TRIPWIRE_CLICK_ON, 1f, 1f); + open(); + } + }),0, 0); + gui.addPane(hidden); + + StaticPane discoverable = new StaticPane(6, 4, 1, 1, Pane.Priority.HIGH); + ItemStack discoverableItem = new ItemStackBuilder(Material.GREEN_BANNER) + .withName("&6Toggle discoverable &7- &6" + region.isDiscoverable()) + .withLore("&7Whether this region can be discovered.", "&c&lShift-Click &7to toggle restartable.") + .build(); + discoverable.addItem(new GuiItem(discoverableItem, event -> { + if (event.getClick() == ClickType.SHIFT_LEFT) { + region.setDiscoverable(!region.isDiscoverable()); + player.playSound(player.getLocation(), Sound.BLOCK_TRIPWIRE_CLICK_ON, 1f, 1f); + open(); + } + }),0, 0); + gui.addPane(discoverable); + + StaticPane teleportable = new StaticPane(6, 5, 1, 1, Pane.Priority.HIGH); + ItemStack teleportableItem = new ItemStackBuilder(Material.RED_BANNER) + .withName("&6Toggle teleportable &7- &6" + region.isTeleportable()) + .withLore("&7Whether this region can be teleported to.", "&c&lShift-Click &7to toggle teleportable.") + .build(); + teleportable.addItem(new GuiItem(teleportableItem, event -> { + if (event.getClick() == ClickType.SHIFT_LEFT) { + region.setTeleportable(!region.isTeleportable()); + player.playSound(player.getLocation(), Sound.BLOCK_TRIPWIRE_CLICK_ON, 1f, 1f); + open(); + } + }),0, 0); + gui.addPane(teleportable); + + StaticPane rewards = new StaticPane(8, 2, 1, 1, Pane.Priority.HIGH); + ItemStack rewardsItem = new ItemStackBuilder(Material.CHEST) + .withName("&6Rewards") + .withLore("&7Rewards are granted upon region discovery", "&e&lClick &7to edit region rewards.") + .build(); + rewards.addItem(new GuiItem(rewardsItem, event -> { + player.playSound(player.getLocation(), Sound.BLOCK_CHEST_OPEN, 1f, 1f); + ItemStack editRewards = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Edit rewards") + .build(); + ItemStack addRewards = new ItemStackBuilder(Material.WRITABLE_BOOK) + .withName("&6Add rewards") + .build(); + GuiItem editRewardGuiItem = new GuiItem(editRewards, click -> { + new EditRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionRewardRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player); + }); + GuiItem addRewardGuiItem = new GuiItem(addRewards, click -> { + new AddRegionElementGUI(plugin, player, region, plugin.getManagers().getRegistry(RegionRewardRegistry.class)).open(); + XSound.ITEM_BOOK_PAGE_TURN.play(player); + }); + new QueryGUI(plugin, player, Arrays.asList(addRewardGuiItem, editRewardGuiItem)).open(); + }),0, 0); + gui.addPane(rewards); + gui.update(); + } + + @Override + public ChestGui getGui() { + return gui; + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java index 42eb48e..3a2aa2f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java @@ -8,6 +8,11 @@ import net.islandearth.rpgregions.command.IconCommand; import net.islandearth.rpgregions.effects.PotionRegionEffect; import net.islandearth.rpgregions.effects.RegionEffect; import net.islandearth.rpgregions.effects.RegionEffectRegistry; +import net.islandearth.rpgregions.gui.element.BooleanGuiFieldElement; +import net.islandearth.rpgregions.gui.element.GuiFieldElementRegistry; +import net.islandearth.rpgregions.gui.element.IGuiFieldElementRegistry; +import net.islandearth.rpgregions.gui.element.IntegerGuiFieldElement; +import net.islandearth.rpgregions.gui.element.ItemStackGuiFieldElement; import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.RPGRegionsCache; @@ -61,6 +66,7 @@ public class RPGRegionsManagers implements IRPGRegionsManagers { private final IRPGRegionsCache regionsCache; private final IRegenerationManager regenerationManager; private final Map>, RPGRegionsRegistry> registry; + private final IGuiFieldElementRegistry guiFieldElementRegistry; public RPGRegionsManagers(RPGRegions plugin) throws ReflectiveOperationException, IllegalStateException, IOException { StorageType.valueOf(plugin.getConfig().getString("settings.storage.mode").toUpperCase()) @@ -154,6 +160,11 @@ public class RPGRegionsManagers implements IRPGRegionsManagers { if (Bukkit.getPluginManager().getPlugin("Plan") != null) { new PlanRegistryManager(plugin); } + + this.guiFieldElementRegistry = new GuiFieldElementRegistry(); + guiFieldElementRegistry.register(new BooleanGuiFieldElement()); + guiFieldElementRegistry.register(new IntegerGuiFieldElement()); + guiFieldElementRegistry.register(new ItemStackGuiFieldElement()); } @Override @@ -176,6 +187,11 @@ public class RPGRegionsManagers implements IRPGRegionsManagers { return regenerationManager; } + @Override + public IGuiFieldElementRegistry getGuiFieldElementRegistry() { + return guiFieldElementRegistry; + } + public Map>, RPGRegionsRegistry> getRegistry() { return registry; } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java index 55c8721..9fd9c9a 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java @@ -1,10 +1,12 @@ package net.islandearth.rpgregions.requirements; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; public class LevelRequirement extends RegionRequirement { + @GuiEditable("Level") private final int level; public LevelRequirement(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java index 24b934e..f33b973 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java @@ -1,13 +1,15 @@ package net.islandearth.rpgregions.requirements; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; public class MoneyRequirement extends RegionRequirement { - + + @GuiEditable("Money") private final double money; public MoneyRequirement(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PermissionRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PermissionRequirement.java index b052e52..9d71e3f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PermissionRequirement.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PermissionRequirement.java @@ -4,13 +4,14 @@ import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; -public final class PermissionRequirement extends QuestRequirement { +public final class PermissionRequirement extends RegionRequirement { @GuiEditable("Permission") - private String permission; + private final String permission; public PermissionRequirement(IRPGRegionsAPI api) { super(api); + this.permission = "rpgregions.admin"; } @Override @@ -22,4 +23,9 @@ public final class PermissionRequirement extends QuestRequirement { public String getName() { return "Permission"; } + + @Override + public String getText(Player player) { + return "Permission " + permission; + } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java index 9400119..0786d76 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java @@ -2,17 +2,21 @@ package net.islandearth.rpgregions.requirements; import me.clip.placeholderapi.PlaceholderAPI; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; public class PlaceholderRequirement extends RegionRequirement { private final CompareType integerCompareType; + @GuiEditable("The Placeholder") private final String placeholder; + @GuiEditable("Value to equal") private final String equal; public PlaceholderRequirement(IRPGRegionsAPI api) { this(api, "", ""); } + public PlaceholderRequirement(IRPGRegionsAPI api, String placeholder, String equal) { super(api); this.integerCompareType = CompareType.GREATER_THAN_OR_EQUAL_TO; diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/QuestRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/QuestRequirement.java index 12036d2..56087a9 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/QuestRequirement.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/QuestRequirement.java @@ -4,6 +4,7 @@ import me.blackvein.quests.Quest; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -11,6 +12,7 @@ import java.util.concurrent.ExecutionException; public class QuestRequirement extends RegionRequirement { + @GuiEditable("Quest id") private final String questId; public QuestRequirement(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirementRegistry.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirementRegistry.java index 06b57dc..00d5d68 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirementRegistry.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirementRegistry.java @@ -12,8 +12,8 @@ public final class RegionRequirementRegistry extends RPGRegionsRegistry clazz, IRPGRegionsAPI plugin, Object... data) { try { - Constructor constructor = clazz.getConstructor(); - return (RegionRequirement) constructor.newInstance(); + Constructor constructor = clazz.getConstructor(IRPGRegionsAPI.class); + return (RegionRequirement) constructor.newInstance(plugin); } catch (ReflectiveOperationException e) { e.printStackTrace(); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java index 731edbe..ba24876 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java @@ -1,11 +1,13 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.Bukkit; import org.bukkit.entity.Player; public class ConsoleCommandReward extends DiscoveryReward { + @GuiEditable("Command") private final String command; public ConsoleCommandReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java index e3339b8..cb2b27c 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java @@ -1,10 +1,12 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; public class ExperienceReward extends DiscoveryReward { - + + @GuiEditable("Experience") private final int xp; public ExperienceReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java index 4113b7d..6376219 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java @@ -1,12 +1,14 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; public class ItemReward extends DiscoveryReward { - + + @GuiEditable("Item") private final ItemStack item; public ItemReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java index fe04c67..f9180f4 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java @@ -1,9 +1,11 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; public abstract class LevelReward extends DiscoveryReward { + @GuiEditable("Level") private final int level; public LevelReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java index 1ce23ed..e16a29e 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -8,6 +9,7 @@ import org.bukkit.plugin.RegisteredServiceProvider; public class MoneyReward extends DiscoveryReward { + @GuiEditable("Money") private final int amount; public MoneyReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java index 5bf870d..1dcac53 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java @@ -1,10 +1,12 @@ package net.islandearth.rpgregions.rewards; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; public class PlayerCommandReward extends DiscoveryReward { + @GuiEditable("Command") private final String command; public PlayerCommandReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java index 593825f..9594a81 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/QuestReward.java @@ -4,6 +4,7 @@ import me.blackvein.quests.Quest; import me.blackvein.quests.Quester; import me.blackvein.quests.Quests; import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.gui.GuiEditable; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -11,6 +12,7 @@ import java.util.concurrent.ExecutionException; public class QuestReward extends DiscoveryReward { + @GuiEditable("Quest id") private final String questId; public QuestReward(IRPGRegionsAPI api) { diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/ReflectionUtils.java b/rpgregions/src/main/java/net/islandearth/rpgregions/utils/ReflectionUtils.java new file mode 100644 index 0000000..3fa9a1c --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/utils/ReflectionUtils.java @@ -0,0 +1,32 @@ +package net.islandearth.rpgregions.utils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class ReflectionUtils { + + /** + * Gets all fields from all super classes (up to Object.class) with the specified annotation. + * @param target origin class + * @param annotation annotation to find + * @return {@link CompletableFuture} with a list of the annotated fields + */ + public static CompletableFuture> getSuperFieldsFromAnnotationAsync(Class target, Class annotation) { + return CompletableFuture.supplyAsync(() -> { + List fields = new ArrayList<>(); + Class current = target; + while (!current.equals(Object.class)) { + for (Field declaredField : current.getDeclaredFields()) { + if (declaredField.isAnnotationPresent(annotation)) { + fields.add(declaredField); + } + } + current = current.getSuperclass(); + } + return fields; + }); + } +}