diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/blockentity/BlockEntity.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/blockentity/BlockEntity.java index 8e885df52..2a04d6821 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/blockentity/BlockEntity.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/blockentity/BlockEntity.java @@ -27,6 +27,10 @@ import org.checkerframework.checker.nullness.qual.Nullable; public interface BlockEntity { + static byte pack(int sectionX, int sectionZ) { + return (byte) (((sectionX) & 15) << 4 | (sectionZ & 15)); + } + default byte sectionX() { return (byte) ((packedXZ() >> 4) & 15); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/ChatRewriter.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/ChatRewriter.java index 1a1622eec..de04a5acd 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/ChatRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/ChatRewriter.java @@ -18,6 +18,7 @@ package com.viaversion.viaversion.protocols.protocol1_13to1_12_2; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.libs.kyori.adventure.text.Component; @@ -28,9 +29,15 @@ import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.Leg public final class ChatRewriter { public static final GsonComponentSerializer HOVER_GSON_SERIALIZER = GsonComponentSerializer.builder().emitLegacyHoverEvent().legacyHoverEventSerializer(NBTLegacyHoverEventSerializer.get()).build(); - public static final JsonElement EMPTY_COMPONENT = GsonComponentSerializer.gson().serializeToTree(Component.empty()); - public static void init() { + public static JsonObject emptyComponent() { + final JsonObject object = new JsonObject(); + object.addProperty("text", ""); + return object; + } + + public static String emptyComponentString() { + return "{\"text\":\"\"}"; } public static String legacyTextToJsonString(String message, boolean itemData) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/Protocol1_19_4To1_19_3.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/Protocol1_19_4To1_19_3.java index 7bb831798..7374051f4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/Protocol1_19_4To1_19_3.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19_4to1_19_3/Protocol1_19_4To1_19_3.java @@ -26,8 +26,6 @@ import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.minecraft.ParticleType; import com.viaversion.viaversion.api.type.types.version.Types1_19_4; import com.viaversion.viaversion.data.entity.EntityTrackerBase; -import com.viaversion.viaversion.libs.kyori.adventure.text.Component; -import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ChatRewriter; import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ClientboundPackets1_19_3; import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ServerboundPackets1_19_3; @@ -78,11 +76,14 @@ public final class Protocol1_19_4To1_19_3 extends AbstractProtocol { private final Protocol protocol; @@ -137,6 +141,10 @@ public class BlockRewriter { } public void registerChunkData1_19(C packetType, ChunkTypeSupplier chunkTypeSupplier) { + registerChunkData1_19(packetType, chunkTypeSupplier, null); + } + + public void registerChunkData1_19(C packetType, ChunkTypeSupplier chunkTypeSupplier, @Nullable Consumer blockEntityHandler) { protocol.registerClientbound(packetType, wrapper -> { final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user()); Preconditions.checkArgument(tracker.biomesSent() != 0, "Biome count not set"); @@ -154,28 +162,42 @@ public class BlockRewriter { } final Mappings blockEntityMappings = protocol.getMappingData().getBlockEntityMappings(); - if (blockEntityMappings != null) { + if (blockEntityMappings != null || blockEntityHandler != null) { List blockEntities = chunk.blockEntities(); for (int i = 0; i < blockEntities.size(); i++) { final BlockEntity blockEntity = blockEntities.get(i); - blockEntities.set(i, blockEntity.withTypeId(protocol.getMappingData().getBlockEntityMappings().getNewIdOrDefault(blockEntity.typeId(), blockEntity.typeId()))); + if (blockEntityMappings != null) { + blockEntities.set(i, blockEntity.withTypeId(blockEntityMappings.getNewIdOrDefault(blockEntity.typeId(), blockEntity.typeId()))); + } + + if (blockEntityHandler != null && blockEntity.tag() != null) { + blockEntityHandler.accept(blockEntity); + } } } }); } public void registerBlockEntityData(C packetType) { - protocol.registerClientbound(packetType, new PacketHandlers() { - @Override - public void register() { - map(Type.POSITION1_14); - handler(wrapper -> { - final Mappings mappings = protocol.getMappingData().getBlockEntityMappings(); - if (mappings != null) { - final int blockEntityId = wrapper.read(Type.VAR_INT); - wrapper.write(Type.VAR_INT, mappings.getNewIdOrDefault(blockEntityId, blockEntityId)); - } - }); + registerBlockEntityData(packetType, null); + } + + public void registerBlockEntityData(C packetType, @Nullable Consumer blockEntityHandler) { + protocol.registerClientbound(packetType, wrapper -> { + final Position position = wrapper.passthrough(Type.POSITION1_14); + + final int blockEntityId = wrapper.read(Type.VAR_INT); + final Mappings mappings = protocol.getMappingData().getBlockEntityMappings(); + if (mappings != null) { + wrapper.write(Type.VAR_INT, mappings.getNewIdOrDefault(blockEntityId, blockEntityId)); + } else { + wrapper.write(Type.VAR_INT, blockEntityId); + } + + final CompoundTag tag; + if (blockEntityHandler != null && (tag = wrapper.passthrough(Type.NBT)) != null) { + final BlockEntity blockEntity = new BlockEntityImpl(BlockEntity.pack(position.x(), position.z()), (short) position.y(), blockEntityId, tag); + blockEntityHandler.accept(blockEntity); } }); }