diff --git a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java index c9941ef..b51dcef 100644 --- a/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/api/integrations/IntegrationManager.java @@ -13,6 +13,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -77,4 +79,7 @@ public interface IntegrationManager { } return true; } + + @NotNull + List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId); } diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java index c06d6e7..07fcef8 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/IStorageManager.java @@ -60,7 +60,6 @@ public interface IStorageManager { default void timing(long ms) { if (TIMINGS.size() >= 3) TIMINGS.remove(2); TIMINGS.add(ms); - System.out.println(ms); if (ms >= 20) { RPGRegionsAPI.getAPI().getLogger().warning("Grabbing accounts is taking a long time! (" + ms + "ms)"); } diff --git a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index a72d40f..a7335b9 100644 --- a/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/api/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -74,6 +74,9 @@ public class ConfiguredRegion { @EditableField(material = XMaterial.NETHER_STAR, name = "Set teleport cooldown", description = "Set the cooldown for teleportation") private int teleportCooldown; private boolean showActionbar; + @EditableField(material = XMaterial.RED_DYE, name = "Hex display colour", description = "Set the colour of the region. It is a hex colour (e.g 0x42f4f1 for red) and is used in dynmap.") + private final String colour; + private final String lineColour; public ConfiguredRegion(@Nullable World world, String id, String customName, List rewards, List effects) { @@ -98,6 +101,8 @@ public class ConfiguredRegion { this.alwaysShowTitles = false; this.teleportCooldown = 0; this.showActionbar = true; + this.colour = String.valueOf(13369344); + this.lineColour = String.valueOf(13369344); } public ConfiguredRegion(@Nullable World world, String id, String customName, @@ -314,6 +319,21 @@ public class ConfiguredRegion { this.showActionbar = showActionbar; } + @Nullable + public List getBoundingBox() { + return RPGRegionsAPI.getAPI().getManagers().getIntegrationManager().getBoundingBoxPoints(location, id); + } + + public String getColour() { + if (colour == null) return "0"; + return colour; + } + + public String getLineColour() { + if (lineColour == null) return "0"; + return lineColour; + } + public void save(IRPGRegionsAPI plugin) { try { File file = this.findFile(plugin); diff --git a/build.gradle b/build.gradle index 901e1c8..09bb309 100644 --- a/build.gradle +++ b/build.gradle @@ -52,6 +52,9 @@ repositories { maven { url 'https://repo.codemc.io/repository/maven-snapshots/' } + // Dynmap + maven { url 'https://repo.mikeprimm.com' } + flatDir { dir '../libraries' } } diff --git a/legacy/README.md b/legacy/README.md deleted file mode 100644 index 70e5f43..0000000 --- a/legacy/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Legacy -This only exists for historical reasons and will be removed at a future date. \ No newline at end of file diff --git a/legacy/build.gradle b/legacy/build.gradle deleted file mode 100644 index f94fc82..0000000 --- a/legacy/build.gradle +++ /dev/null @@ -1,70 +0,0 @@ -plugins { - id 'java' -} - -group = pluginGroup -version = pluginVersion - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 - -repositories { - mavenCentral() - mavenLocal() - - maven { url 'https://jitpack.io' } - - maven { - name 'papermc-repo' - url 'https://papermc.io/repo/repository/maven-public/' - } - - maven { - name 'sonatype' - url 'https://oss.sonatype.org/content/groups/public/' - } - - maven { - name 'CodeMC' - url 'https://repo.codemc.org/repository/maven-public' - } - - maven { url "https://repo.aikar.co/content/groups/aikar/" } - - // worldguard - maven { url "https://maven.enginehub.org/repo/" } - - // PAPI - maven { url 'http://repo.extendedclip.com/content/repositories/placeholderapi/' } - - // plan - maven { - name 'bintray' - url 'https://dl.bintray.com/rsl1122/Plan-repository' - } - - maven { url 'https://hub.spigotmc.org/nexus/content/repositories/public/' } - - // MythicMobs - maven { url 'https://mvn.lumine.io/repository/maven-public/' } - - maven { url 'https://repo.codemc.io/repository/maven-snapshots/' } - - flatDir { dir '../libraries' } -} - -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' - compileOnly ('com.sk89q.worldguard:worldguard-legacy:6.2') { - exclude group: 'com.destroystokyo.paper' - exclude group: 'org.spigotmc' - } - compileOnly ('com.sk89q.worldedit:worldedit-core:6.1.4-SNAPSHOT') { - exclude group: 'com.destroystokyo.paper' - exclude group: 'org.spigotmc' - } - implementation 'com.gitlab.samb440:languagy:2.0.3-RELEASE' // languagy - compileOnly 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' // spigot - compileOnly project(':rpgregions') - compileOnly project(':api') -} 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 deleted file mode 100644 index 3303071..0000000 --- a/legacy/src/main/java/net/islandearth/rpgregions/api/integrations/worldguard/WorldGuardLegacyIntegration.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.islandearth.rpgregions.api.integrations.worldguard; - -import com.sk89q.worldguard.bukkit.WorldGuardPlugin; -import com.sk89q.worldguard.protection.regions.ProtectedRegion; -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; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerMoveEvent; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -public class WorldGuardLegacyIntegration implements IntegrationManager { - - private final IRPGRegionsAPI plugin; - - public WorldGuardLegacyIntegration(IRPGRegionsAPI plugin) { - this.plugin = plugin; - } - - @Override - public boolean isInRegion(Location location) { - return !this.getProtectedRegions(location).isEmpty(); - } - - @Override - public void handleMove(PlayerMoveEvent pme) { - Player player = pme.getPlayer(); - int oldX = pme.getFrom().getBlockX(); - int oldY = pme.getFrom().getBlockY(); - int oldZ = pme.getFrom().getBlockZ(); - int x = pme.getTo().getBlockX(); - int y = pme.getTo().getBlockY(); - int z = pme.getTo().getBlockZ(); - Set oldRegions = this.getProtectedRegions(new Location(player.getWorld(), oldX, oldY, oldZ)); - Set regions = this.getProtectedRegions(new Location(player.getWorld(), x, y, z)); - - ConfiguredRegion prioritisedRegion = getPrioritisedRegion(pme.getTo()); - if (prioritisedRegion == null) return; - List stringRegions = new ArrayList<>(); - regions.forEach(region -> { - if (!prioritisedRegion.getId().equals(region.getId()) - && checkRequirements(pme, region.getId())) stringRegions.add(region.getId()); - }); - - stringRegions.add(0, getPrioritisedRegion(pme.getTo()).getId()); - Bukkit.getPluginManager().callEvent(new RegionsEnterEvent(player, stringRegions, !oldRegions.equals(regions))); - } - - @Override - public ConfiguredRegion getPrioritisedRegion(Location location) { - Set regions = this.getProtectedRegions(location); - ProtectedRegion highest = null; - for (ProtectedRegion region : regions) { - if (highest == null) { - highest = region; - continue; - } - - if (region.getPriority() >= highest.getPriority()) { - highest = region; - } - } - - if (highest == null) return null; - return plugin.getManagers().getRegionsCache().getConfiguredRegion(highest.getId()); - } - - @Override - public boolean exists(World world, String region) { - return WorldGuardPlugin.inst() - .getRegionContainer() - .get(world) - .getRegions().containsKey(region); - } - - private Set getProtectedRegions(Location location) { - return WorldGuardPlugin.inst() - .getRegionContainer() - .get(location.getWorld()) - .getApplicableRegions(location) - .getRegions(); - } - - @Override - public Set getAllRegionNames(org.bukkit.World world) { - return WorldGuardPlugin.inst() - .getRegionContainer() - .get(world) - .getRegions().keySet(); - } -} diff --git a/libraries/Dynmap-3.1-spigot.jar b/libraries/Dynmap-3.1-spigot.jar new file mode 100644 index 0000000..bafa822 Binary files /dev/null and b/libraries/Dynmap-3.1-spigot.jar differ diff --git a/modern/build.gradle b/modern/build.gradle index bd8ac8c..6aea3e9 100644 --- a/modern/build.gradle +++ b/modern/build.gradle @@ -67,6 +67,7 @@ dependencies { compileOnly name: 'Residence4.9.2.2' // residence compileOnly name: 'GriefPrevention' // griefprevention if (ultraRegionsSupport) compileOnly name: 'UltraRegions' // ultraregions + compileOnly 'org.jetbrains:annotations:20.1.0' compileOnly project(':api') compileOnly project(':rpgregions') } 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 39376d8..b5fdd9a 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 @@ -11,6 +11,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashSet; @@ -65,4 +67,9 @@ public class GriefPreventionIntegration implements IntegrationManager { } return claims; } + + @Override + public @NotNull List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId) { + return null; + } } 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 463aeff..e12a8c8 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 @@ -11,7 +11,10 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Set; public class ResidenceIntegration implements IntegrationManager { @@ -55,4 +58,9 @@ public class ResidenceIntegration implements IntegrationManager { public Set getAllRegionNames(World world) { return Residence.getInstance().getResidenceManager().getResidences().keySet(); } + + @Override + public @NotNull List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId) { + return null; + } } diff --git a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java index f90ab1d..8728c20 100644 --- a/modern/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java +++ b/modern/src/main/java/net/islandearth/rpgregions/api/integrations/rpgregions/RPGRegionsIntegration.java @@ -5,7 +5,10 @@ import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Set; public class RPGRegionsIntegration implements IntegrationManager { @@ -34,4 +37,9 @@ public class RPGRegionsIntegration implements IntegrationManager { public Set getAllRegionNames(World world) { return null; } + + @Override + public @NotNull List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId) { + return null; + } } 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 fb14fd6..65a36fd 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 @@ -14,6 +14,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashSet; @@ -86,6 +88,11 @@ public class UltraRegionsIntegration implements IntegrationManager { return regions; } + @Override + public @NotNull List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId) { + return null; + } + private List getProtectedRegions(Location location) { Optional world = UltraRegions.getAPI().getWorlds().find(location.getWorld()); if (world.isPresent()) { 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 14cb44d..4676af2 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 @@ -1,6 +1,7 @@ package net.islandearth.rpgregions.api.integrations.worldguard; import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.protection.regions.ProtectedRegion; @@ -13,6 +14,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -95,6 +98,22 @@ public class WorldGuardIntegration implements IntegrationManager { .getRegions().keySet(); } + @Override + @NotNull + public List getBoundingBoxPoints(Location regionLocation, @Nullable String regionId) { + List points = new ArrayList<>(); + for (ProtectedRegion protectedRegion : getProtectedRegions(regionLocation)) { + if (regionId != null && !protectedRegion.getId().equals(regionId)) { + continue; + } + + for (BlockVector2 point : protectedRegion.getPoints()) { + points.add(new Location(regionLocation.getWorld(), point.getX(), regionLocation.getY(), point.getZ())); + } + } + return points; + } + private Set getProtectedRegions(Location location) { return WorldGuard.getInstance() .getPlatform() diff --git a/rpgregions/build.gradle b/rpgregions/build.gradle index c3b01ce..01709f6 100644 --- a/rpgregions/build.gradle +++ b/rpgregions/build.gradle @@ -50,6 +50,9 @@ repositories { maven { url 'https://repo.codemc.io/repository/maven-snapshots/' } + // Dynmap + maven { url 'https://repo.mikeprimm.com' } + flatDir { dir '../libraries' } } @@ -85,6 +88,7 @@ dependencies { 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' + compileOnly name: 'Dynmap-3.1-spigot' // Dynmap compileOnly 'org.jetbrains:annotations:20.1.0' compileOnly project(':api') diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java index c57edf7..effb7d3 100644 --- a/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -49,6 +49,7 @@ import net.islandearth.rpgregions.rewards.QuestReward; import net.islandearth.rpgregions.rewards.RegionDiscoverReward; import net.islandearth.rpgregions.rewards.RegionRewardRegistry; import net.islandearth.rpgregions.rewards.TeleportReward; +import net.islandearth.rpgregions.tasks.DynmapTask; import net.islandearth.rpgregions.translation.Translations; import net.islandearth.rpgregions.utils.XMaterial; import net.islandearth.rpgregions.utils.XSound; @@ -70,6 +71,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; +import java.util.logging.Level; public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, LanguagyPluginHook { @@ -108,6 +110,7 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang this.registerListeners(); this.registerCommands(); this.hook(this); + this.registerTasks(); this.registerMetrics(); } @@ -163,6 +166,7 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang config.options().header(header); config.addDefault("settings.dev.debug", false); config.addDefault("settings.integration.name", getIntegration()); + config.addDefault("settings.external.dynmap", true); config.addDefault("settings.storage.mode", "file"); config.addDefault("settings.sql.host", "localhost"); config.addDefault("settings.sql.port", 3306); @@ -370,6 +374,14 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang return "WorldGuard"; } + private void registerTasks() { + if (Bukkit.getPluginManager().getPlugin("Dynmap") != null + && getConfig().getBoolean("settings.external.dynmap")) { + Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new DynmapTask(this), 0L, 20L); + getLogger().info("Registered support for Dynmap."); + } + } + private void registerMetrics() { Metrics metrics = new Metrics(this, 2066); // regions_discovered chart currently causes lag due to bStats not running it async :( @@ -392,4 +404,12 @@ public final class RPGRegions extends JavaPlugin implements IRPGRegionsAPI, Lang public boolean debug() { return this.getConfig().getBoolean("settings.dev.debug"); } + + public void debug(String debug) { + this.debug(debug, Level.INFO); + } + + public void debug(String debug, Level level) { + if (debug()) this.getLogger().log(level, "[Debug] " + debug); + } } diff --git a/rpgregions/src/main/java/net/islandearth/rpgregions/tasks/DynmapTask.java b/rpgregions/src/main/java/net/islandearth/rpgregions/tasks/DynmapTask.java new file mode 100644 index 0000000..7e580b4 --- /dev/null +++ b/rpgregions/src/main/java/net/islandearth/rpgregions/tasks/DynmapTask.java @@ -0,0 +1,57 @@ +package net.islandearth.rpgregions.tasks; + +import net.islandearth.rpgregions.RPGRegions; +import org.bukkit.Location; +import org.dynmap.DynmapAPI; +import org.dynmap.bukkit.DynmapPlugin; +import org.dynmap.markers.AreaMarker; +import org.dynmap.markers.MarkerSet; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DynmapTask implements Runnable { + + private final RPGRegions plugin; + private final DynmapAPI dynmapAPI; + private final Map markers; + private final MarkerSet markerSet; + + public DynmapTask(final RPGRegions plugin) { + this.plugin = plugin; + this.dynmapAPI = DynmapPlugin.plugin; + this.markers = new HashMap<>(); + this.markerSet = dynmapAPI.getMarkerAPI().createMarkerSet("rpgregions.regions", "Regions", dynmapAPI.getMarkerAPI().getMarkerIcons(), false); + } + + @Override + public void run() { + plugin.getManagers().getRegionsCache().getConfiguredRegions().forEach((name, region) -> { + List boundingBox = region.getBoundingBox(); + if (boundingBox == null) return; + if (!markers.containsKey(name)) { + if (region.getWorld() == null) return; + plugin.debug("Generated bounding box for dynmap integration (" + name + "): " + boundingBox); + String markerid = region.getWorld() + "_" + name; + AreaMarker am = markerSet.createAreaMarker(markerid, region.getCustomName(), true, region.getWorld().getName(), new double[1000], new double[1000], false); + markers.put(name, am); + } + + // Update the marker information + AreaMarker am = markers.get(name); + double[] x = new double[boundingBox.size()]; + double[] z = new double[boundingBox.size()]; + for(int i = 0; i < boundingBox.size(); i++) { + Location point = boundingBox.get(i); + x[i] = point.getX(); z[i] = point.getZ(); + } + + am.setCornerLocations(x, z); + am.setLabel(region.getCustomName(), true); + if (!region.getColour().equals("0")) am.setFillStyle(0.5, Integer.parseInt(region.getColour())); + if (!region.getLineColour().equals("0")) am.setLineStyle(1, 0.5, Integer.parseInt(region.getLineColour())); + am.setDescription("" + region.getCustomName() + ""); + }); + } +} diff --git a/rpgregions/src/main/resources/plugin.yml b/rpgregions/src/main/resources/plugin.yml index 6d4e1fb..02c7a4a 100644 --- a/rpgregions/src/main/resources/plugin.yml +++ b/rpgregions/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: RPGRegions version: @version@ main: net.islandearth.rpgregions.RPGRegions api-version: '1.13' -softdepend: [Hyperverse, Multiverse, Languagy, UltraRegions, WorldGuard, PlaceholderAPI, HeadDatabase, Residence, Plan, GriefPrevention, Vault, MythicMobs, AlonsoLevels] +softdepend: [Hyperverse, Multiverse, Languagy, UltraRegions, WorldGuard, PlaceholderAPI, HeadDatabase, Residence, Plan, GriefPrevention, Vault, MythicMobs, AlonsoLevels, Dynmap] authors: [SamB440] description: Discoverable regions website: https://fortitude.islandearth.net