Search in sources :

Example 6 with Chunk1_13Type

use of com.viaversion.viaversion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type in project ViaVersion by ViaVersion.

the class WorldPackets method register.

public static void register(Protocol1_14To1_13_2 protocol) {
    BlockRewriter blockRewriter = new BlockRewriter(protocol, null);
    protocol.registerClientbound(ClientboundPackets1_13.BLOCK_BREAK_ANIMATION, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.VAR_INT);
            map(Type.POSITION, Type.POSITION1_14);
            map(Type.BYTE);
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.BLOCK_ENTITY_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.POSITION, Type.POSITION1_14);
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.BLOCK_ACTION, new PacketRemapper() {

        @Override
        public void registerMap() {
            // Location
            map(Type.POSITION, Type.POSITION1_14);
            // Action id
            map(Type.UNSIGNED_BYTE);
            // Action param
            map(Type.UNSIGNED_BYTE);
            // Block id - /!\ NOT BLOCK STATE
            map(Type.VAR_INT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    wrapper.set(Type.VAR_INT, 0, protocol.getMappingData().getNewBlockId(wrapper.get(Type.VAR_INT, 0)));
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.BLOCK_CHANGE, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.POSITION, Type.POSITION1_14);
            map(Type.VAR_INT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    int id = wrapper.get(Type.VAR_INT, 0);
                    wrapper.set(Type.VAR_INT, 0, protocol.getMappingData().getNewBlockStateId(id));
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.SERVER_DIFFICULTY, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.UNSIGNED_BYTE);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    // Added in 19w11a. Maybe https://bugs.mojang.com/browse/MC-44471 ?
                    wrapper.write(Type.BOOLEAN, false);
                }
            });
        }
    });
    blockRewriter.registerMultiBlockChange(ClientboundPackets1_13.MULTI_BLOCK_CHANGE);
    protocol.registerClientbound(ClientboundPackets1_13.EXPLOSION, new PacketRemapper() {

        @Override
        public void registerMap() {
            // X
            map(Type.FLOAT);
            // Y
            map(Type.FLOAT);
            // Z
            map(Type.FLOAT);
            // Radius
            map(Type.FLOAT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    for (int i = 0; i < 3; i++) {
                        float coord = wrapper.get(Type.FLOAT, i);
                        if (coord < 0f) {
                            coord = (int) coord;
                            wrapper.set(Type.FLOAT, i, coord);
                        }
                    }
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.CHUNK_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    ClientWorld clientWorld = wrapper.user().get(ClientWorld.class);
                    Chunk chunk = wrapper.read(new Chunk1_13Type(clientWorld));
                    wrapper.write(new Chunk1_14Type(), chunk);
                    int[] motionBlocking = new int[16 * 16];
                    int[] worldSurface = new int[16 * 16];
                    for (int s = 0; s < chunk.getSections().length; s++) {
                        ChunkSection section = chunk.getSections()[s];
                        if (section == null)
                            continue;
                        boolean hasBlock = false;
                        for (int i = 0; i < section.getPaletteSize(); i++) {
                            int old = section.getPaletteEntry(i);
                            int newId = protocol.getMappingData().getNewBlockStateId(old);
                            if (!hasBlock && newId != air && newId != voidAir && newId != caveAir) {
                                // air, void_air, cave_air
                                hasBlock = true;
                            }
                            section.setPaletteEntry(i, newId);
                        }
                        if (!hasBlock) {
                            section.setNonAirBlocksCount(0);
                            continue;
                        }
                        int nonAirBlockCount = 0;
                        for (int x = 0; x < 16; x++) {
                            for (int y = 0; y < 16; y++) {
                                for (int z = 0; z < 16; z++) {
                                    int id = section.getFlatBlock(x, y, z);
                                    if (id != air && id != voidAir && id != caveAir) {
                                        nonAirBlockCount++;
                                        // +1 (top of the block)
                                        worldSurface[x + z * 16] = y + s * 16 + 1;
                                    }
                                    if (protocol.getMappingData().getMotionBlocking().contains(id)) {
                                        // +1 (top of the block)
                                        motionBlocking[x + z * 16] = y + s * 16 + 1;
                                    }
                                    // Manually update light for non full blocks (block light must not be sent)
                                    if (Via.getConfig().isNonFullBlockLightFix() && protocol.getMappingData().getNonFullBlocks().contains(id)) {
                                        setNonFullLight(chunk, section, s, x, y, z);
                                    }
                                }
                            }
                        }
                        section.setNonAirBlocksCount(nonAirBlockCount);
                    }
                    CompoundTag heightMap = new CompoundTag();
                    heightMap.put("MOTION_BLOCKING", new LongArrayTag(encodeHeightMap(motionBlocking)));
                    heightMap.put("WORLD_SURFACE", new LongArrayTag(encodeHeightMap(worldSurface)));
                    chunk.setHeightMap(heightMap);
                    PacketWrapper lightPacket = wrapper.create(ClientboundPackets1_14.UPDATE_LIGHT);
                    lightPacket.write(Type.VAR_INT, chunk.getX());
                    lightPacket.write(Type.VAR_INT, chunk.getZ());
                    // all 18 bits set if ground up
                    int skyLightMask = chunk.isFullChunk() ? 0x3ffff : 0;
                    int blockLightMask = 0;
                    for (int i = 0; i < chunk.getSections().length; i++) {
                        ChunkSection sec = chunk.getSections()[i];
                        if (sec == null)
                            continue;
                        if (!chunk.isFullChunk() && sec.getLight().hasSkyLight()) {
                            skyLightMask |= (1 << (i + 1));
                        }
                        blockLightMask |= (1 << (i + 1));
                    }
                    lightPacket.write(Type.VAR_INT, skyLightMask);
                    lightPacket.write(Type.VAR_INT, blockLightMask);
                    // empty sky light mask
                    lightPacket.write(Type.VAR_INT, 0);
                    // empty block light mask
                    lightPacket.write(Type.VAR_INT, 0);
                    // only do this on the initial chunk send (not when chunk.isGroundUp() is false)
                    if (chunk.isFullChunk())
                        // chunk below 0
                        lightPacket.write(Type.BYTE_ARRAY_PRIMITIVE, FULL_LIGHT);
                    for (ChunkSection section : chunk.getSections()) {
                        if (section == null || !section.getLight().hasSkyLight()) {
                            if (chunk.isFullChunk()) {
                                lightPacket.write(Type.BYTE_ARRAY_PRIMITIVE, FULL_LIGHT);
                            }
                            continue;
                        }
                        lightPacket.write(Type.BYTE_ARRAY_PRIMITIVE, section.getLight().getSkyLight());
                    }
                    if (chunk.isFullChunk())
                        // chunk above 255
                        lightPacket.write(Type.BYTE_ARRAY_PRIMITIVE, FULL_LIGHT);
                    for (ChunkSection section : chunk.getSections()) {
                        if (section == null)
                            continue;
                        lightPacket.write(Type.BYTE_ARRAY_PRIMITIVE, section.getLight().getBlockLight());
                    }
                    EntityTracker1_14 entityTracker = wrapper.user().getEntityTracker(Protocol1_14To1_13_2.class);
                    int diffX = Math.abs(entityTracker.getChunkCenterX() - chunk.getX());
                    int diffZ = Math.abs(entityTracker.getChunkCenterZ() - chunk.getZ());
                    if (entityTracker.isForceSendCenterChunk() || diffX >= SERVERSIDE_VIEW_DISTANCE || diffZ >= SERVERSIDE_VIEW_DISTANCE) {
                        // Set center chunk
                        PacketWrapper fakePosLook = wrapper.create(ClientboundPackets1_14.UPDATE_VIEW_POSITION);
                        fakePosLook.write(Type.VAR_INT, chunk.getX());
                        fakePosLook.write(Type.VAR_INT, chunk.getZ());
                        fakePosLook.send(Protocol1_14To1_13_2.class);
                        entityTracker.setChunkCenterX(chunk.getX());
                        entityTracker.setChunkCenterZ(chunk.getZ());
                    }
                    lightPacket.send(Protocol1_14To1_13_2.class);
                    // Remove light references from chunk sections
                    for (ChunkSection section : chunk.getSections()) {
                        if (section != null) {
                            section.setLight(null);
                        }
                    }
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.EFFECT, new PacketRemapper() {

        @Override
        public void registerMap() {
            // Effect Id
            map(Type.INT);
            // Location
            map(Type.POSITION, Type.POSITION1_14);
            // Data
            map(Type.INT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    int id = wrapper.get(Type.INT, 0);
                    int data = wrapper.get(Type.INT, 1);
                    if (id == 1010) {
                        // Play record
                        wrapper.set(Type.INT, 1, protocol.getMappingData().getNewItemId(data));
                    } else if (id == 2001) {
                        // Block break + block break sound
                        wrapper.set(Type.INT, 1, protocol.getMappingData().getNewBlockStateId(data));
                    }
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.JOIN_GAME, new PacketRemapper() {

        @Override
        public void registerMap() {
            // 0 - Entity ID
            map(Type.INT);
            // 1 - Gamemode
            map(Type.UNSIGNED_BYTE);
            // 2 - Dimension
            map(Type.INT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    // Store the player
                    ClientWorld clientChunks = wrapper.user().get(ClientWorld.class);
                    int dimensionId = wrapper.get(Type.INT, 1);
                    clientChunks.setEnvironment(dimensionId);
                    int entityId = wrapper.get(Type.INT, 0);
                    Entity1_14Types entType = Entity1_14Types.PLAYER;
                    // Register Type ID
                    EntityTracker1_14 tracker = wrapper.user().getEntityTracker(Protocol1_14To1_13_2.class);
                    tracker.addEntity(entityId, entType);
                    tracker.setClientEntityId(entityId);
                }
            });
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    // 19w11a removed difficulty from join game
                    short difficulty = wrapper.read(Type.UNSIGNED_BYTE);
                    PacketWrapper difficultyPacket = wrapper.create(ClientboundPackets1_14.SERVER_DIFFICULTY);
                    difficultyPacket.write(Type.UNSIGNED_BYTE, difficulty);
                    // Unknown value added in 19w11a
                    difficultyPacket.write(Type.BOOLEAN, false);
                    difficultyPacket.scheduleSend(protocol.getClass());
                    // Max Players
                    wrapper.passthrough(Type.UNSIGNED_BYTE);
                    // Level Type
                    wrapper.passthrough(Type.STRING);
                    // Serverside view distance, added in 19w13a
                    wrapper.write(Type.VAR_INT, SERVERSIDE_VIEW_DISTANCE);
                }
            });
            handler(wrapper -> {
                // Manually send the packet
                wrapper.send(Protocol1_14To1_13_2.class);
                wrapper.cancel();
                // View distance has to be sent after the join packet
                sendViewDistancePacket(wrapper.user());
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.MAP_DATA, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.VAR_INT);
            map(Type.BYTE);
            map(Type.BOOLEAN);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    // new value, probably if the map is locked (added in 19w02a), old maps are not locked
                    wrapper.write(Type.BOOLEAN, false);
                }
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.RESPAWN, new PacketRemapper() {

        @Override
        public void registerMap() {
            // 0 - Dimension ID
            map(Type.INT);
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    ClientWorld clientWorld = wrapper.user().get(ClientWorld.class);
                    int dimensionId = wrapper.get(Type.INT, 0);
                    clientWorld.setEnvironment(dimensionId);
                    EntityTracker1_14 entityTracker = wrapper.user().getEntityTracker(Protocol1_14To1_13_2.class);
                    // The client may reset the center chunk if dimension is changed
                    entityTracker.setForceSendCenterChunk(true);
                }
            });
            handler(new PacketHandler() {

                @Override
                public void handle(PacketWrapper wrapper) throws Exception {
                    // 19w11a removed difficulty from respawn
                    short difficulty = wrapper.read(Type.UNSIGNED_BYTE);
                    PacketWrapper difficultyPacket = wrapper.create(ClientboundPackets1_14.SERVER_DIFFICULTY);
                    difficultyPacket.write(Type.UNSIGNED_BYTE, difficulty);
                    // Unknown value added in 19w11a
                    difficultyPacket.write(Type.BOOLEAN, false);
                    difficultyPacket.scheduleSend(protocol.getClass());
                }
            });
            handler(wrapper -> {
                // Manually send the packet and update the viewdistance after
                wrapper.send(Protocol1_14To1_13_2.class);
                wrapper.cancel();
                sendViewDistancePacket(wrapper.user());
            });
        }
    });
    protocol.registerClientbound(ClientboundPackets1_13.SPAWN_POSITION, new PacketRemapper() {

        @Override
        public void registerMap() {
            map(Type.POSITION, Type.POSITION1_14);
        }
    });
}
Also used : PacketHandler(com.viaversion.viaversion.api.protocol.remapper.PacketHandler) Arrays(java.util.Arrays) EntityTracker1_14(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.storage.EntityTracker1_14) ClientWorld(com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld) PacketWrapper(com.viaversion.viaversion.api.protocol.packet.PacketWrapper) Chunk1_14Type(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.types.Chunk1_14Type) Via(com.viaversion.viaversion.api.Via) CompactArrayUtil(com.viaversion.viaversion.util.CompactArrayUtil) NibbleArray(com.viaversion.viaversion.api.minecraft.chunks.NibbleArray) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) ClientboundPackets1_13(com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13) Type(com.viaversion.viaversion.api.type.Type) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) Protocol1_14To1_13_2(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2) CompoundTag(com.github.steveice10.opennbt.tag.builtin.CompoundTag) LongArrayTag(com.github.steveice10.opennbt.tag.builtin.LongArrayTag) UserConnection(com.viaversion.viaversion.api.connection.UserConnection) BlockFace(com.viaversion.viaversion.api.minecraft.BlockFace) ChunkSection(com.viaversion.viaversion.api.minecraft.chunks.ChunkSection) ClientboundPackets1_14(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14) Chunk1_13Type(com.viaversion.viaversion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type) Entity1_14Types(com.viaversion.viaversion.api.minecraft.entities.Entity1_14Types) EntityTracker1_14(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.storage.EntityTracker1_14) PacketRemapper(com.viaversion.viaversion.api.protocol.remapper.PacketRemapper) Chunk1_14Type(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.types.Chunk1_14Type) Chunk(com.viaversion.viaversion.api.minecraft.chunks.Chunk) BlockRewriter(com.viaversion.viaversion.rewriter.BlockRewriter) PacketHandler(com.viaversion.viaversion.api.protocol.remapper.PacketHandler) PacketWrapper(com.viaversion.viaversion.api.protocol.packet.PacketWrapper) Chunk1_13Type(com.viaversion.viaversion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type) LongArrayTag(com.github.steveice10.opennbt.tag.builtin.LongArrayTag) Entity1_14Types(com.viaversion.viaversion.api.minecraft.entities.Entity1_14Types) Protocol1_14To1_13_2(com.viaversion.viaversion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2) ClientWorld(com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld) 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)6 ChunkSection (com.viaversion.viaversion.api.minecraft.chunks.ChunkSection)6 PacketWrapper (com.viaversion.viaversion.api.protocol.packet.PacketWrapper)6 PacketHandler (com.viaversion.viaversion.api.protocol.remapper.PacketHandler)6 PacketRemapper (com.viaversion.viaversion.api.protocol.remapper.PacketRemapper)6 Chunk1_13Type (com.viaversion.viaversion.protocols.protocol1_13to1_12_2.types.Chunk1_13Type)6 ClientWorld (com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld)6 Type (com.viaversion.viaversion.api.type.Type)4 ClientboundPackets1_13 (com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13)4 BlockRewriter (com.viaversion.viaversion.rewriter.BlockRewriter)4 Via (com.viaversion.viaversion.api.Via)3 UserConnection (com.viaversion.viaversion.api.connection.UserConnection)3 CompoundTag (com.github.steveice10.opennbt.tag.builtin.CompoundTag)2 ViaBackwards (com.viaversion.viabackwards.ViaBackwards)2 EnchantmentRewriter (com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter)2 BlockChangeRecord (com.viaversion.viaversion.api.minecraft.BlockChangeRecord)2 Position (com.viaversion.viaversion.api.minecraft.Position)2 Item (com.viaversion.viaversion.api.minecraft.item.Item)2 CompoundTag (com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag)2 ListTag (com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag)2