From f313a22caccd4ec50b787c326475da8bbdf0a57d Mon Sep 17 00:00:00 2001 From: SamB440 Date: Mon, 16 Mar 2020 17:07:28 +0000 Subject: [PATCH] Add %rpgregions_region_total%, add region requirements, update javadoc --- RPGRegions.iml | 2 +- api/build.gradle | 1 + .../requirements/LevelRequirement.java | 27 ++++++++++++++ .../rpgregions/requirements/PreventType.java | 24 +++++++++++++ .../requirements/RegionRequirement.java | 35 +++++++++++++++++++ .../rpgregions/rewards/DiscoveryReward.java | 2 +- gradle.properties | 2 +- .../WorldGuardLegacyIntegration.java | 16 ++++++++- .../worldguard/WorldGuardIntegration.java | 17 ++++++++- .../islandearth/rpgregions/RPGRegions.java | 2 ++ .../hooks/PlaceholderRegionHook.java | 2 ++ .../managers/RPGRegionsManagers.java | 1 + .../data/region/ConfiguredRegion.java | 10 ++++++ .../rpgregions/translation/Translations.java | 3 +- src/main/resources/lang/en_gb.yml | 3 +- 15 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java create mode 100644 api/src/main/java/net/islandearth/rpgregions/requirements/PreventType.java create mode 100644 api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java diff --git a/RPGRegions.iml b/RPGRegions.iml index a0f3273..0c30463 100644 --- a/RPGRegions.iml +++ b/RPGRegions.iml @@ -1,6 +1,6 @@ - + diff --git a/api/build.gradle b/api/build.gradle index 6f2e2a6..5b70296 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -30,4 +30,5 @@ repositories { dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compileOnly 'org.spigotmc:spigot-api:1.12-R0.1-SNAPSHOT' // spigot + implementation "io.papermc:paperlib:1.0.2" // paperlib - async teleport on Paper } diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java new file mode 100644 index 0000000..24b26c3 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/LevelRequirement.java @@ -0,0 +1,27 @@ +package net.islandearth.rpgregions.requirements; + +import org.bukkit.entity.Player; + +public class LevelRequirement extends RegionRequirement { + + private final int level; + + public LevelRequirement(int level) { + this.level = level; + } + + @Override + public boolean meetsRequirements(Player player) { + return player.getLevel() >= level; + } + + @Override + public String getName() { + return "Level"; + } + + @Override + public String getText(Player player) { + return "level " + level; + } +} diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/PreventType.java b/api/src/main/java/net/islandearth/rpgregions/requirements/PreventType.java new file mode 100644 index 0000000..1a33f97 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/PreventType.java @@ -0,0 +1,24 @@ +package net.islandearth.rpgregions.requirements; + +import io.papermc.lib.PaperLib; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.util.Vector; + +public enum PreventType { + TELEPORT, + PUSH; + + public void prevent(PlayerMoveEvent event) { + Player player = event.getPlayer(); + switch (this) { + case TELEPORT: + PaperLib.teleportAsync(player, event.getFrom()); + break; + case PUSH: + Vector vector = event.getTo().toVector().subtract(player.getLocation().toVector()).normalize(); + player.setVelocity(vector.multiply(0.5)); + break; + } + } +} diff --git a/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java b/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java new file mode 100644 index 0000000..7f37b80 --- /dev/null +++ b/api/src/main/java/net/islandearth/rpgregions/requirements/RegionRequirement.java @@ -0,0 +1,35 @@ +package net.islandearth.rpgregions.requirements; + +import org.bukkit.entity.Player; + +public abstract class RegionRequirement { + + private final PreventType preventType; + + public RegionRequirement() { + this.preventType = PreventType.TELEPORT; + } + + public RegionRequirement(PreventType preventType) { + this.preventType = preventType; + } + + /** + * Checks whether this player meets the requirements to enter. + * @param player player to check + * @return true if requirements are met by this player + */ + public abstract boolean meetsRequirements(Player player); + + public PreventType getPreventType() { + return preventType; + } + + /** + * User friendly name of this reward. + * @return name of reward + */ + public abstract String getName(); + + public abstract String getText(Player player); +} diff --git a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java index 3ccd50e..80c0041 100644 --- a/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java +++ b/api/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java @@ -6,7 +6,7 @@ public abstract class DiscoveryReward { /** * Awards this reward to the specified player - * @param player + * @param player player to award to */ public abstract void award(Player player); diff --git a/gradle.properties b/gradle.properties index c390c39..d80079e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ pluginGroup=net.islandearth -pluginVersion=1.1.5 +pluginVersion=1.1.6 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 50d6c6e..743c295 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 @@ -6,6 +6,8 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.RegionRequirement; +import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -38,7 +40,19 @@ public class WorldGuardLegacyIntegration implements IntegrationManager { Set regions = this.getProtectedRegions(new Location(player.getWorld(), x, y, z)); List stringRegions = new ArrayList<>(); - regions.forEach(region -> stringRegions.add(region.getId())); + regions.forEach(region -> { + ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(region.getId()); + if (configuredRegion != null) { + for (RegionRequirement requirement : configuredRegion.getRequirements()) { + if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } + } + } + stringRegions.add(region.getId()); + }); Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions)); } 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 daf84dd..e5f206e 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 @@ -8,6 +8,8 @@ import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.events.RegionsEnterEvent; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.requirements.RegionRequirement; +import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -40,7 +42,20 @@ public class WorldGuardIntegration implements IntegrationManager { Set regions = this.getProtectedRegions(new Location(player.getWorld(), x, y, z)); List stringRegions = new ArrayList<>(); - regions.forEach(region -> stringRegions.add(region.getId())); + regions.forEach(region -> { + ConfiguredRegion configuredRegion = plugin.getManagers().getRegionsCache().getConfiguredRegion(region.getId()); + if (configuredRegion != null) { + for (RegionRequirement requirement : configuredRegion.getRequirements()) { + if (!player.hasPermission("rpgregions.bypassentry") && !requirement.meetsRequirements(player)) { + requirement.getPreventType().prevent(pme); + Translations.CANNOT_ENTER.send(player, requirement.getText(player)); + return; + } + } + } + stringRegions.add(region.getId()); + }); + Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions)); } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java index dd3a81b..5d15369 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.listener.ConnectionListener; import net.islandearth.rpgregions.listener.MoveListener; import net.islandearth.rpgregions.listener.RegionListener; import net.islandearth.rpgregions.managers.RPGRegionsManagers; +import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.rewards.DiscoveryReward; import net.islandearth.rpgregions.translation.Translations; import net.islandearth.rpgregions.utils.XMaterial; @@ -188,6 +189,7 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu return new GsonBuilder() .registerTypeAdapter(DiscoveryReward.class, new AbstractAdapter(null)) .registerTypeAdapter(RegionEffect.class, new AbstractAdapter(null)) + .registerTypeAdapter(RegionRequirement.class, new AbstractAdapter(null)) .registerTypeHierarchyAdapter(PotionEffect.class, new PotionEffectAdapter(this)) .registerTypeHierarchyAdapter(ItemStack.class, new ItemStackAdapter()) .setPrettyPrinting() diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java index 36ab327..bf09ca6 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/api/integrations/hooks/PlaceholderRegionHook.java @@ -59,6 +59,8 @@ public class PlaceholderRegionHook extends PlaceholderExpansion { } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } + case "region_total": + return String.valueOf(plugin.getManagers().getRegionsCache().getConfiguredRegions().size()); default: return null; } 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 aec5fc3..1b58ffe 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java @@ -93,6 +93,7 @@ public class RPGRegionsManagers { Reader reader = new FileReader(file); ConfiguredRegion region = plugin.getGson().fromJson(reader, ConfiguredRegion.class); if (!region.getId().equals("exampleconfig")) regionsCache.addConfiguredRegion(region); + region.getRequirements().forEach(regionRequirement -> plugin.getLogger().warning("Warning: Region " + region.getId() + " uses requirements. These are highly experimental and there may be bypasses.")); reader.close(); } catch (Exception e) { plugin.getLogger().severe("Error loading region config " + file.getName() + ":"); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index b3ff31d..93a4c2a 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -3,6 +3,8 @@ package net.islandearth.rpgregions.managers.data.region; import com.google.gson.Gson; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.effects.RegionEffect; +import net.islandearth.rpgregions.requirements.LevelRequirement; +import net.islandearth.rpgregions.requirements.RegionRequirement; import net.islandearth.rpgregions.rewards.DiscoveryReward; import net.islandearth.rpgregions.utils.XMaterial; import net.islandearth.rpgregions.utils.XSound; @@ -16,6 +18,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -38,6 +41,7 @@ public class ConfiguredRegion { private final boolean hidden; private final boolean discoverable; private final List effects; + private final List requirements; public ConfiguredRegion(@Nullable World world, String id, String customName, List rewards, List effects, int x, int y, int z) { @@ -58,6 +62,7 @@ public class ConfiguredRegion { this.hidden = false; this.discoverable = true; this.effects = effects; + this.requirements = Collections.singletonList(new LevelRequirement(5)); } public ConfiguredRegion(@Nullable World world, String id, String customName, @@ -80,6 +85,7 @@ public class ConfiguredRegion { this.hidden = false; this.discoverable = true; this.effects = effects; + this.requirements = Collections.singletonList(new LevelRequirement(5)); } public String getId() { @@ -164,6 +170,10 @@ public class ConfiguredRegion { return effects; } + public List getRequirements() { + return requirements; + } + public void save(RPGRegions plugin) throws IOException { File file = new File(plugin.getDataFolder() + "/regions/" + this.id + ".json"); Writer writer = new FileWriter(file); diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java b/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java index 8305a6e..6e83584 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/translation/Translations.java @@ -20,7 +20,8 @@ public enum Translations { TELEPORT("&aClick to teleport"), CANNOT_TELEPORT("&cWe can't teleport you because that world doesn't exist!"), UNKNOWN_REGION("Unknown Realm"), - EXIT("&cExit"); + EXIT("&cExit"), + CANNOT_ENTER("&cYou require %0 to enter this area."); private final String defaultValue; private final boolean isList; diff --git a/src/main/resources/lang/en_gb.yml b/src/main/resources/lang/en_gb.yml index a89c76b..affc67f 100644 --- a/src/main/resources/lang/en_gb.yml +++ b/src/main/resources/lang/en_gb.yml @@ -9,4 +9,5 @@ discovered_subtitle: teleport: "&aClick to teleport" cannot_teleport: "&cWe can't teleport you because that world doesn't exist!" unknown_region: "Unknown Realm" -exit: "&cExit" \ No newline at end of file +exit: "&cExit" +cannot_enter: "&cYou require %0 to enter this area." \ No newline at end of file