Search in sources :

Example 11 with BlockRewriter

use of com.viaversion.viaversion.rewriter.BlockRewriter in project ViaVersion by ViaVersion.

the class WorldPackets method register.

public static void register(Protocol1_17To1_16_4 protocol) {
    BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14);
    blockRewriter.registerBlockAction(ClientboundPackets1_16_2.BLOCK_ACTION);
    blockRewriter.registerBlockChange(ClientboundPackets1_16_2.BLOCK_CHANGE);
    blockRewriter.registerVarLongMultiBlockChange(ClientboundPackets1_16_2.MULTI_BLOCK_CHANGE);
    blockRewriter.registerAcknowledgePlayerDigging(ClientboundPackets1_16_2.ACKNOWLEDGE_PLAYER_DIGGING);
    protocol.registerClientbound(ClientboundPackets1_16_2.WORLD_BORDER, null, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(wrapper -> {
                // Border packet actions have been split into individual packets (the content hasn't changed)
                int type = wrapper.read(Type.VAR_INT);
                ClientboundPacketType packetType;
                switch(type) {
                    case 0:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_SIZE;
                        break;
                    case 1:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_LERP_SIZE;
                        break;
                    case 2:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_CENTER;
                        break;
                    case 3:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_INIT;
                        break;
                    case 4:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_WARNING_DELAY;
                        break;
                    case 5:
                        packetType = ClientboundPackets1_17.WORLD_BORDER_WARNING_DISTANCE;
                        break;
                    default:
                        throw new IllegalArgumentException("Invalid world border type received: " + type);
                }
                wrapper.setId(packetType.getId());
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_16_2.UPDATE_LIGHT, new PacketRemapper() {

        @Override
        public void registerMap() {
            // x
            map(Type.VAR_INT);
            // y
            map(Type.VAR_INT);
            // trust edges
            map(Type.BOOLEAN);
            handler(wrapper -> {
                int skyLightMask = wrapper.read(Type.VAR_INT);
                int blockLightMask = wrapper.read(Type.VAR_INT);
                // Now all written as a representation of BitSets
                // Sky light mask
                wrapper.write(Type.LONG_ARRAY_PRIMITIVE, toBitSetLongArray(skyLightMask));
                // Block light mask
                wrapper.write(Type.LONG_ARRAY_PRIMITIVE, toBitSetLongArray(blockLightMask));
                // Empty sky light mask
                wrapper.write(Type.LONG_ARRAY_PRIMITIVE, toBitSetLongArray(wrapper.read(Type.VAR_INT)));
                // Empty block light mask
                wrapper.write(Type.LONG_ARRAY_PRIMITIVE, toBitSetLongArray(wrapper.read(Type.VAR_INT)));
                writeLightArrays(wrapper, skyLightMask);
                writeLightArrays(wrapper, blockLightMask);
            });
        }

        private void writeLightArrays(PacketWrapper wrapper, int bitMask) throws Exception {
            List<byte[]> light = new ArrayList<>();
            for (int i = 0; i < 18; i++) {
                if (isSet(bitMask, i)) {
                    light.add(wrapper.read(Type.BYTE_ARRAY_PRIMITIVE));
                }
            }
            // Now needs the length of the bytearray-array
            wrapper.write(Type.VAR_INT, light.size());
            for (byte[] bytes : light) {
                wrapper.write(Type.BYTE_ARRAY_PRIMITIVE, bytes);
            }
        }

        private long[] toBitSetLongArray(int bitmask) {
            return new long[] { bitmask };
        }

        private boolean isSet(int mask, int i) {
            return (mask & (1 << i)) != 0;
        }
    });
    protocol.registerClientbound(ClientboundPackets1_16_2.CHUNK_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(wrapper -> {
                Chunk chunk = wrapper.read(new Chunk1_16_2Type());
                if (!chunk.isFullChunk()) {
                    // All chunks are full chunk packets now (1.16 already stopped sending non-full chunks)
                    // Construct multi block change packets instead
                    // Height map updates are lost (unless we want to fully cache and resend entire chunks)
                    // Block entities are always empty for non-full chunks in Vanilla
                    writeMultiBlockChangePacket(wrapper, chunk);
                    wrapper.cancel();
                    return;
                }
                // Normal full chunk writing
                wrapper.write(new Chunk1_17Type(chunk.getSections().length), chunk);
                // 1.17 uses a bitset for the mask
                chunk.setChunkMask(BitSet.valueOf(new long[] { chunk.getBitmask() }));
                for (int s = 0; s < chunk.getSections().length; s++) {
                    ChunkSection section = chunk.getSections()[s];
                    if (section == null)
                        continue;
                    for (int i = 0; i < section.getPaletteSize(); i++) {
                        int old = section.getPaletteEntry(i);
                        section.setPaletteEntry(i, protocol.getMappingData().getNewBlockStateId(old));
                    }
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_16_2.JOIN_GAME, new PacketRemapper() {

        @Override
        public void registerMap() {
            // Entity ID
            map(Type.INT);
            // Hardcore
            map(Type.BOOLEAN);
            // Gamemode
            map(Type.UNSIGNED_BYTE);
            // Previous Gamemode
            map(Type.BYTE);
            // World List
            map(Type.STRING_ARRAY);
            // Registry
            map(Type.NBT);
            // Current dimension
            map(Type.NBT);
            handler(wrapper -> {
                // Add new dimension fields
                CompoundTag dimensionRegistry = wrapper.get(Type.NBT, 0).get("minecraft:dimension_type");
                ListTag dimensions = dimensionRegistry.get("value");
                for (Tag dimension : dimensions) {
                    CompoundTag dimensionCompound = ((CompoundTag) dimension).get("element");
                    addNewDimensionData(dimensionCompound);
                }
                CompoundTag currentDimensionTag = wrapper.get(Type.NBT, 1);
                addNewDimensionData(currentDimensionTag);
                UserConnection user = wrapper.user();
                user.getEntityTracker(Protocol1_17To1_16_4.class).addEntity(wrapper.get(Type.INT, 0), Entity1_17Types.PLAYER);
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_16_2.RESPAWN, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(wrapper -> {
                CompoundTag dimensionData = wrapper.passthrough(Type.NBT);
                addNewDimensionData(dimensionData);
            });
        }
    });
    blockRewriter.registerEffect(ClientboundPackets1_16_2.EFFECT, 1010, 2001);
}
Also used : ClientboundPackets1_17(com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ClientboundPackets1_17) ListTag(com.github.steveice10.opennbt.tag.builtin.ListTag) BlockChangeRecord1_16_2(com.viaversion.viaversion.api.minecraft.BlockChangeRecord1_16_2) PacketWrapper(com.viaversion.viaversion.api.protocol.packet.PacketWrapper) IntTag(com.github.steveice10.opennbt.tag.builtin.IntTag) BlockChangeRecord(com.viaversion.viaversion.api.minecraft.BlockChangeRecord) ClientboundPackets1_16_2(com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2) ArrayList(java.util.ArrayList) ClientboundPacketType(com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) Protocol1_17To1_16_4(com.viaversion.viaversion.protocols.protocol1_17to1_16_4.Protocol1_17To1_16_4) Type(com.viaversion.viaversion.api.type.Type) Chunk1_17Type(com.viaversion.viaversion.protocols.protocol1_17to1_16_4.types.Chunk1_17Type) List(java.util.List) Tag(com.github.steveice10.opennbt.tag.builtin.Tag) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) Entity1_17Types(com.viaversion.viaversion.api.minecraft.entities.Entity1_17Types) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) Chunk1_16_2Type(com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.types.Chunk1_16_2Type) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag) UserConnection(com.viaversion.viaversion.api.connection.UserConnection) ChunkSection(com.viaversion.viaversion.api.minecraft.chunks.ChunkSection) BitSet(java.util.BitSet) Chunk1_17Type(com.viaversion.viaversion.protocols.protocol1_17to1_16_4.types.Chunk1_17Type) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) ClientboundPacketType(com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) ListTag(com.github.steveice10.opennbt.tag.builtin.ListTag) UserConnection(com.viaversion.viaversion.api.connection.UserConnection) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) PacketWrapper(com.viaversion.viaversion.api.protocol.packet.PacketWrapper) ArrayList(java.util.ArrayList) List(java.util.List) Chunk1_16_2Type(com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.types.Chunk1_16_2Type) ListTag(com.github.steveice10.opennbt.tag.builtin.ListTag) IntTag(com.github.steveice10.opennbt.tag.builtin.IntTag) Tag(com.github.steveice10.opennbt.tag.builtin.Tag) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag) ChunkSection(com.viaversion.viaversion.api.minecraft.chunks.ChunkSection) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag)

