New features + fixes

Fixed a very specific case of IC world not loading with multiverse every
second startup
Fixed chunks not being sent for plot clearing (although it was being
sent for other thing) Fixes #554
Added fast experimental sudo-async worldedit processor
This commit is contained in:
boy0001 2015-08-25 09:01:45 +10:00
parent 0e8ae9e6e4
commit 6ca6880917
9 changed files with 194 additions and 39 deletions

View File

@ -268,7 +268,10 @@ public class PS {
if (world.equals("CheckingPlotSquaredGenerator")) { if (world.equals("CheckingPlotSquaredGenerator")) {
continue; continue;
} }
if (!BlockManager.manager.isWorld(world)) { if (!BlockManager.manager.isWorld(world) || (BlockManager.manager.isWorld(world) && !isPlotWorld(world))) {
PS.debug("&c`" + world + "` was not properly loaded - PlotSquared will now try to load it properly: ");
PS.debug("&8 - &7Are you trying to delete this world? Remember to remove it from the settings.yml as well");
PS.debug("&8 - &7Your world management plugin may be faulty. Consider using an up to date plugin.");
IMP.setGenerator(world); IMP.setGenerator(world);
} }
} }
@ -1250,6 +1253,7 @@ public class PS {
LOADING_WORLD = false; LOADING_WORLD = false;
} }
} else { } else {
LOADING_WORLD = false;
plotWorld = generator.getNewPlotWorld(world); plotWorld = generator.getNewPlotWorld(world);
plotManager = generator.getPlotManager(); plotManager = generator.getPlotManager();
if (!config.contains(path)) { if (!config.contains(path)) {
@ -1842,6 +1846,7 @@ public class PS {
// Chunk processor // Chunk processor
options.put("chunk-processor.enabled", Settings.CHUNK_PROCESSOR); options.put("chunk-processor.enabled", Settings.CHUNK_PROCESSOR);
options.put("chunk-processor.auto-unload", Settings.CHUNK_PROCESSOR_GC); options.put("chunk-processor.auto-unload", Settings.CHUNK_PROCESSOR_GC);
options.put("chunk-processor.experimental-fast-async-worldedit", Settings.EXPERIMENTAL_FAST_ASYNC_WORLDEDIT);
options.put("chunk-processor.auto-trim", Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE); options.put("chunk-processor.auto-trim", Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE);
options.put("chunk-processor.max-blockstates", Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES); options.put("chunk-processor.max-blockstates", Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES);
options.put("chunk-processor.max-entities", Settings.CHUNK_PROCESSOR_MAX_ENTITIES); options.put("chunk-processor.max-entities", Settings.CHUNK_PROCESSOR_MAX_ENTITIES);
@ -1956,10 +1961,9 @@ public class PS {
// Chunk processor // Chunk processor
Settings.CHUNK_PROCESSOR = config.getBoolean("chunk-processor.enabled"); Settings.CHUNK_PROCESSOR = config.getBoolean("chunk-processor.enabled");
Settings.CHUNK_PROCESSOR_GC = config.getBoolean("chunk-processor.auto-unload"); Settings.CHUNK_PROCESSOR_GC = config.getBoolean("chunk-processor.auto-unload");
Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE = config.getBoolean("chunk-processor.auto-trim"); Settings.CHUNK_PROCESSOR_TRIM_ON_SAVE = config.getBoolean("chunk-processor.auto-trim");
Settings.EXPERIMENTAL_FAST_ASYNC_WORLDEDIT = config.getBoolean("chunk-processor.experimental-fast-async-worldedit");
Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES = config.getInt("chunk-processor.max-blockstates"); Settings.CHUNK_PROCESSOR_MAX_BLOCKSTATES = config.getInt("chunk-processor.max-blockstates");
Settings.CHUNK_PROCESSOR_MAX_ENTITIES = config.getInt("chunk-processor.max-entities"); Settings.CHUNK_PROCESSOR_MAX_ENTITIES = config.getInt("chunk-processor.max-entities");
Settings.CHUNK_PROCESSOR_DISABLE_PHYSICS = config.getBoolean("chunk-processor.disable-physics"); Settings.CHUNK_PROCESSOR_DISABLE_PHYSICS = config.getBoolean("chunk-processor.disable-physics");

View File

@ -81,10 +81,10 @@ public class DebugClaimTest extends SubCommand {
try { try {
final String[] split1 = args[1].split(";"); final String[] split1 = args[1].split(";");
final String[] split2 = args[2].split(";"); final String[] split2 = args[2].split(";");
min = new PlotId(Integer.parseInt(split1[0]), Integer.parseInt(split1[1])); min = PlotId.fromString(args[1]);
max = new PlotId(Integer.parseInt(split2[0]), Integer.parseInt(split2[1])); max = PlotId.fromString(args[2]);
} catch (final Exception e) { } catch (final Exception e) {
return !MainUtil.sendMessage(null, "&cInvalid min/max values. &7The values are to Plot IDs in the format &cX;Y &7where X,Y are the plot coords\nThe conversion will only check the plots in the selected area."); return !MainUtil.sendMessage(null, "&cInvalid min/max values. &7The values are to Plot IDs in the format &cX;Y &7where X;Y are the plot coords\nThe conversion will only check the plots in the selected area.");
} }
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Beginning sign to plot conversion. This may take a while..."); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Beginning sign to plot conversion. This may take a while...");
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: Found an excess of 250,000 chunks. Limiting search radius... (~3.8 min)"); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: Found an excess of 250,000 chunks. Limiting search radius... (~3.8 min)");

View File

@ -68,6 +68,7 @@ public class Settings {
* Chunk processor * Chunk processor
*/ */
public static boolean CHUNK_PROCESSOR = false; public static boolean CHUNK_PROCESSOR = false;
public static boolean EXPERIMENTAL_FAST_ASYNC_WORLDEDIT = false;
public static boolean CHUNK_PROCESSOR_TRIM_ON_SAVE = false; public static boolean CHUNK_PROCESSOR_TRIM_ON_SAVE = false;
public static boolean CHUNK_PROCESSOR_GC = false; public static boolean CHUNK_PROCESSOR_GC = false;
public static int CHUNK_PROCESSOR_MAX_BLOCKSTATES = 4096; public static int CHUNK_PROCESSOR_MAX_BLOCKSTATES = 4096;

View File

@ -53,6 +53,7 @@ import com.plotsquared.bukkit.database.plotme.ClassicPlotMeConnector;
import com.plotsquared.bukkit.database.plotme.LikePlotMeConverter; import com.plotsquared.bukkit.database.plotme.LikePlotMeConverter;
import com.plotsquared.bukkit.database.plotme.PlotMeConnector_017; import com.plotsquared.bukkit.database.plotme.PlotMeConnector_017;
import com.plotsquared.bukkit.generator.BukkitGeneratorWrapper; import com.plotsquared.bukkit.generator.BukkitGeneratorWrapper;
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
import com.plotsquared.bukkit.generator.HybridGen; import com.plotsquared.bukkit.generator.HybridGen;
import com.plotsquared.bukkit.listeners.ChunkListener; import com.plotsquared.bukkit.listeners.ChunkListener;
import com.plotsquared.bukkit.listeners.ForceFieldListener; import com.plotsquared.bukkit.listeners.ForceFieldListener;
@ -578,13 +579,26 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
setup.step = new ConfigurationNode[0]; setup.step = new ConfigurationNode[0];
setup.world = worldname; setup.world = worldname;
SetupUtils.manager.setupWorld(setup); SetupUtils.manager.setupWorld(setup);
return;
} }
try { else {
SetGenCB.setGenerator(BukkitUtil.getWorld(worldname)); try {
} catch (Exception e) { if (!PS.get().isPlotWorld(worldname)) {
log("Failed to reload world: " + world); SetGenCB.setGenerator(BukkitUtil.getWorld(worldname));
Bukkit.getServer().unloadWorld(world, false); }
} catch (Exception e) {
log("Failed to reload world: " + world);
Bukkit.getServer().unloadWorld(world, false);
}
}
world = Bukkit.getWorld(worldname);
final ChunkGenerator gen = world.getGenerator();
if (gen instanceof BukkitPlotGenerator) {
PS.get().loadWorld(worldname, new BukkitGeneratorWrapper(worldname, (BukkitPlotGenerator) gen));
}
else {
if (PS.get().config.contains("worlds." + worldname)) {
PS.get().loadWorld(worldname, new BukkitGeneratorWrapper(worldname, null));
}
} }
} }

View File

@ -4,7 +4,11 @@ import java.util.HashSet;
import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.object.PlotBlock;
import com.intellectualcrafters.plot.object.RegionWrapper; import com.intellectualcrafters.plot.object.RegionWrapper;
import com.intellectualcrafters.plot.util.BlockManager;
import com.intellectualcrafters.plot.util.SetBlockQueue;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.WorldEditException;
@ -22,15 +26,18 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
int Ecount = 0; int Ecount = 0;
boolean BSblocked = false; boolean BSblocked = false;
boolean Eblocked = false; boolean Eblocked = false;
private String world;
public ProcessedWEExtent(HashSet<RegionWrapper> mask, Extent extent) { public ProcessedWEExtent(String world, HashSet<RegionWrapper> mask, Extent extent) {
super(extent); super(extent);
this.mask = mask; this.mask = mask;
this.world = world;
} }
@Override @Override
public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException { public boolean setBlock(Vector location, BaseBlock block) throws WorldEditException {
switch (block.getType()) { int id = block.getType();
switch (id) {
case 54: case 54:
case 130: case 130:
case 142: case 142:
@ -74,10 +81,126 @@ public class ProcessedWEExtent extends AbstractDelegateExtent {
BSblocked = true; BSblocked = true;
PS.debug("&cPlotSquared detected unsafe WorldEdit: " + (location.getBlockX()) + "," + (location.getBlockZ())); PS.debug("&cPlotSquared detected unsafe WorldEdit: " + (location.getBlockX()) + "," + (location.getBlockZ()));
} }
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
return super.setBlock(location, block);
}
break;
} }
} default: {
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) { int x = location.getBlockX();
return super.setBlock(location, block); int y = location.getBlockY();
int z = location.getBlockZ();
if (WEManager.maskContains(mask, location.getBlockX(), location.getBlockZ())) {
switch(id) {
case 0:
case 2:
case 4:
case 13:
case 14:
case 15:
case 20:
case 21:
case 22:
case 24:
case 25:
case 30:
case 32:
case 37:
case 39:
case 40:
case 41:
case 42:
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 54:
case 55:
case 56:
case 57:
case 58:
case 60:
case 61:
case 62:
case 7:
case 8:
case 9:
case 10:
case 11:
case 73:
case 74:
case 75:
case 76:
case 78:
case 79:
case 80:
case 81:
case 82:
case 83:
case 84:
case 85:
case 87:
case 88:
case 101:
case 102:
case 103:
case 110:
case 112:
case 113:
case 117:
case 121:
case 122:
case 123:
case 124:
case 129:
case 133:
case 138:
case 137:
case 140:
case 165:
case 166:
case 169:
case 170:
case 172:
case 173:
case 174:
case 176:
case 177:
case 181:
case 182:
case 188:
case 189:
case 190:
case 191:
case 192: {
if (Settings.EXPERIMENTAL_FAST_ASYNC_WORLDEDIT) {
SetBlockQueue.setBlock(world, x, y, z, id);
}
else {
super.setBlock(location, block);
}
break;
}
default: {
if (Settings.EXPERIMENTAL_FAST_ASYNC_WORLDEDIT) {
SetBlockQueue.setBlock(world, x, y, z, new PlotBlock((short) id, (byte) block.getData()));
}
else {
super.setBlock(location, block);
}
break;
}
}
return true;
// BlockManager.manager.functionSetBlock(world, x, y, z, id, data);
// return super.setBlock(location, block);
}
}
} }
return false; return false;
} }

