Implement basic sky lighting for chunks with broken lighting

(forge,fabric)
This commit is contained in:
Mike Primm 2021-12-24 20:38:05 -06:00
parent 05819b1b74
commit 3a3a970883
12 changed files with 197 additions and 219 deletions

View File

@ -119,23 +119,31 @@ public class GenericChunk {
int sky[] = new int[256]; // ZX array int sky[] = new int[256]; // ZX array
Arrays.fill(sky, 15); // Start fully lit at top Arrays.fill(sky, 15); // Start fully lit at top
GenericChunkSection.Builder bld = new GenericChunkSection.Builder(); GenericChunkSection.Builder bld = new GenericChunkSection.Builder();
boolean allzero = false;
// Make light array for each section, start from top // Make light array for each section, start from top
for (int i = (sections.length - 1); i >= 0; i--) { for (int i = (sections.length - 1); i >= 0; i--) {
if (sections[i] == null) continue; if (sections[i] == null) continue;
byte[] ssky = new byte[2048]; byte[] ssky = new byte[2048];
for (int x = 0; x < 16; x++) { if (!allzero) {
for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) {
int idx = (z << 4) + x; for (int z = 0; z < 16; z++) {
for (int y = 15; y >= 0; y--) { int idx = (z << 4) + x;
DynmapBlockState bs = sections[i].blocks.getBlock(x, y, z); // Get block for (int y = 15; y >= 0; y--) {
int atten = bs.lightAttenuation; DynmapBlockState bs = sections[i].blocks.getBlock(x, y, z); // Get block
sky[idx] = (sky[idx] > atten) ? (sky[idx] - atten) : 0; int atten = bs.getLightAttenuation();
ssky[(y << 7) | (z << 3) | (x >> 1)] |= (sky[idx] << (4 * (x & 1))); sky[idx] = (sky[idx] >= atten) ? (sky[idx] - atten) : 0;
ssky[(y << 7) | (z << 3) | (x >> 1)] |= (sky[idx] << (4 * (x & 1)));
}
} }
} }
// Check if we're all dark
allzero = true;
for (int v = 0; v < 256; v++) {
if (sky[v] > 0) { allzero = false; break; }
}
} }
// Replace section with new one with new lighting // Replace section with new one with new lighting
sections[i] = bld.buildFrom(sections[i], ssky); sections[i] = bld.buildFrom(sections[i], ssky);
} }
return this; return this;
} }

View File

