From 988fd66a85fbe6f0175dccaa99ddd981ef68931c Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 15 Dec 2020 13:09:40 -0500 Subject: [PATCH] Fix boat movement on land (#1668) * Fix boat movement on land 1.16.100 appears to now take advantage of two newer entity metadata properties, IS_BUOYANT and BUOYANCY_DATA. Without the former, moving on land will not work properly. With the former and without the latter, moving in water no longer works. * Use offset kind of --- .../geysermc/connector/entity/BoatEntity.java | 14 ++++++++++++++ .../network/session/GeyserSession.java | 11 +++++++++++ .../bedrock/BedrockAnimateTranslator.java | 18 +++++++----------- .../BedrockMoveEntityAbsoluteTranslator.java | 10 +++++++++- .../JavaEntitySetPassengersTranslator.java | 9 ++++++--- 5 files changed, 47 insertions(+), 15 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java index c067416d..5e1fd005 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/BoatEntity.java @@ -35,6 +35,16 @@ import java.util.concurrent.TimeUnit; public class BoatEntity extends Entity { + /** + * Required when IS_BUOYANT is sent in order for boats to work in the water.
+ * + * Taken from BDS 1.16.200, with the modification of simulate_waves since Java doesn't bob the boat up and down + * like Bedrock. + */ + private static final String BUOYANCY_DATA = "{\"apply_gravity\":true,\"base_buoyancy\":1.0,\"big_wave_probability\":0.02999999932944775," + + "\"big_wave_speed\":10.0,\"drag_down_on_buoyancy_removed\":0.0,\"liquid_blocks\":[\"minecraft:water\"," + + "\"minecraft:flowing_water\"],\"simulate_waves\":false}}"; + private boolean isPaddlingLeft; private float paddleTimeLeft; private boolean isPaddlingRight; @@ -45,6 +55,10 @@ public class BoatEntity extends Entity { public BoatEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { super(entityId, geyserId, entityType, position.add(0d, entityType.getOffset(), 0d), motion, rotation.add(90, 0, 90)); + + // Required to be able to move on land 1.16.200+ or apply gravity not in the water 1.16.100+ + metadata.put(EntityData.IS_BUOYANT, (byte) 1); + metadata.put(EntityData.BUOYANCY_DATA, BUOYANCY_DATA); } @Override diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index 9f6b8eb2..cd420025 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -219,6 +219,17 @@ public class GeyserSession implements CommandSender { @Setter private long lastHitTime; + /** + * Saves if the client is steering left on a boat. + */ + @Setter + private boolean steeringLeft; + /** + * Saves if the client is steering right on a boat. + */ + @Setter + private boolean steeringRight; + /** * Store the last time the player interacted. Used to fix a right-click spam bug. * See https://github.com/GeyserMC/Geyser/issues/503 for context. diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java index 012582da..0bedaa71 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAnimateTranslator.java @@ -25,23 +25,19 @@ package org.geysermc.connector.network.translators.bedrock; -import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.PacketTranslator; -import org.geysermc.connector.network.translators.Translator; - import com.github.steveice10.mc.protocol.data.game.entity.player.Hand; import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerSwingArmPacket; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientSteerBoatPacket; import com.nukkitx.protocol.bedrock.packet.AnimatePacket; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.network.translators.Translator; import java.util.concurrent.TimeUnit; @Translator(packet = AnimatePacket.class) public class BedrockAnimateTranslator extends PacketTranslator { - private boolean isSteeringLeft; - private boolean isSteeringRight; - @Override public void translate(AnimatePacket packet, GeyserSession session) { // Stop the player sending animations before they have fully spawned into the server @@ -61,13 +57,13 @@ public class BedrockAnimateTranslator extends PacketTranslator { // These two might need to be flipped, but my recommendation is getting moving working first case ROW_LEFT: // Packet value is a float of how long one has been rowing, so we convert that into a boolean - isSteeringLeft = packet.getRowingTime() > 0.0; - ClientSteerBoatPacket steerLeftPacket = new ClientSteerBoatPacket(isSteeringRight, isSteeringLeft); + session.setSteeringLeft(packet.getRowingTime() > 0.0); + ClientSteerBoatPacket steerLeftPacket = new ClientSteerBoatPacket(session.isSteeringLeft(), session.isSteeringRight()); session.sendDownstreamPacket(steerLeftPacket); break; case ROW_RIGHT: - isSteeringRight = packet.getRowingTime() > 0.0; - ClientSteerBoatPacket steerRightPacket = new ClientSteerBoatPacket(isSteeringRight, isSteeringLeft); + session.setSteeringRight(packet.getRowingTime() > 0.0); + ClientSteerBoatPacket steerRightPacket = new ClientSteerBoatPacket(session.isSteeringLeft(), session.isSteeringRight()); session.sendDownstreamPacket(steerRightPacket); break; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java index fd5e71e9..e1d87f19 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMoveEntityAbsoluteTranslator.java @@ -27,6 +27,8 @@ package org.geysermc.connector.network.translators.bedrock; import com.github.steveice10.mc.protocol.packet.ingame.client.world.ClientVehicleMovePacket; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; +import org.geysermc.connector.entity.BoatEntity; +import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; @@ -39,8 +41,14 @@ public class BedrockMoveEntityAbsoluteTranslator extends PacketTranslator 1)); } else {