package org.terasology.teraspout;
import gnu.trove.map.TShortObjectMap;
import gnu.trove.map.hash.TShortObjectHashMap;
import java.util.WeakHashMap;
import org.spout.api.Spout;
import org.spout.api.material.BlockMaterial;
import org.spout.api.material.MaterialRegistry;
import org.spout.engine.world.SpoutChunk;
import org.terasology.game.TerasologyEngine;
/**
* TeraSpout. Links server-side objects with client concepts.
*
* @author simplyianm
*
* TODO!!!
*
*/
public class TeraSpout {
private static TeraSpout _instance;
private WeakHashMap<SpoutChunk, TeraChunk> chunks = new WeakHashMap<SpoutChunk, TeraChunk>();
private TeraBlock[] blocks = new TeraBlock[1 << 16]; // store the blocks by
// id
private final TerasologyEngine engine;
public TeraSpout(TerasologyEngine engine) {
_instance = this;
this.engine = engine;
}
public static TeraSpout getInstance() {
return _instance;
}
/**
* Gets the TeraChunk of a SpoutChunk.
*
* @param chunk
* @return
*/
public TeraChunk getChunk(SpoutChunk chunk) {
TeraChunk t = chunks.get(chunk);
if (t == null) {
t = loadChunk(chunk);
}
return t;
}
private TeraChunk loadChunk(SpoutChunk chunk) {
TeraChunk tc = new TeraChunk(chunk);
return tc;
}
public TeraBlock getBlock(short mat) {
TeraBlock b = blocks[mat];
if (b == null) {
blocks[mat] = b = loadBlock(mat);
}
return b;
}
public TeraBlock getBlock(BlockMaterial mat) {
return getBlock(mat.getId());
}
private TeraBlock loadBlock(short mat) {
return new TeraBlock((BlockMaterial) MaterialRegistry.get(mat));
}
}