193 lines
5.0 KiB
Java
193 lines
5.0 KiB
Java
/*
|
|
* This file is part of BlueMap, licensed under the MIT License (MIT).
|
|
*
|
|
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
|
|
* Copyright (c) contributors
|
|
*
|
|
* 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 de.bluecolored.bluemap.core.world;
|
|
|
|
public class Block<T extends Block<T>> {
|
|
|
|
private World world;
|
|
private int x, y, z;
|
|
|
|
private Chunk chunk;
|
|
|
|
private BlockState blockState;
|
|
private final LightData lightData = new LightData(-1, -1);
|
|
private String biomeId;
|
|
|
|
public Block(World world, int x, int y, int z) {
|
|
set(world, x, y, z);
|
|
}
|
|
|
|
public T set(World world, int x, int y, int z) {
|
|
if (this.x == x && this.z == z && this.world == world){
|
|
if (this.y == y) return self();
|
|
} else {
|
|
this.chunk = null; //only reset the chunk if x or z have changed
|
|
}
|
|
|
|
this.world = world;
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
|
|
reset();
|
|
|
|
return self();
|
|
}
|
|
|
|
public T set(int x, int y, int z) {
|
|
if (this.x == x && this.z == z){
|
|
if (this.y == y) return self();
|
|
} else {
|
|
this.chunk = null; //only reset the chunk if x or z have changed
|
|
}
|
|
|
|
this.x = x;
|
|
this.y = y;
|
|
this.z = z;
|
|
|
|
reset();
|
|
|
|
return self();
|
|
}
|
|
|
|
protected void reset() {
|
|
this.blockState = null;
|
|
this.lightData.set(-1, -1);
|
|
this.biomeId = null;
|
|
}
|
|
|
|
public T add(int dx, int dy, int dz) {
|
|
return set(x + dx, y + dy, z + dz);
|
|
}
|
|
|
|
public T copy(Block<?> source) {
|
|
this.world = source.world;
|
|
this.chunk = source.chunk;
|
|
this.x = source.x;
|
|
this.y = source.y;
|
|
this.z = source.z;
|
|
|
|
reset();
|
|
|
|
this.blockState = source.blockState;
|
|
this.lightData.set(source.lightData.getSkyLight(), source.lightData.getBlockLight());
|
|
this.biomeId = source.biomeId;
|
|
|
|
return self();
|
|
}
|
|
|
|
/**
|
|
* copy with offset
|
|
*/
|
|
public T copy(Block<?> source, int dx, int dy, int dz) {
|
|
this.world = source.world;
|
|
this.x = source.x + dx;
|
|
this.y = source.y + dy;
|
|
this.z = source.z + dz;
|
|
|
|
this.chunk = null;
|
|
|
|
reset();
|
|
|
|
return self();
|
|
}
|
|
|
|
public World getWorld() {
|
|
return world;
|
|
}
|
|
|
|
public int getX() {
|
|
return x;
|
|
}
|
|
|
|
public int getY() {
|
|
return y;
|
|
}
|
|
|
|
public int getZ() {
|
|
return z;
|
|
}
|
|
|
|
public Chunk getChunk() {
|
|
if (chunk == null) chunk = world.getChunkAtBlock(x, y, z);
|
|
return chunk;
|
|
}
|
|
|
|
public BlockState getBlockState() {
|
|
if (blockState == null){
|
|
if (y > getChunk().getNetherCeilingY(x, z)) blockState = BlockState.AIR;
|
|
else blockState = getChunk().getBlockState(x, y, z);
|
|
}
|
|
return blockState;
|
|
}
|
|
|
|
public LightData getLightData() {
|
|
if (lightData.getSkyLight() < 0) getChunk().getLightData(x, y, z, lightData);
|
|
return lightData;
|
|
}
|
|
|
|
public String getBiomeId() {
|
|
if (biomeId == null) biomeId = getChunk().getBiome(x, y, z);
|
|
return biomeId;
|
|
}
|
|
|
|
public int getSunLightLevel() {
|
|
return getLightData().getSkyLight();
|
|
}
|
|
|
|
public int getBlockLightLevel() {
|
|
return getLightData().getBlockLight();
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
if (world != null) {
|
|
return "Block{" +
|
|
"world=" + world +
|
|
", x=" + x +
|
|
", y=" + y +
|
|
", z=" + z +
|
|
", chunk=" + getChunk() +
|
|
", blockState=" + getBlockState() +
|
|
", lightData=" + getLightData() +
|
|
", biomeId=" + getBiomeId() +
|
|
'}';
|
|
} else {
|
|
return "Block{" +
|
|
"world=null" +
|
|
", x=" + x +
|
|
", y=" + y +
|
|
", z=" + z +
|
|
'}';
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
protected T self() {
|
|
return (T) this;
|
|
}
|
|
|
|
}
|