From 37ec7c62dd800abee2104ea45986eaf4ffaa3c0b Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sat, 20 Feb 2021 16:54:19 +0000 Subject: [PATCH] Overhaul API (closes #26), add SQLite support (closes #25) --- RPGRegions.iml | 2 +- api/build.gradle | 23 +++- .../rpgregions/api/IRPGRegionsAPI.java | 30 +++++ .../rpgregions/api/RPGRegionsAPI.java | 17 +++ .../api/integrations/IntegrationManager.java | 8 +- .../api/integrations/IntegrationType.java | 13 +- .../rpgregions/editor/ClassEditor.java | 0 .../editor/annotate/EditableField.java | 0 .../rpgregions/editor/field/EditField.java | 0 .../managers/IRPGRegionsManagers.java | 16 +++ .../managers/IRegenerationManager.java | 6 + .../managers/data/IRPGRegionsCache.java | 18 +++ .../managers/data/IStorageManager.java | 2 +- .../data/account/RPGRegionsAccount.java | 0 .../data/region/ConfiguredRegion.java | 40 ++---- .../managers/data/region/Discovery.java | 0 .../managers/data/region/WorldDiscovery.java | 4 +- .../rpgregions/translation/Translations.java | 29 ++--- .../rpgregions/utils/ItemStackBuilder.java | 0 .../rpgregions/utils/RegenUtils.java | 6 +- .../rpgregions/utils/StringUtils.java | 0 .../utils/TextComponentBuilder.java | 0 .../rpgregions/utils/TitleAnimator.java | 7 +- .../rpgregions/utils/XMaterial.java | 58 ++++----- .../islandearth/rpgregions/utils/XSound.java | 0 .../src/main/resources/lang/en_gb.yml | 0 .../translation/TranslationsTest.java | 0 gradle.properties | 2 +- .../WorldGuardLegacyIntegration.java | 8 +- .../GriefPreventionIntegration.java | 6 +- .../residence/ResidenceIntegration.java | 6 +- .../ultraregions/UltraRegionsIntegration.java | 6 +- .../worldguard/WorldGuardIntegration.java | 6 +- rpgregions/build.gradle | 6 +- .../islandearth/rpgregions/RPGRegions.java | 15 +-- .../rpgregions/api/RPGRegionsAPI.java | 19 --- .../commands/RPGRegionsCommand.java | 2 +- .../managers/RPGRegionsManagers.java | 23 ++-- .../managers/data/RPGRegionsCache.java | 8 +- .../managers/data/SQLCommonStorage.java | 123 ++++++++++++++++++ .../rpgregions/managers/data/StorageType.java | 12 +- .../managers/data/sql/SqlStorage.java | 116 +---------------- .../managers/data/sqlite/SqliteStorage.java | 25 ++++ .../managers/data/yml/YamlStorage.java | 4 +- .../regeneration/RegenerationManager.java | 8 +- .../requirements/AlonsoLevelRequirement.java | 0 .../requirements/LevelRequirement.java | 0 .../requirements/MoneyRequirement.java | 0 .../requirements/PlaceholderRequirement.java | 0 .../rpgregions/rewards/AlonsoLevelReward.java | 0 .../rewards/ConsoleCommandReward.java | 0 .../rpgregions/rewards/ExperienceReward.java | 0 .../rpgregions/rewards/ItemReward.java | 0 .../rpgregions/rewards/LevelReward.java | 0 .../rpgregions/rewards/MessageReward.java | 0 .../rpgregions/rewards/MoneyReward.java | 0 .../rewards/PlayerCommandReward.java | 0 57 files changed, 396 insertions(+), 278 deletions(-) create mode 100644 api/src/main/java/net/islandearth/rpgregions/api/IRPGRegionsAPI.java create mode 100644 api/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java (90%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java (81%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java (100%) create mode 100644 api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java create mode 100644 api/src/main/java/net/islandearth/rpgregions/managers/IRegenerationManager.java create mode 100644 api/src/main/java/net/islandearth/rpgregions/managers/data/IRPGRegionsCache.java rename rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java => api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java (97%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java (87%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/managers/data/region/Discovery.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java (85%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/translation/Translations.java (72%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/ItemStackBuilder.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java (98%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/StringUtils.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/TextComponentBuilder.java (100%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java (79%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java (98%) rename {rpgregions => api}/src/main/java/net/islandearth/rpgregions/utils/XSound.java (100%) rename {rpgregions => api}/src/main/resources/lang/en_gb.yml (100%) rename {rpgregions => api}/src/test/java/net/islandearth/rpgregions/translation/TranslationsTest.java (100%) delete mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java create mode 100644 rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sqlite/SqliteStorage.java rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/requirements/AlonsoLevelRequirement.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java (100%) rename {api => rpgregions}/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java (100%) diff --git a/RPGRegions.iml b/RPGRegions.iml index 3c30d4e..9994807 100644 --- a/RPGRegions.iml +++ b/RPGRegions.iml @@ -1,5 +1,5 @@ - + diff --git a/api/build.gradle b/api/build.gradle index 531a8d5..080958c 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -33,14 +33,35 @@ repositories { url = 'http://repo.extendedclip.com/content/repositories/placeholderapi/' } + // MythicMobs + maven { + url = 'https://mvn.lumine.io/repository/maven-public/' + } + flatDir { dir '../libraries' } } dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' + testCompile group: 'junit', name: 'junit', version: '4.5' + testImplementation 'com.github.seeseemelk:MockBukkit-v1.15:0.3.0-SNAPSHOT' + testImplementation 'org.reflections:reflections:0.9.12' + + implementation 'com.gitlab.samb440.languagy:api:3ba744c0f1' // languagy compileOnly 'org.spigotmc:spigot-api:1.12.2-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 + compileOnly 'com.github.shynixn.headdatabase:hdb-api:1.0' // head database + compileOnly 'org.jetbrains:annotations:19.0.0' + compileOnly ('com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT') { + exclude group: 'com.google' + exclude group: 'org.bukkit' + exclude group: 'org.spigotmc' + } + compileOnly ('com.sk89q.worldguard:worldguard-bukkit:7.0.4-SNAPSHOT') { + exclude group: 'com.destroystokyo.paper' + exclude group: 'org.spigotmc' + } + compileOnly 'io.lumine.xikage:MythicMobs:4.9.1' implementation 'io.papermc:paperlib:1.0.4' // paperlib - async teleport on Paper } diff --git a/api/src/main/java/net/islandearth/rpgregions/api/IRPGRegionsAPI.java b/api/src/main/java/net/islandearth/rpgregions/api/IRPGRegionsAPI.java new file mode 100644 index 0000000..190490d --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/api/IRPGRegionsAPI.java @@ -0,0 +1,30 @@ +package net.islandearth.rpgregions.api; + +import com.google.gson.Gson; +import net.islandearth.languagy.api.language.Translator; +import net.islandearth.rpgregions.managers.IRPGRegionsManagers; +import org.bukkit.configuration.Configuration; + +import java.io.File; +import java.util.logging.Logger; + +public interface IRPGRegionsAPI { + + Translator getTranslator(); + + Logger getLogger(); + + File getDataFolder(); + + void saveResource(String path, boolean replace); + + Gson getGson(); + + Configuration getConfig(); + + IRPGRegionsManagers getManagers(); + + boolean debug(); + + boolean hasHeadDatabase(); +} diff --git a/api/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java b/api/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java new file mode 100644 index 0000000..ef16e10 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java @@ -0,0 +1,17 @@ +package net.islandearth.rpgregions.api; + +public final class RPGRegionsAPI { + + private RPGRegionsAPI() {} + + private static IRPGRegionsAPI api; + + public static IRPGRegionsAPI getAPI() { + return api; + } + + public static void setAPI(IRPGRegionsAPI api) { + if (RPGRegionsAPI.api != null && api != null) throw new IllegalStateException("API already set"); + RPGRegionsAPI.api = api; + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java similarity index 90% rename from rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java rename to api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java index d0583a1..9611ce8 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.api.integrations; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.requirements.DependencyRequirement; import net.islandearth.rpgregions.requirements.RegionRequirement; @@ -9,7 +10,6 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList; import java.util.List; @@ -43,14 +43,14 @@ public interface IntegrationManager { default boolean checkRequirements(PlayerMoveEvent event, String region) { Player player = event.getPlayer(); - RPGRegions plugin = JavaPlugin.getPlugin(RPGRegions.class); + IRPGRegionsAPI plugin = RPGRegionsAPI.getAPI(); ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(region); if (configuredRegion != null && configuredRegion.getRequirements() != null) { for (RegionRequirement requirement : configuredRegion.getRequirements()) { if (requirement instanceof DependencyRequirement) { DependencyRequirement dependencyRequirement = (DependencyRequirement) requirement; List discoveries = new ArrayList<>(); - RPGRegions.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).whenComplete((account, error) -> { + RPGRegionsAPI.getAPI().getManagers().getStorageManager().getAccount(player.getUniqueId()).whenComplete((account, error) -> { discoveries.addAll(account.getDiscoveredRegions().keySet()); }).exceptionally(error -> { error.printStackTrace(); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java similarity index 81% rename from rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java rename to api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java index 1a1b556..52a9790 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationType.java @@ -1,6 +1,6 @@ package net.islandearth.rpgregions.api.integrations; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import org.bukkit.Bukkit; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -22,13 +22,12 @@ public enum IntegrationType { this.path = path; } - public Optional get() throws ClassNotFoundException { - RPGRegions plugin = JavaPlugin.getPlugin(RPGRegions.class); + public Optional get(IRPGRegionsAPI plugin) throws ClassNotFoundException { 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(plugin); + Bukkit.getPluginManager().disablePlugin((JavaPlugin) plugin); return Optional.empty(); } @@ -36,15 +35,15 @@ public enum IntegrationType { .forName("net.islandearth.rpgregions.api.integrations." + path); IntegrationManager generatedClazz = null; try { - generatedClazz = clazz.getConstructor(RPGRegions.class).newInstance(JavaPlugin.getPlugin(RPGRegions.class)); + generatedClazz = clazz.getConstructor(IRPGRegionsAPI.class).newInstance(plugin); if (generatedClazz instanceof Listener) { // Register events if applicable - Bukkit.getPluginManager().registerEvents((Listener) generatedClazz, plugin); + Bukkit.getPluginManager().registerEvents((Listener) generatedClazz, (JavaPlugin) plugin); } plugin.getLogger().info("Loaded IntegrationManager implementation " + clazz.getName() + "."); } catch (ReflectiveOperationException e) { plugin.getLogger().severe("Unable to load IntegrationManager (" + clazz.getName() + ")! Plugin will disable."); e.printStackTrace(); - Bukkit.getPluginManager().disablePlugin(plugin); + Bukkit.getPluginManager().disablePlugin((JavaPlugin) plugin); } return Optional.ofNullable(generatedClazz); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java b/api/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java rename to api/src/main/java/net/islandearth/rpgregions/editor/ClassEditor.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java b/api/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java rename to api/src/main/java/net/islandearth/rpgregions/editor/annotate/EditableField.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java b/api/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java rename to api/src/main/java/net/islandearth/rpgregions/editor/field/EditField.java diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java b/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java new file mode 100644 index 0000000..d1c22b8 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/managers/IRPGRegionsManagers.java @@ -0,0 +1,16 @@ +package net.islandearth.rpgregions.managers; + +import net.islandearth.rpgregions.api.integrations.IntegrationManager; +import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; +import net.islandearth.rpgregions.managers.data.IStorageManager; + +public interface IRPGRegionsManagers { + + IStorageManager getStorageManager(); + + IntegrationManager getIntegrationManager(); + + IRPGRegionsCache getRegionsCache(); + + IRegenerationManager getRegenerationManager(); +} diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/IRegenerationManager.java b/api/src/main/java/net/islandearth/rpgregions/managers/IRegenerationManager.java new file mode 100644 index 0000000..31a23cc --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/managers/IRegenerationManager.java @@ -0,0 +1,6 @@ +package net.islandearth.rpgregions.managers; + +public interface IRegenerationManager { + + void reload(); +} diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/IRPGRegionsCache.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/IRPGRegionsCache.java new file mode 100644 index 0000000..386505f --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/IRPGRegionsCache.java @@ -0,0 +1,18 @@ +package net.islandearth.rpgregions.managers.data; + +import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public interface IRPGRegionsCache { + + @Nullable + ConfiguredRegion getConfiguredRegion(String id); + + void addConfiguredRegion(ConfiguredRegion region); + + void removeConfiguredRegion(String id); + + Map getConfiguredRegions(); +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java similarity index 97% rename from rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java rename to api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java index 8451f17..971ccf4 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java @@ -6,7 +6,7 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentMap; -public interface StorageManager { +public interface IStorageManager { /** * Gets a player's account from the storage. diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java rename to api/src/main/java/net/islandearth/rpgregions/managers/data/account/RPGRegionsAccount.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java similarity index 87% rename from rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java rename to api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index e19586d..4a58f7f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -2,12 +2,12 @@ package net.islandearth.rpgregions.managers.data.region; import com.google.gson.Gson; import me.arcaniax.hdb.api.HeadDatabaseAPI; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.command.IconCommand; import net.islandearth.rpgregions.editor.annotate.EditableField; import net.islandearth.rpgregions.effects.RegionEffect; import net.islandearth.rpgregions.regenerate.Regenerate; -import net.islandearth.rpgregions.requirements.LevelRequirement; import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.rewards.DiscoveryReward; import net.islandearth.rpgregions.translation.Translations; @@ -20,7 +20,6 @@ import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,7 +31,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -45,8 +43,8 @@ public class ConfiguredRegion { @EditableField(material = XMaterial.NAME_TAG, name = "Set name", description = "Set the display name of the region") private String customName; private final List rewards; - private final Sound sound; - private final String icon; + private Sound sound; + private String icon; private final String undiscoveredIcon; private final List iconCommand; @EditableField(description = "Toggle whether the coordinates of the region are shown", name = "Toggle coordinates") @@ -92,7 +90,7 @@ public class ConfiguredRegion { this.hidden = false; this.discoverable = true; this.effects = effects; - this.requirements = Collections.singletonList(new LevelRequirement(5)); + this.requirements = new ArrayList<>(); this.discoveredLore = new ArrayList<>(); this.alwaysShowTitles = false; this.teleportCooldown = 0; @@ -100,25 +98,9 @@ public class ConfiguredRegion { public ConfiguredRegion(@Nullable World world, String id, String customName, List rewards, List effects, Sound sound, XMaterial icon) { - this.world = world != null ? world.getUID() : null; - this.id = id; - this.customName = customName; - this.rewards = rewards; + this(world, id, customName, rewards, effects); this.sound = sound; this.icon = icon.name(); - this.undiscoveredIcon = icon.name(); - this.iconCommand = new ArrayList<>(); - this.showCoords = false; - this.hints = new ArrayList<>(); - this.showHint = false; - this.teleportable = false; - this.hidden = false; - this.discoverable = true; - this.effects = effects; - this.requirements = Collections.singletonList(new LevelRequirement(5)); - this.discoveredLore = new ArrayList<>(); - this.alwaysShowTitles = false; - this.teleportCooldown = 0; } public String getId() { @@ -146,14 +128,14 @@ public class ConfiguredRegion { @Nullable public ItemStack getIcon() { if (icon == null) return new ItemStack(XMaterial.TOTEM_OF_UNDYING.parseMaterial(true)); - if (icon.startsWith("hdb-") && JavaPlugin.getPlugin(RPGRegions.class).hasHeadDatabase()) return new ItemStack(new HeadDatabaseAPI().getItemHead(icon.replace("hdb-", ""))); + if (icon.startsWith("hdb-") && RPGRegionsAPI.getAPI().hasHeadDatabase()) return new ItemStack(new HeadDatabaseAPI().getItemHead(icon.replace("hdb-", ""))); return XMaterial.valueOf(icon).parseItem(true); } @Nullable public ItemStack getUndiscoveredIcon() { if (undiscoveredIcon == null) return new ItemStack(XMaterial.TOTEM_OF_UNDYING.parseMaterial(true)); - if (undiscoveredIcon.startsWith("hdb-") && JavaPlugin.getPlugin(RPGRegions.class).hasHeadDatabase()) return new ItemStack(new HeadDatabaseAPI().getItemHead(undiscoveredIcon.replace("hdb-", ""))); + if (undiscoveredIcon.startsWith("hdb-") && RPGRegionsAPI.getAPI().hasHeadDatabase()) return new ItemStack(new HeadDatabaseAPI().getItemHead(undiscoveredIcon.replace("hdb-", ""))); return XMaterial.valueOf(undiscoveredIcon).parseItem(true); } @@ -312,7 +294,7 @@ public class ConfiguredRegion { this.teleportCooldown = teleportCooldown; } - public void save(RPGRegions plugin) { + public void save(IRPGRegionsAPI plugin) { try { File file = this.findFile(plugin); if (file == null) file = new File(plugin.getDataFolder() + "/regions/" + this.id + ".json"); @@ -326,7 +308,7 @@ public class ConfiguredRegion { } } - public boolean delete(RPGRegions plugin) { + public boolean delete(IRPGRegionsAPI plugin) { try { File file = this.findFile(plugin); if (file == null) file = new File(plugin.getDataFolder() + "/regions/" + this.id + ".json"); @@ -338,7 +320,7 @@ public class ConfiguredRegion { } @Nullable - private File findFile(RPGRegions plugin) throws IOException { + private File findFile(IRPGRegionsAPI plugin) throws IOException { File folder = new File(plugin.getDataFolder() + "/regions/"); Stream files = Files.walk(Paths.get(folder.getPath())); List valid = files.filter(path -> Files.isRegularFile(path) && path.toFile().getName().equals(this.id + ".json")) diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/Discovery.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/Discovery.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/Discovery.java rename to api/src/main/java/net/islandearth/rpgregions/managers/data/region/Discovery.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java similarity index 85% rename from rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java rename to api/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java index 766a897..97a1f7c 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/WorldDiscovery.java @@ -2,8 +2,8 @@ package net.islandearth.rpgregions.managers.data.region; public class WorldDiscovery implements Discovery { - private String date; - private String region; + private final String date; + private final String region; public WorldDiscovery(String date, String region) { this.date = date; diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java b/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java similarity index 72% rename from rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java rename to api/src/main/java/net/islandearth/rpgregions/translation/Translations.java index 3c55027..32a3d0c 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java +++ b/api/src/main/java/net/islandearth/rpgregions/translation/Translations.java @@ -2,7 +2,8 @@ package net.islandearth.rpgregions.translation; import me.clip.placeholderapi.PlaceholderAPI; import net.islandearth.languagy.api.language.Language; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.api.RPGRegionsAPI; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -58,62 +59,54 @@ public enum Translations { } public void send(Player player) { - String message = RPGRegions.getAPI().getTranslator().getTranslationFor(player, this.getPath()); + String message = RPGRegionsAPI.getAPI().getTranslator().getTranslationFor(player, this.getPath()); player.sendMessage(message); - //Component component = MiniMessage.markdown().parse(this.setPapi(player, message)); - //BukkitAudiences.create(JavaPlugin.getPlugin(RPGRegions.class)).player(player).sendMessage(component); } public void send(Player player, String... values) { - String message = RPGRegions.getAPI().getTranslator().getTranslationFor(player, this.getPath()); + String message = RPGRegionsAPI.getAPI().getTranslator().getTranslationFor(player, this.getPath()); message = this.setPapi(player, replaceVariables(message, values)); player.sendMessage(message); - //Component component = MiniMessage.markdown().parse(message); - //BukkitAudiences.create(JavaPlugin.getPlugin(RPGRegions.class)).player(player).sendMessage(component); } public void sendList(Player player) { - List messages = RPGRegions.getAPI().getTranslator().getTranslationListFor(player, this.getPath()); - //Component component = MiniMessage.markdown().parse(this.setPapi(player, message)); - //BukkitAudiences.create(JavaPlugin.getPlugin(RPGRegions.class)).player(player).sendMessage(component); + List messages = RPGRegionsAPI.getAPI().getTranslator().getTranslationListFor(player, this.getPath()); messages.forEach(player::sendMessage); } public void sendList(Player player, String... values) { - List messages = RPGRegions.getAPI().getTranslator().getTranslationListFor(player, this.getPath()); + List messages = RPGRegionsAPI.getAPI().getTranslator().getTranslationListFor(player, this.getPath()); messages.forEach(message -> { message = this.setPapi(player, replaceVariables(message, values)); - //Component component = MiniMessage.markdown().parse(message); - //BukkitAudiences.create(JavaPlugin.getPlugin(RPGRegions.class)).player(player).sendMessage(component); player.sendMessage(message); }); } public String get(Player player) { - return this.setPapi(player, RPGRegions.getAPI().getTranslator().getTranslationFor(player, this.getPath())); + return this.setPapi(player, RPGRegionsAPI.getAPI().getTranslator().getTranslationFor(player, this.getPath())); } public String get(Player player, String... values) { - String message = RPGRegions.getAPI().getTranslator().getTranslationFor(player, this.getPath()); + String message = RPGRegionsAPI.getAPI().getTranslator().getTranslationFor(player, this.getPath()); message = replaceVariables(message, values); return this.setPapi(player, message); } public List getList(Player player) { List list = new ArrayList<>(); - RPGRegions.getAPI().getTranslator().getTranslationListFor(player, this.getPath()).forEach(text -> list.add(this.setPapi(player, text))); + RPGRegionsAPI.getAPI().getTranslator().getTranslationListFor(player, this.getPath()).forEach(text -> list.add(this.setPapi(player, text))); return list; } public List getList(Player player, String... values) { List messages = new ArrayList<>(); - RPGRegions.getAPI().getTranslator() + RPGRegionsAPI.getAPI().getTranslator() .getTranslationListFor(player, this.getPath()) .forEach(message -> messages.add(this.setPapi(player, replaceVariables(message, values)))); return messages; } - public static void generateLang(RPGRegions plugin) { + public static void generateLang(IRPGRegionsAPI plugin) { File lang = new File(plugin.getDataFolder() + "/lang/"); lang.mkdirs(); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/ItemStackBuilder.java b/api/src/main/java/net/islandearth/rpgregions/utils/ItemStackBuilder.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/ItemStackBuilder.java rename to api/src/main/java/net/islandearth/rpgregions/utils/ItemStackBuilder.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java b/api/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java similarity index 98% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java rename to api/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java index 63f59f7..a8c13b4 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java +++ b/api/src/main/java/net/islandearth/rpgregions/utils/RegenUtils.java @@ -17,7 +17,8 @@ import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import io.lumine.xikage.mythicmobs.MythicMobs; import io.lumine.xikage.mythicmobs.mobs.MythicMob; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; +import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.api.integrations.IntegrationType; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.regenerate.Regenerate; @@ -27,7 +28,6 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.io.FileInputStream; @@ -40,7 +40,7 @@ public class RegenUtils { public static boolean regenerate(ConfiguredRegion region) { Regenerate regenerate = region.getRegenerate(); if (regenerate != null) { - RPGRegions plugin = JavaPlugin.getPlugin(RPGRegions.class); + IRPGRegionsAPI plugin = RPGRegionsAPI.getAPI(); IntegrationType integrationType = IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase()); if (integrationType == IntegrationType.WORLDGUARD) { ProtectedRegion protectedRegion = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(region.getWorld())).getRegion(region.getId()); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/StringUtils.java b/api/src/main/java/net/islandearth/rpgregions/utils/StringUtils.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/StringUtils.java rename to api/src/main/java/net/islandearth/rpgregions/utils/StringUtils.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/TextComponentBuilder.java b/api/src/main/java/net/islandearth/rpgregions/utils/TextComponentBuilder.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/TextComponentBuilder.java rename to api/src/main/java/net/islandearth/rpgregions/utils/TextComponentBuilder.java diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java b/api/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java similarity index 79% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java rename to api/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java index 7d99df6..0301d75 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java +++ b/api/src/main/java/net/islandearth/rpgregions/utils/TitleAnimator.java @@ -1,14 +1,15 @@ package net.islandearth.rpgregions.utils; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import java.util.List; public class TitleAnimator { - public TitleAnimator(Player player, RPGRegions plugin, List titles, List subtitles, int speed) { + public TitleAnimator(Player player, IRPGRegionsAPI plugin, List titles, List subtitles, int speed) { new BukkitRunnable() { int current = 0; @Override @@ -28,6 +29,6 @@ public class TitleAnimator { plugin.getConfig().getInt("settings.server.discoveries.discovered.title.fadeout")); current++; } - }.runTaskTimer(plugin, 0L, speed); + }.runTaskTimer((JavaPlugin) plugin, 0L, speed); } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java b/api/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java similarity index 98% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java rename to api/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java index 3fd6678..6966d35 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java +++ b/api/src/main/java/net/islandearth/rpgregions/utils/XMaterial.java @@ -12,9 +12,9 @@ import org.apache.commons.lang.WordUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -1394,7 +1394,7 @@ public enum XMaterial { * @since 1.0.0 */ @Nullable - private static XMaterial requestOldXMaterial(@Nonnull String name, byte data) { + private static XMaterial requestOldXMaterial(@NotNull String name, byte data) { String holder = name + data; XMaterial cache = NAME_CACHE.getIfPresent(holder); if (cache != null) return cache; @@ -1422,7 +1422,7 @@ public enum XMaterial { * @return true if XMaterial enum has this material. * @since 1.0.0 */ - public static boolean contains(@Nonnull String name) { + public static boolean contains(@NotNull String name) { Validate.notEmpty(name, "Cannot check for null or empty material name"); name = format(name); @@ -1437,8 +1437,8 @@ public enum XMaterial { * @see #matchXMaterialWithData(String) * @since 2.0.0 */ - @Nonnull - public static Optional matchXMaterial(@Nonnull String name) { + @NotNull + public static Optional matchXMaterial(@NotNull String name) { Validate.notEmpty(name, "Cannot match a material with null or empty material name"); Optional oldMatch = matchXMaterialWithData(name); if (oldMatch.isPresent()) return oldMatch; @@ -1482,8 +1482,8 @@ public enum XMaterial { * @see #matchXMaterial(ItemStack) * @since 2.0.0 */ - @Nonnull - public static XMaterial matchXMaterial(@Nonnull Material material) { + @NotNull + public static XMaterial matchXMaterial(@NotNull Material material) { Objects.requireNonNull(material, "Cannot match null material"); return matchDefinedXMaterial(material.name(), (byte) -1) .orElseThrow(() -> new IllegalArgumentException("Unsupported Material With No Bytes: " + material.name())); @@ -1498,9 +1498,9 @@ public enum XMaterial { * @see #matchDefinedXMaterial(String, byte) * @since 2.0.0 */ - @Nonnull + @NotNull @SuppressWarnings("deprecation") - public static XMaterial matchXMaterial(@Nonnull ItemStack item) { + public static XMaterial matchXMaterial(@NotNull ItemStack item) { Objects.requireNonNull(item, "Cannot match null ItemStack"); String material = item.getType().name(); byte data = (byte) (ISFLAT || isDamageable(material) ? 0 : item.getDurability()); @@ -1521,8 +1521,8 @@ public enum XMaterial { * @see #matchXMaterial(ItemStack) * @since 3.0.0 */ - @Nonnull - private static Optional matchDefinedXMaterial(@Nonnull String name, byte data) { + @NotNull + private static Optional matchDefinedXMaterial(@NotNull String name, byte data) { boolean duplicated = isDuplicated(name); // Do basic number and boolean checks before accessing more complex enum stuff. @@ -1567,7 +1567,7 @@ public enum XMaterial { * @see #isDuplicated() * @since 2.0.0 */ - private static boolean isDuplicated(@Nonnull String name) { + private static boolean isDuplicated(@NotNull String name) { // Don't use matchXMaterial() since this method is being called from matchXMaterial() itself and will cause a StackOverflowError. for (Map.Entry duplicated : duplicated.entrySet()) { XMaterial material = duplicated.getKey(); @@ -1586,7 +1586,7 @@ public enum XMaterial { * @see #matchXMaterial(ItemStack) * @since 2.0.0 */ - @Nonnull + @NotNull public static Optional matchXMaterial(int id, byte data) { if (id < 0 || data < 0) return Optional.empty(); @@ -1604,8 +1604,8 @@ public enum XMaterial { * @return a Material enum name. * @since 2.0.0 */ - @Nonnull - private static String format(@Nonnull String name) { + @NotNull + private static String format(@NotNull String name) { return FORMAT_PATTERN.matcher( name.trim().replace('-', '_').replace(' ', '_')).replaceAll("").toUpperCase(Locale.ENGLISH); } @@ -1628,8 +1628,8 @@ public enum XMaterial { * @see #toWord(String) * @since 2.1.0 */ - @Nonnull - public static String toWord(@Nonnull Material material) { + @NotNull + public static String toWord(@NotNull Material material) { Objects.requireNonNull(material, "Cannot translate a null material to a word"); return toWord(material.name()); } @@ -1649,8 +1649,8 @@ public enum XMaterial { * @return a cleaned more readable enum name. * @since 2.1.0 */ - @Nonnull - private static String toWord(@Nonnull String name) { + @NotNull + private static String toWord(@NotNull String name) { return WordUtils.capitalize(name.replace('_', ' ').toLowerCase(Locale.ENGLISH)); } @@ -1661,8 +1661,8 @@ public enum XMaterial { * @return the exact major version. * @since 2.0.0 */ - @Nonnull - public static String getMajorVersion(@Nonnull String version) { + @NotNull + public static String getMajorVersion(@NotNull String version) { Validate.notEmpty(version, "Cannot get major Minecraft version from null or empty string"); // getVersion() @@ -1691,7 +1691,7 @@ public enum XMaterial { * @see #isDamageable() * @since 1.0.0 */ - public static boolean isDamageable(@Nonnull String name) { + public static boolean isDamageable(@NotNull String name) { Objects.requireNonNull(name, "Material name cannot be null"); for (String damageable : DAMAGEABLE) if (name.contains(damageable)) return true; @@ -1739,7 +1739,7 @@ public enum XMaterial { * @return true if one of the given material names is similar to the base material. * @since 3.1.1 */ - public static boolean isOneOf(@Nonnull Material material, @Nullable List materials) { + public static boolean isOneOf(@NotNull Material material, @Nullable List materials) { if (materials == null || materials.isEmpty()) return false; Objects.requireNonNull(material, "Cannot match materials with a null material"); String name = material.name(); @@ -1789,9 +1789,9 @@ public enum XMaterial { * @see #parseItem() * @since 3.0.0 */ - @Nonnull + @NotNull @SuppressWarnings("deprecation") - public ItemStack setType(@Nonnull ItemStack item) { + public ItemStack setType(@NotNull ItemStack item) { Objects.requireNonNull(item, "Cannot set material for null ItemStack"); item.setType(this.parseMaterial()); @@ -1822,7 +1822,7 @@ public enum XMaterial { * @return true if it's one of the legacy names. * @since 2.0.0 */ - private boolean anyMatchLegacy(@Nonnull String name) { + private boolean anyMatchLegacy(@NotNull String name) { for (String legacy : this.legacy) { if (legacy.isEmpty()) break; // Left-side suggestion list if (name.equals(legacy)) return true; @@ -1902,7 +1902,7 @@ public enum XMaterial { * @return a list of legacy material names and the first element as the version the material was added in if new. * @since 1.0.0 */ - @Nonnull + @NotNull public String[] getLegacy() { return legacy; } @@ -2014,7 +2014,7 @@ public enum XMaterial { * @since 1.0.0 */ @SuppressWarnings("deprecation") - public boolean isSimilar(@Nonnull ItemStack item) { + public boolean isSimilar(@NotNull ItemStack item) { Objects.requireNonNull(item, "Cannot compare with null ItemStack"); if (item.getType() != this.parseMaterial()) return false; return ISFLAT || this.isDamageable() || item.getDurability() == this.data; @@ -2028,7 +2028,7 @@ public enum XMaterial { * @see #parseMaterial(boolean) * @since 2.0.0 */ - @Nonnull + @NotNull public List getSuggestions() { if (this.legacy.length == 0 || this.legacy[0].charAt(1) != '.') return new ArrayList<>(); List suggestions = new ArrayList<>(); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/utils/XSound.java b/api/src/main/java/net/islandearth/rpgregions/utils/XSound.java similarity index 100% rename from rpgregions/src/main/java/net/islandearth/rpgregions/utils/XSound.java rename to api/src/main/java/net/islandearth/rpgregions/utils/XSound.java diff --git a/rpgregions/src/main/resources/lang/en_gb.yml b/api/src/main/resources/lang/en_gb.yml similarity index 100% rename from rpgregions/src/main/resources/lang/en_gb.yml rename to api/src/main/resources/lang/en_gb.yml diff --git a/rpgregions/src/test/java/net/islandearth/rpgregions/translation/TranslationsTest.java b/api/src/test/java/net/islandearth/rpgregions/translation/TranslationsTest.java similarity index 100% rename from rpgregions/src/test/java/net/islandearth/rpgregions/translation/TranslationsTest.java rename to api/src/test/java/net/islandearth/rpgregions/translation/TranslationsTest.java diff --git a/gradle.properties b/gradle.properties index 61274a1..07990cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ pluginGroup=net.islandearth -pluginVersion=1.3.4 +pluginVersion=1.3.5 # 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/legacy/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardLegacyIntegration.java b/legacy/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardLegacyIntegration.java index 81f3bc1..cca913f 100644 --- a/legacy/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardLegacyIntegration.java +++ b/legacy/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardLegacyIntegration.java @@ -2,7 +2,7 @@ package net.islandearth.rpgregions.api.integrations.worldguard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; @@ -20,15 +20,15 @@ import java.util.Set; public class WorldGuardLegacyIntegration implements IntegrationManager { - private final RPGRegions plugin; + private final IRPGRegionsAPI plugin; - public WorldGuardLegacyIntegration(RPGRegions plugin) { + public WorldGuardLegacyIntegration(IRPGRegionsAPI plugin) { this.plugin = plugin; } @Override public boolean isInRegion(Location location) { - return this.getProtectedRegions(location).size() > 0; + return !this.getProtectedRegions(location).isEmpty(); } @Override diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java index 159c69d..39376d8 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/griefprevention/GriefPreventionIntegration.java @@ -2,7 +2,7 @@ package net.islandearth.rpgregions.api.integrations.griefprevention; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; @@ -19,9 +19,9 @@ import java.util.Set; public class GriefPreventionIntegration implements IntegrationManager { - private final RPGRegions plugin; + private final IRPGRegionsAPI plugin; - public GriefPreventionIntegration(RPGRegions plugin) { + public GriefPreventionIntegration(IRPGRegionsAPI plugin) { this.plugin = plugin; } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java index 559464c..066de4b 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/residence/ResidenceIntegration.java @@ -2,7 +2,7 @@ package net.islandearth.rpgregions.api.integrations.residence; import com.bekvon.bukkit.residence.Residence; import com.bekvon.bukkit.residence.protection.ClaimedResidence; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; @@ -18,9 +18,9 @@ import java.util.Set; public class ResidenceIntegration implements IntegrationManager { - private final RPGRegions plugin; + private final IRPGRegionsAPI plugin; - public ResidenceIntegration(RPGRegions plugin) { + public ResidenceIntegration(IRPGRegionsAPI plugin) { this.plugin = plugin; } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java index b9fd56b..fb14fd6 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/ultraregions/UltraRegionsIntegration.java @@ -5,7 +5,7 @@ import me.TechsCode.UltraRegions.selection.XYZ; import me.TechsCode.UltraRegions.storage.ManagedWorld; import me.TechsCode.UltraRegions.storage.Region; import me.TechsCode.UltraRegions.storage.RegionQuery; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; @@ -24,9 +24,9 @@ import java.util.stream.Collectors; public class UltraRegionsIntegration implements IntegrationManager { - private final RPGRegions plugin; + private final IRPGRegionsAPI plugin; - public UltraRegionsIntegration(RPGRegions plugin) { + public UltraRegionsIntegration(IRPGRegionsAPI plugin) { this.plugin = plugin; } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java index 19b8021..ade383d 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardIntegration.java @@ -4,7 +4,7 @@ import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.protection.regions.ProtectedRegion; -import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; @@ -20,9 +20,9 @@ import java.util.Set; public class WorldGuardIntegration implements IntegrationManager { - private final RPGRegions plugin; + private final IRPGRegionsAPI plugin; - public WorldGuardIntegration(RPGRegions plugin) { + public WorldGuardIntegration(IRPGRegionsAPI plugin) { this.plugin = plugin; } diff --git a/rpgregions/build.gradle b/rpgregions/build.gradle index a85cc58..cea7394 100644 --- a/rpgregions/build.gradle +++ b/rpgregions/build.gradle @@ -56,6 +56,8 @@ repositories { maven { url = 'https://mvn.lumine.io/repository/maven-public/' } + + flatDir { dir '../libraries' } } dependencies { @@ -63,8 +65,6 @@ dependencies { testImplementation 'com.github.seeseemelk:MockBukkit-v1.15:0.3.0-SNAPSHOT' testImplementation 'org.reflections:reflections:0.9.12' - //implementation 'net.kyori:adventure-text-minimessage:4.0.0-SNAPSHOT' - //implementation 'net.kyori:adventure-platform-bukkit:4.0.0-SNAPSHOT' implementation 'com.gitlab.samb440.languagy:api:master-SNAPSHOT' // languagy implementation 'co.aikar:acf-paper:0.5.0-SNAPSHOT' // commands implementation 'co.aikar:idb-core:1.0.0-SNAPSHOT' // database @@ -86,6 +86,8 @@ dependencies { } compileOnly 'org.spigotmc:spigot-api:1.13.2-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 compileOnly 'com.github.shynixn.headdatabase:hdb-api:1.0' // head database compileOnly 'com.djrapitops:Plan-api:5.1-R0.4' // plan compileOnly 'io.lumine.xikage:MythicMobs:4.9.1' diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java index 7054fc5..96451ed 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -10,6 +10,7 @@ import net.islandearth.languagy.api.language.Language; import net.islandearth.languagy.api.language.LanguagyImplementation; import net.islandearth.languagy.api.language.LanguagyPluginHook; import net.islandearth.languagy.api.language.Translator; +import net.islandearth.rpgregions.api.IRPGRegionsAPI; import net.islandearth.rpgregions.api.RPGRegionsAPI; import net.islandearth.rpgregions.commands.RPGRegionsCommand; import net.islandearth.rpgregions.effects.RegionEffect; @@ -45,11 +46,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, LanguagyPluginHook { +public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, LanguagyPluginHook { private RPGRegionsManagers managers; - private static RPGRegions plugin; + @Override public Translator getTranslator() { return translator; } @@ -65,7 +66,7 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu return; } - plugin = this; + RPGRegionsAPI.setAPI(this); this.createConfig(); this.generateLang(); try { @@ -212,7 +213,7 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu }); manager.getCommandContexts().registerContext(ConfiguredRegion.class, context -> { String id = context.popFirstArg(); - for (ConfiguredRegion region : plugin.getManagers().getRegionsCache().getConfiguredRegions().values()) { + for (ConfiguredRegion region : managers.getRegionsCache().getConfiguredRegions().values()) { if (region.getId().equals(id)) { return region; } @@ -222,15 +223,12 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu manager.registerCommand(new RPGRegionsCommand(this)); } - public static RPGRegionsAPI getAPI() { - return plugin; - } - @Override public void onLanguagyHook() { translator.setDisplay(XMaterial.MAP.parseMaterial()); } + @Override public Gson getGson() { return new GsonBuilder() .registerTypeAdapter(DiscoveryReward.class, new AbstractAdapter(null)) @@ -251,6 +249,7 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu || Bukkit.getVersion().contains("1.8"); } + @Override public boolean hasHeadDatabase() { return Bukkit.getPluginManager().getPlugin("HeadDatabase") != null; } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java deleted file mode 100644 index 4cabb95..0000000 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/RPGRegionsAPI.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.islandearth.rpgregions.api; - -import net.islandearth.languagy.api.language.Translator; -import net.islandearth.rpgregions.managers.RPGRegionsManagers; - -public interface RPGRegionsAPI { - - /** - * Gets the class handling managers. - * @return class handling managers - */ - RPGRegionsManagers getManagers(); - - /** - * Gets the translator provided by Languagy - * @return Translator - */ - Translator getTranslator(); -} 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 2b13249..ae01978 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/commands/RPGRegionsCommand.java @@ -157,7 +157,7 @@ public class RPGRegionsCommand extends BaseCommand { } plugin.reloadConfig(); - plugin.getManagers().getRegenerationManager().reload(plugin); + plugin.getManagers().getRegenerationManager().reload(); long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; sender.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)"); 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 8d53c16..82f9eee 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java @@ -7,8 +7,9 @@ import net.islandearth.rpgregions.api.integrations.hooks.PlaceholderRegionHook; import net.islandearth.rpgregions.command.IconCommand; import net.islandearth.rpgregions.effects.PotionRegionEffect; import net.islandearth.rpgregions.effects.RegionEffect; +import net.islandearth.rpgregions.managers.data.IRPGRegionsCache; +import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.RPGRegionsCache; -import net.islandearth.rpgregions.managers.data.StorageManager; import net.islandearth.rpgregions.managers.data.StorageType; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.managers.regeneration.RegenerationManager; @@ -45,12 +46,12 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -public class RPGRegionsManagers { +public class RPGRegionsManagers implements IRPGRegionsManagers { - private StorageManager storageManager; + private IStorageManager storageManager; private IntegrationManager integrationManager; - private final RPGRegionsCache regionsCache; - private final RegenerationManager regenerationManager; + private final IRPGRegionsCache regionsCache; + private final IRegenerationManager regenerationManager; public RPGRegionsManagers(RPGRegions plugin) throws ReflectiveOperationException, IllegalStateException, IOException { StorageType.valueOf(plugin.getConfig().getString("settings.storage.mode").toUpperCase()) @@ -59,7 +60,7 @@ public class RPGRegionsManagers { if (storageManager == null) throw new IllegalStateException("Could not find StorageManager!"); IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase()) - .get() + .get(plugin) .ifPresent(integrationManager1 -> integrationManager = integrationManager1); this.regionsCache = new RPGRegionsCache(plugin); @@ -142,19 +143,23 @@ public class RPGRegionsManagers { } } - public StorageManager getStorageManager() { + @Override + public IStorageManager getStorageManager() { return storageManager; } + @Override public IntegrationManager getIntegrationManager() { return integrationManager; } - public RPGRegionsCache getRegionsCache() { + @Override + public IRPGRegionsCache getRegionsCache() { return regionsCache; } - public RegenerationManager getRegenerationManager() { + @Override + public IRegenerationManager getRegenerationManager() { return regenerationManager; } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/RPGRegionsCache.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/RPGRegionsCache.java index 8b60eb0..539e9f3 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/RPGRegionsCache.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/RPGRegionsCache.java @@ -7,28 +7,32 @@ import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class RPGRegionsCache { +public class RPGRegionsCache implements IRPGRegionsCache { private final RPGRegions plugin; - private Map configuredRegions = new ConcurrentHashMap<>(); + private final Map configuredRegions = new ConcurrentHashMap<>(); public RPGRegionsCache(RPGRegions plugin) { this.plugin = plugin; } @Nullable + @Override public ConfiguredRegion getConfiguredRegion(String id) { return configuredRegions.get(id); } + @Override public void addConfiguredRegion(ConfiguredRegion region) { configuredRegions.put(region.getId(), region); } + @Override public void removeConfiguredRegion(String id) { configuredRegions.remove(id); } + @Override public Map getConfiguredRegions() { return configuredRegions; } 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 new file mode 100644 index 0000000..1518ffc --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/SQLCommonStorage.java @@ -0,0 +1,123 @@ +package net.islandearth.rpgregions.managers.data; + +import co.aikar.idb.DB; +import co.aikar.idb.DbRow; +import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; +import net.islandearth.rpgregions.managers.data.region.Discovery; +import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +public abstract class SQLCommonStorage implements IStorageManager { + + protected static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS rpgregions_discoveries (uuid varchar(32) NOT NULL, region varchar(32) NOT NULL, time varchar(64) NOT NULL, PRIMARY KEY(uuid, region))"; + protected static final String SELECT_REGION = "SELECT * FROM rpgregions_discoveries WHERE uuid = ?"; + protected static final String INSERT_DISCOVERY = "INSERT INTO rpgregions_discoveries (uuid, region, time) VALUES (?, ?, ?)"; + protected static final String DELETE_DISCOVERIES = "DELETE * FROM rpgregions_discoveries WHERE uuid = ?"; + protected static final String DELETE_DISCOVERY = "DELETE * FROM rpgregions_discoveries WHERE uuid = ? AND region = ?"; + + private final ConcurrentMap cachedAccounts = new ConcurrentHashMap<>(); + + private final RPGRegions plugin; + + public SQLCommonStorage(RPGRegions plugin) { + this.plugin = plugin; + + } + + @Override + public CompletableFuture getAccount(UUID uuid) { + // Add a check to ensure accounts aren't taking a long time + long startTime = System.currentTimeMillis(); + CompletableFuture future = new CompletableFuture<>(); + if (cachedAccounts.containsKey(uuid)) { + future.complete(cachedAccounts.get(uuid)); + } else { + DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { + Map regions = new HashMap<>(); + for (DbRow row : results) { + String region = row.getString("region"); + regions.put(region, new WorldDiscovery(row.getString("time"), region)); + } + + RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); + cachedAccounts.put(uuid, account); + future.complete(account); + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + if (totalTime >= 20) { + plugin.getLogger().warning("Grabbing accounts is taking a long time! (" + totalTime + "ms)"); + } + }).exceptionally(t -> { + t.printStackTrace(); + return null; + }); + } + return future; + } + + @Override + public ConcurrentMap getCachedAccounts() { + return cachedAccounts; + } + + @Override + public void clearDiscoveries(UUID uuid) { + getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().clear()).exceptionally(t -> { + t.printStackTrace(); + return null; + }); + + DB.executeUpdateAsync(DELETE_DISCOVERIES, getDatabaseUuid(uuid)); + } + + @Override + public void clearDiscovery(UUID uuid, String regionId) { + getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().remove(regionId)).exceptionally(t -> { + t.printStackTrace(); + return null; + }); + + DB.executeUpdateAsync(DELETE_DISCOVERY, getDatabaseUuid(uuid), regionId); + } + + @Override + public void deleteAccount(UUID uuid) { + this.clearDiscoveries(uuid); + cachedAccounts.remove(uuid); + } + + @Override + public void removeCachedAccount(UUID uuid) { + RPGRegionsAccount account = cachedAccounts.get(uuid); + DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { + List current = new ArrayList<>(); + for (DbRow row : results) { + current.add(row.getString("region")); + } + + for (Discovery region : account.getDiscoveredRegions().values()) { + if (!current.contains(region.getRegion())) { + try { + DB.executeInsert(INSERT_DISCOVERY, getDatabaseUuid(uuid), region.getRegion(), region.getDate()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + cachedAccounts.remove(uuid); + }).exceptionally(t -> { + t.printStackTrace(); + return null; + }); + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageType.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageType.java index 3e91125..063b12f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageType.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/StorageType.java @@ -2,6 +2,7 @@ package net.islandearth.rpgregions.managers.data; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.managers.data.sql.SqlStorage; +import net.islandearth.rpgregions.managers.data.sqlite.SqliteStorage; import net.islandearth.rpgregions.managers.data.yml.YamlStorage; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -11,18 +12,19 @@ import java.util.Optional; public enum StorageType { FILE(YamlStorage.class), - SQL(SqlStorage.class); + SQL(SqlStorage.class), + SQLITE(SqliteStorage.class); - private final Class clazz; + private final Class clazz; - StorageType(Class clazz) { + StorageType(Class clazz) { this.clazz = clazz; } - public Optional get() { + public Optional get() { RPGRegions plugin = JavaPlugin.getPlugin(RPGRegions.class); plugin.getLogger().info("Loading StorageManager implementation..."); - StorageManager generatedClazz = null; + IStorageManager generatedClazz = null; try { generatedClazz = clazz.getConstructor(RPGRegions.class).newInstance(JavaPlugin.getPlugin(RPGRegions.class)); plugin.getLogger().info("Loaded StorageManager implementation " + clazz.getName() + "."); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java index ad5c769..a3b3686 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sql/SqlStorage.java @@ -3,39 +3,16 @@ package net.islandearth.rpgregions.managers.data.sql; import co.aikar.idb.DB; import co.aikar.idb.Database; import co.aikar.idb.DatabaseOptions; -import co.aikar.idb.DbRow; import co.aikar.idb.PooledDatabaseOptions; import net.islandearth.rpgregions.RPGRegions; -import net.islandearth.rpgregions.managers.data.StorageManager; -import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; -import net.islandearth.rpgregions.managers.data.region.Discovery; -import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; +import net.islandearth.rpgregions.managers.data.SQLCommonStorage; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -public class SqlStorage implements StorageManager { - - private static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS rpgregions_discoveries (uuid varchar(32) NOT NULL, region varchar(32) NOT NULL, time varchar(64) NOT NULL, PRIMARY KEY(uuid, region))"; - private static final String SELECT_REGION = "SELECT * FROM rpgregions_discoveries WHERE uuid = ?"; - private static final String INSERT_DISCOVERY = "INSERT INTO rpgregions_discoveries (uuid, region, time) VALUES (?, ?, ?)"; - private static final String DELETE_DISCOVERIES = "DELETE * FROM rpgregions_discoveries WHERE uuid = ?"; - private static final String DELETE_DISCOVERY = "DELETE * FROM rpgregions_discoveries WHERE uuid = ? AND region = ?"; - - private ConcurrentMap cachedAccounts = new ConcurrentHashMap<>(); - - private final RPGRegions plugin; +public class SqlStorage extends SQLCommonStorage { public SqlStorage(RPGRegions plugin) { - this.plugin = plugin; - + super(plugin); DatabaseOptions options = DatabaseOptions.builder().mysql(plugin.getConfig().getString("settings.sql.user"), plugin.getConfig().getString("settings.sql.pass"), plugin.getConfig().getString("settings.sql.db"), @@ -48,91 +25,4 @@ public class SqlStorage implements StorageManager { e.printStackTrace(); } } - - @Override - public CompletableFuture getAccount(UUID uuid) { - // Add a check to ensure accounts aren't taking a long time - long startTime = System.currentTimeMillis(); - CompletableFuture future = new CompletableFuture<>(); - if (cachedAccounts.containsKey(uuid)) { - future.complete(cachedAccounts.get(uuid)); - } else { - DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { - Map regions = new HashMap<>(); - for (DbRow row : results) { - String region = row.getString("region"); - regions.put(region, new WorldDiscovery(row.getString("time"), region)); - } - - RPGRegionsAccount account = new RPGRegionsAccount(uuid, regions); - cachedAccounts.put(uuid, account); - future.complete(account); - long endTime = System.currentTimeMillis(); - long totalTime = endTime - startTime; - if (totalTime >= 20) { - plugin.getLogger().warning("Grabbing accounts is taking a long time! (" + totalTime + "ms)"); - } - }).exceptionally(t -> { - t.printStackTrace(); - return null; - }); - } - return future; - } - - @Override - public ConcurrentMap getCachedAccounts() { - return cachedAccounts; - } - - @Override - public void clearDiscoveries(UUID uuid) { - getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().clear()).exceptionally(t -> { - t.printStackTrace(); - return null; - }); - - DB.executeUpdateAsync(DELETE_DISCOVERIES, getDatabaseUuid(uuid)); - } - - @Override - public void clearDiscovery(UUID uuid, String regionId) { - getAccount(uuid).thenAccept(account -> account.getDiscoveredRegions().remove(regionId)).exceptionally(t -> { - t.printStackTrace(); - return null; - }); - - DB.executeUpdateAsync(DELETE_DISCOVERY, getDatabaseUuid(uuid), regionId); - } - - @Override - public void deleteAccount(UUID uuid) { - this.clearDiscoveries(uuid); - cachedAccounts.remove(uuid); - } - - @Override - public void removeCachedAccount(UUID uuid) { - RPGRegionsAccount account = cachedAccounts.get(uuid); - DB.getResultsAsync(SELECT_REGION, getDatabaseUuid(uuid)).thenAccept(results -> { - List current = new ArrayList<>(); - for (DbRow row : results) { - current.add(row.getString("region")); - } - - for (Discovery region : account.getDiscoveredRegions().values()) { - if (!current.contains(region.getRegion())) { - try { - DB.executeInsert(INSERT_DISCOVERY, getDatabaseUuid(uuid), region.getRegion(), region.getDate()); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - cachedAccounts.remove(uuid); - }).exceptionally(t -> { - t.printStackTrace(); - return null; - }); - } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sqlite/SqliteStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sqlite/SqliteStorage.java new file mode 100644 index 0000000..031a987 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/sqlite/SqliteStorage.java @@ -0,0 +1,25 @@ +package net.islandearth.rpgregions.managers.data.sqlite; + +import co.aikar.idb.DB; +import co.aikar.idb.Database; +import co.aikar.idb.DatabaseOptions; +import co.aikar.idb.PooledDatabaseOptions; +import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.managers.data.SQLCommonStorage; + +import java.sql.SQLException; + +public class SqliteStorage extends SQLCommonStorage { + + public SqliteStorage(RPGRegions plugin) { + super(plugin); + DatabaseOptions options = DatabaseOptions.builder().sqlite(plugin.getDataFolder() + "/regions.sqlite").build(); + Database db = PooledDatabaseOptions.builder().options(options).createHikariDatabase(); + DB.setGlobalDatabase(db); + try { + db.executeUpdate(CREATE_TABLE); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java index 38787dc..5b7358f 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/yml/YamlStorage.java @@ -1,7 +1,7 @@ package net.islandearth.rpgregions.managers.data.yml; import net.islandearth.rpgregions.RPGRegions; -import net.islandearth.rpgregions.managers.data.StorageManager; +import net.islandearth.rpgregions.managers.data.IStorageManager; import net.islandearth.rpgregions.managers.data.account.RPGRegionsAccount; import net.islandearth.rpgregions.managers.data.region.Discovery; import net.islandearth.rpgregions.managers.data.region.WorldDiscovery; @@ -20,7 +20,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -public class YamlStorage implements StorageManager { +public class YamlStorage implements IStorageManager { private final ConcurrentMap cachedAccounts = new ConcurrentHashMap<>(); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/regeneration/RegenerationManager.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/regeneration/RegenerationManager.java index 6fa3228..dee3129 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/regeneration/RegenerationManager.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/regeneration/RegenerationManager.java @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.managers.regeneration; import net.islandearth.rpgregions.RPGRegions; +import net.islandearth.rpgregions.managers.IRegenerationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import net.islandearth.rpgregions.regenerate.Regenerate; import net.islandearth.rpgregions.tasks.RegenerationTask; @@ -9,15 +10,18 @@ import org.bukkit.Bukkit; import java.util.ArrayList; import java.util.List; -public class RegenerationManager { +public class RegenerationManager implements IRegenerationManager { + private final RPGRegions plugin; private final List tasks; public RegenerationManager(RPGRegions plugin) { + this.plugin = plugin; this.tasks = new ArrayList<>(); } - public void reload(RPGRegions plugin) { + @Override + public void reload() { tasks.forEach(task -> Bukkit.getScheduler().cancelTask(task)); tasks.clear(); for (ConfiguredRegion configuredRegion1 : plugin.getManagers().getRegionsCache().getConfiguredRegions().values()) { diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/AlonsoLevelRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/AlonsoLevelRequirement.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/requirements/AlonsoLevelRequirement.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/requirements/AlonsoLevelRequirement.java diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/requirements/MoneyRequirement.java diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java b/rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/requirements/PlaceholderRequirement.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/AlonsoLevelReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ConsoleCommandReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/LevelReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MessageReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/MoneyReward.java diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java b/rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java similarity index 100% rename from api/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java rename to rpgregions/src/main/java/net/islandearth/rpgregions/rewards/PlayerCommandReward.java