mirror of
https://github.com/BlueMap-Minecraft/BlueMap.git
synced 2024-12-12 12:16:46 +01:00
First mock of an improved nether-render mode
This commit is contained in:
parent
969f7a78f3
commit
7c1d7a9cc2
@ -30,25 +30,33 @@
|
|||||||
import net.querz.nbt.CompoundTag;
|
import net.querz.nbt.CompoundTag;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
public abstract class MCAChunk implements Chunk {
|
public abstract class MCAChunk implements Chunk {
|
||||||
|
|
||||||
private final MCAWorld world;
|
private final MCAWorld world;
|
||||||
private final int dataVersion;
|
private final int dataVersion;
|
||||||
|
|
||||||
|
private int[] netherCeilingHeights;
|
||||||
|
|
||||||
protected MCAChunk() {
|
protected MCAChunk() {
|
||||||
this.world = null;
|
this(null, -1);
|
||||||
this.dataVersion = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MCAChunk(MCAWorld world) {
|
protected MCAChunk(MCAWorld world) {
|
||||||
this.world = world;
|
this(world, -1);
|
||||||
this.dataVersion = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected MCAChunk(MCAWorld world, CompoundTag chunkTag) {
|
protected MCAChunk(MCAWorld world, CompoundTag chunkTag) {
|
||||||
|
this(world, chunkTag.getInt("DataVersion"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private MCAChunk(MCAWorld world, int dataVersion) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
dataVersion = chunkTag.getInt("DataVersion");
|
this.dataVersion = dataVersion;
|
||||||
|
|
||||||
|
this.netherCeilingHeights = new int[16 * 16];
|
||||||
|
Arrays.fill(this.netherCeilingHeights, Integer.MIN_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -86,6 +94,26 @@ public int getMinY(int x, int z) {
|
|||||||
@Override
|
@Override
|
||||||
public int getOceanFloorY(int x, int z) { return 0; }
|
public int getOceanFloorY(int x, int z) { return 0; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNetherCeilingY(int x, int z) {
|
||||||
|
int lx = x & 0xF, lz = z & 0xF;
|
||||||
|
int i = lz * 16 + lx;
|
||||||
|
int y = netherCeilingHeights[i];
|
||||||
|
|
||||||
|
if (y == Integer.MIN_VALUE) {
|
||||||
|
int maxY = getMaxY(x, z);
|
||||||
|
int minY = getMinY(x, z);
|
||||||
|
|
||||||
|
for (y = Math.min(maxY, 120); y >= minY; y--){
|
||||||
|
if (!getBlockState(x, y, z).isNetherCeiling()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
netherCeilingHeights[i] = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
protected MCAWorld getWorld() {
|
protected MCAWorld getWorld() {
|
||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,10 @@ public Chunk getChunk() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BlockState getBlockState() {
|
public BlockState getBlockState() {
|
||||||
if (blockState == null) blockState = getChunk().getBlockState(x, y, z);
|
if (blockState == null){
|
||||||
|
if (y > getChunk().getNetherCeilingY(x, z)) blockState = BlockState.AIR;
|
||||||
|
else blockState = getChunk().getBlockState(x, y, z);
|
||||||
|
}
|
||||||
return blockState;
|
return blockState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ public class BlockState extends Key {
|
|||||||
private final Map<String, String> properties;
|
private final Map<String, String> properties;
|
||||||
private final Property[] propertiesArray;
|
private final Property[] propertiesArray;
|
||||||
|
|
||||||
private final boolean isAir, isWater, isWaterlogged;
|
private final boolean isAir, isWater, isWaterlogged, isNetherCeiling;
|
||||||
private int liquidLevel = -1, redstonePower = -1;
|
private int liquidLevel = -1, redstonePower = -1;
|
||||||
|
|
||||||
public BlockState(String value) {
|
public BlockState(String value) {
|
||||||
@ -82,6 +82,17 @@ public BlockState(String value, Map<String, String> properties) {
|
|||||||
this.isWater = "minecraft:water".equals(this.getFormatted());
|
this.isWater = "minecraft:water".equals(this.getFormatted());
|
||||||
this.isWaterlogged = "true".equals(properties.get("waterlogged"));
|
this.isWaterlogged = "true".equals(properties.get("waterlogged"));
|
||||||
|
|
||||||
|
this.isNetherCeiling =
|
||||||
|
"minecraft:bedrock".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:netherrack".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:nether_quartz_ore".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:lava".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:soul_sand".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:basalt".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:blackstone".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:soul_soil".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:nether_gold_ore".equals(this.getFormatted()) ||
|
||||||
|
"minecraft:ancient_debris".equals(this.getFormatted());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,6 +120,10 @@ public boolean isWaterlogged() {
|
|||||||
return isWaterlogged;
|
return isWaterlogged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isNetherCeiling() {
|
||||||
|
return isNetherCeiling;
|
||||||
|
}
|
||||||
|
|
||||||
public int getLiquidLevel() {
|
public int getLiquidLevel() {
|
||||||
if (liquidLevel == -1) {
|
if (liquidLevel == -1) {
|
||||||
try {
|
try {
|
||||||
|
@ -44,4 +44,6 @@ public interface Chunk {
|
|||||||
|
|
||||||
int getOceanFloorY(int x, int z);
|
int getOceanFloorY(int x, int z);
|
||||||
|
|
||||||
|
int getNetherCeilingY(int x, int z);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -69,4 +69,9 @@ public int getMinY(int x, int z) {
|
|||||||
@Override
|
@Override
|
||||||
public int getOceanFloorY(int x, int z) { return 0; }
|
public int getOceanFloorY(int x, int z) { return 0; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNetherCeilingY(int x, int z) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user