View File

@ -41,7 +41,7 @@ public class WESubscriber {
return; return;
} }
if (Settings.CHUNK_PROCESSOR) { if (Settings.CHUNK_PROCESSOR) {
event.setExtent(new ProcessedWEExtent(mask, event.getExtent())); event.setExtent(new ProcessedWEExtent(world, mask, event.getExtent()));
} }
else { else {
event.setExtent(new WEExtent(mask, event.getExtent())); event.setExtent(new WEExtent(mask, event.getExtent()));

View File

@ -56,6 +56,7 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
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.object.RunnableVal; import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.BlockUpdateUtil;
import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.ChunkManager;
import com.intellectualcrafters.plot.util.ClusterManager; import com.intellectualcrafters.plot.util.ClusterManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
@ -101,6 +102,9 @@ public class BukkitChunkManager extends ChunkManager {
World worldObj = Bukkit.getWorld(world); World worldObj = Bukkit.getWorld(world);
// Chunk chunk = worldObj.getChunkAt(loc.x, loc.z); // Chunk chunk = worldObj.getChunkAt(loc.x, loc.z);
worldObj.regenerateChunk(loc.x, loc.z); worldObj.regenerateChunk(loc.x, loc.z);
if (MainUtil.canSendChunk && BlockUpdateUtil.setBlockManager != null) {
BlockUpdateUtil.setBlockManager.update(world, Arrays.asList(loc));
}
for (final Player player : worldObj.getPlayers()) { for (final Player player : worldObj.getPlayers()) {
org.bukkit.Location locObj = player.getLocation(); org.bukkit.Location locObj = player.getLocation();
if (locObj.getBlockX() >> 4 == loc.x && locObj.getBlockZ() >> 4 == loc.z && !locObj.getBlock().isEmpty()) { if (locObj.getBlockX() >> 4 == loc.x && locObj.getBlockZ() >> 4 == loc.z && !locObj.getBlock().isEmpty()) {

View File

@ -72,28 +72,36 @@ public class BukkitSetupUtils extends SetupUtils {
if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core").isEnabled()) { if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core").isEnabled()) {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv create " + world + " normal -g " + object.setupGenerator); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv create " + world + " normal -g " + object.setupGenerator);
setGenerator(world, object.setupGenerator); setGenerator(world, object.setupGenerator);
} else { if (Bukkit.getWorld(world) != null) {
if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld").isEnabled()) { return world;
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + world + " plugin:" + object.setupGenerator);
setGenerator(world, object.setupGenerator);
} else {
final WorldCreator wc = new WorldCreator(object.world);
wc.generator(object.setupGenerator);
wc.environment(Environment.NORMAL);
Bukkit.createWorld(wc);
setGenerator(world, object.setupGenerator);
} }
} }
if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld").isEnabled()) {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + world + " plugin:" + object.setupGenerator);
setGenerator(world, object.setupGenerator);
if (Bukkit.getWorld(world) != null) {
return world;
}
}
final WorldCreator wc = new WorldCreator(object.world);
wc.generator(object.setupGenerator);
wc.environment(Environment.NORMAL);
Bukkit.createWorld(wc);
setGenerator(world, object.setupGenerator);
} else { } else {
if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core").isEnabled()) { if ((Bukkit.getPluginManager().getPlugin("Multiverse-Core") != null) && Bukkit.getPluginManager().getPlugin("Multiverse-Core").isEnabled()) {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv create " + world + " normal"); Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mv create " + world + " normal");
} else { if (Bukkit.getWorld(world) != null) {
if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld").isEnabled()) { return world;
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + world);
} else {
Bukkit.createWorld(new WorldCreator(object.world).environment(World.Environment.NORMAL));
} }
} }
if ((Bukkit.getPluginManager().getPlugin("MultiWorld") != null) && Bukkit.getPluginManager().getPlugin("MultiWorld").isEnabled()) {
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), "mw create " + world);
if (Bukkit.getWorld(world) != null) {
return world;
}
}
Bukkit.createWorld(new WorldCreator(object.world).environment(World.Environment.NORMAL));
} }
return object.world; return object.world;
} }

View File

@ -104,14 +104,15 @@ public class SendChunk {
if (dx > view || dz > view) { if (dx > view || dz > view) {
continue; continue;
} }
Object c = methodGetHandleChunk.of(chunk).call(); net.minecraft.server.v1_8_R2.Chunk c = (net.minecraft.server.v1_8_R2.Chunk) methodGetHandleChunk.of(chunk).call();
c.initLighting();
chunks.remove(chunk); chunks.remove(chunk);
Object con = connection.of(entity).get(); Object con = connection.of(entity).get();
if (dx != 0 || dz != 0) { // if (dx != 0 || dz != 0) {
Object packet = MapChunk.create(c, true, 1); // Object packet = MapChunk.create(c, true, 0);
send.of(con).call(packet); // send.of(con).call(packet);
} // }
Object packet = MapChunk.create(c, true, 65565); Object packet = MapChunk.create(c, true, 65535);
send.of(con).call(packet); send.of(con).call(packet);
} }
} }