General cleanup for pull request.

This commit is contained in:
Glitchfinder 2012-11-05 16:03:44 -08:00
parent c3dd777e44
commit 3129acfc19
16 changed files with 132 additions and 127 deletions

View File

@ -28,7 +28,7 @@ public class HiddenConfig {
if (mcMMO.p.getResource(fileName) != null) { if (mcMMO.p.getResource(fileName) != null) {
config = YamlConfiguration.loadConfiguration(mcMMO.p.getResource(fileName)); config = YamlConfiguration.loadConfiguration(mcMMO.p.getResource(fileName));
chunkletsEnabled = config.getBoolean("Options.Chunklets", true); chunkletsEnabled = config.getBoolean("Options.Chunklets", true);
conversionRate = config.getInt("Options.ConversionRate", 1); conversionRate = config.getInt("Options.ConversionRate", 3);
} }
} }

View File

@ -13,13 +13,8 @@ import org.bukkit.event.world.WorldUnloadEvent;
import org.bukkit.World; import org.bukkit.World;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.BlockStoreConversionMain; import com.gmail.nossr50.runnables.blockstoreconversion.BlockStoreConversionMain;
import com.gmail.nossr50.util.blockmeta.ChunkletStore; import com.gmail.nossr50.util.blockmeta.chunkmeta.HashChunkManager;
import com.gmail.nossr50.util.blockmeta.PrimitiveChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveExChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveChunkStore;
import com.gmail.nossr50.util.blockmeta.HashChunkletManager;
import com.gmail.nossr50.util.blockmeta.HashChunkManager;
public class WorldListener implements Listener { public class WorldListener implements Listener {
ArrayList<BlockStoreConversionMain> converters = new ArrayList<BlockStoreConversionMain>(); ArrayList<BlockStoreConversionMain> converters = new ArrayList<BlockStoreConversionMain>();
@ -66,90 +61,7 @@ public class WorldListener implements Listener {
World world = event.getChunk().getWorld(); World world = event.getChunk().getWorld();
int cx = event.getChunk().getX(); int cx = event.getChunk().getX();
int cz = event.getChunk().getZ(); int cz = event.getChunk().getZ();
HashChunkletManager manager = new HashChunkletManager();
HashChunkManager newManager = (HashChunkManager) mcMMO.p.placeStore;
manager.loadChunk(cx, cz, world); ((HashChunkManager) mcMMO.p.placeStore).convertChunk(dataDir, cx, cz, world);
for(int y = 0; y < (world.getMaxHeight() / 64); y++) {
String chunkletName = world.getName() + "," + cx + "," + cz + "," + y;
ChunkletStore tempChunklet = manager.store.get(chunkletName);
PrimitiveChunkletStore primitiveChunklet = null;
PrimitiveExChunkletStore primitiveExChunklet = null;
if(tempChunklet instanceof PrimitiveChunkletStore)
primitiveChunklet = (PrimitiveChunkletStore) tempChunklet;
else if(tempChunklet instanceof PrimitiveExChunkletStore)
primitiveExChunklet = (PrimitiveExChunkletStore) tempChunklet;
if(tempChunklet == null) {
continue;
} else {
String chunkName = world.getName() + "," + cx + "," + cz;
PrimitiveChunkStore cChunk = (PrimitiveChunkStore) newManager.store.get(chunkName);
if(cChunk != null) {
int xPos = cx * 16;
int zPos = cz * 16;
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
int cxPos = xPos + x;
int czPos = zPos + z;
for(int y2 = (64 * y); y2 < (64 * y + 64); y2++) {
if(!manager.isTrue(cxPos, y2, czPos, world))
continue;
newManager.setTrue(cxPos, y2, czPos, world);
}
}
}
continue;
}
newManager.setTrue(cx * 16, 0, cz * 16, world);
newManager.setFalse(cx * 16, 0, cz * 16, world);
cChunk = (PrimitiveChunkStore) newManager.store.get(chunkName);
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
boolean[] oldArray;
if(primitiveChunklet != null)
oldArray = primitiveChunklet.store[x][z];
if(primitiveExChunklet != null)
oldArray = primitiveExChunklet.store[x][z];
else
return;
boolean[] newArray = cChunk.store[x][z];
if(oldArray.length < 64)
return;
else if(newArray.length < ((y * 64) + 64))
return;
System.arraycopy(oldArray, 0, newArray, (y * 64), 64);
}
}
}
}
manager.unloadChunk(cx, cz, world);
newManager.unloadChunk(cx, cz, world);
File cxDir = new File(dataDir, "" + cx);
if(!cxDir.exists()) return;
File czDir = new File(cxDir, "" + cz);
if(!czDir.exists()) return;
for(File yFile : czDir.listFiles()) {
if(!yFile.exists())
continue;
yFile.delete();
}
if(czDir.listFiles().length <= 0)
czDir.delete();
if(cxDir.listFiles().length <= 0)
cxDir.delete();
if(dataDir.listFiles().length <= 0)
dataDir.delete();
} }
} }

