Regenerate and refresh chunk methods

This commit is contained in:
Raphfrk 2011-03-02 20:27:44 +00:00 committed by Dinnerbone
parent 528b9b2e09
commit 03a5bbc612
2 changed files with 71 additions and 25 deletions

View File

@ -21,8 +21,8 @@ import org.bukkit.event.world.ChunkUnloadEvent;
public class ChunkProviderServer implements IChunkProvider { public class ChunkProviderServer implements IChunkProvider {
public LongHashset a = new LongHashset(); // CraftBukkit public LongHashset a = new LongHashset(); // CraftBukkit
private Chunk b; public Chunk b; // CraftBukkit
private IChunkProvider c; public IChunkProvider c; // CraftBukkit
private IChunkLoader d; private IChunkLoader d;
public LongHashtable<Chunk> e = new LongHashtable<Chunk>(); // CraftBukkit public LongHashtable<Chunk> e = new LongHashtable<Chunk>(); // CraftBukkit
public List f = new ArrayList(); // CraftBukkit public List f = new ArrayList(); // CraftBukkit

View File

@ -149,6 +149,48 @@ public class CraftWorld implements World {
return true; return true;
} }
public boolean regenerateChunk(int x, int z) {
unloadChunk(x, z, false, false);
provider.a.remove(x, z);
net.minecraft.server.Chunk chunk = null;
if(provider.c == null) {
chunk = provider.b;
} else {
chunk = provider.c.b(x, z);
}
chunkLoadPostProcess(chunk, x, z);
refreshChunk(x, z);
return chunk != null;
}
public boolean refreshChunk(int x, int z) {
if(!isChunkLoaded(x, z)) {
return false;
}
int px = x<<4;
int pz = z<<4;
// If there are more than 10 updates to a chunk at once, it carries out the update as a cuboid
// This flags 16 blocks in a line along the bottom for update and then flags a block at the opposite corner at the top
// The cuboid that contains these 17 blocks covers the entire chunk
// The server will compress the chunk and send it to all clients
for(int xx = px; xx < (px + 16); xx++) {
world.g(xx, 0, pz);
}
world.g(px, 127, pz+15);
return true;
}
public boolean isChunkInUse(int x, int z) { public boolean isChunkInUse(int x, int z) {
Player[] players = server.getOnlinePlayers(); Player[] players = server.getOnlinePlayers();
@ -180,33 +222,37 @@ public class CraftWorld implements World {
if (chunk == null) { if (chunk == null) {
chunk = provider.e(x, z); chunk = provider.e(x, z);
if (chunk != null) { chunkLoadPostProcess(chunk, x, z);
provider.e.put(x, z, chunk);
provider.f.add(chunk);
chunk.c();
chunk.d();
if (!chunk.n && provider.a(x + 1, z + 1) && provider.a(x, z + 1) && provider.a(x + 1, z)) {
provider.a(provider, x, z);
}
if (provider.a(x - 1, z) && !provider.b(x - 1, z).n && provider.a(x - 1, z + 1) && provider.a(x, z + 1) && provider.a(x - 1, z)) {
provider.a(provider, x - 1, z);
}
if (provider.a(x, z - 1) && !provider.b(x, z - 1).n && provider.a(x + 1, z - 1) && provider.a(x, z - 1) && provider.a(x + 1, z)) {
provider.a(provider, x, z - 1);
}
if (provider.a(x - 1, z - 1) && !provider.b(x - 1, z - 1).n && provider.a(x - 1, z - 1) && provider.a(x, z - 1) && provider.a(x - 1, z)) {
provider.a(provider, x - 1, z - 1);
}
}
} }
return chunk != null; return chunk != null;
} }
private void chunkLoadPostProcess(net.minecraft.server.Chunk chunk, int x, int z) {
if (chunk != null) {
provider.e.put(x, z, chunk);
provider.f.add(chunk);
chunk.c();
chunk.d();
if (!chunk.n && provider.a(x + 1, z + 1) && provider.a(x, z + 1) && provider.a(x + 1, z)) {
provider.a(provider, x, z);
}
if (provider.a(x - 1, z) && !provider.b(x - 1, z).n && provider.a(x - 1, z + 1) && provider.a(x, z + 1) && provider.a(x - 1, z)) {
provider.a(provider, x - 1, z);
}
if (provider.a(x, z - 1) && !provider.b(x, z - 1).n && provider.a(x + 1, z - 1) && provider.a(x, z - 1) && provider.a(x + 1, z)) {
provider.a(provider, x, z - 1);
}
if (provider.a(x - 1, z - 1) && !provider.b(x - 1, z - 1).n && provider.a(x - 1, z - 1) && provider.a(x, z - 1) && provider.a(x - 1, z)) {
provider.a(provider, x - 1, z - 1);
}
}
}
public boolean isChunkLoaded(Chunk chunk) { public boolean isChunkLoaded(Chunk chunk) {
return isChunkLoaded(chunk.getX(), chunk.getZ()); return isChunkLoaded(chunk.getX(), chunk.getZ());
} }