diff --git a/src/main/java/net/raphimc/viaproxy/injection/transformer/Protocol1_18_2To1_18Transformer.java b/src/main/java/net/raphimc/viaproxy/injection/transformer/Protocol1_18_2To1_18Transformer.java new file mode 100644 index 0000000..5808013 --- /dev/null +++ b/src/main/java/net/raphimc/viaproxy/injection/transformer/Protocol1_18_2To1_18Transformer.java @@ -0,0 +1,64 @@ +/* + * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy + * Copyright (C) 2023 RK_01/RaphiMC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.viaproxy.injection.transformer; + +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ServerboundPackets1_17; +import com.viaversion.viaversion.protocols.protocol1_18_2to1_18.Protocol1_18_2To1_18; +import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18; +import net.lenni0451.classtransform.annotations.CTarget; +import net.lenni0451.classtransform.annotations.CTransformer; +import net.lenni0451.classtransform.annotations.injection.CInject; +import net.raphimc.viaproxy.protocolhack.viaproxy.loading_terrain_fix.SpawnPositionTracker; + +@CTransformer(Protocol1_18_2To1_18.class) +public abstract class Protocol1_18_2To1_18Transformer extends AbstractProtocol { + + @CInject(method = "registerPackets", target = @CTarget("RETURN")) + private void fixDownloadingTerrainScreenNotClosing() { + this.registerClientbound(ClientboundPackets1_18.PLAYER_POSITION, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + final SpawnPositionTracker tracker = wrapper.user().get(SpawnPositionTracker.class); + tracker.sendSpawnPosition(); + }); + } + }); + this.registerClientbound(ClientboundPackets1_18.SPAWN_POSITION, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.POSITION1_14); // position + map(Type.FLOAT); // angle + handler(wrapper -> { + final SpawnPositionTracker tracker = wrapper.user().get(SpawnPositionTracker.class); + tracker.setSpawnPosition(wrapper.get(Type.POSITION1_14, 0), wrapper.get(Type.FLOAT, 0)); + }); + } + }); + } + + @Override + public void init(UserConnection user) { + user.put(new SpawnPositionTracker(user)); + } + +} diff --git a/src/main/java/net/raphimc/viaproxy/protocolhack/viaproxy/loading_terrain_fix/SpawnPositionTracker.java b/src/main/java/net/raphimc/viaproxy/protocolhack/viaproxy/loading_terrain_fix/SpawnPositionTracker.java new file mode 100644 index 0000000..3156ad9 --- /dev/null +++ b/src/main/java/net/raphimc/viaproxy/protocolhack/viaproxy/loading_terrain_fix/SpawnPositionTracker.java @@ -0,0 +1,49 @@ +/* + * This file is part of ViaProxy - https://github.com/RaphiMC/ViaProxy + * Copyright (C) 2023 RK_01/RaphiMC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package net.raphimc.viaproxy.protocolhack.viaproxy.loading_terrain_fix; + +import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.Position; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_18_2to1_18.Protocol1_18_2To1_18; +import com.viaversion.viaversion.protocols.protocol1_18to1_17_1.ClientboundPackets1_18; + +public class SpawnPositionTracker extends StoredObject { + + private Position spawnPosition = new Position(8, 64, 8); + private float angle = 0F; + + public SpawnPositionTracker(final UserConnection user) { + super(user); + } + + public void setSpawnPosition(final Position spawnPosition, final float angle) { + this.spawnPosition = spawnPosition; + this.angle = angle; + } + + public void sendSpawnPosition() throws Exception { + final PacketWrapper spawnPosition = PacketWrapper.create(ClientboundPackets1_18.SPAWN_POSITION, this.getUser()); + spawnPosition.write(Type.POSITION1_14, this.spawnPosition); // position + spawnPosition.write(Type.FLOAT, this.angle); // angle + spawnPosition.send(Protocol1_18_2To1_18.class); + } + +}