View File

@ -79,8 +79,8 @@ import com.gmail.nossr50.util.Leaderboard;
import com.gmail.nossr50.util.Metrics; import com.gmail.nossr50.util.Metrics;
import com.gmail.nossr50.util.Metrics.Graph; import com.gmail.nossr50.util.Metrics.Graph;
import com.gmail.nossr50.util.Users; import com.gmail.nossr50.util.Users;
import com.gmail.nossr50.util.blockmeta.ChunkManager; import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManager;
import com.gmail.nossr50.util.blockmeta.ChunkManagerFactory; import com.gmail.nossr50.util.blockmeta.chunkmeta.ChunkManagerFactory;
public class mcMMO extends JavaPlugin { public class mcMMO extends JavaPlugin {

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.runnables; package com.gmail.nossr50.runnables.blockstoreconversion;
import java.io.File; import java.io.File;
import java.lang.Runnable; import java.lang.Runnable;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.runnables; package com.gmail.nossr50.runnables.blockstoreconversion;
import java.io.File; import java.io.File;
import java.lang.Runnable; import java.lang.Runnable;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.runnables; package com.gmail.nossr50.runnables.blockstoreconversion;
import java.io.File; import java.io.File;
import java.lang.Runnable; import java.lang.Runnable;
@ -10,9 +10,9 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.blockmeta.ChunkletStore; import com.gmail.nossr50.util.blockmeta.ChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveChunkletStore; import com.gmail.nossr50.util.blockmeta.PrimitiveChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveExChunkletStore; import com.gmail.nossr50.util.blockmeta.PrimitiveExChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveChunkStore; import com.gmail.nossr50.util.blockmeta.chunkmeta.PrimitiveChunkStore;
import com.gmail.nossr50.util.blockmeta.HashChunkletManager; import com.gmail.nossr50.util.blockmeta.HashChunkletManager;
import com.gmail.nossr50.util.blockmeta.HashChunkManager; import com.gmail.nossr50.util.blockmeta.chunkmeta.HashChunkManager;
public class BlockStoreConversionZDirectory implements Runnable { public class BlockStoreConversionZDirectory implements Runnable {
private int taskID, cx, cz, x, y, z, y2, xPos, zPos, cxPos, czPos; private int taskID, cx, cz, x, y, z, y2, xPos, zPos, cxPos, czPos;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import java.io.IOException; import java.io.IOException;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import com.gmail.nossr50.config.HiddenConfig; import com.gmail.nossr50.config.HiddenConfig;

View File

@ -1,7 +1,9 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import java.io.Serializable; import java.io.Serializable;
import com.gmail.nossr50.util.blockmeta.ChunkletStore;
/** /**
* A ChunkStore should be responsible for a 16x16xWorldHeight area of data * A ChunkStore should be responsible for a 16x16xWorldHeight area of data
*/ */

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import org.bukkit.World; import org.bukkit.World;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
@ -17,20 +17,24 @@ import org.bukkit.block.Block;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.runnables.ChunkletUnloader; import com.gmail.nossr50.runnables.ChunkletUnloader;
import com.gmail.nossr50.util.blockmeta.ChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveChunkletStore;
import com.gmail.nossr50.util.blockmeta.PrimitiveExChunkletStore;
import com.gmail.nossr50.util.blockmeta.HashChunkletManager;
import org.getspout.spoutapi.chunkstore.SimpleRegionFile; import org.getspout.spoutapi.chunkstore.mcMMOSimpleRegionFile;
public class HashChunkManager implements ChunkManager { public class HashChunkManager implements ChunkManager {
private HashMap<UUID, HashMap<Long, SimpleRegionFile>> regionFiles = new HashMap<UUID, HashMap<Long, SimpleRegionFile>>(); private HashMap<UUID, HashMap<Long, mcMMOSimpleRegionFile>> regionFiles = new HashMap<UUID, HashMap<Long, mcMMOSimpleRegionFile>>();
public HashMap<String, ChunkStore> store = new HashMap<String, ChunkStore>(); public HashMap<String, ChunkStore> store = new HashMap<String, ChunkStore>();
@Override @Override
public void closeAll() { public void closeAll() {
for (UUID uid : regionFiles.keySet()) { for (UUID uid : regionFiles.keySet()) {
HashMap<Long, SimpleRegionFile> worldRegions = regionFiles.get(uid); HashMap<Long, mcMMOSimpleRegionFile> worldRegions = regionFiles.get(uid);
Iterator<SimpleRegionFile> itr = worldRegions.values().iterator(); Iterator<mcMMOSimpleRegionFile> itr = worldRegions.values().iterator();
while (itr.hasNext()) { while (itr.hasNext()) {
SimpleRegionFile rf = itr.next(); mcMMOSimpleRegionFile rf = itr.next();
if (rf != null) { if (rf != null) {
rf.close(); rf.close();
itr.remove(); itr.remove();
@ -42,7 +46,7 @@ public class HashChunkManager implements ChunkManager {
@Override @Override
public ChunkStore readChunkStore(World world, int x, int z) throws IOException { public ChunkStore readChunkStore(World world, int x, int z) throws IOException {
SimpleRegionFile rf = getSimpleRegionFile(world, x, z); mcMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z);
InputStream in = rf.getInputStream(x, z); InputStream in = rf.getInputStream(x, z);
if (in == null) { if (in == null) {
return null; return null;
@ -73,7 +77,7 @@ public class HashChunkManager implements ChunkManager {
return; return;
} }
try { try {
SimpleRegionFile rf = getSimpleRegionFile(world, x, z); mcMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z);
ObjectOutputStream objectStream = new ObjectOutputStream(rf.getOutputStream(x, z)); ObjectOutputStream objectStream = new ObjectOutputStream(rf.getOutputStream(x, z));
objectStream.writeObject(data); objectStream.writeObject(data);
objectStream.flush(); objectStream.flush();
@ -86,23 +90,23 @@ public class HashChunkManager implements ChunkManager {
@Override @Override
public void closeChunkStore(World world, int x, int z) { public void closeChunkStore(World world, int x, int z) {
SimpleRegionFile rf = getSimpleRegionFile(world, x, z); mcMMOSimpleRegionFile rf = getSimpleRegionFile(world, x, z);
if (rf != null) { if (rf != null) {
rf.close(); rf.close();
} }
} }
private SimpleRegionFile getSimpleRegionFile(World world, int x, int z) { private mcMMOSimpleRegionFile getSimpleRegionFile(World world, int x, int z) {
File directory = new File(world.getWorldFolder(), "mcmmo_regions"); File directory = new File(world.getWorldFolder(), "mcmmo_regions");
directory.mkdirs(); directory.mkdirs();
UUID key = world.getUID(); UUID key = world.getUID();
HashMap<Long, SimpleRegionFile> worldRegions = regionFiles.get(key); HashMap<Long, mcMMOSimpleRegionFile> worldRegions = regionFiles.get(key);
if (worldRegions == null) { if (worldRegions == null) {
worldRegions = new HashMap<Long, SimpleRegionFile>(); worldRegions = new HashMap<Long, mcMMOSimpleRegionFile>();
regionFiles.put(key, worldRegions); regionFiles.put(key, worldRegions);
} }
@ -111,11 +115,11 @@ public class HashChunkManager implements ChunkManager {
long key2 = (((long) rx) << 32) | (((long) rz) & 0xFFFFFFFFL); long key2 = (((long) rx) << 32) | (((long) rz) & 0xFFFFFFFFL);
SimpleRegionFile regionFile = worldRegions.get(key2); mcMMOSimpleRegionFile regionFile = worldRegions.get(key2);
if (regionFile == null) { if (regionFile == null) {
File file = new File(directory, "mcmmo_" + rx + "_" + rz + "_.mcm"); File file = new File(directory, "mcmmo_" + rx + "_" + rz + "_.mcm");
regionFile = new SimpleRegionFile(file, rx, rz); regionFile = new mcMMOSimpleRegionFile(file, rx, rz);
worldRegions.put(key2, regionFile); worldRegions.put(key2, regionFile);
} }
@ -371,4 +375,90 @@ public class HashChunkManager implements ChunkManager {
@Override @Override
public void cleanUp() {} public void cleanUp() {}
public void convertChunk(File dataDir, int cx, int cz, World world) {
HashChunkletManager manager = new HashChunkletManager();
manager.loadChunk(cx, cz, world);
for(int y = 0; y < (world.getMaxHeight() / 64); y++) {
String chunkletName = world.getName() + "," + cx + "," + cz + "," + y;
ChunkletStore tempChunklet = manager.store.get(chunkletName);
PrimitiveChunkletStore primitiveChunklet = null;
PrimitiveExChunkletStore primitiveExChunklet = null;
if(tempChunklet instanceof PrimitiveChunkletStore)
primitiveChunklet = (PrimitiveChunkletStore) tempChunklet;
else if(tempChunklet instanceof PrimitiveExChunkletStore)
primitiveExChunklet = (PrimitiveExChunkletStore) tempChunklet;
if(tempChunklet == null) {
continue;
} else {
String chunkName = world.getName() + "," + cx + "," + cz;
PrimitiveChunkStore cChunk = (PrimitiveChunkStore) store.get(chunkName);
if(cChunk != null) {
int xPos = cx * 16;
int zPos = cz * 16;
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
int cxPos = xPos + x;
int czPos = zPos + z;
for(int y2 = (64 * y); y2 < (64 * y + 64); y2++) {
if(!manager.isTrue(cxPos, y2, czPos, world))
continue;
setTrue(cxPos, y2, czPos, world);
}
}
}
continue;
}
setTrue(cx * 16, 0, cz * 16, world);
setFalse(cx * 16, 0, cz * 16, world);
cChunk = (PrimitiveChunkStore) store.get(chunkName);
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
boolean[] oldArray;
if(primitiveChunklet != null)
oldArray = primitiveChunklet.store[x][z];
if(primitiveExChunklet != null)
oldArray = primitiveExChunklet.store[x][z];
else
return;
boolean[] newArray = cChunk.store[x][z];
if(oldArray.length < 64)
return;
else if(newArray.length < ((y * 64) + 64))
return;
System.arraycopy(oldArray, 0, newArray, (y * 64), 64);
}
}
}
}
manager.unloadChunk(cx, cz, world);
unloadChunk(cx, cz, world);
File cxDir = new File(dataDir, "" + cx);
if(!cxDir.exists()) return;
File czDir = new File(cxDir, "" + cz);
if(!czDir.exists()) return;
for(File yFile : czDir.listFiles()) {
if(!yFile.exists())
continue;
yFile.delete();
}
if(czDir.listFiles().length <= 0)
czDir.delete();
if(cxDir.listFiles().length <= 0)
cxDir.delete();
if(dataDir.listFiles().length <= 0)
dataDir.delete();
}
} }

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import java.io.IOException; import java.io.IOException;

View File

@ -1,4 +1,4 @@
package com.gmail.nossr50.util.blockmeta; package com.gmail.nossr50.util.blockmeta.chunkmeta;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
@ -8,6 +8,7 @@ import java.util.UUID;
import org.bukkit.World; import org.bukkit.World;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.blockmeta.ChunkletStore;
public class PrimitiveChunkStore implements ChunkStore { public class PrimitiveChunkStore implements ChunkStore {
private static final long serialVersionUID = -1L; private static final long serialVersionUID = -1L;

View File

@ -22,11 +22,11 @@ package org.getspout.spoutapi.chunkstore;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
public class SimpleChunkBuffer extends ByteArrayOutputStream { public class mcMMOSimpleChunkBuffer extends ByteArrayOutputStream {
final SimpleRegionFile rf; final mcMMOSimpleRegionFile rf;
final int index; final int index;
SimpleChunkBuffer(SimpleRegionFile rf, int index) { mcMMOSimpleChunkBuffer(mcMMOSimpleRegionFile rf, int index) {
super(1024); super(1024);
this.rf = rf; this.rf = rf;
this.index = index; this.index = index;

View File

@ -29,7 +29,7 @@ import java.util.ArrayList;
import java.util.zip.DeflaterOutputStream; import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream; import java.util.zip.InflaterInputStream;
public class SimpleRegionFile { public class mcMMOSimpleRegionFile {
private RandomAccessFile file; private RandomAccessFile file;
private final int[] dataStart = new int[1024]; private final int[] dataStart = new int[1024];
private final int[] dataActualLength = new int[1024]; private final int[] dataActualLength = new int[1024];
@ -46,11 +46,11 @@ public class SimpleRegionFile {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static long TIMEOUT_TIME = 300000; // 5 min private static long TIMEOUT_TIME = 300000; // 5 min
public SimpleRegionFile(File f, int rx, int rz) { public mcMMOSimpleRegionFile(File f, int rx, int rz) {
this(f, rx, rz, 10); this(f, rx, rz, 10);
} }
public SimpleRegionFile(File f, int rx, int rz, int defaultSegmentSize) { public mcMMOSimpleRegionFile(File f, int rx, int rz, int defaultSegmentSize) {
this.rx = rx; this.rx = rx;
this.rz = rz; this.rz = rz;
this.defaultSegmentSize = defaultSegmentSize; this.defaultSegmentSize = defaultSegmentSize;
@ -160,7 +160,7 @@ public class SimpleRegionFile {
public DataOutputStream getOutputStream(int x, int z) { public DataOutputStream getOutputStream(int x, int z) {
int index = getChunkIndex(x, z); int index = getChunkIndex(x, z);
return new DataOutputStream(new DeflaterOutputStream(new SimpleChunkBuffer(this, index))); return new DataOutputStream(new DeflaterOutputStream(new mcMMOSimpleChunkBuffer(this, index)));
} }
public DataInputStream getInputStream(int x, int z) throws IOException { public DataInputStream getInputStream(int x, int z) throws IOException {

View File

@ -6,4 +6,4 @@ Options:
# true to use Chunklets metadata store system, false to disable # true to use Chunklets metadata store system, false to disable
Chunklets: true Chunklets: true
# Square root of the number of chunks to convert per tick. # Square root of the number of chunks to convert per tick.
ConversionRate: 1 ConversionRate: 3