|
55 | 55 | import net.minecraft.world.World; |
56 | 56 | import net.raphimc.viabedrock.api.BedrockProtocolVersion; |
57 | 57 | import org.slf4j.Logger; |
58 | | -import org.spongepowered.asm.mixin.Final; |
59 | | -import org.spongepowered.asm.mixin.Mixin; |
60 | | -import org.spongepowered.asm.mixin.Mutable; |
61 | | -import org.spongepowered.asm.mixin.Shadow; |
| 58 | +import org.spongepowered.asm.mixin.*; |
62 | 59 | import org.spongepowered.asm.mixin.injection.*; |
63 | 60 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
64 | 61 |
|
@@ -91,10 +88,30 @@ public abstract class MixinClientPlayNetworkHandler extends ClientCommonNetworkH |
91 | 88 | @Shadow |
92 | 89 | private ClientWorld world; |
93 | 90 |
|
| 91 | + @Unique |
| 92 | + private Packet<?> viaFabricPlus$teleportConfirmPacket; |
| 93 | + |
94 | 94 | protected MixinClientPlayNetworkHandler(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) { |
95 | 95 | super(client, connection, connectionState); |
96 | 96 | } |
97 | 97 |
|
| 98 | + @WrapWithCondition(method = "onPlayerPositionLook", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/packet/Packet;)V", ordinal = 0)) |
| 99 | + private boolean changePacketOrder(ClientConnection instance, Packet<?> packet) { |
| 100 | + final boolean cancel = ProtocolTranslator.getTargetVersion().equalTo(ProtocolVersion.v1_21_2); |
| 101 | + if (cancel) { |
| 102 | + this.viaFabricPlus$teleportConfirmPacket = packet; |
| 103 | + } |
| 104 | + return !cancel; |
| 105 | + } |
| 106 | + |
| 107 | + @Inject(method = "onPlayerPositionLook", at = @At("RETURN")) |
| 108 | + public void changePacketOrder(PlayerPositionLookS2CPacket packet, CallbackInfo ci) { |
| 109 | + if (viaFabricPlus$teleportConfirmPacket != null) { |
| 110 | + this.connection.send(viaFabricPlus$teleportConfirmPacket); |
| 111 | + viaFabricPlus$teleportConfirmPacket = null; |
| 112 | + } |
| 113 | + } |
| 114 | + |
98 | 115 | @WrapWithCondition(method = "onEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/TrackedPosition;setPos(Lnet/minecraft/util/math/Vec3d;)V", ordinal = 0)) |
99 | 116 | private boolean dontHandleEntityPositionChange(TrackedPosition instance, Vec3d pos) { |
100 | 117 | return ProtocolTranslator.getTargetVersion().newerThanOrEqualTo(ProtocolVersion.v1_21_2); |
|
0 commit comments