mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-11-24 03:05:28 +01:00
Further handle broken lighting data... start builder pattern for
blockstate
This commit is contained in:
parent
67ab35658c
commit
05819b1b74
@ -128,12 +128,8 @@ public class GenericChunk {
|
|||||||
int idx = (z << 4) + x;
|
int idx = (z << 4) + x;
|
||||||
for (int y = 15; y >= 0; y--) {
|
for (int y = 15; y >= 0; y--) {
|
||||||
DynmapBlockState bs = sections[i].blocks.getBlock(x, y, z); // Get block
|
DynmapBlockState bs = sections[i].blocks.getBlock(x, y, z); // Get block
|
||||||
if (bs.isWater() || bs.isWaterlogged()) { // Drop light by 1 level for water
|
int atten = bs.lightAttenuation;
|
||||||
sky[idx] = sky[idx] < 1 ? 0 : sky[idx] - 1;
|
sky[idx] = (sky[idx] > atten) ? (sky[idx] - atten) : 0;
|
||||||
}
|
|
||||||
else if (bs.isLeaves()) { // Drop light by 2 levels for leaves
|
|
||||||
sky[idx] = sky[idx] < 2 ? 0 : sky[idx] - 2;
|
|
||||||
}
|
|
||||||
ssky[(y << 7) | (z << 3) | (x >> 1)] |= (sky[idx] << (4 * (x & 1)));
|
ssky[(y << 7) | (z << 3) | (x >> 1)] |= (sky[idx] << (4 * (x & 1)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@ public class DynmapBlockState {
|
|||||||
public final int globalStateIndex;
|
public final int globalStateIndex;
|
||||||
// Legacy block ID (if defined - otherwise -1)
|
// Legacy block ID (if defined - otherwise -1)
|
||||||
public final int legacyBlockID;
|
public final int legacyBlockID;
|
||||||
|
// Light attenuation level (levels dropped when light tries to pass through block)
|
||||||
|
public final int lightAttenuation;
|
||||||
// List of block states (only defined on base block), indexed by stateIndex (null if single state base block)
|
// List of block states (only defined on base block), indexed by stateIndex (null if single state base block)
|
||||||
private DynmapBlockState[] states;
|
private DynmapBlockState[] states;
|
||||||
private int stateLastIdx = 0;
|
private int stateLastIdx = 0;
|
||||||
@ -44,7 +46,6 @@ public class DynmapBlockState {
|
|||||||
private static int MATCH_WATERLOGGED = 1 << 5;
|
private static int MATCH_WATERLOGGED = 1 << 5;
|
||||||
private static int MATCH_LEAVES = 1 << 6;
|
private static int MATCH_LEAVES = 1 << 6;
|
||||||
private static int MATCH_SOLID = 1 << 7;
|
private static int MATCH_SOLID = 1 << 7;
|
||||||
|
|
||||||
// Map of base blocks by name
|
// Map of base blocks by name
|
||||||
private static HashMap<String, DynmapBlockState> blocksByName = new HashMap<String, DynmapBlockState>();
|
private static HashMap<String, DynmapBlockState> blocksByName = new HashMap<String, DynmapBlockState>();
|
||||||
// Map of states by global state index
|
// Map of states by global state index
|
||||||
@ -104,6 +105,45 @@ public class DynmapBlockState {
|
|||||||
|
|
||||||
private static DynmapBlockState still_water = null;
|
private static DynmapBlockState still_water = null;
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
DynmapBlockState base;
|
||||||
|
int stateidx;
|
||||||
|
String blkname;
|
||||||
|
String statename;
|
||||||
|
String material;
|
||||||
|
int legacyblkid;
|
||||||
|
int matchflags;
|
||||||
|
int lightblocked;
|
||||||
|
public Builder() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
public void reset() { base = null; blkname = null; statename = null; material = null; legacyblkid = -1; matchflags = 0; lightblocked = 0; }
|
||||||
|
public Builder setBaseState(DynmapBlockState base) { this.base = base; return this; }
|
||||||
|
public Builder setStateIndex(int stateidx) { this.stateidx = stateidx; return this; }
|
||||||
|
public Builder setBlockName(String blkname) { this.blkname = blkname; return this; }
|
||||||
|
public Builder setStateName(String statename) { this.statename = statename; return this; }
|
||||||
|
public Builder setMaterial(String material) { this.material = material; return this; }
|
||||||
|
public Builder setLegacyBlockID(int legacyblkid) { this.legacyblkid = legacyblkid; return this; }
|
||||||
|
public Builder setAir() { this.matchflags |= MATCH_AIR; return this; }
|
||||||
|
public Builder setLog() { this.matchflags |= MATCH_LOG; return this; }
|
||||||
|
public Builder setCustomWater() { this.matchflags |= MATCH_WATER; return this; }
|
||||||
|
public Builder setWaterlogged() { this.matchflags |= MATCH_WATERLOGGED; return this; }
|
||||||
|
public Builder setLeaves() { this.matchflags |= MATCH_LEAVES; return this; }
|
||||||
|
public Builder setSolid() { this.matchflags |= MATCH_SOLID; return this; }
|
||||||
|
public Builder setBlocksLight() { this.lightblocked = 15; return this; }
|
||||||
|
public Builder setAttenuatesLight(int levels) { this.lightblocked = levels; return this; }
|
||||||
|
public DynmapBlockState build() {
|
||||||
|
DynmapBlockState bs = new DynmapBlockState(base, stateidx, blkname, statename, material, legacyblkid);
|
||||||
|
if ((matchflags & MATCH_AIR) != 0) bs.setAir();
|
||||||
|
if ((matchflags & MATCH_LOG) != 0) bs.setLog();
|
||||||
|
if ((matchflags & MATCH_WATERLOGGED) != 0) bs.setWaterlogged();
|
||||||
|
if ((matchflags & MATCH_LEAVES) != 0) bs.setLeaves();
|
||||||
|
if ((matchflags & MATCH_SOLID) != 0) bs.setSolid();
|
||||||
|
if ((matchflags & MATCH_WATER) != 0) bs.addWaterBlock(blkname);
|
||||||
|
return bs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for block state
|
* Constructor for block state
|
||||||
* @param base - base block state (null if first/only state for block)
|
* @param base - base block state (null if first/only state for block)
|
||||||
@ -113,7 +153,7 @@ public class DynmapBlockState {
|
|||||||
* @param material - material name string
|
* @param material - material name string
|
||||||
*/
|
*/
|
||||||
public DynmapBlockState(DynmapBlockState base, int stateidx, String blkname, String statename, String material) {
|
public DynmapBlockState(DynmapBlockState base, int stateidx, String blkname, String statename, String material) {
|
||||||
this(base, stateidx, blkname, statename, material, -1);
|
this(base, stateidx, blkname, statename, material, -1, -1);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Constructor for block state
|
* Constructor for block state
|
||||||
@ -125,6 +165,10 @@ public class DynmapBlockState {
|
|||||||
* @param legacyblkid - legacy block ID (if defined), otherwise -1
|
* @param legacyblkid - legacy block ID (if defined), otherwise -1
|
||||||
*/
|
*/
|
||||||
public DynmapBlockState(DynmapBlockState base, int stateidx, String blkname, String statename, String material, int legacyblkid) {
|
public DynmapBlockState(DynmapBlockState base, int stateidx, String blkname, String statename, String material, int legacyblkid) {
|
||||||
|
this(base, stateidx, blkname, statename, material, legacyblkid, -1);
|
||||||
|
}
|
||||||
|
private DynmapBlockState(DynmapBlockState base, int stateidx, String blkname, String statename, String material, int legacyblkid, int lightAtten) {
|
||||||
|
|
||||||
// If we generated lookup arrays, flush them and complain about it
|
// If we generated lookup arrays, flush them and complain about it
|
||||||
if (blockArrayByIndex != null) {
|
if (blockArrayByIndex != null) {
|
||||||
blockArrayByIndex = null;
|
blockArrayByIndex = null;
|
||||||
@ -143,7 +187,6 @@ public class DynmapBlockState {
|
|||||||
}
|
}
|
||||||
blockName = blkname;
|
blockName = blkname;
|
||||||
stateName = (statename != null) ? statename : "";
|
stateName = (statename != null) ? statename : "";
|
||||||
|
|
||||||
if (base != this) { // If we aren't base block state
|
if (base != this) { // If we aren't base block state
|
||||||
if (base.states == null) { // If no state list yet
|
if (base.states == null) { // If no state list yet
|
||||||
base.states = new DynmapBlockState[Math.max((stateidx+1)*3 / 2, 16)]; // Enough for us to fit
|
base.states = new DynmapBlockState[Math.max((stateidx+1)*3 / 2, 16)]; // Enough for us to fit
|
||||||
@ -185,6 +228,14 @@ public class DynmapBlockState {
|
|||||||
if (this.blockName.equals(WATER_BLOCK) && (this == this.baseState)) {
|
if (this.blockName.equals(WATER_BLOCK) && (this == this.baseState)) {
|
||||||
still_water = this;
|
still_water = this;
|
||||||
}
|
}
|
||||||
|
if (lightAtten < 0) { // Not set
|
||||||
|
if (isWater() || isWaterlogged()) lightAttenuation = 1;
|
||||||
|
else if (isLeaves()) lightAttenuation = 2;
|
||||||
|
else lightAttenuation = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lightAttenuation = lightAtten;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Generate static lookup arrays once all BlockStates initialized
|
* Generate static lookup arrays once all BlockStates initialized
|
||||||
|
Loading…
Reference in New Issue
Block a user