9
0
mirror of https://gitlab.com/SamB440/rpgregions-2.git synced 2025-12-26 18:29:16 +00:00

The new GUI editor is here!

This commit is contained in:
SamB440
2021-03-25 21:33:09 +00:00
parent 7df19ff2ba
commit 513513ec4d
28 changed files with 794 additions and 75 deletions

View File

@@ -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<ItemStack> ignoreItems;

View File

@@ -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<? extends IRPGRegionsRegistry<?>> clazz);
}

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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")

View File

@@ -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<GuiItem> 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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<GuiItem> 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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<String> 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<String> 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);
}
}

View File

@@ -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;
}
}

View File

@@ -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<Class<? extends RPGRegionsRegistry<?>>, 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<Class<? extends RPGRegionsRegistry<?>>, RPGRegionsRegistry<?>> getRegistry() {
return registry;
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -12,8 +12,8 @@ public final class RegionRequirementRegistry extends RPGRegionsRegistry<RegionRe
@Override
public @Nullable RegionRequirement getNew(Class<? extends RegionRequirement> 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();
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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<List<Field>> getSuperFieldsFromAnnotationAsync(Class<?> target, Class<? extends Annotation> annotation) {
return CompletableFuture.supplyAsync(() -> {
List<Field> 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;
});
}
}