diff --git a/PlotSquared/pom.xml b/PlotSquared/pom.xml index 04480a58e..a6d8e7024 100644 --- a/PlotSquared/pom.xml +++ b/PlotSquared/pom.xml @@ -8,7 +8,7 @@ UTF-8 PlotSquared - 2.9.6 + 2.9.7 PlotSquared jar diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java index 2e2654d73..4e2abc5c9 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java @@ -30,6 +30,7 @@ import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.generator.BukkitHybridUtils; import com.intellectualcrafters.plot.generator.HybridGen; import com.intellectualcrafters.plot.generator.HybridUtils; +import com.intellectualcrafters.plot.listeners.ChunkListener; import com.intellectualcrafters.plot.listeners.ForceFieldListener; import com.intellectualcrafters.plot.listeners.InventoryListener; import com.intellectualcrafters.plot.listeners.PlayerEvents; @@ -103,6 +104,12 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { log("&dUsing metrics will allow us to improve the plugin, please consider it :)"); } getServer().getPluginManager().registerEvents(new WorldEvents(), this); + + // Experimental + if (Settings.CHUNK_PROCESSOR) { + getServer().getPluginManager().registerEvents(new ChunkListener(), this); + } + List worlds = Bukkit.getWorlds(); if (worlds.size() > 0) { UUIDHandler.cacheAll(worlds.get(0).getName()); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java index 10c6df3a1..e9ca0d807 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java @@ -810,6 +810,11 @@ public class PlotSquared { options.put("titles", Settings.TITLES); options.put("teleport.on_login", Settings.TELEPORT_ON_LOGIN); options.put("worldedit.require-selection-in-mask", Settings.REQUIRE_SELECTION); + + options.put("chunk-processor.enabled", Settings.CHUNK_PROCESSOR); + options.put("chunk-processor.max-blockstates", Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES); + options.put("chunk-processor.max-entities", Settings.CHUNK_PROCESSOR_MAX_ENTITIES); + for (final Entry node : options.entrySet()) { if (!config.contains(node.getKey())) { config.set(node.getKey(), node.getValue()); @@ -820,6 +825,9 @@ public class PlotSquared { if (Settings.DEBUG) { log(C.PREFIX.s() + "&6Debug Mode Enabled (Default). Edit the config to turn this off."); } + + Settings.CHUNK_PROCESSOR = config.getBoolean("chunk-processor.enabled"); + Settings.TNT_LISTENER = config.getBoolean("protection.tnt-listener.enabled"); Settings.PERMISSION_CACHING = config.getBoolean("cache.permissions"); Settings.CONFIRM_CLEAR = config.getBoolean("confirmation.clear"); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java index 8e8e4510a..ca7fbbbcc 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java @@ -41,6 +41,12 @@ public class Settings { public static boolean CONVERT_PLOTME = true; public static boolean CACHE_PLOTME = false; public static boolean USE_PLOTME_ALIAS = false; + /** + * Chunk processor + */ + public static boolean CHUNK_PROCESSOR = false; + public static int CHUNK_PROCESSOR_MAX_BLOCKSTATES = 4096; + public static int CHUNK_PROCESSOR_MAX_ENTITIES = 512; /** * TNT listener */ diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/ChunkListener.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/ChunkListener.java new file mode 100644 index 000000000..b40529317 --- /dev/null +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/ChunkListener.java @@ -0,0 +1,44 @@ +package com.intellectualcrafters.plot.listeners; + +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkUnloadEvent; + +import com.intellectualcrafters.plot.PlotSquared; +import com.intellectualcrafters.plot.config.Settings; + +public class ChunkListener implements Listener { + + @EventHandler + public void onChunkUnload(ChunkUnloadEvent event) { + processChunk(event.getChunk()); + } + + @EventHandler + public void onChunkLoad(ChunkLoadEvent event) { + processChunk(event.getChunk()); + } + + public void processChunk(Chunk chunk) { + if (!PlotSquared.isPlotWorld(chunk.getWorld().getName())) { + return; + } + Entity[] entities = chunk.getEntities(); + BlockState[] tiles = chunk.getTileEntities(); + if (tiles.length > Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES) { + for (BlockState tile : tiles) { + tile.getBlock().setType(Material.AIR, false); + } + } + if (entities.length > Settings.CHUNK_PROCESSOR_MAX_ENTITIES) { + for (Entity ent : entities) { + ent.remove(); + } + } + } +} diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/BukkitPlayer.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/BukkitPlayer.java index eb3f83359..dd1594ebe 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/BukkitPlayer.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/BukkitPlayer.java @@ -1,5 +1,6 @@ package com.intellectualcrafters.plot.object; +import java.util.HashMap; import java.util.HashSet; import java.util.UUID; @@ -18,6 +19,7 @@ public class BukkitPlayer implements PlotPlayer { public HashSet noPerm = new HashSet<>(); private int op = 0; private long last = 0; + private HashMap tmpData = null; /** * Please do not use this method. Instead use BukkitUtil.getPlayer(Player), as it caches player objects. @@ -119,4 +121,20 @@ public class BukkitPlayer implements PlotPlayer { return BukkitUtil.getLocationFull(this.player); } + @Override + public void setTmpData(String key, Object value) { + if (tmpData == null) { + tmpData = new HashMap<>(); + } + tmpData.put(key, value); + } + + @Override + public Object getTmpData(String key) { + if (tmpData == null) { + return null; + } + return tmpData.get(key); + } + } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java index cb75aa726..24776994e 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotPlayer.java @@ -9,6 +9,10 @@ import java.util.UUID; */ public interface PlotPlayer { + public void setTmpData(String key, Object value); + + public Object getTmpData(String key); + public long getPreviousLogin(); public Location getLocation();