@ -26,7 +26,7 @@ public class DynmapBlockState {
// 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) // Light attenuation level (levels dropped when light tries to pass through block)
public final int lightAttenuation; public 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;
@ -106,24 +106,24 @@ public class DynmapBlockState {
private static DynmapBlockState still_water = null; private static DynmapBlockState still_water = null;
public static class Builder { public static class Builder {
DynmapBlockState base; private DynmapBlockState base;
int stateidx; private int stateidx;
String blkname; private String blkname;
String statename; private String statename;
String material; private String material;
int legacyblkid; private int legacyblkid;
int matchflags; private int matchflags;
int lightblocked; private int lightblocked;
public Builder() { public Builder() {
reset(); reset();
} }
public void reset() { base = null; blkname = null; statename = null; material = null; legacyblkid = -1; matchflags = 0; lightblocked = 0; } 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 setBaseState(DynmapBlockState blkbase) { this.base = blkbase; return this; }
public Builder setStateIndex(int stateidx) { this.stateidx = stateidx; return this; } public Builder setStateIndex(int sidx) { this.stateidx = sidx; return this; }
public Builder setBlockName(String blkname) { this.blkname = blkname; return this; } public Builder setBlockName(String blkname) { this.blkname = blkname; return this; }
public Builder setStateName(String statename) { this.statename = statename; return this; } public Builder setStateName(String stname) { this.statename = stname; return this; }
public Builder setMaterial(String material) { this.material = material; return this; } public Builder setMaterial(String mat) { this.material = mat; return this; }
public Builder setLegacyBlockID(int legacyblkid) { this.legacyblkid = legacyblkid; return this; } public Builder setLegacyBlockID(int legacybid) { this.legacyblkid = legacybid; return this; }
public Builder setAir() { this.matchflags |= MATCH_AIR; return this; } public Builder setAir() { this.matchflags |= MATCH_AIR; return this; }
public Builder setLog() { this.matchflags |= MATCH_LOG; return this; } public Builder setLog() { this.matchflags |= MATCH_LOG; return this; }
public Builder setCustomWater() { this.matchflags |= MATCH_WATER; return this; } public Builder setCustomWater() { this.matchflags |= MATCH_WATER; return this; }
@ -133,13 +133,14 @@ public class DynmapBlockState {
public Builder setBlocksLight() { this.lightblocked = 15; return this; } public Builder setBlocksLight() { this.lightblocked = 15; return this; }
public Builder setAttenuatesLight(int levels) { this.lightblocked = levels; return this; } public Builder setAttenuatesLight(int levels) { this.lightblocked = levels; return this; }
public DynmapBlockState build() { public DynmapBlockState build() {
DynmapBlockState bs = new DynmapBlockState(base, stateidx, blkname, statename, material, legacyblkid); DynmapBlockState bs = new DynmapBlockState(base, stateidx, blkname, statename, material, legacyblkid, lightblocked);
if ((matchflags & MATCH_AIR) != 0) bs.setAir(); if ((matchflags & MATCH_AIR) != 0) bs.setAir();
if ((matchflags & MATCH_LOG) != 0) bs.setLog(); if ((matchflags & MATCH_LOG) != 0) bs.setLog();
if ((matchflags & MATCH_WATERLOGGED) != 0) bs.setWaterlogged(); if ((matchflags & MATCH_WATERLOGGED) != 0) bs.setWaterlogged();
if ((matchflags & MATCH_LEAVES) != 0) bs.setLeaves(); if ((matchflags & MATCH_LEAVES) != 0) bs.setLeaves();
if ((matchflags & MATCH_SOLID) != 0) bs.setSolid(); if ((matchflags & MATCH_SOLID) != 0) bs.setSolid();
if ((matchflags & MATCH_WATER) != 0) bs.addWaterBlock(blkname); if ((matchflags & MATCH_WATER) != 0) bs.addWaterBlock(blkname);
reset(); // Reset after build complete
return bs; return bs;
} }
} }
@ -228,14 +229,7 @@ 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 lightAttenuation = lightAtten;
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
@ -528,6 +522,15 @@ public class DynmapBlockState {
public void setSolid() { public void setSolid() {
matchflags |= MATCH_SOLID; matchflags |= MATCH_SOLID;
} }
/**
* Get light attenuation
*/
public final int getLightAttenuation() {
if (lightAttenuation < 0) {
lightAttenuation = (isWater() || isWaterlogged() || isLeaves()) ? 1 : 0;
}
return lightAttenuation;
}
/** /**
* To printable string * To printable string
*/ */

View File

@ -29,6 +29,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.CollisionView; import net.minecraft.world.CollisionView;
import net.minecraft.world.EmptyBlockView;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
//import net.minecraft.world.WorldAccess; //import net.minecraft.world.WorldAccess;
@ -174,6 +175,7 @@ public class DynmapPlugin {
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getId(bs); int idx = bsids.getId(bs);
@ -205,27 +207,20 @@ public class DynmapPlugin {
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isFullOpaque(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTranslucent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { if (basebs == null) { basebs = dbs; }
basebs = dbs;
}
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -28,6 +28,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.EmptyBlockView;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
//import net.minecraft.world.WorldAccess; //import net.minecraft.world.WorldAccess;
@ -174,6 +175,7 @@ public class DynmapPlugin {
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getId(bs); int idx = bsids.getId(bs);
@ -205,27 +207,20 @@ public class DynmapPlugin {
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isFullOpaque(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTranslucent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { if (basebs == null) { basebs = dbs; }
basebs = dbs;
}
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -27,6 +27,7 @@ import net.minecraft.util.collection.IdList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.EmptyBlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
@ -173,6 +174,7 @@ public class DynmapPlugin {
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getRawId(bs); int idx = bsids.getRawId(bs);
@ -204,27 +206,20 @@ public class DynmapPlugin {
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueFullCube(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTranslucent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { if (basebs == null) { basebs = dbs; }
basebs = dbs;
}
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -27,6 +27,7 @@ import net.minecraft.util.collection.IdList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.EmptyBlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
@ -174,6 +175,7 @@ public class DynmapPlugin {
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getRawId(bs); int idx = bsids.getRawId(bs);
@ -205,27 +207,20 @@ public class DynmapPlugin {
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueFullCube(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTranslucent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { if (basebs == null) { basebs = dbs; }
basebs = dbs;
}
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -24,6 +24,7 @@ import net.minecraft.util.collection.IdList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.world.EmptyBlockView;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
@ -31,6 +32,7 @@ import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.chunk.ChunkSection;
import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.chunk.ChunkStatus;
import net.minecraft.world.chunk.WorldChunk; import net.minecraft.world.chunk.WorldChunk;
import org.dynmap.*; import org.dynmap.*;
import org.dynmap.common.BiomeMap; import org.dynmap.common.BiomeMap;
import org.dynmap.common.DynmapCommandSender; import org.dynmap.common.DynmapCommandSender;
@ -135,6 +137,7 @@ public class DynmapPlugin {
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getRawId(bs); int idx = bsids.getRawId(bs);
@ -166,27 +169,20 @@ public class DynmapPlugin {
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueFullCube(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTranslucent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { if (basebs == null) { basebs = dbs; }
basebs = dbs;
}
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
// for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { // for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -56,6 +56,7 @@ import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.EmptyBlockReader;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -222,6 +223,7 @@ public class DynmapPlugin
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.get(bs); int idx = bsids.get(bs);
@ -253,25 +255,20 @@ public class DynmapPlugin
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueCube(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { basebs = dbs; } if (basebs == null) { basebs = dbs; }
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -57,6 +57,7 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.EmptyBlockReader;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -223,6 +224,7 @@ public class DynmapPlugin
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.get(bs); int idx = bsids.get(bs);
@ -254,25 +256,20 @@ public class DynmapPlugin
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueCube(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { basebs = dbs; } if (basebs == null) { basebs = dbs; }
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -59,6 +59,7 @@ import net.minecraft.util.registry.Registry;
import net.minecraft.util.text.ChatType; import net.minecraft.util.text.ChatType;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.world.EmptyBlockReader;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IServerWorld; import net.minecraft.world.IServerWorld;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
@ -224,6 +225,9 @@ public class DynmapPlugin
/** /**
* Initialize block states (org.dynmap.blockstate.DynmapBlockState) * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
*/ */
/**
*
*/
public void initializeBlockStates() { public void initializeBlockStates() {
stateByID = new DynmapBlockState[512*32]; // Simple map - scale as needed stateByID = new DynmapBlockState[512*32]; // Simple map - scale as needed
Arrays.fill(stateByID, DynmapBlockState.AIR); // Default to air Arrays.fill(stateByID, DynmapBlockState.AIR); // Default to air
@ -235,6 +239,7 @@ public class DynmapPlugin
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getId(bs); int idx = bsids.getId(bs);
@ -266,25 +271,21 @@ public class DynmapPlugin
} }
statename += p.getName() + "=" + bs.get(p).toString(); statename += p.getName() + "=" + bs.get(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isOpaqueCube(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockReader.INSTANCE, BlockPos.ZERO) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { basebs = dbs; } if (basebs == null) { basebs = dbs; }
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof FlowingFluidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -51,6 +51,7 @@ import net.minecraft.server.players.GameProfileCache;
import net.minecraft.server.players.UserBanList; import net.minecraft.server.players.UserBanList;
import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.Pose;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.EmptyBlockGetter;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@ -214,6 +215,7 @@ public class DynmapPlugin
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getId(bs); int idx = bsids.getId(bs);
@ -245,25 +247,21 @@ public class DynmapPlugin
} }
statename += p.getName() + "=" + bs.getValue(p).toString(); statename += p.getName() + "=" + bs.getValue(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isSolidRender(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof LiquidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { basebs = dbs; } if (basebs == null) { basebs = dbs; }
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof LiquidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {

View File

@ -123,6 +123,8 @@ import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraft.world.level.EmptyBlockGetter;
public class DynmapPlugin public class DynmapPlugin
{ {
private DynmapCore core; private DynmapCore core;
@ -213,6 +215,7 @@ public class DynmapPlugin
int baseidx = 0; int baseidx = 0;
Iterator<BlockState> iter = bsids.iterator(); Iterator<BlockState> iter = bsids.iterator();
DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
while (iter.hasNext()) { while (iter.hasNext()) {
BlockState bs = iter.next(); BlockState bs = iter.next();
int idx = bsids.getId(bs); int idx = bsids.getId(bs);
@ -244,25 +247,20 @@ public class DynmapPlugin
} }
statename += p.getName() + "=" + bs.getValue(p).toString(); statename += p.getName() + "=" + bs.getValue(p).toString();
} }
//Log.info("bn=" + bn + ", statenme=" + statename + ",idx=" + idx + ",baseidx=" + baseidx); int lightAtten = bs.isSolidRender(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 0 : 1);
DynmapBlockState dbs = new DynmapBlockState(basebs, idx - baseidx, bn, statename, mat.toString(), idx); //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setMaterial(mat.toString()).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
if (mat.isSolid()) { bld.setSolid(); }
if (mat == Material.AIR) { bld.setAir(); }
if (mat == Material.WOOD) { bld.setLog(); }
if (mat == Material.LEAVES) { bld.setLeaves(); }
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof LiquidBlock)) {
bld.setWaterlogged();
}
DynmapBlockState dbs = bld.build(); // Build state
stateByID[idx] = dbs; stateByID[idx] = dbs;
if (basebs == null) { basebs = dbs; } if (basebs == null) { basebs = dbs; }
if (mat.isSolid()) {
dbs.setSolid();
}
if (mat == Material.AIR) {
dbs.setAir();
}
if (mat == Material.WOOD) {
dbs.setLog();
}
if (mat == Material.LEAVES) {
dbs.setLeaves();
}
if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof LiquidBlock)) {
dbs.setWaterlogged();
}
} }
} }
for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {