diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index 9685d719..132b615b 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; @@ -156,7 +157,7 @@ public class Methods { public static ConcurrentHashMap tempair = new ConcurrentHashMap(); public static ConcurrentHashMap cooldowns = new ConcurrentHashMap(); // Represents PlayerName, previously checked blocks, and whether they were true or false - public static ConcurrentHashMap> blockProtectionCache = new ConcurrentHashMap>(); + public static ConcurrentHashMap> blockProtectionCache = new ConcurrentHashMap>(); public static ArrayList tempnophysics = new ArrayList(); public static HashSet tempNoEarthbending = new HashSet(); private static Integer[] plantIds = { 6, 18, 31, 32, 37, 38, 39, 40, 59, 81, 83, 86, 99, 100, 103, 104, 105, 106, 111, 161, 175}; @@ -1451,20 +1452,15 @@ public class Methods { */ public static boolean isRegionProtectedFromBuild(Player player, String ability, Location loc) { if(!blockProtectionCache.containsKey(player.getName())) - blockProtectionCache.put(player.getName(), new ConcurrentHashMap()); + blockProtectionCache.put(player.getName(), new ConcurrentHashMap()); - final ConcurrentHashMap blockMap = blockProtectionCache.get(player.getName()); - final Block block = loc.getBlock(); + ConcurrentHashMap blockMap = blockProtectionCache.get(player.getName()); + Block block = loc.getBlock(); if(blockMap.containsKey(block)) - return blockMap.get(block); - + return blockMap.get(block).isAllowed(); + boolean value = isRegionProtectedFromBuildPostCache(player, ability, loc); - blockMap.put(block, value); - new BukkitRunnable() { - public void run() { - blockMap.remove(block); - } - }.runTaskLater(ProjectKorra.plugin, (long) (CACHE_TIME / 20)); + blockMap.put(block, new BlockCacheElement(player, block, value, System.currentTimeMillis())); return value; } @@ -2669,8 +2665,69 @@ public class Methods { return true; } + public static class BlockCacheElement { + private Player player; + private Block block; + private boolean allowed; + private long time; + + public BlockCacheElement(Player player, Block block, boolean allowed, long time) { + this.player = player; + this.block = block; + this.allowed = allowed; + this.time = time; + } + + public Player getPlayer() { + return player; + } + + public void setPlayer(Player player) { + this.player = player; + } + + public Block getBlock() { + return block; + } + + public void setBlock(Block block) { + this.block = block; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public boolean isAllowed() { + return allowed; + } + + public void setAllowed(boolean allowed) { + this.allowed = allowed; + } + + } - + public static void startCacheCleaner(final double period) { + new BukkitRunnable() { + public void run() { + for(ConcurrentHashMap map : blockProtectionCache.values()) { + for(Iterator i = map.keySet().iterator(); i.hasNext();) { + Block key = i.next(); + BlockCacheElement value = map.get(key); + + if(System.currentTimeMillis() - value.getTime() > period) { + map.remove(key); + } + } + } + } + }.runTaskTimer(ProjectKorra.plugin, 0, (long) (period / 20)); + } } diff --git a/src/com/projectkorra/ProjectKorra/ProjectKorra.java b/src/com/projectkorra/ProjectKorra/ProjectKorra.java index 0206f485..1a731017 100644 --- a/src/com/projectkorra/ProjectKorra/ProjectKorra.java +++ b/src/com/projectkorra/ProjectKorra/ProjectKorra.java @@ -76,7 +76,7 @@ public class ProjectKorra extends JavaPlugin { } Methods.deserializeFile(); - + Methods.startCacheCleaner(Methods.CACHE_TIME); new CraftingRecipes(this); }