/*
* This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT).
*
* Copyright (c) JCThePants (www.jcwhatever.com)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.jcwhatever.nucleus.utils.coords;
import com.jcwhatever.nucleus.storage.IDataNode;
import com.jcwhatever.nucleus.storage.serialize.DeserializeException;
import com.jcwhatever.nucleus.utils.PreCon;
import com.jcwhatever.nucleus.utils.file.IByteReader;
import com.jcwhatever.nucleus.utils.file.IByteWriter;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.block.Block;
import java.io.IOException;
/**
* Data object to hold information about a single block
*/
public final class ChunkBlockInfo extends Coords3Di
implements IChunkBlockInfo, Comparable<ChunkBlockInfo> {
private Material _material;
private int _data;
private int _light;
private int _skylight;
/**
* Constructor.
*
* @param material The block material.
* @param data The block meta data.
* @param chunkBlockX The blocks X coordinates relative to its chunk.
* @param y The blocks Y coordinates.
* @param chunkBlockZ The blocks Z coordinates relative to its chunk,
*/
public ChunkBlockInfo(int chunkBlockX, int y, int chunkBlockZ, Material material,
int data, int light, int skylight) {
super(chunkBlockX, y, chunkBlockZ);
_material = material;
_data = data;
_light = light;
_skylight = skylight;
}
@Override
public Material getMaterial() {
return _material;
}
@Override
public int getData() {
return _data;
}
@Override
public int getEmittedLight() {
return _light;
}
@Override
public int getSkylight() {
return _skylight;
}
/**
* Get the {@link org.bukkit.block.Block} represented by this coordinates in
* the specified {@link org.bukkit.Chunk}.
*
* @param chunk The chunk to get the block from.
*/
public Block getBlock(Chunk chunk) {
PreCon.notNull(chunk);
return chunk.getBlock(getX(), getY(), getZ());
}
@Override
public int compareTo(ChunkBlockInfo o) {
//noinspection SuspiciousNameCombination
return Integer.compare(this.getY(), o.getY());
}
@Override
public void serialize(IDataNode dataNode) {
super.serialize(dataNode);
dataNode.set("material", _material);
dataNode.set("meta", _data);
dataNode.set("light", _light);
dataNode.set("sky", _skylight);
}
@Override
public void deserialize(IDataNode dataNode) throws DeserializeException {
super.deserialize(dataNode);
_material = dataNode.getEnum("material", Material.class);
_data = dataNode.getInteger("meta");
_light = dataNode.getInteger("light");
_skylight = dataNode.getInteger("sky");
}
@Override
public void serialize(IByteWriter writer) throws IOException {
writer.write((byte)((getX() << 4) | (getY() & 0xF)));
writer.write((short)getY());
writer.write(_material);
writer.write((byte)_data);
writer.write((byte)((_light << 4) | (_skylight & 0xF)));
}
@Override
public void deserialize(IByteReader reader)
throws IOException, ClassNotFoundException, InstantiationException {
int xz = reader.getByte();
int x = xz >> 4;
int z = xz & 0xF;
int y = reader.getShort();
_material = reader.getEnum(Material.class);
_data = reader.getByte();
int ls = reader.getByte();
_light = ls >> 4;
_skylight = ls & 0xF;
setX(x);
setY(y);
setZ(z);
seal();
}
@Override
public String toString() {
return getClass().getSimpleName() +
" { x:" + getX() + ", z:" + getZ() +
", material:" + _material.name() +
", data:" + _data +
", light:" + _light +
", skylight: " + _skylight + '}';
}
}