From c0850abff3c07928b6e4b827f87ebb2b256a0286 Mon Sep 17 00:00:00 2001 From: SamB440 Date: Fri, 11 Jun 2021 21:34:31 +0100 Subject: [PATCH] Update to 1.17, improvements to error handling --- RPGRegions.iml | 4 +- api/build.gradle | 2 +- .../api/integrations/IntegrationType.java | 2 - build.gradle | 6 +- gradle.properties | 2 +- modern/build.gradle | 2 +- rpgregions/build.gradle | 14 +- .../islandearth/rpgregions/RPGRegions.java | 6 +- .../exception/CouldNotStartException.java | 8 + .../islandearth/rpgregions/gui/EditorGUI.java | 248 ------------------ .../managers/RPGRegionsManagers.java | 26 +- .../managers/data/SQLCommonStorage.java | 1 - settings.gradle | 3 +- 13 files changed, 49 insertions(+), 275 deletions(-) create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/exception/CouldNotStartException.java delete mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java diff --git a/RPGRegions.iml b/RPGRegions.iml index 6e28103..dc5dee1 100644 --- a/RPGRegions.iml +++ b/RPGRegions.iml @@ -1,7 +1,7 @@ - + - + diff --git a/api/build.gradle b/api/build.gradle index 6e63b72..ecb11a4 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -53,7 +53,7 @@ dependencies { implementation 'com.gitlab.samb440:languagy:2.0.3-RELEASE' // languagy implementation 'io.papermc:paperlib:1.0.4' // paperlib - async teleport on Paper - compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' // spigot + compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT' // spigot compileOnly 'com.github.MilkBowl:VaultAPI:1.7' // vault compileOnly 'me.clip:placeholderapi:2.10.4' // PAPI compileOnly name: 'AlonsoLevels_v2.0-BETA' // alonsolevels diff --git a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java index 52a9790..c94581f 100644 --- a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java @@ -26,8 +26,6 @@ public enum IntegrationType { if (plugin.getManagers() != null && plugin.getManagers().getIntegrationManager() != null) throw new UnsupportedOperationException("IntegrationManager already loaded"); plugin.getLogger().info("Loading IntegrationManager implementation..."); if (Bukkit.getPluginManager().getPlugin(this.plugin) == null) { - plugin.getLogger().severe("Unable to load IntegrationManager. The requested plugin is not enabled."); - Bukkit.getPluginManager().disablePlugin((JavaPlugin) plugin); return Optional.empty(); } diff --git a/build.gradle b/build.gradle index 8eb6ad8..a8b2cd7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,8 @@ plugins { group = pluginGroup version = pluginVersion -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +java.sourceCompatibility = JavaVersion.VERSION_16 +java.targetCompatibility = JavaVersion.VERSION_16 repositories { mavenCentral() @@ -73,4 +73,4 @@ import org.apache.tools.ant.filters.ReplaceTokens processResources { filter ReplaceTokens, tokens: [version: version] -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a94dfc7..5bd2037 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ pluginGroup=net.islandearth -pluginVersion=1.3.8 +pluginVersion=1.3.9 # Set to false if you don't have access to the UltraRegions API jar to make the plugin compilable. The purchased plugin has support for it. ultraRegionsSupport=true diff --git a/modern/build.gradle b/modern/build.gradle index ad84f2b..e5e5bbe 100644 --- a/modern/build.gradle +++ b/modern/build.gradle @@ -56,7 +56,7 @@ dependencies { exclude group: 'com.destroystokyo.paper' exclude group: 'org.spigotmc' } - compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' // spigot + compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT' // spigot compileOnly name: 'Residence4.9.2.2' // residence compileOnly name: 'GriefPrevention' // griefprevention if (ultraRegionsSupport) compileOnly name: 'UltraRegions' // ultraregions diff --git a/rpgregions/build.gradle b/rpgregions/build.gradle index 96c48c6..2327d1c 100644 --- a/rpgregions/build.gradle +++ b/rpgregions/build.gradle @@ -2,6 +2,9 @@ plugins { id 'java' } +group = pluginGroup +version = pluginVersion + repositories { mavenCentral() mavenLocal() @@ -47,7 +50,7 @@ repositories { dependencies { testImplementation group: 'junit', name: 'junit', version: '4.5' - testImplementation 'com.github.seeseemelk:MockBukkit-v1.15:0.3.0-SNAPSHOT' + testImplementation 'com.github.seeseemelk:MockBukkit-v1.16:1.0.0' testImplementation 'org.reflections:reflections:0.9.12' implementation 'com.github.WesJD.AnvilGUI:anvilgui:bb60945f7a' // anvilgui @@ -69,7 +72,7 @@ dependencies { exclude group: 'org.bukkit' exclude group: 'org.spigotmc' } - compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' // spigot + compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT' // spigot compileOnly 'me.clip:placeholderapi:2.10.4' // PAPI compileOnly 'com.github.MilkBowl:VaultAPI:1.7' // vault compileOnly name: 'AlonsoLevels_v2.0-BETA' // alonsolevels @@ -90,3 +93,10 @@ javadoc { exclude 'net/islandearth/rpgregions/commands/**' exclude 'net/islandearth/rpgregions/utils/**' } + +import org.apache.tools.ant.filters.ReplaceTokens + +processResources { + filter ReplaceTokens, tokens: [version: version] +} + diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java index effb7d3..27804c1 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -18,6 +18,7 @@ import net.islandearth.rpgregions.commands.RPGRegionsDebugCommand; import net.islandearth.rpgregions.effects.PotionRegionEffect; import net.islandearth.rpgregions.effects.RegionEffect; import net.islandearth.rpgregions.effects.RegionEffectRegistry; +import net.islandearth.rpgregions.exception.CouldNotStartException; import net.islandearth.rpgregions.gson.AbstractAdapter; import net.islandearth.rpgregions.gson.ItemStackAdapter; import net.islandearth.rpgregions.gson.LocationAdapter; @@ -98,9 +99,8 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang this.generateLang(); try { this.managers = new RPGRegionsManagers(this); - } catch (ReflectiveOperationException | IOException e) { - getLogger().severe("Error starting managers: "); - e.printStackTrace(); + } catch (ReflectiveOperationException | IOException | CouldNotStartException e) { + getLogger().log(Level.SEVERE, "Error starting managers, please report this!", e); Bukkit.getPluginManager().disablePlugin(this); return; } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/exception/CouldNotStartException.java b/rpgregions/src/main/java/net/islandearth/rpgregions/exception/CouldNotStartException.java new file mode 100644 index 0000000..c553f1b --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/exception/CouldNotStartException.java @@ -0,0 +1,8 @@ +package net.islandearth.rpgregions.exception; + +public class CouldNotStartException extends Exception { + + public CouldNotStartException(final String message) { + super(message); + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java deleted file mode 100644 index 7685d7d..0000000 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/gui/EditorGUI.java +++ /dev/null @@ -1,248 +0,0 @@ -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.StaticPane; -import com.github.stefvanschie.inventoryframework.pane.util.Mask; -import me.arcaniax.hdb.api.HeadDatabaseAPI; -import net.islandearth.rpgregions.RPGRegions; -import net.islandearth.rpgregions.editor.ClassEditor; -import net.islandearth.rpgregions.editor.field.EditField; -import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; -import net.islandearth.rpgregions.translation.Translations; -import net.islandearth.rpgregions.utils.ItemStackBuilder; -import net.islandearth.rpgregions.utils.XMaterial; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import net.wesjd.anvilgui.AnvilGUI; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; - -import java.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); - PaginatedPane pane = new PaginatedPane(paneX, paneY, paneL, paneH); - OutlinePane oPane = new OutlinePane(oPaneX, oPaneY, oPaneL, oPaneH); - OutlinePane innerPane = new OutlinePane(iPaneX, iPaneY, iPaneL, iPaneH); - StaticPane back = new StaticPane(backX, backY, backL, backH); - StaticPane forward = new StaticPane(forwardX, forwardY, forwardL, forwardH); - StaticPane exit = new StaticPane(exitX, exitY, exitL, exitH); - - // Inner pane - if (plugin.getConfig().getBoolean("settings.server.gui.innerPane.show")) { - innerPane.setRepeat(true); - List mask = plugin.getConfig().getStringList("settings.server.gui.innerPane.mask"); - innerPane.applyMask(new Mask(mask.toArray(new String[]{}))); - innerPane.setOnClick(inventoryClickEvent -> inventoryClickEvent.setCancelled(true)); - - innerPane.addItem(new GuiItem(new ItemStackBuilder(XMaterial.matchXMaterial( - plugin.getConfig().getString("settings.server.gui.innerPane.innerPane")).get().parseItem(true)) - .withName(" ") - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build())); - - gui.addPane(innerPane); - } - - // Outline pane - if (plugin.getConfig().getBoolean("settings.server.gui.outlinePane.show")) { - oPane.setRepeat(true); - List mask = plugin.getConfig().getStringList("settings.server.gui.outlinePane.mask"); - oPane.applyMask(new Mask(mask.toArray(new String[]{}))); - oPane.setOnClick(inventoryClickEvent -> inventoryClickEvent.setCancelled(true)); - - oPane.addItem(new GuiItem(new ItemStackBuilder(XMaterial.matchXMaterial( - plugin.getConfig().getString("settings.server.gui.outlinePane.outlinePane")).get().parseItem(true)) - .withName(" ") - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build())); - - gui.addPane(oPane); - } - - // Back item - String bm = plugin.getConfig().getString("settings.server.gui.back.back"); - ItemStack backItem = bm.startsWith("hdb-") && plugin.hasHeadDatabase() - ? - new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(bm.replace("hdb-", ""))) - .withName(Translations.PREVIOUS_PAGE.get(player)) - .withLore(Translations.PREVIOUS_PAGE_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build() - : - new ItemStackBuilder(XMaterial.matchXMaterial( - plugin.getConfig().getString("settings.server.gui.back.back")).get().parseItem(true)) - .withName(Translations.PREVIOUS_PAGE.get(player)) - .withLore(Translations.PREVIOUS_PAGE_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build(); - - back.addItem(new GuiItem(backItem, event -> { - event.setCancelled(true); - if (pane.getPages() == 0 || pane.getPages() == 1) return; - - pane.setPage(pane.getPage() - 1); - - forward.setVisible(true); - gui.update(); - }), 0, 0); - - // Forward item - String fm = plugin.getConfig().getString("settings.server.gui.forward.forward"); - ItemStack forwardItem = fm.startsWith("hdb-") && plugin.hasHeadDatabase() - ? - new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(fm.replace("hdb-", ""))) - .withName(Translations.NEXT_PAGE.get(player)) - .withLore(Translations.NEXT_PAGE_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build() - : - new ItemStackBuilder(XMaterial.matchXMaterial( - plugin.getConfig().getString("settings.server.gui.forward.forward")).get().parseItem(true)) - .withName(Translations.NEXT_PAGE.get(player)) - .withLore(Translations.NEXT_PAGE_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build(); - - forward.addItem(new GuiItem(forwardItem, event -> { - event.setCancelled(true); - if (pane.getPages() == 0 || pane.getPages() == 1) return; - - pane.setPage(pane.getPage() + 1); - - back.setVisible(true); - gui.update(); - }), 0, 0); - - // Exit item - if (plugin.getConfig().getBoolean("settings.server.gui.exit.show")) { - String em = plugin.getConfig().getString("settings.server.gui.exit.exit"); - ItemStack item = em.startsWith("hdb-") && plugin.hasHeadDatabase() - ? - new ItemStackBuilder(new HeadDatabaseAPI().getItemHead(em.replace("hdb-", ""))) - .withName(Translations.EXIT.get(player)) - .withLore(Translations.EXIT_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build() - : - new ItemStackBuilder(XMaterial.matchXMaterial( - plugin.getConfig().getString("settings.server.gui.exit.exit")).get().parseItem(true)) - .withName(Translations.EXIT.get(player)) - .withLore(Translations.EXIT_LORE.getList(player)) - .addFlags(ItemFlag.HIDE_ATTRIBUTES) - .build(); - exit.addItem(new GuiItem(item, event -> { - event.setCancelled(true); - gui.update(); - player.closeInventory(); - String command = plugin.getConfig().getString("settings.server.gui.exit.command"); - if (!command.isEmpty()) player.performCommand(command - .replace("%player%", player.getName())); - player.sendMessage(ChatColor.GREEN + "Saving data..."); - long startTime = System.currentTimeMillis(); - region.save(plugin); - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - player.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)"); - }), 0, 0); - - gui.addPane(exit); - } - - gui.addPane(back); - gui.addPane(forward); - - List guiItems = new ArrayList<>(); - for (EditField editField : classEditor.getEditable()) { - ItemStack itemStack = new ItemStackBuilder(editField.getMaterial().parseMaterial(true)) - .withName(ChatColor.GREEN + editField.getName()) - .withLore(Arrays.asList(ChatColor.WHITE + editField.getDescription(), - ChatColor.GRAY + editField.getValue().getClass().getSimpleName().toLowerCase())) - .build(); - if (editField.getValue() instanceof Boolean) { - Boolean bool = (Boolean) editField.getValue(); - if (bool) { - itemStack.setType(XMaterial.LIME_DYE.parseMaterial(true)); - } else { - itemStack.setType(XMaterial.GRAY_DYE.parseMaterial(true)); - } - } - - try { - if (editField.getField().get(region) instanceof Location) { - guiItems.add(new GuiItem(itemStack, event -> { - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(player.getLocation()))); - this.open(); - })); - } else if (editField.getField().get(region) instanceof Boolean) { - Boolean bool = (Boolean) editField.getField().get(region); - guiItems.add(new GuiItem(itemStack, event -> { - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(!bool))); - player.closeInventory(); - new EditorGUI(plugin, player, region).open(); - })); - } else { - guiItems.add(new GuiItem(itemStack, event -> { - new AnvilGUI.Builder() - .onComplete((responder, text) -> { - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(editField.setValue(text))); - Bukkit.getScheduler().runTaskLater(plugin, this::open, 20L); - return AnvilGUI.Response.close(); - }) - .preventClose() - .text(region.getCustomName()) - .itemLeft(new ItemStack(Material.NAME_TAG)) - .title("Set display name") // only works in 1.14+ - .plugin(plugin) - .open(player); - })); - } - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - - pane.populateWithGuiItems(guiItems); - gui.addPane(pane); - } - - @Override - public void render() { - - } - - @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 91d0165..6872721 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,7 @@ 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.exception.CouldNotStartException; import net.islandearth.rpgregions.gui.element.BooleanGuiFieldElement; import net.islandearth.rpgregions.gui.element.GuiFieldElementRegistry; import net.islandearth.rpgregions.gui.element.IGuiFieldElementRegistry; @@ -55,28 +56,34 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; public class RPGRegionsManagers implements IRPGRegionsManagers { private IStorageManager storageManager; - private IntegrationManager integrationManager; + private final IntegrationManager integrationManager; 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 { + public RPGRegionsManagers(RPGRegions plugin) throws ReflectiveOperationException, CouldNotStartException, IOException { StorageType.valueOf(plugin.getConfig().getString("settings.storage.mode").toUpperCase()) .get() .ifPresent(storageManager1 -> storageManager = storageManager1); - if (storageManager == null) throw new IllegalStateException("Could not find StorageManager!"); + if (storageManager == null) throw new CouldNotStartException("Could not find StorageManager!"); - IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase()) - .get(plugin) - .ifPresent(integrationManager1 -> integrationManager = integrationManager1); + Optional integrationManager = IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase()) + .get(plugin); + if (integrationManager.isPresent()) { + this.integrationManager = integrationManager.get(); + } else { + throw new CouldNotStartException("Unable to load IntegrationManager. The requested plugin is not enabled."); + } this.regionsCache = new RPGRegionsCache(plugin); this.registry = new ConcurrentHashMap<>(); @@ -121,9 +128,11 @@ public class RPGRegionsManagers implements IRPGRegionsManagers { .collect(Collectors.toList()) .forEach(path -> { File file = path.toFile(); + plugin.debug("Walking file tree: " + file); if (regionsCache.getConfiguredRegions().containsKey(file.getName().replace(".json", ""))) { plugin.getLogger().severe("Duplicate region files have been found for " + file.getName() + ". " + - "In order to protect your data, the plugin will NOT load the duplicate region config."); + "In order to protect your data, the plugin will NOT load the duplicate region config " + + "(which is " + file + ")."); return; } // Exclude non-json files @@ -132,8 +141,7 @@ public class RPGRegionsManagers implements IRPGRegionsManagers { ConfiguredRegion region = plugin.getGson().fromJson(reader, ConfiguredRegion.class); if (!region.getId().equals("exampleconfig")) regionsCache.addConfiguredRegion(region); } catch (Exception e) { - plugin.getLogger().severe("Error loading region config " + file.getName() + ":"); - e.printStackTrace(); + plugin.getLogger().log(Level.SEVERE, "Error loading region config " + file.getName() + ".", e); } } }); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java index 85868df..0868723 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java @@ -31,7 +31,6 @@ public abstract class SQLCommonStorage implements IStorageManager { public SQLCommonStorage(RPGRegions plugin) { this.plugin = plugin; - } @Override diff --git a/settings.gradle b/settings.gradle index 15d381f..aca58e8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,3 @@ include 'rpgregions' include 'modern' -include 'api' - +include 'api' \ No newline at end of file