Cancel player input if not in a vehicle, fix shift/sprint input

This commit is contained in:
Nassim Jahnke 2024-09-04 19:06:31 +02:00
parent a88e2f3fb5
commit 75537d3f85
No known key found for this signature in database
GPG Key ID: EF6771C01F6EF02F
3 changed files with 81 additions and 8 deletions

View File

@ -44,6 +44,7 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.BlockItemPacketRewriter1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.BlockItemPacketRewriter1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.ComponentRewriter1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.ComponentRewriter1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.EntityPacketRewriter1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.EntityPacketRewriter1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
import com.viaversion.viaversion.rewriter.AttributeRewriter; import com.viaversion.viaversion.rewriter.AttributeRewriter;
import com.viaversion.viaversion.rewriter.SoundRewriter; import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.StatisticsRewriter;
@ -134,6 +135,7 @@ public final class Protocol1_21To1_21_2 extends AbstractProtocol<ClientboundPack
@Override @Override
public void init(final UserConnection connection) { public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_20_5.PLAYER)); addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_20_5.PLAYER));
connection.put(new ClientVehicleStorage());
} }
@Override @Override

View File

@ -34,6 +34,7 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPacke
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21; import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.Protocol1_21To1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.Protocol1_21To1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2; import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
import com.viaversion.viaversion.rewriter.EntityRewriter; import com.viaversion.viaversion.rewriter.EntityRewriter;
import com.viaversion.viaversion.util.Key; import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.TagUtil; import com.viaversion.viaversion.util.TagUtil;
@ -120,6 +121,8 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
wrapper.write(Types.VAR_INT, 64); // Sea level wrapper.write(Types.VAR_INT, 64); // Sea level
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world); trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
wrapper.user().get(ClientVehicleStorage.class).clear();
}); });
protocol.registerClientbound(ClientboundPackets1_21.PLAYER_POSITION, wrapper -> { protocol.registerClientbound(ClientboundPackets1_21.PLAYER_POSITION, wrapper -> {
@ -150,22 +153,53 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
wrapper.set(Types.VAR_INT, 0, teleportId); wrapper.set(Types.VAR_INT, 0, teleportId);
}); });
// Previously only used while in a vehicle, now always sent. protocol.registerClientbound(ClientboundPackets1_21.SET_PASSENGERS, wrapper -> {
// The server will ignore it if not in a vehicle, so we can always pass it through final int vehicleId = wrapper.passthrough(Types.VAR_INT);
final int[] passengerIds = wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE);
final ClientVehicleStorage storage = wrapper.user().get(ClientVehicleStorage.class);
if (vehicleId == storage.vehicleId()) {
storage.clear();
}
final int clientEntityId = tracker(wrapper.user()).clientEntityId();
for (final int passenger : passengerIds) {
if (passenger == clientEntityId) {
storage.setVehicleId(vehicleId);
break;
}
}
});
protocol.appendClientbound(ClientboundPackets1_21.REMOVE_ENTITIES, wrapper -> {
final ClientVehicleStorage vehicleStorage = wrapper.user().get(ClientVehicleStorage.class);
final int[] entityIds = wrapper.get(Types.VAR_INT_ARRAY_PRIMITIVE, 0);
for (final int entityId : entityIds) {
if (entityId == vehicleStorage.vehicleId()) {
vehicleStorage.clear();
}
}
});
protocol.registerServerbound(ServerboundPackets1_21_2.PLAYER_INPUT, wrapper -> { protocol.registerServerbound(ServerboundPackets1_21_2.PLAYER_INPUT, wrapper -> {
// Previously only used while in a vehicle, now always sent
// Filter them appropriately
if (wrapper.user().get(ClientVehicleStorage.class).vehicleId() == -1) {
wrapper.cancel();
return;
}
final byte flags = wrapper.read(Types.BYTE); final byte flags = wrapper.read(Types.BYTE);
final boolean left = (flags & 4) != 0; final boolean left = (flags & 1 << 2) != 0;
final boolean right = (flags & 8) != 0; final boolean right = (flags & 1 << 3) != 0;
wrapper.write(Types.FLOAT, left ? IMPULSE : (right ? -IMPULSE : 0F)); wrapper.write(Types.FLOAT, left ? IMPULSE : (right ? -IMPULSE : 0F));
final boolean forward = (flags & 1) != 0; final boolean forward = (flags & 1 << 0) != 0;
final boolean backward = (flags & 2) != 0; final boolean backward = (flags & 1 << 1) != 0;
wrapper.write(Types.FLOAT, forward ? IMPULSE : (backward ? -IMPULSE : 0F)); wrapper.write(Types.FLOAT, forward ? IMPULSE : (backward ? -IMPULSE : 0F));
byte updatedFlags = 0; byte updatedFlags = 0;
if ((flags & 1) != 0) { if ((flags & 1 << 4) != 0) {
updatedFlags |= 1; updatedFlags |= 1;
} else if ((flags & 2) != 0) { }
if ((flags & 1 << 5) != 0) {
updatedFlags |= 2; updatedFlags |= 2;
} }
wrapper.write(Types.BYTE, updatedFlags); wrapper.write(Types.BYTE, updatedFlags);

View File

@ -0,0 +1,37 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion 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 <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.protocols.v1_21to1_21_2.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
public class ClientVehicleStorage implements StorableObject {
private int vehicleId = -1;
public int vehicleId() {
return this.vehicleId;
}
public void setVehicleId(final int vehicleId) {
this.vehicleId = vehicleId;
}
public void clear() {
this.vehicleId = -1;
}
}