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 e1262b1e2..7bb831798 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 @@ -34,6 +34,7 @@ import com.viaversion.viaversion.protocols.protocol1_19_3to1_19_1.ServerboundPac import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.data.MappingData; import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.packets.EntityPackets; import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.packets.InventoryPackets; +import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.storage.PlayerVehicleTracker; import com.viaversion.viaversion.rewriter.CommandRewriter; import com.viaversion.viaversion.rewriter.SoundRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; @@ -105,6 +106,8 @@ public final class Protocol1_19_4To1_19_3 extends AbstractProtocol { @@ -55,6 +57,7 @@ public final class EntityPackets extends EntityRewriter { final CompoundTag registry = wrapper.get(Type.NBT, 0); final CompoundTag damageTypeRegistry = protocol.getMappingData().damageTypesRegistry(); @@ -82,7 +85,49 @@ public final class EntityPackets extends EntityRewriter { + if (wrapper.read(Type.BOOLEAN)) { // Dismount vehicle + final PlayerVehicleTracker playerVehicleTracker = wrapper.user().get(PlayerVehicleTracker.class); + if (playerVehicleTracker.getVehicleId() != -1) { + final PacketWrapper bundleStart = wrapper.create(ClientboundPackets1_19_4.BUNDLE); + bundleStart.send(Protocol1_19_4To1_19_3.class); + final PacketWrapper setPassengers = wrapper.create(ClientboundPackets1_19_4.SET_PASSENGERS); + setPassengers.write(Type.VAR_INT, playerVehicleTracker.getVehicleId()); // vehicle id + setPassengers.write(Type.VAR_INT_ARRAY_PRIMITIVE, new int[0]); // passenger ids + setPassengers.send(Protocol1_19_4To1_19_3.class); + wrapper.send(Protocol1_19_4To1_19_3.class); + wrapper.cancel(); + final PacketWrapper bundleEnd = wrapper.create(ClientboundPackets1_19_4.BUNDLE); + bundleEnd.send(Protocol1_19_4To1_19_3.class); + + playerVehicleTracker.setVehicleId(-1); + } + } + }); + } + }); + protocol.registerClientbound(ClientboundPackets1_19_3.SET_PASSENGERS, new PacketHandlers() { + @Override + protected void register() { + map(Type.VAR_INT); // vehicle id + map(Type.VAR_INT_ARRAY_PRIMITIVE); // passenger ids + handler(wrapper -> { + final PlayerVehicleTracker playerVehicleTracker = wrapper.user().get(PlayerVehicleTracker.class); + final int clientEntityId = wrapper.user().getEntityTracker(Protocol1_19_4To1_19_3.class).clientEntityId(); + final int vehicleId = wrapper.get(Type.VAR_INT, 0); + + if (playerVehicleTracker.getVehicleId() == vehicleId) { + playerVehicleTracker.setVehicleId(-1); + } + + final int[] passengerIds = wrapper.get(Type.VAR_INT_ARRAY_PRIMITIVE, 0); + for (int passengerId : passengerIds) { + if (passengerId == clientEntityId) { + playerVehicleTracker.setVehicleId(vehicleId); + break; + } + } + }); } }); @@ -109,6 +154,7 @@ public final class EntityPackets extends EntityRewriter wrapper.user().put(new PlayerVehicleTracker(wrapper.user()))); } }); @@ -188,4 +234,4 @@ public final class EntityPackets extends EntityRewriter. + */ +package com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.storage; + +import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.UserConnection; + +public class PlayerVehicleTracker extends StoredObject { + + private int vehicleId = -1; + + public PlayerVehicleTracker(final UserConnection user) { + super(user); + } + + public int getVehicleId() { + return this.vehicleId; + } + + public void setVehicleId(final int vehicleId) { + this.vehicleId = vehicleId; + } + +}