Example 12 with BlockRewriter

use of com.viaversion.viaversion.rewriter.BlockRewriter in project ViaVersion by ViaVersion.

the class WorldPackets method register.

public static void register(Protocol1_16To1_15_2 protocol) {
    BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14);
    blockRewriter.registerBlockAction(ClientboundPackets1_15.BLOCK_ACTION);
    blockRewriter.registerBlockChange(ClientboundPackets1_15.BLOCK_CHANGE);
    blockRewriter.registerMultiBlockChange(ClientboundPackets1_15.MULTI_BLOCK_CHANGE);
    blockRewriter.registerAcknowledgePlayerDigging(ClientboundPackets1_15.ACKNOWLEDGE_PLAYER_DIGGING);
    protocol.registerClientbound(ClientboundPackets1_15.UPDATE_LIGHT, new PacketRemapper() {

        @Override
        public void registerMap() {
            // x
            map(Type.VAR_INT);
            // y
            map(Type.VAR_INT);
            // Take neighbour's light into account as well
            handler(wrapper -> wrapper.write(Type.BOOLEAN, true));
        }
    });
    protocol.registerClientbound(ClientboundPackets1_15.CHUNK_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(wrapper -> {
                Chunk chunk = wrapper.read(new Chunk1_15Type());
                wrapper.write(new Chunk1_16Type(), chunk);
                chunk.setIgnoreOldLightData(chunk.isFullChunk());
                for (int s = 0; s < chunk.getSections().length; s++) {
                    ChunkSection section = chunk.getSections()[s];
                    if (section == null)
                        continue;
                    for (int i = 0; i < section.getPaletteSize(); i++) {
                        int old = section.getPaletteEntry(i);
                        section.setPaletteEntry(i, protocol.getMappingData().getNewBlockStateId(old));
                    }
                }
                CompoundTag heightMaps = chunk.getHeightMap();
                for (Tag heightMapTag : heightMaps.values()) {
                    LongArrayTag heightMap = (LongArrayTag) heightMapTag;
                    int[] heightMapData = new int[256];
                    CompactArrayUtil.iterateCompactArray(9, heightMapData.length, heightMap.getValue(), (i, v) -> heightMapData[i] = v);
                    heightMap.setValue(CompactArrayUtil.createCompactArrayWithPadding(9, heightMapData.length, i -> heightMapData[i]));
                }
                if (chunk.getBlockEntities() == null)
                    return;
                for (CompoundTag blockEntity : chunk.getBlockEntities()) {
                    handleBlockEntity(blockEntity);
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_15.BLOCK_ENTITY_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(wrapper -> {
                Position position = wrapper.passthrough(Type.POSITION1_14);
                short action = wrapper.passthrough(Type.UNSIGNED_BYTE);
                CompoundTag tag = wrapper.passthrough(Type.NBT);
                handleBlockEntity(tag);
            });
        }
    });
    blockRewriter.registerEffect(ClientboundPackets1_15.EFFECT, 1010, 2001);
}
Also used : Position(com.viaversion.viaversion.api.minecraft.Position) IntArrayTag(com.github.steveice10.opennbt.tag.builtin.IntArrayTag) UUID(java.util.UUID) UUIDIntArrayType(com.viaversion.viaversion.api.type.types.UUIDIntArrayType) Protocol1_16To1_15_2(com.viaversion.viaversion.protocols.protocol1_16to1_15_2.Protocol1_16To1_15_2) CompactArrayUtil(com.viaversion.viaversion.util.CompactArrayUtil) StringTag(com.github.steveice10.opennbt.tag.builtin.StringTag) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) Type(com.viaversion.viaversion.api.type.Type) Tag(com.github.steveice10.opennbt.tag.builtin.Tag) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) Chunk1_16Type(com.viaversion.viaversion.protocols.protocol1_16to1_15_2.types.Chunk1_16Type) Chunk1_15Type(com.viaversion.viaversion.protocols.protocol1_15to1_14_4.types.Chunk1_15Type) Map(java.util.Map) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag) LongArrayTag(com.github.steveice10.opennbt.tag.builtin.LongArrayTag) ClientboundPackets1_15(com.viaversion.viaversion.protocols.protocol1_15to1_14_4.ClientboundPackets1_15) ChunkSection(com.viaversion.viaversion.api.minecraft.chunks.ChunkSection) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) LongArrayTag(com.github.steveice10.opennbt.tag.builtin.LongArrayTag) Position(com.viaversion.viaversion.api.minecraft.Position) Chunk1_16Type(com.viaversion.viaversion.protocols.protocol1_16to1_15_2.types.Chunk1_16Type) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) Chunk1_15Type(com.viaversion.viaversion.protocols.protocol1_15to1_14_4.types.Chunk1_15Type) IntArrayTag(com.github.steveice10.opennbt.tag.builtin.IntArrayTag) StringTag(com.github.steveice10.opennbt.tag.builtin.StringTag) Tag(com.github.steveice10.opennbt.tag.builtin.Tag) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag) LongArrayTag(com.github.steveice10.opennbt.tag.builtin.LongArrayTag) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) ChunkSection(com.viaversion.viaversion.api.minecraft.chunks.ChunkSection) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag)

