Fixes #657
Fixes #656
Fixes #653
Fixes #652
Fixes #585
This commit is contained in:
Jesse Boyd
2015-10-05 00:59:43 +11:00
parent 9d77b422df
commit f2431c869f
23 changed files with 505 additions and 332 deletions

View File

@ -2,6 +2,7 @@ package com.plotsquared.bukkit.listeners;
import static com.intellectualcrafters.plot.util.ReflectionUtils.getRefClass;
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Map.Entry;
@ -40,10 +41,11 @@ public class ChunkListener implements Listener {
private Chunk lastChunk = null;
final RefClass classChunk = getRefClass("{nms}.Chunk");
final RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
final RefMethod methodGetHandleChunk;
final RefField mustSave = classChunk.getField("mustSave");
private final RefClass classChunk = getRefClass("{nms}.Chunk");
private final RefClass classCraftChunk = getRefClass("{cb}.CraftChunk");
private RefMethod methodGetHandleChunk;
private final RefField mustSave = classChunk.getField("mustSave");
public ChunkListener() {
RefMethod method;
@ -58,10 +60,11 @@ public class ChunkListener implements Listener {
if (!Settings.CHUNK_PROCESSOR_GC) {
return;
}
TaskManager.runTaskRepeat(new Runnable() {
TaskManager.runTask(new Runnable() {
@Override
public void run() {
final int distance = Bukkit.getViewDistance() + 1;
int time = 300;
final int distance = Bukkit.getViewDistance() + 2;
final HashMap<String, HashMap<ChunkLoc, Integer>> players = new HashMap<>();
for (final Entry<String, PlotPlayer> entry : UUIDHandler.getPlayers().entrySet()) {
final PlotPlayer pp = entry.getValue();
@ -101,38 +104,53 @@ public class ChunkListener implements Listener {
if ((val == null) || (val < weight)) {
map.put(chunk, weight);
}
}
}
}
for (final World world : Bukkit.getWorlds()) {
final String name = world.getName();
final boolean autosave = world.isAutoSave();
if (!PS.get().isPlotWorld(name)) {
continue;
}
if (!Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE && autosave) {
final boolean autosave = world.isAutoSave();
if (autosave) {
world.setAutoSave(false);
}
final HashMap<ChunkLoc, Integer> map = players.get(name);
if ((map == null) || (map.size() == 0)) {
continue;
}
for (final Chunk chunk : world.getLoadedChunks()) {
Chunk[] chunks = world.getLoadedChunks();
ArrayDeque<Chunk> toUnload = new ArrayDeque<Chunk>();
for (final Chunk chunk : chunks) {
final int x = chunk.getX();
final int z = chunk.getZ();
if (!map.containsKey(new ChunkLoc(x, z))) {
toUnload.add(chunk);
}
}
if (toUnload.size() > 0) {
long start = System.currentTimeMillis();
Chunk chunk;
while ((chunk = toUnload.poll()) != null && (System.currentTimeMillis() - start < 5)) {
if (!Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE || !unloadChunk(name, chunk)) {
chunk.unload(true, false);
if (chunk.isLoaded()) {
chunk.unload(true, false);
}
}
}
if (toUnload.size() > 0) {
time = 1;
}
}
if (!Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE && autosave) {
world.setAutoSave(true);
}
}
TaskManager.runTaskLater(this, time);
}
}, 300);
});
}
public boolean unloadChunk(final String world, final Chunk chunk) {
@ -165,7 +183,9 @@ public class ChunkListener implements Listener {
}
final Object c = methodGetHandleChunk.of(chunk).call();
mustSave.of(c).set(false);
chunk.unload(false, false);
if (chunk.isLoaded()) {
chunk.unload(false, false);
}
return true;
}

View File

@ -25,7 +25,6 @@ import org.bukkit.entity.Creature;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Hanging;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.LivingEntity;
@ -43,7 +42,6 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.block.BlockExplodeEvent;
import org.bukkit.event.block.BlockFadeEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockFromToEvent;
@ -88,7 +86,6 @@ import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.help.HelpTopic;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.LazyMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.projectiles.BlockProjectileSource;
@ -111,7 +108,6 @@ import com.intellectualcrafters.plot.object.PlotManager;
import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.object.StringWrapper;
import com.intellectualcrafters.plot.util.ChunkManager;
import com.intellectualcrafters.plot.util.ClusterManager;
import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.ExpireManager;
@ -454,7 +450,7 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen
if (BukkitMain.worldEdit != null) {
if (pp.getAttribute("worldedit")) {
MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED);
}
}
}
if ((PS.get().update != null) && Permissions.hasPermission(pp, C.PERMISSION_ADMIN) && Settings.UPDATE_NOTIFICATIONS) {
TaskManager.runTaskLater(new Runnable() {

View File

@ -74,7 +74,7 @@ public abstract class Command<E extends CommandCaller> extends CommandManager {
return this.requiredType;
}
final protected void create() {
final public void create() {
final Annotation annotation = getClass().getAnnotation(CommandDeclaration.class);
if (annotation == null) {
throw new RuntimeException("Command does not have a CommandDeclaration");

View File

@ -13,8 +13,8 @@ import com.intellectualcrafters.plot.util.Permissions;
@SuppressWarnings("unused")
public class CommandManager<T extends CommandCaller> {
protected final ConcurrentHashMap<String, Command<T>> commands;
protected final Character initialCharacter;
final public ConcurrentHashMap<String, Command<T>> commands;
final private Character initialCharacter;
public CommandManager() {
this('/', new ArrayList<Command<T>>());