From 8564b0b80fd495ab57c0ebe24f670920b168ec96 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Thu, 31 Aug 2017 22:42:29 +1000 Subject: [PATCH] Delete unclaimed filter --- .../com/boydti/fawe/bukkit/FaweBukkit.java | 5 +- .../bukkit/filter/GriefPreventionFilter.java | 43 ++++++++++++ .../fawe/bukkit/filter/WorldGuardFilter.java | 66 ++++++++++++++++++ .../fawe/bukkit/regions/BukkitMask.java | 2 +- .../regions/GriefPreventionFeature.java | 7 ++ .../fawe/bukkit/regions/Worldguard.java | 6 ++ .../boydti/fawe/command/AnvilCommands.java | 21 ++++++ .../anvil/filters/DeleteUnclaimedFilter.java | 47 +++++++++++++ .../filters/DeleteUninhabitedFilter.java | 47 ++++++------- .../fawe/jnbt/anvil/filters/RegionFilter.java | 4 ++ .../boydti/fawe/regions/FaweMaskManager.java | 7 +- .../regions/general/CuboidRegionFilter.java | 69 +++++++++++++++++++ .../fawe/regions/general/RegionFilter.java | 7 ++ .../general/plot/PlotRegionFilter.java | 29 ++++++++ .../general/plot/PlotSquaredFeature.java | 6 ++ .../fawe/util/DocumentationPrinter.java | 2 +- 16 files changed, 335 insertions(+), 33 deletions(-) create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java create mode 100644 core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/DeleteUnclaimedFilter.java create mode 100644 core/src/main/java/com/boydti/fawe/jnbt/anvil/filters/RegionFilter.java create mode 100644 core/src/main/java/com/boydti/fawe/regions/general/CuboidRegionFilter.java create mode 100644 core/src/main/java/com/boydti/fawe/regions/general/RegionFilter.java create mode 100644 core/src/main/java/com/boydti/fawe/regions/general/plot/PlotRegionFilter.java diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java index a1017c4b..b93e54d6 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -240,10 +240,7 @@ public class FaweBukkit implements IFawe, Listener { } if (url != null) ReflectionUtils.setFailsafeFieldValue(url, null, null); } catch (NoSuchFieldError | IllegalAccessException ignore) {} - catch (Throwable e) { - Fawe.debug("Error linking metrics: " + instance); - e.printStackTrace(); - } + catch (Throwable e) {} } } catch (NoSuchFieldException ignored) { } }); diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java new file mode 100644 index 00000000..a6743854 --- /dev/null +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java @@ -0,0 +1,43 @@ +package com.boydti.fawe.bukkit.filter; + +import com.boydti.fawe.regions.general.CuboidRegionFilter; +import com.intellectualcrafters.plot.object.RunnableVal; +import com.intellectualcrafters.plot.util.TaskManager; +import com.sk89q.worldedit.BlockVector2D; +import java.util.ArrayDeque; +import java.util.Collection; +import me.ryanhamshire.GriefPrevention.Claim; +import me.ryanhamshire.GriefPrevention.GriefPrevention; +import org.bukkit.World; + + +import static com.google.common.base.Preconditions.checkNotNull; + +public class GriefPreventionFilter extends CuboidRegionFilter { + private final Collection claims; + private final World world; + + public GriefPreventionFilter(World world) { + checkNotNull(world); + this.claims = TaskManager.IMP.sync(new RunnableVal>() { + @Override + public void run(Collection claims) { + this.value = new ArrayDeque(GriefPrevention.instance.dataStore.getClaims()); + } + }); + this.world = world; + } + + @Override + public void calculateRegions() { + for (Claim claim : claims) { + org.bukkit.Location bot = claim.getGreaterBoundaryCorner(); + if (world.equals(bot.getWorld())) { + org.bukkit.Location top = claim.getGreaterBoundaryCorner(); + BlockVector2D pos1 = new BlockVector2D(bot.getBlockX(), bot.getBlockZ()); + BlockVector2D pos2 = new BlockVector2D(top.getBlockX(), top.getBlockZ()); + add(pos1, pos2); + } + } + } +} diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java new file mode 100644 index 00000000..a2668752 --- /dev/null +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java @@ -0,0 +1,66 @@ +package com.boydti.fawe.bukkit.filter; + +import com.boydti.fawe.Fawe; +import com.boydti.fawe.object.RunnableVal; +import com.boydti.fawe.regions.general.CuboidRegionFilter; +import com.boydti.fawe.util.TaskManager; +import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.managers.RegionManager; +import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion; +import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import org.bukkit.World; + + +import static com.google.common.base.Preconditions.checkNotNull; + +public class WorldGuardFilter extends CuboidRegionFilter { + private final World world; + private boolean large; + private RegionManager manager; + + public WorldGuardFilter(World world) { + checkNotNull(world); + this.world = world; + } + @Override + public void calculateRegions() { + TaskManager.IMP.sync(new RunnableVal() { + @Override + public void run(Object value) { + WorldGuardFilter.this.manager = WorldGuardPlugin.inst().getRegionManager(world); + for (ProtectedRegion region : manager.getRegions().values()) { + BlockVector min = region.getMinimumPoint(); + BlockVector max = region.getMaximumPoint(); + if (max.getBlockX() - min.getBlockX() > 1024 || max.getBlockZ() - min.getBlockZ() > 1024) { + Fawe.debug("Large or complex region shapes cannot be optimized. Filtering will be slower"); + large = true; + break; + } + add(min.toVector2D(), max.toVector2D()); + } + } + }); + } + + @Override + public boolean containsChunk(int chunkX, int chunkZ) { + if (!large) return super.containsChunk(chunkX, chunkZ); + BlockVector pos1 = new BlockVector(chunkX << 4, 0, chunkZ << 4); + BlockVector pos2 = new BlockVector(pos1.getBlockX() + 15, 255, pos1.getBlockZ() + 15); + ProtectedCuboidRegion chunkRegion = new ProtectedCuboidRegion("unimportant", pos1, pos2); + ApplicableRegionSet set = manager.getApplicableRegions(chunkRegion); + return set.size() > 0 && !set.getRegions().iterator().next().getId().equals("__global__"); + } + + @Override + public boolean containsRegion(int mcaX, int mcaZ) { + if (!large) return super.containsRegion(mcaX, mcaZ); + BlockVector pos1 = new BlockVector(mcaX << 9, 0, mcaZ << 9); + BlockVector pos2 = new BlockVector(pos1.getBlockX() + 511, 255, pos1.getBlockZ() + 511); + ProtectedCuboidRegion regionRegion = new ProtectedCuboidRegion("unimportant", pos1, pos2); + ApplicableRegionSet set = manager.getApplicableRegions(regionRegion); + return set.size() > 0 && !set.getRegions().iterator().next().getId().equals("__global__"); + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMask.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMask.java index 76c6ece2..37127387 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMask.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMask.java @@ -9,4 +9,4 @@ public class BukkitMask extends FaweMask { public BukkitMask(Location pos1, Location pos2) { super(new BlockVector(pos1.getBlockX(), pos1.getBlockY(), pos1.getBlockZ()), new BlockVector(pos2.getBlockX(), pos2.getBlockY(), pos2.getBlockZ())); } -} +} \ No newline at end of file diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java index a1c28dd1..8832ec90 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java @@ -1,9 +1,12 @@ package com.boydti.fawe.bukkit.regions; import com.boydti.fawe.bukkit.FaweBukkit; +import com.boydti.fawe.bukkit.filter.GriefPreventionFilter; import com.boydti.fawe.object.FawePlayer; +import com.boydti.fawe.regions.general.RegionFilter; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -49,6 +52,10 @@ public class GriefPreventionFeature extends BukkitMaskManager implements Listene } } return null; + } + @Override + public RegionFilter getFilter(String world) { + return new GriefPreventionFilter(Bukkit.getWorld(world)); } } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java index 401276a8..8a4f6078 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java @@ -1,7 +1,9 @@ package com.boydti.fawe.bukkit.regions; import com.boydti.fawe.bukkit.FaweBukkit; +import com.boydti.fawe.bukkit.filter.WorldGuardFilter; import com.boydti.fawe.object.FawePlayer; +import com.boydti.fawe.regions.general.RegionFilter; import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.ApplicableRegionSet; @@ -108,6 +110,10 @@ public class Worldguard extends BukkitMaskManager implements Listener { } else { return null; } + } + @Override + public RegionFilter getFilter(String world) { + return new WorldGuardFilter(Bukkit.getWorld(world)); } } diff --git a/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java b/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java index 2cc81e90..b9d343b9 100644 --- a/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java +++ b/core/src/main/java/com/boydti/fawe/command/AnvilCommands.java @@ -12,6 +12,7 @@ import com.boydti.fawe.jnbt.anvil.MCAQueue; import com.boydti.fawe.jnbt.anvil.filters.CountFilter; import com.boydti.fawe.jnbt.anvil.filters.CountIdFilter; import com.boydti.fawe.jnbt.anvil.filters.DeleteOldFilter; +import com.boydti.fawe.jnbt.anvil.filters.DeleteUnclaimedFilter; import com.boydti.fawe.jnbt.anvil.filters.DeleteUninhabitedFilter; import com.boydti.fawe.jnbt.anvil.filters.MappedReplacePatternFilter; import com.boydti.fawe.jnbt.anvil.filters.PlotTrimFilter; @@ -219,6 +220,26 @@ public class AnvilCommands { if (result != null) player.print(BBC.getPrefix() + BBC.VISITOR_BLOCK.format(result.getTotal())); } + @Command( + aliases = {"deleteallunclaimed", "delunclaimed" }, + usage = " [file-age=60000]", + desc = "(Supports: WG, P2, GP) Delete all chunks which haven't been occupied AND claimed", + help = "(Supports: WG, P2, GP) Delete all chunks which aren't claimed AND haven't been occupied for `age-ticks` (20t = 1s) and \n" + + "Have not been accessed since `file-duration` (ms) after creation and\n" + + "Have not been used in the past `chunk-inactivity` (ms)" + + "The auto-save interval is the recommended value for `file-duration` and `chunk-inactivity`", + min = 2, + max = 3 + ) + @CommandPermissions("worldedit.anvil.deleteallunclaimed") + public void deleteAllUnclaimed(Player player, int inhabitedTicks, @Optional("60000") int fileDurationMillis) throws WorldEditException { + String folder = Fawe.imp().getWorldName(player.getWorld()); + long chunkInactivityMillis = fileDurationMillis; // Use same value for now + DeleteUnclaimedFilter filter = new DeleteUnclaimedFilter(player.getWorld(), fileDurationMillis, inhabitedTicks, chunkInactivityMillis); + DeleteUnclaimedFilter result = runWithWorld(player, folder, filter, true); + if (result != null) player.print(BBC.getPrefix() + BBC.VISITOR_BLOCK.format(result.getTotal())); + } + @Command( aliases = {"deletealloldregions", "deloldreg" }, usage = "