Aggregations

Chunk (com.viaversion.viaversion.api.minecraft.chunks.Chunk)12 ChunkSection (com.viaversion.viaversion.api.minecraft.chunks.ChunkSection)12 PacketRemapper (com.viaversion.viaversion.api.protocol.remapper.PacketRemapper)12 BlockRewriter (com.viaversion.viaversion.rewriter.BlockRewriter)12 PacketWrapper (com.viaversion.viaversion.api.protocol.packet.PacketWrapper)10 Type (com.viaversion.viaversion.api.type.Type)10 PacketHandler (com.viaversion.viaversion.api.protocol.remapper.PacketHandler)6 ArrayList (java.util.ArrayList)5 List (java.util.List)5 BlockChangeRecord (com.viaversion.viaversion.api.minecraft.BlockChangeRecord)4 CompoundTag (com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag)4 Tag (com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag)4 Chunk1_13Type (com.viaversion.viaversion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type)4 ClientboundPackets1_16_2 (com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2)4 Chunk1_16_2Type (com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.types.Chunk1_16_2Type)4 ClientWorld (com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld)4 CompoundTag (com.github.steveice10.opennbt.tag.builtin.CompoundTag)3 Chunk1_14Type (com.viaversion.viaversion.protocols.protocol1_14to1_13_2.types.Chunk1_14Type)3 Chunk1_15Type (com.viaversion.viaversion.protocols.protocol1_15to1_14_4.types.Chunk1_15Type)3 Chunk1_16Type (com.viaversion.viaversion.protocols.protocol1_16to1_15_2.types.Chunk1_16Type)3