reduce memory usage

This commit is contained in:
boy0001 2015-02-15 21:52:51 +11:00
parent eba445cd23
commit 1e8ce84769
7 changed files with 139 additions and 26 deletions

View File

@ -8,7 +8,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>
<artifactId>PlotSquared</artifactId> <artifactId>PlotSquared</artifactId>
<version>2.7.2</version> <version>2.7.3</version>
<name>PlotSquared</name> <name>PlotSquared</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<build> <build>

View File

@ -1021,7 +1021,7 @@ public class PlotMain extends JavaPlugin implements Listener {
} }
} }
catch (Exception e) { catch (Exception e) {
System.out.print("ERRRRRRRRRRRRRR 6"); PlotMain.sendConsoleSenderMessage("&d=== Oh no! Please set the generator for the " + world + " ===");
e.printStackTrace(); e.printStackTrace();
LOADING_WORLD = false; LOADING_WORLD = false;
removePlotWorld(world); removePlotWorld(world);
@ -1594,7 +1594,7 @@ public class PlotMain extends JavaPlugin implements Listener {
try { try {
AbstractSetBlock.setBlockManager = new SetBlockFast_1_8(); AbstractSetBlock.setBlockManager = new SetBlockFast_1_8();
} }
catch (Exception e) { catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
AbstractSetBlock.setBlockManager = new SetBlockSlow(); AbstractSetBlock.setBlockManager = new SetBlockSlow();
} }
@ -1602,7 +1602,7 @@ public class PlotMain extends JavaPlugin implements Listener {
else { else {
try { try {
AbstractSetBlock.setBlockManager = new SetBlockFast(); AbstractSetBlock.setBlockManager = new SetBlockFast();
} catch (NoSuchMethodException e) { } catch (Throwable e) {
AbstractSetBlock.setBlockManager = new SetBlockSlow(); AbstractSetBlock.setBlockManager = new SetBlockSlow();
} }
} }
@ -1619,7 +1619,7 @@ public class PlotMain extends JavaPlugin implements Listener {
} }
// Handle UUIDS // Handle UUIDS
{ {
boolean checkVersion = checkVersion(1, 7, 5); boolean checkVersion = checkVersion(1, 7, 6);
if (!checkVersion) { if (!checkVersion) {
sendConsoleSenderMessage(C.PREFIX.s()+" &c[WARN] Titles are disabled - please update your version of Bukkit to support this feature."); sendConsoleSenderMessage(C.PREFIX.s()+" &c[WARN] Titles are disabled - please update your version of Bukkit to support this feature.");
Settings.TITLES = false; Settings.TITLES = false;

View File

@ -0,0 +1,79 @@
////////////////////////////////////////////////////////////////////////////////////////////////////
// PlotSquared - A plot manager and world generator for the Bukkit API /
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
// /
// This program is free software; you can redistribute it and/or modify /
// it under the terms of the GNU General Public License as published by /
// the Free Software Foundation; either version 3 of the License, or /
// (at your option) any later version. /
// /
// This program is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
// GNU General Public License for more details. /
// /
// You should have received a copy of the GNU General Public License /
// along with this program; if not, write to the Free Software Foundation, /
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
// /
// You can contact us via: support@intellectualsites.com /
////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.commands;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.intellectualcrafters.plot.PlotMain;
import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.generator.HybridPlotManager;
import com.intellectualcrafters.plot.generator.HybridPlotWorld;
import com.intellectualcrafters.plot.object.ChunkLoc;
import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.util.ChunkManager;
import com.intellectualcrafters.plot.util.ExpireManager;
import com.intellectualcrafters.plot.util.PlayerFunctions;
import com.intellectualcrafters.plot.util.PlotHelper;
import com.intellectualcrafters.plot.util.TaskManager;
public class Condense extends SubCommand {
public static boolean TASK = false;
private static int TASK_ID = 0;
public Condense() {
super("condense", "plots.admin", "Condense a plotworld", "condense", "", CommandCategory.DEBUG, false);
}
public PlotId getId(String id) {
try {
String[] split = id.split(";");
return new PlotId(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
}
catch (Exception e) {
return null;
}
}
@Override
public boolean execute(final Player plr, final String... args) {
return true;
}
public static void sendMessage(final String message) {
PlotMain.sendConsoleSenderMessage("&3PlotSquared -> Plot condense&8: &7" + message);
}
}

View File

@ -45,14 +45,23 @@ import com.intellectualcrafters.plot.util.TaskManager;
public class Move extends SubCommand { public class Move extends SubCommand {
public Move() { public Move() {
super("move", "plots.admin", "plot moving debug test", "move", "condense", CommandCategory.DEBUG, false); super("move", "plots.admin", "plot moving debug test", "move", "condense", CommandCategory.DEBUG, true);
} }
@Override @Override
public boolean execute(final Player plr, final String... args) { public boolean execute(final Player plr, final String... args) {
if (plr == null) {
PlayerFunctions.sendMessage(plr, "MUST BE EXECUTED BY PLAYER");
}
World world = plr.getWorld(); World world = plr.getWorld();
PlotId plot1 = PlotHelper.parseId(args[0]); PlotId plot1 = PlotHelper.parseId(args[0]);
PlotId plot2 = PlotHelper.parseId(args[1]); PlotId plot2 = PlotHelper.parseId(args[1]);
if (plot1 == null || plot2 == null) {
PlayerFunctions.sendMessage(plr, "INVALID PLOT ID\n/plot move <pos1> <pos2>");
}
if (plot1 == plot2) {
PlayerFunctions.sendMessage(plr, "DUPLICATE ID");
}
if (move(world, plot1, plot2, null)) { if (move(world, plot1, plot2, null)) {
PlayerFunctions.sendMessage(plr, "MOVE SUCCESS"); PlayerFunctions.sendMessage(plr, "MOVE SUCCESS");
} }
@ -63,9 +72,9 @@ public class Move extends SubCommand {
} }
public boolean move(final World world, final PlotId current, PlotId newPlot, final Runnable whenDone) { public boolean move(final World world, final PlotId current, PlotId newPlot, final Runnable whenDone) {
Location bot1 = PlotHelper.getPlotBottomLoc(world, current); final Location bot1 = PlotHelper.getPlotBottomLoc(world, current);
Location bot2 = PlotHelper.getPlotBottomLoc(world, newPlot); Location bot2 = PlotHelper.getPlotBottomLoc(world, newPlot);
Location top = PlotHelper.getPlotTopLoc(world, current); final Location top = PlotHelper.getPlotTopLoc(world, current);
final Plot currentPlot = PlotHelper.getPlot(world, current); final Plot currentPlot = PlotHelper.getPlot(world, current);
if (currentPlot.owner == null) { if (currentPlot.owner == null) {
return false; return false;
@ -79,7 +88,7 @@ public class Move extends SubCommand {
int offset_x = newPlot.x - current.x; int offset_x = newPlot.x - current.x;
int offset_y = newPlot.y - current.y; int offset_y = newPlot.y - current.y;
ArrayList<PlotId> selection = PlayerFunctions.getPlotSelectionIds(pos1.id, pos2.id); final ArrayList<PlotId> selection = PlayerFunctions.getPlotSelectionIds(pos1.id, pos2.id);
String worldname = world.getName(); String worldname = world.getName();
for (PlotId id : selection) { for (PlotId id : selection) {
DBFunc.movePlot(world.getName(), new PlotId(id.x, id.y), new PlotId(id.x + offset_x, id.y + offset_y)); DBFunc.movePlot(world.getName(), new PlotId(id.x, id.y), new PlotId(id.x + offset_x, id.y + offset_y));
@ -92,11 +101,9 @@ public class Move extends SubCommand {
ChunkManager.copyRegion(bot1, top, bot2, new Runnable() { ChunkManager.copyRegion(bot1, top, bot2, new Runnable() {
@Override @Override
public void run() { public void run() {
PlotHelper.clear(null, world, PlotHelper.getPlot(world, current), true); ChunkManager.regenerateRegion(bot1, top, null);
if (whenDone != null) {
TaskManager.runTaskLater(whenDone, 1); TaskManager.runTaskLater(whenDone, 1);
} }
}
}); });
return true; return true;
} }

View File

@ -1,5 +1,6 @@
package com.intellectualcrafters.plot.generator; package com.intellectualcrafters.plot.generator;
import java.util.Arrays;
import java.util.Random; import java.util.Random;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -16,6 +17,7 @@ import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotManager; import com.intellectualcrafters.plot.object.PlotManager;
import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.object.RegionWrapper; import com.intellectualcrafters.plot.object.RegionWrapper;
import com.intellectualcrafters.plot.util.AbstractSetBlock;
import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.ChunkManager;
import com.intellectualcrafters.plot.util.PlotHelper; import com.intellectualcrafters.plot.util.PlotHelper;
import com.intellectualcrafters.plot.util.TaskManager; import com.intellectualcrafters.plot.util.TaskManager;
@ -129,8 +131,8 @@ public class AugmentedPopulator extends BlockPopulator {
@Override @Override
public void run() { public void run() {
populateBiome(world, x, z); populateBiome(world, x, z);
chunk.unload(); chunk.unload(true, false);
chunk.load(); AbstractSetBlock.setBlockManager.update(Arrays.asList( new Chunk[] {chunk}));
} }
}, 20); }, 20);
} }
@ -146,8 +148,8 @@ public class AugmentedPopulator extends BlockPopulator {
public void run() { public void run() {
chunk.load(true); chunk.load(true);
populateBlocks(world, rand, X, Z, x, z, check); populateBlocks(world, rand, X, Z, x, z, check);
chunk.unload(); chunk.unload(true, false);
chunk.load(); AbstractSetBlock.setBlockManager.update(Arrays.asList( new Chunk[] {chunk}));
} }
}, 40 + rand.nextInt(40)); }, 40 + rand.nextInt(40));
} }

View File

@ -2,6 +2,7 @@ package com.intellectualcrafters.plot.util;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -129,6 +130,9 @@ public class ChunkManager {
private static HashSet<EntityWrapper> entities; private static HashSet<EntityWrapper> entities;
/**
* Copy a region to a new location (in the same world)
*/
public static boolean copyRegion(final Location pos1, final Location pos2, final Location newPos, final Runnable whenDone) { public static boolean copyRegion(final Location pos1, final Location pos2, final Location newPos, final Runnable whenDone) {
int relX = newPos.getBlockX() - pos1.getBlockX(); int relX = newPos.getBlockX() - pos1.getBlockX();
int relZ = newPos.getBlockZ() - pos1.getBlockZ(); int relZ = newPos.getBlockZ() - pos1.getBlockZ();
@ -138,6 +142,9 @@ public class ChunkManager {
Chunk c1 = world.getChunkAt(pos1); Chunk c1 = world.getChunkAt(pos1);
Chunk c2 = world.getChunkAt(pos2); Chunk c2 = world.getChunkAt(pos2);
Chunk c3 = world.getChunkAt(pos1.getBlockX() + relX, pos1.getBlockZ() + relZ);
Chunk c4 = world.getChunkAt(pos2.getBlockX() + relX, pos2.getBlockZ() + relZ);
final int sx = pos1.getBlockX(); final int sx = pos1.getBlockX();
final int sz = pos1.getBlockZ(); final int sz = pos1.getBlockZ();
final int ex = pos2.getBlockX(); final int ex = pos2.getBlockX();
@ -148,17 +155,33 @@ public class ChunkManager {
final int c2x = c2.getX(); final int c2x = c2.getX();
final int c2z = c2.getZ(); final int c2z = c2.getZ();
final int c3x = c3.getX();
final int c3z = c3.getZ();
final int c4x = c4.getX();
final int c4z = c4.getZ();
// Copy entities // Copy entities
ArrayList<Chunk> chunks = new ArrayList<>();
initMaps(); initMaps();
for (int x = c1x; x <= c2x; x ++) { for (int x = c3x; x <= c4x; x ++) {
for (int z = c1z; z <= c2z; z ++) { for (int z = c3z; z <= c4z; z ++) {
Chunk chunk = world.getChunkAt(x, z); Chunk chunk = world.getChunkAt(x, z);
chunks.add(chunk);
chunk.load(false); chunk.load(false);
saveEntitiesIn(chunk, region); saveEntitiesIn(chunk, region);
restoreEntities(world, relX, relZ); restoreEntities(world, relX, relZ);
} }
} }
// Load chunks
for (int x = c1x; x <= c2x; x ++) {
for (int z = c1z; z <= c2z; z ++) {
Chunk chunk = world.getChunkAt(x, z);
chunk.load(true);
chunks.add(chunk);
}
}
// Copy blocks // Copy blocks
int maxY = world.getMaxHeight(); int maxY = world.getMaxHeight();
for (int x = sx; x <= ex; x++) { for (int x = sx; x <= ex; x++) {
@ -173,9 +196,11 @@ public class ChunkManager {
} }
} }
restoreBlocks(world, relX, relZ); restoreBlocks(world, relX, relZ);
TaskManager.runTaskLater(whenDone, 1); TaskManager.runTaskLater(whenDone, 1);
AbstractSetBlock.setBlockManager.update(chunks);
for (Chunk chunk : chunks) {
chunk.unload(true, false);
}
return true; return true;
} }
@ -264,8 +289,8 @@ public class ChunkManager {
restoreBlocks(world, 0, 0); restoreBlocks(world, 0, 0);
restoreEntities(world, 0, 0); restoreEntities(world, 0, 0);
} }
chunk.unload(); chunk.unload(true, false);
chunk.load(); AbstractSetBlock.setBlockManager.update(Arrays.asList( new Chunk[] {chunk}));
} }
CURRENT_PLOT_CLEAR = null; CURRENT_PLOT_CLEAR = null;
} }

View File

@ -1,6 +1,7 @@
package com.intellectualcrafters.plot.util; package com.intellectualcrafters.plot.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@ -287,16 +288,15 @@ public class ClusterManager {
@Override @Override
public void run() { public void run() {
if (populator == null || plotworld.TYPE == 0) { if (populator == null || plotworld.TYPE == 0) {
AbstractSetBlock.setBlockManager.update(Arrays.asList( new Chunk[] {chunk}));
world.regenerateChunk(chunk.getX(), chunk.getZ()); world.regenerateChunk(chunk.getX(), chunk.getZ());
chunk.unload(); chunk.unload(true, false);
chunk.load();
} }
else { else {
populator.populate(world, rand, chunk); populator.populate(world, rand, chunk);
} }
} }
}, i); }, i);
} }
} }
} }