@@ -32,6 +32,8 @@

import org.spout.api.entity.BlockController;
import org.spout.api.entity.Entity;
import org.spout.api.generator.biome.Biome;
import org.spout.api.generator.biome.BiomeManager;
import org.spout.api.geo.cuboid.Chunk;
import org.spout.api.geo.cuboid.ChunkSnapshot;
import org.spout.api.geo.cuboid.Region;
@@ -46,12 +48,13 @@ public class SpoutChunkSnapshot extends ChunkSnapshot {
* The mask that should be applied to the x, y and z coords
*/
private final int coordMask;

private final Set<WeakReference<Entity>> entities;
private final short[] blockIds;
private final short[] blockData;
private final byte[] blockLight;
private final byte[] skyLight;

private final BiomeManager biomes;
private boolean renderDirty = false;

public SpoutChunkSnapshot(SpoutChunk chunk, short[] blockIds, short[] blockData, byte[] blockLight, byte[] skyLight, boolean entities) {
@@ -71,6 +74,7 @@ public SpoutChunkSnapshot(SpoutChunk chunk, short[] blockIds, short[] blockData,
this.blockData = blockData;
this.blockLight = blockLight;
this.skyLight = skyLight;
this.biomes = chunk.getBiomeManager().clone();
renderDirty = chunk.isDirty();
}

@@ -164,4 +168,9 @@ public void setRenderDirty(boolean val){
public BlockController getBlockController(int x, int y, int z) {
return null;
}

@Override
public Biome getBiomeType(int x, int y, int z) {
return biomes.getBiome(x, y, z);
}
}
@@ -43,11 +43,14 @@

import org.spout.api.Source;
import org.spout.api.Spout;
import org.spout.api.datatable.DataMap;
import org.spout.api.entity.BlockController;
import org.spout.api.entity.Controller;
import org.spout.api.entity.Entity;
import org.spout.api.entity.PlayerController;
import org.spout.api.generator.WorldGenerator;
import org.spout.api.generator.biome.Biome;
import org.spout.api.generator.biome.BiomeManager;
import org.spout.api.geo.LoadGenerateOption;
import org.spout.api.geo.World;
import org.spout.api.geo.cuboid.Block;
@@ -259,9 +262,9 @@ private SpoutChunk generateChunk(int x, int y, int z) {
CuboidShortBuffer buffer = new CuboidShortBuffer(getWorld(), cx << Chunk.CHUNK_SIZE_BITS, cy << Chunk.CHUNK_SIZE_BITS, cz << Chunk.CHUNK_SIZE_BITS, Chunk.CHUNK_SIZE, Chunk.CHUNK_SIZE, Chunk.CHUNK_SIZE);

WorldGenerator generator = getWorld().getGenerator();
generator.generate(buffer, cx, cy, cz);
BiomeManager manager = generator.generate(buffer, cx, cy, cz);

return new SpoutChunk(getWorld(), this, cx, cy, cz, buffer.getRawArray());
return new SpoutChunk(getWorld(), this, cx, cy, cz, buffer.getRawArray(), manager, (DataMap)buffer.getDataMap());
}

/**
@@ -856,6 +859,11 @@ public void updateBlockPhysics(int x, int y, int z, Source source) {
this.getChunkFromBlock(x, y, z).updateBlockPhysics(x, y, z, source);
}

@Override
public Biome getBiomeType(int x, int y, int z) {
return this.getWorld().getBiomeType(x, y, z);
}

@Override
public Block getBlock(int x, int y, int z) {
return this.getWorld().getBlock(x, y, z);
@@ -53,7 +53,6 @@
import org.spout.api.entity.Entity;
import org.spout.api.generator.WorldGenerator;
import org.spout.api.generator.biome.Biome;
import org.spout.api.generator.biome.BiomeGenerator;
import org.spout.api.geo.LoadGenerateOption;
import org.spout.api.geo.World;
import org.spout.api.geo.cuboid.Chunk;
@@ -176,7 +175,6 @@ public SpoutWorld(String name, Engine server, long seed, WorldGenerator generato
}
this.name = name;
this.generator = generator;
generator.setWorld(this);
this.itemMap = itemMap;
entityManager = new EntityManager();
regions = new RegionSource(this, snapshotManager);
@@ -192,8 +190,6 @@ public SpoutWorld(String name, Engine server, long seed, WorldGenerator generato
this.datatableMap = new GenericDatatableMap();;
}
this.dataMap = new DataMap(this.datatableMap);



this.hashcode = new HashCodeBuilder(27, 971).append(uid).toHashCode();

@@ -381,11 +377,7 @@ public Biome getBiomeType(int x, int y, int z) {
if (y < 0 || y > getHeight()) {
return null;
}
if (generator instanceof BiomeGenerator) {
return ((BiomeGenerator) generator).getBiome(x, y, z, seed);
} else {
return null;
}
return getChunkFromBlock(x, y, z).getBiomeType(x, y, z);
}

@Override
@@ -715,6 +707,18 @@ public OutputStream getHeightMapOutputStream(int x, int z) {

return baa.getBlockOutputStream(key);
}

@Override
public Entity getEntity(UUID uid) {
for (Region region : regions) {
for (Entity e :region.getAll()) {
if (e.getUID().equals(uid)) {
return e;
}
}
}
return null;
}

@Override
public String toString() {