From 61590472469f5733776ef62c19865b39248ceaf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien?= <43724816+Aurelien30000@users.noreply.github.com> Date: Sat, 13 Aug 2022 00:07:46 +0200 Subject: [PATCH] Replace unnecessarily expensive method getting chunks Fixes https://github.com/LandlordPlugin/LandLord/issues/22 --- .../landlord/api/IWorldGuardManager.java | 6 ++-- .../landlord/commands/claiming/Claim.java | 3 +- .../landlord/manager/map/LandMap.java | 5 ++-- .../protection/AWorldGuardManager.java | 30 +++++++++++++------ .../biz/princeps/landlord/util/JavaUtils.java | 10 +++++++ 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/LandLord-api/src/main/java/biz/princeps/landlord/api/IWorldGuardManager.java b/LandLord-api/src/main/java/biz/princeps/landlord/api/IWorldGuardManager.java index 2259a818..38029eb4 100644 --- a/LandLord-api/src/main/java/biz/princeps/landlord/api/IWorldGuardManager.java +++ b/LandLord-api/src/main/java/biz/princeps/landlord/api/IWorldGuardManager.java @@ -24,6 +24,8 @@ public interface IWorldGuardManager { IOwnedLand getRegion(String name); + IOwnedLand getRegion(World world, int chunkX, int chunkZ); + Set getRegions(UUID id, World world); Set getRegions(UUID id); @@ -69,9 +71,9 @@ public interface IWorldGuardManager { IOwnedLand[] getSurroundingsOwner(IOwnedLand land, UUID owner); - Map getNearbyLands(Chunk chunk, int offsetX, int offsetZ); + Map getNearbyLands(Chunk chunk, int offsetX, int offsetZ); - Map getNearbyLands(Location loc, int offsetX, int offsetZ); + Map getNearbyLands(Location loc, int offsetX, int offsetZ); int getRegionCount(UUID id); diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/commands/claiming/Claim.java b/LandLord-core/src/main/java/biz/princeps/landlord/commands/claiming/Claim.java index cbaa0e7b..a4e4b0af 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/commands/claiming/Claim.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/commands/claiming/Claim.java @@ -25,6 +25,7 @@ import org.bukkit.scheduler.BukkitRunnable; import java.util.Map; +import java.util.Set; /** * Project: LandLord @@ -409,7 +410,7 @@ private boolean isGapBetweenLands(Player player, Chunk chunk) { int radius = plugin.getConfig().getInt("CommandSettings.Claim.customGapRadius"); boolean differentOwner = false; - Map nearbyLands = wg.getNearbyLands(chunk, radius, radius); + Map nearbyLands = wg.getNearbyLands(chunk, radius, radius); for (IOwnedLand adjLand : nearbyLands.values()) { if (adjLand != null) { if (!adjLand.isOwner(player.getUniqueId())) { diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/manager/map/LandMap.java b/LandLord-core/src/main/java/biz/princeps/landlord/manager/map/LandMap.java index 273e6e08..901a9d1c 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/manager/map/LandMap.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/manager/map/LandMap.java @@ -3,6 +3,7 @@ import biz.princeps.landlord.api.ILandLord; import biz.princeps.landlord.api.IOwnedLand; import biz.princeps.landlord.api.IWorldGuardManager; +import biz.princeps.landlord.util.JavaUtils; import biz.princeps.landlord.util.MapConstants; import biz.princeps.landlord.util.SimpleScoreboard; import org.bukkit.ChatColor; @@ -200,7 +201,7 @@ private String[] buildMap(Player p) { String[][] mapBoard = getMapDir(p); String[] mapRows = new String[mapBoard.length + 3]; - Map nearby = wg.getNearbyLands(p.getLocation(), radius, radius); + Map nearby = wg.getNearbyLands(p.getLocation(), radius, radius); for (int z = 0; z < mapBoard.length; z++) { StringBuilder row = new StringBuilder(); @@ -209,7 +210,7 @@ private String[] buildMap(Player p) { int xx = x - radius; int zz = z - radius; - IOwnedLand land = nearby.get(p.getWorld().getChunkAt(xx + (p.getLocation().getBlockX() >> 4), zz + (p.getLocation().getBlockZ() >> 4))); + IOwnedLand land = nearby.get(JavaUtils.getChunkKey(xx + (p.getLocation().getBlockX() >> 4), zz + (p.getLocation().getBlockZ() >> 4))); String currSpot = mapBoard[z][x]; diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/protection/AWorldGuardManager.java b/LandLord-core/src/main/java/biz/princeps/landlord/protection/AWorldGuardManager.java index f5ccaacf..a6e28252 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/protection/AWorldGuardManager.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/protection/AWorldGuardManager.java @@ -5,6 +5,7 @@ import biz.princeps.landlord.api.IOwnedLand; import biz.princeps.landlord.api.IWorldGuardManager; import biz.princeps.landlord.api.tuple.Pair; +import biz.princeps.landlord.util.JavaUtils; import biz.princeps.lib.PrincepsLib; import org.bukkit.ChatColor; import org.bukkit.Chunk; @@ -105,21 +106,21 @@ public boolean isLLRegion(String name) { } @Override - public Map getNearbyLands(Chunk chunk, int offsetX, int offsetZ) { - Map lands = new HashMap<>(); + public Map getNearbyLands(Chunk chunk, int offsetX, int offsetZ) { + Map lands = new HashMap<>(); + World world = chunk.getWorld(); int xCoord = chunk.getX(); int zCoord = chunk.getZ(); for (int x = xCoord - offsetX; x <= xCoord + offsetX; x++) { for (int z = zCoord - offsetZ; z <= zCoord + offsetZ; z++) { - Chunk chunkA = chunk.getWorld().getChunkAt(x, z); - lands.put(chunkA, this.getRegion(chunkA)); + lands.put(JavaUtils.getChunkKey(x, z), this.getRegion(world, x, z)); } } return lands; } @Override - public Map getNearbyLands(Location loc, int offsetX, int offsetZ) { + public Map getNearbyLands(Location loc, int offsetX, int offsetZ) { return getNearbyLands(loc.getChunk(), offsetX, offsetZ); } @@ -265,12 +266,23 @@ public IOwnedLand getRegion(Location loc) { name += "_"; // x coord - int x = loc.getBlockX() >> 4; - name += x; + name += loc.getBlockX() >> 4; + name += "_"; + // z coord + name += loc.getBlockZ() >> 4; + return getRegion(name); + } + + @Override + public IOwnedLand getRegion(World world, int chunkX, int chunkZ) { + String name = world.getName().toLowerCase().replace(" ", "_"); + name += "_"; + + // x coord + name += chunkX; name += "_"; // z coord - int z = loc.getBlockZ() >> 4; - name += z; + name += chunkZ; return getRegion(name); } diff --git a/LandLord-core/src/main/java/biz/princeps/landlord/util/JavaUtils.java b/LandLord-core/src/main/java/biz/princeps/landlord/util/JavaUtils.java index bbec9c3f..ebd8c170 100644 --- a/LandLord-core/src/main/java/biz/princeps/landlord/util/JavaUtils.java +++ b/LandLord-core/src/main/java/biz/princeps/landlord/util/JavaUtils.java @@ -64,4 +64,14 @@ public static BlockFace getBlockFace(float yaw) { return BLOCK_FACES[(Math.round(yaw / 90f) & 0x3)]; } + /** + * + * @param x X Coordinate + * + * @param z Z Coordinate + * + * @return Chunk coordinates packed into a long + * + + */ + public static long getChunkKey(int x, int z) { + return (long) x & 0xffffffffL | ((long) z & 0xffffffffL) << 32; + } + }