use of net.minecraft.world.gen.Heightmap in project LoliServer by Loli-Server.
the class CraftChunk method getChunkSnapshot.
@Override
public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain) {
net.minecraft.world.chunk.Chunk chunk = getHandle();
ChunkSection[] cs = chunk.getSections();
PalettedContainer[] sectionBlockIDs = new PalettedContainer[cs.length];
byte[][] sectionSkyLights = new byte[cs.length][];
byte[][] sectionEmitLights = new byte[cs.length][];
boolean[] sectionEmpty = new boolean[cs.length];
for (int i = 0; i < cs.length; i++) {
if (cs[i] == null) {
// Section is empty?
sectionBlockIDs[i] = emptyBlockIDs;
sectionSkyLights[i] = emptyLight;
sectionEmitLights[i] = emptyLight;
sectionEmpty[i] = true;
} else {
// Not empty
CompoundNBT data = new CompoundNBT();
cs[i].getStates().write(data, "Palette", "BlockStates");
// TODO: snapshot whole ChunkSection
PalettedContainer blockids = new PalettedContainer<net.minecraft.block.BlockState>(ChunkSection.GLOBAL_BLOCKSTATE_PALETTE, net.minecraft.block.Block.BLOCK_STATE_REGISTRY, NBTUtil::readBlockState, NBTUtil::writeBlockState, Blocks.AIR.defaultBlockState());
blockids.read(data.getList("Palette", CraftMagicNumbers.NBT.TAG_COMPOUND), data.getLongArray("BlockStates"));
sectionBlockIDs[i] = blockids;
WorldLightManager lightengine = chunk.level.getChunkSource().getLightEngine();
NibbleArray skyLightArray = lightengine.getLayerListener(LightType.SKY).getDataLayerData(SectionPos.of(x, i, z));
if (skyLightArray == null) {
sectionSkyLights[i] = emptyLight;
} else {
sectionSkyLights[i] = new byte[2048];
System.arraycopy(skyLightArray.getData(), 0, sectionSkyLights[i], 0, 2048);
}
NibbleArray emitLightArray = lightengine.getLayerListener(LightType.BLOCK).getDataLayerData(SectionPos.of(x, i, z));
if (emitLightArray == null) {
sectionEmitLights[i] = emptyLight;
} else {
sectionEmitLights[i] = new byte[2048];
System.arraycopy(emitLightArray.getData(), 0, sectionEmitLights[i], 0, 2048);
}
}
}
Heightmap hmap = null;
if (includeMaxBlockY) {
hmap = new Heightmap(null, Heightmap.Type.MOTION_BLOCKING);
hmap.setRawData(chunk.heightmaps.get(Heightmap.Type.MOTION_BLOCKING).getRawData());
}
BiomeContainer biome = null;
if (includeBiome || includeBiomeTempRain) {
biome = chunk.getBiomes();
}
World world = getWorld();
return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome);
}
use of net.minecraft.world.gen.Heightmap in project Magma-1.16.x by magmafoundation.
the class CraftChunk method getChunkSnapshot.
@Override
public ChunkSnapshot getChunkSnapshot(boolean includeMaxBlockY, boolean includeBiome, boolean includeBiomeTempRain) {
net.minecraft.world.chunk.Chunk chunk = getHandle();
ChunkSection[] cs = chunk.getSections();
PalettedContainer[] sectionBlockIDs = new PalettedContainer[cs.length];
byte[][] sectionSkyLights = new byte[cs.length][];
byte[][] sectionEmitLights = new byte[cs.length][];
boolean[] sectionEmpty = new boolean[cs.length];
for (int i = 0; i < cs.length; i++) {
if (cs[i] == null) {
// Section is empty?
sectionBlockIDs[i] = emptyBlockIDs;
sectionSkyLights[i] = emptyLight;
sectionEmitLights[i] = emptyLight;
sectionEmpty[i] = true;
} else {
// Not empty
CompoundNBT data = new CompoundNBT();
cs[i].getStates().write(data, "Palette", "BlockStates");
// TODO: snapshot whole ChunkSection
PalettedContainer blockids = new PalettedContainer<net.minecraft.block.BlockState>(ChunkSection.GLOBAL_BLOCKSTATE_PALETTE, net.minecraft.block.Block.BLOCK_STATE_REGISTRY, NBTUtil::readBlockState, NBTUtil::writeBlockState, Blocks.AIR.defaultBlockState());
blockids.read(data.getList("Palette", CraftMagicNumbers.NBT.TAG_COMPOUND), data.getLongArray("BlockStates"));
sectionBlockIDs[i] = blockids;
WorldLightManager lightengine = chunk.level.getChunkSource().getLightEngine();
NibbleArray skyLightArray = lightengine.getLayerListener(LightType.SKY).getDataLayerData(SectionPos.of(x, i, z));
if (skyLightArray == null) {
sectionSkyLights[i] = emptyLight;
} else {
sectionSkyLights[i] = new byte[2048];
System.arraycopy(skyLightArray.getData(), 0, sectionSkyLights[i], 0, 2048);
}
NibbleArray emitLightArray = lightengine.getLayerListener(LightType.BLOCK).getDataLayerData(SectionPos.of(x, i, z));
if (emitLightArray == null) {
sectionEmitLights[i] = emptyLight;
} else {
sectionEmitLights[i] = new byte[2048];
System.arraycopy(emitLightArray.getData(), 0, sectionEmitLights[i], 0, 2048);
}
}
}
Heightmap hmap = null;
if (includeMaxBlockY) {
hmap = new Heightmap(null, Heightmap.Type.MOTION_BLOCKING);
hmap.setRawData(chunk.heightmaps.get(Heightmap.Type.MOTION_BLOCKING).getRawData());
}
BiomeContainer biome = null;
if (includeBiome || includeBiomeTempRain) {
biome = chunk.getBiomes();
}
World world = getWorld();
return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome);
}
use of net.minecraft.world.gen.Heightmap in project Magma-1.16.x by magmafoundation.
the class CraftChunk method getEmptyChunkSnapshot.
public static ChunkSnapshot getEmptyChunkSnapshot(int x, int z, CraftWorld world, boolean includeBiome, boolean includeBiomeTempRain) {
BiomeContainer biome = null;
if (includeBiome || includeBiomeTempRain) {
BiomeProvider wcm = world.getHandle().getChunkSource().getGenerator().getBiomeSource();
biome = new BiomeContainer(world.getHandle().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), new ChunkPos(x, z), wcm);
}
/* Fill with empty data */
int hSection = world.getMaxHeight() >> 4;
PalettedContainer[] blockIDs = new PalettedContainer[hSection];
byte[][] skyLight = new byte[hSection][];
byte[][] emitLight = new byte[hSection][];
boolean[] empty = new boolean[hSection];
for (int i = 0; i < hSection; i++) {
blockIDs[i] = emptyBlockIDs;
skyLight[i] = emptyLight;
emitLight[i] = emptyLight;
empty[i] = true;
}
return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, skyLight, emitLight, empty, new Heightmap(null, Heightmap.Type.MOTION_BLOCKING), biome);
}
use of net.minecraft.world.gen.Heightmap in project Shrines by Silverminer007.
the class StructureUtils method getHeight.
public static int getHeight(ChunkGenerator cG, BlockPos pos, MutableBoundingBox mbb, Random rand) {
Category biome = cG.getBiomeSource().getNoiseBiome(pos.getX(), pos.getY(), pos.getZ()).getBiomeCategory();
if (biome == Category.NETHER) {
int i = randomIntInclusive(rand, 32, 100);
List<BlockPos> list1 = ImmutableList.of(new BlockPos(mbb.x0, 0, mbb.z0), new BlockPos(mbb.x1, 0, mbb.z0), new BlockPos(mbb.x0, 0, mbb.z1), new BlockPos(mbb.x1, 0, mbb.z1));
List<IBlockReader> list = list1.stream().map((pos1) -> {
return cG.getBaseColumn(pos1.getX(), pos1.getZ());
}).collect(Collectors.toList());
Heightmap.Type heightmap$type = Heightmap.Type.WORLD_SURFACE_WG;
BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable();
int k;
for (k = i; k > 15; --k) {
int l = 0;
blockpos$mutable.set(0, k, 0);
for (IBlockReader iblockreader : list) {
BlockState blockstate = iblockreader.getBlockState(blockpos$mutable);
if (blockstate != null && heightmap$type.isOpaque().test(blockstate)) {
++l;
if (l == 3) {
return k;
}
}
}
}
return k;
} else if (biome == Category.THEEND) {
int i1 = cG.getFirstOccupiedHeight(mbb.x0, mbb.z0, Heightmap.Type.WORLD_SURFACE_WG);
int j1 = cG.getFirstOccupiedHeight(mbb.x0, mbb.z1, Heightmap.Type.WORLD_SURFACE_WG);
int k1 = cG.getFirstOccupiedHeight(mbb.x1, mbb.z0, Heightmap.Type.WORLD_SURFACE_WG);
int l1 = cG.getFirstOccupiedHeight(mbb.x1, mbb.z1, Heightmap.Type.WORLD_SURFACE_WG);
return Math.min(Math.min(i1, j1), Math.min(k1, l1));
} else {
return getAverageHeight(pos, cG, Math.max(mbb.getXSpan(), Math.max(mbb.getYSpan(), mbb.getZSpan())) / 16);
}
}
use of net.minecraft.world.gen.Heightmap in project LoliServer by Loli-Server.
the class CraftChunk method getEmptyChunkSnapshot.
public static ChunkSnapshot getEmptyChunkSnapshot(int x, int z, CraftWorld world, boolean includeBiome, boolean includeBiomeTempRain) {
BiomeContainer biome = null;
if (includeBiome || includeBiomeTempRain) {
BiomeProvider wcm = world.getHandle().getChunkSource().getGenerator().getBiomeSource();
biome = new BiomeContainer(world.getHandle().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), new ChunkPos(x, z), wcm);
}
/* Fill with empty data */
int hSection = world.getMaxHeight() >> 4;
PalettedContainer[] blockIDs = new PalettedContainer[hSection];
byte[][] skyLight = new byte[hSection][];
byte[][] emitLight = new byte[hSection][];
boolean[] empty = new boolean[hSection];
for (int i = 0; i < hSection; i++) {
blockIDs[i] = emptyBlockIDs;
skyLight[i] = emptyLight;
emitLight[i] = emptyLight;
empty[i] = true;
}
return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, skyLight, emitLight, empty, new Heightmap(null, Heightmap.Type.MOTION_BLOCKING), biome);
}
Aggregations