From 298830f0766255ca4ec2b83f647c53a1626f0545 Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Sat, 13 Dec 2014 20:52:26 -0800 Subject: [PATCH] Added show all nearby claims by holding shift. While holding the stick. Requires a new permission node, to avoid any lag from spamming this operation. --- plugin.yml | 6 ++++- .../GriefPrevention/DataStore.java | 25 +++++++++++++++++++ .../GriefPrevention/PlayerEventHandler.java | 17 +++++++++++-- .../GriefPrevention/Visualization.java | 22 ++++++++++++---- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/plugin.yml b/plugin.yml index ff79c29..cea56fe 100644 --- a/plugin.yml +++ b/plugin.yml @@ -156,6 +156,7 @@ permissions: griefprevention.deathblow: true griefprevention.softmute: true griefprevention.reload: true + griefprevention.visualizenearbyclaims: true griefprevention.restorenature: description: Grants permission to use /RestoreNature. default: op @@ -197,4 +198,7 @@ permissions: default: true griefprevention.buysellclaimblocks: description: Grants access to claim block buy/sell commands. - default: true \ No newline at end of file + default: true + griefprevention.visualizenearbyclaims: + description: Allows a player to see all nearby claims at once. + default: op \ No newline at end of file diff --git a/src/me/ryanhamshire/GriefPrevention/DataStore.java b/src/me/ryanhamshire/GriefPrevention/DataStore.java index e25f25f..469a237 100644 --- a/src/me/ryanhamshire/GriefPrevention/DataStore.java +++ b/src/me/ryanhamshire/GriefPrevention/DataStore.java @@ -1304,4 +1304,29 @@ public abstract class DataStore asyncSavePlayerData(this.playerID, this.playerData); } } + + //gets all the claims "near" a location + ArrayList getNearbyClaims(Location location) + { + ArrayList claims = new ArrayList(); + + Chunk lesserChunk = location.getWorld().getChunkAt(location.subtract(150, 0, 150)); + Chunk greaterChunk = location.getWorld().getChunkAt(location.add(300, 0, 300)); + + for(int chunk_x = lesserChunk.getX(); chunk_x <= greaterChunk.getX(); chunk_x++) + { + for(int chunk_z = lesserChunk.getZ(); chunk_z <= greaterChunk.getZ(); chunk_z++) + { + Chunk chunk = location.getWorld().getChunkAt(chunk_x, chunk_z); + String chunkID = this.getChunkString(chunk.getBlock(0, 0, 0).getLocation()); + ArrayList claimsInChunk = this.chunksToClaimsMap.get(chunkID); + if(claimsInChunk != null) + { + claims.addAll(claimsInChunk); + } + } + } + + return claims; + } } diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index c21eea4..bd5cd98 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -1361,7 +1361,20 @@ class PlayerEventHandler implements Listener //if he's investigating a claim else if(materialInHand == GriefPrevention.instance.config_claims_investigationTool) { - //FEATURE: shovel and stick can be used from a distance away + //if holding shift (sneaking), show all claims in area + if(player.isSneaking() && player.hasPermission("griefprevention.visualizenearbyclaims")) + { + //find nearby claims + ArrayList claims = this.dataStore.getNearbyClaims(player.getLocation()); + + //visualize boundaries + Visualization visualization = Visualization.fromClaims(claims, (int)player.getEyeHeight(), VisualizationType.Claim, player.getLocation()); + Visualization.Apply(player, visualization); + + return; + } + + //FEATURE: shovel and stick can be used from a distance away if(action == Action.RIGHT_CLICK_AIR) { //try to find a far away non-air block along line of sight @@ -1400,7 +1413,7 @@ class PlayerEventHandler implements Listener GriefPrevention.sendMessage(player, TextMode.Info, Messages.BlockClaimed, claim.getOwnerName()); //visualize boundary - Visualization visualization = Visualization.FromClaim(claim, clickedBlock.getY(), VisualizationType.Claim, player.getLocation()); + Visualization visualization = Visualization.FromClaim(claim, (int)player.getEyeHeight(), VisualizationType.Claim, player.getLocation()); Visualization.Apply(player, visualization); //if can resize this claim, tell about the boundaries diff --git a/src/me/ryanhamshire/GriefPrevention/Visualization.java b/src/me/ryanhamshire/GriefPrevention/Visualization.java index 84c035c..12dba45 100644 --- a/src/me/ryanhamshire/GriefPrevention/Visualization.java +++ b/src/me/ryanhamshire/GriefPrevention/Visualization.java @@ -46,7 +46,7 @@ public class Visualization } //if he's online, create a task to send him the visualization in about half a second - if(player.isOnline() && visualization.elements.get(0).location.getWorld().equals(player.getWorld())) + if(player.isOnline() && visualization.elements.size() > 0 && visualization.elements.get(0).location.getWorld().equals(player.getWorld())) { GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, new VisualizationApplicationTask(player, playerData, visualization), 1L); } @@ -183,10 +183,10 @@ public class Visualization this.elements.add(new VisualizationElement(getVisibleLocation(world, smallx, height, bigz - 1, waterIsTransparent), accentMaterial, (byte)0)); //locality - int minx = locality.getBlockX() - 100; - int minz = locality.getBlockZ() - 100; - int maxx = locality.getBlockX() + 100; - int maxz = locality.getBlockZ() + 100; + int minx = locality.getBlockX() - 200; + int minz = locality.getBlockZ() - 200; + int maxx = locality.getBlockX() + 200; + int maxz = locality.getBlockZ() + 200; //top line for(int x = smallx + 10; x < bigx - 10; x += 10) @@ -249,4 +249,16 @@ public class Visualization (waterIsTransparent && block.getType() == Material.STATIONARY_WATER) || block.getType().isTransparent())); } + + public static Visualization fromClaims(ArrayList claims, int height, VisualizationType type, Location locality) + { + Visualization visualization = new Visualization(); + + for(Claim claim : claims) + { + visualization.addClaimElements(claim, height, type, locality); + } + + return visualization; + } }