Skip to content
This repository has been archived by the owner on Mar 25, 2021. It is now read-only.

Commit

Permalink
NBT changes for first working 1.14 join
Browse files Browse the repository at this point in the history
  • Loading branch information
LeonMangler authored and fionera committed May 5, 2019
1 parent db662d4 commit 07f9a89
Show file tree
Hide file tree
Showing 12 changed files with 145 additions and 160 deletions.
3 changes: 2 additions & 1 deletion build.gradle.kts
Expand Up @@ -48,7 +48,8 @@ dependencies {
implementation("com.github.ben-manes.caffeine:caffeine:2.6.2")
implementation("commons-io:commons-io:2.6")

implementation("com.github.querz:nbt:4.0")
implementation("com.github.steveice10:opennbt:1.2")


// todo: switch back to lombok plugin as soon as intellij picks up the dependency again
implementation("org.projectlombok:lombok:1.18.4")
Expand Down
Expand Up @@ -2,6 +2,7 @@

import org.springframework.stereotype.Component;
import rocks.cleanstone.game.world.chunk.BlockDataTable;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.section.BlockDataSection;

@Component
public class SimpleVanillaBlockDataStorageFactory implements VanillaBlockDataStorageFactory {
Expand Down
@@ -1,24 +1,40 @@
package rocks.cleanstone.game.world.chunk.data.block.vanilla;

import com.github.steveice10.opennbt.NBTIO;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.LongArrayTag;

import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufOutputStream;
import io.netty.buffer.Unpooled;
import io.netty.util.ReferenceCountUtil;
import lombok.extern.slf4j.Slf4j;
import rocks.cleanstone.data.InOutCodec;
import rocks.cleanstone.game.block.state.BlockState;
import rocks.cleanstone.game.material.block.vanilla.VanillaBlockType;
import rocks.cleanstone.game.world.chunk.BlockDataTable;
import rocks.cleanstone.game.world.chunk.Chunk;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.section.BlockDataSection;
import rocks.cleanstone.net.utils.ByteBufUtils;

import java.io.IOException;

@Slf4j
public class VanillaBlockDataCodec implements InOutCodec<VanillaBlockDataStorage, ByteBuf> {

private final VanillaBlockDataStorageFactory vanillaBlockDataStorageFactory;
private final DirectPalette directPalette;
private final boolean omitDirectPaletteLength;
private final boolean omitDirectPaletteLength, writeHeightMap, omitLighting;

public VanillaBlockDataCodec(VanillaBlockDataStorageFactory vanillaBlockDataStorageFactory, DirectPalette directPalette, boolean omitDirectPaletteLength) {
public VanillaBlockDataCodec(VanillaBlockDataStorageFactory vanillaBlockDataStorageFactory,
DirectPalette directPalette, boolean omitDirectPaletteLength) {
this.vanillaBlockDataStorageFactory = vanillaBlockDataStorageFactory;
this.directPalette = directPalette;
this.omitDirectPaletteLength = omitDirectPaletteLength;
this.writeHeightMap = true;
this.omitLighting = true;
}

@Override
Expand Down Expand Up @@ -59,9 +75,64 @@ public ByteBuf encode(VanillaBlockDataStorage storage) {
}

ByteBufUtils.writeVarInt(data, primaryBitMask);

if (writeHeightMap) writeHeightMap(data, storage);

ByteBufUtils.writeVarInt(data, dataBuf.readableBytes());
data.writeBytes(dataBuf);
ReferenceCountUtil.release(dataBuf);
return data;
}

private void writeHeightMap(ByteBuf data, VanillaBlockDataStorage storage) {
BlockDataTable table = storage.constructTable();
int[] motionBlocking = new int[16 * 16];
for (int sectionY = 0; sectionY < 16; sectionY++) {
for (int x = 0; x < 16; x++) {
for (int y = 0; y < 16; y++) {
for (int z = 0; z < 16; z++) {
final BlockState blockState =
table.getBlock(x, y + sectionY * BlockDataSection.HEIGHT, z).getState();
if (blockState.getBlockType() != VanillaBlockType.AIR)
motionBlocking[x + z * 16] = y + sectionY * 16 + 2; // Should be +1 (top of the block) but +2 works :tm:
}
}
}
}
CompoundTag heightMap = new CompoundTag("");
heightMap.put(new LongArrayTag("MOTION_BLOCKING", encodeHeightMap(motionBlocking)));
//heightMap.put(new LongArrayTag("WORLD_SURFACE", encodeHeightMap(motionBlocking)));

try {
ByteBufOutputStream byteBufStream = new ByteBufOutputStream(data);
DataOutputStream dataOutputStream = new DataOutputStream(byteBufStream);
NBTIO.writeTag((DataOutput) dataOutputStream, heightMap);
dataOutputStream.close();
} catch (IOException e) {
log.error("Error occurred while serializing heightMap NBT data", e);
}
}

private long[] encodeHeightMap(int[] heightMap) {
final int bitsPerBlock = 9;
long maxEntryValue = (1L << bitsPerBlock) - 1;

int length = (int) Math.ceil(heightMap.length * bitsPerBlock / 64.0);
long[] data = new long[length];

for (int index = 0; index < heightMap.length; index++) {
int value = heightMap[index];
int bitIndex = index * 9;
int startIndex = bitIndex / 64;
int endIndex = ((index + 1) * bitsPerBlock - 1) / 64;
int startBitSubIndex = bitIndex % 64;
data[startIndex] = data[startIndex] & ~(maxEntryValue << startBitSubIndex) | ((long) value & maxEntryValue) << startBitSubIndex;
if (startIndex != endIndex) {
int endBitSubIndex = 64 - startBitSubIndex;
data[endIndex] = data[endIndex] >>> endBitSubIndex << endBitSubIndex | ((long) value & maxEntryValue) >> endBitSubIndex;
}
}

return data;
}
}
@@ -1,6 +1,12 @@
package rocks.cleanstone.game.world.chunk.data.block.vanilla;

import com.google.common.base.Objects;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.annotation.Nullable;

import lombok.extern.slf4j.Slf4j;
import rocks.cleanstone.game.block.ImmutableBlock;
import rocks.cleanstone.game.block.state.BlockState;
Expand All @@ -9,10 +15,8 @@
import rocks.cleanstone.game.world.chunk.BlockDataTable;
import rocks.cleanstone.game.world.chunk.Chunk;
import rocks.cleanstone.game.world.chunk.data.block.BlockDataStorage;

import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicBoolean;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.section.BlockDataSection;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.section.PaletteBlockStateStorage;

@Slf4j
public class VanillaBlockDataStorage implements BlockDataStorage {
Expand Down
@@ -1,6 +1,7 @@
package rocks.cleanstone.game.world.chunk.data.block.vanilla;

import rocks.cleanstone.game.world.chunk.BlockDataTable;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.section.BlockDataSection;

public interface VanillaBlockDataStorageFactory {
VanillaBlockDataStorage get(VanillaBlockDataStorage blockDataStorage);
Expand Down
@@ -1,9 +1,12 @@
package rocks.cleanstone.game.world.chunk.data.block.vanilla;
package rocks.cleanstone.game.world.chunk.data.block.vanilla.section;

import java.io.IOException;

import io.netty.buffer.ByteBuf;
import rocks.cleanstone.game.block.state.BlockState;
import rocks.cleanstone.game.material.block.vanilla.VanillaBlockType;
import rocks.cleanstone.game.world.chunk.Chunk;

import java.io.IOException;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.DirectPalette;

public class BlockDataSection {

Expand Down Expand Up @@ -73,9 +76,12 @@ public boolean hasSkyLight() {
}

public void write(ByteBuf out) {
// 1.14 non-air block count
out.writeShort(countNonAirBlocks());

blockStateStorage.write(out);
writeLights(out, true);
if (hasSkyLight) writeLights(out, false);
//writeLights(out, true);
//if (hasSkyLight) writeLights(out, false);
}

private void writeLights(ByteBuf buf, boolean isBlockLight) {
Expand Down Expand Up @@ -109,4 +115,19 @@ private void readLights(ByteBuf buf, boolean isBlockLight) {
}
}
}

private int countNonAirBlocks() {
int blockCount = 0;
for (int y = 0; y < HEIGHT; y++) {
for (int z = 0; z < WIDTH; z++) {
for (int x = 0; x < WIDTH; x++) {
BlockState state = blockStateStorage.get(x, y, z);
if (state.getBlockType() != VanillaBlockType.AIR) {
blockCount++;
}
}
}
}
return blockCount;
}
}
Expand Up @@ -19,7 +19,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package rocks.cleanstone.game.world.chunk.data.block.vanilla;
package rocks.cleanstone.game.world.chunk.data.block.vanilla.section;

import com.google.common.base.Objects;

Expand Down
@@ -1,19 +1,21 @@
package rocks.cleanstone.game.world.chunk.data.block.vanilla;
package rocks.cleanstone.game.world.chunk.data.block.vanilla.section;

import com.google.common.base.Objects;
import com.google.common.base.Preconditions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import io.netty.buffer.ByteBuf;
import lombok.extern.slf4j.Slf4j;
import rocks.cleanstone.game.block.state.BlockState;
import rocks.cleanstone.game.material.block.vanilla.VanillaBlockType;
import rocks.cleanstone.game.world.chunk.BlockDataTable;
import rocks.cleanstone.game.world.chunk.data.block.vanilla.DirectPalette;
import rocks.cleanstone.net.utils.ByteBufUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

@Slf4j
public class PaletteBlockStateStorage {
private static final int MINIMUM_BITS_PER_ENTRY_FOR_INDIRECT_PALETTE = 4,
Expand Down
Expand Up @@ -2,22 +2,23 @@

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

import rocks.cleanstone.net.minecraft.protocol.AutowiredServerProtocolLayer;
import rocks.cleanstone.net.minecraft.protocol.MinecraftClientProtocolLayer;
import rocks.cleanstone.net.minecraft.protocol.v1_12_2.inbound.*;
import rocks.cleanstone.net.minecraft.protocol.v1_12_2.outbound.*;
import rocks.cleanstone.net.minecraft.protocol.v1_13_2.MinecraftProtocolLayer_v1_13_2;
import rocks.cleanstone.net.minecraft.protocol.v1_14.inbound.CreativeInventoryActionCodec;
import rocks.cleanstone.net.minecraft.protocol.v1_14.outbound.BlockChangeCodec;
import rocks.cleanstone.net.minecraft.protocol.v1_14.outbound.ChunkDataCodec;
import rocks.cleanstone.net.minecraft.protocol.v1_14.outbound.JoinGameCodec;
import rocks.cleanstone.net.protocol.PacketCodec;

import java.util.List;

import static rocks.cleanstone.net.minecraft.protocol.VanillaProtocolState.*;

@Component("minecraftProtocolLayer_v1_14")
public class MinecraftProtocolLayer_v1_14 extends MinecraftProtocolLayer_v1_13_2 {
public class MinecraftProtocolLayer_v1_14 extends AutowiredServerProtocolLayer {

@Autowired
public MinecraftProtocolLayer_v1_14(List<? extends PacketCodec> packetCodecs) {
Expand Down Expand Up @@ -85,4 +86,9 @@ public MinecraftProtocolLayer_v1_14(List<? extends PacketCodec> packetCodecs) {
public MinecraftClientProtocolLayer getCorrespondingClientLayer() {
return MinecraftClientProtocolLayer.MINECRAFT_V1_14;
}

@Override
public int getOrderedID() {
return 2;
}
}

0 comments on commit 07f9a89

Please sign in to comment.