package net.glowstone.io.structure;
import net.glowstone.generator.structures.GlowStructurePiece;
import net.glowstone.generator.structures.util.StructureBoundingBox;
import net.glowstone.util.nbt.CompoundTag;
import org.bukkit.util.Vector;
/**
* The base for structure piece store classes.
* @param <T> The type of structure piece being stored.
*/
public abstract class StructurePieceStore<T extends GlowStructurePiece> {
private final String id;
private final Class<T> clazz;
public StructurePieceStore(Class<T> clazz, String id) {
this.id = id;
this.clazz = clazz;
}
public final String getId() {
return id;
}
public final Class<T> getType() {
return clazz;
}
/**
* Create a structure piece of this store's type. The load method will
* be called separately.
* @return The structure piece.
*/
public abstract T createStructurePiece();
/**
* Load structure piece data of the appropriate type from the given compound tag.
* @param structurePiece The target structure piece.
* @param compound The structure piece's tag.
*/
public void load(T structurePiece, CompoundTag compound) {
if (compound.isInt("GD")) {
structurePiece.setGD(compound.getInt("GD"));
}
if (compound.isInt("O")) {
structurePiece.setNumericOrientation(compound.getInt("O"));
}
if (compound.isIntArray("BB")) {
int[] bb = compound.getIntArray("BB");
if (bb.length == 6) {
final StructureBoundingBox boundingBox = new StructureBoundingBox(new Vector(bb[0], bb[1], bb[2]), new Vector(bb[3], bb[4], bb[5]));
structurePiece.setBoundingBox(boundingBox);
}
}
}
/**
* Save information about this structure piece to the given tag.
* @param structurePiece The structure piece to save.
* @param compound The target tag.
*/
public void save(T structurePiece, CompoundTag compound) {
compound.putInt("GD", structurePiece.getGD());
compound.putInt("O", structurePiece.getNumericOrientation());
StructureBoundingBox boundingBox = structurePiece.getBoundingBox();
int[] bb = new int[6];
bb[0] = boundingBox.getMin().getBlockX();
bb[1] = boundingBox.getMin().getBlockY();
bb[2] = boundingBox.getMin().getBlockZ();
bb[3] = boundingBox.getMax().getBlockX();
bb[4] = boundingBox.getMax().getBlockY();
bb[5] = boundingBox.getMax().getBlockZ();
compound.putIntArray("BB", bb);
}
}