From 70e28604b81e3b76d62e1434cb1047c3a0c66c22 Mon Sep 17 00:00:00 2001 From: David Choo Date: Thu, 15 Apr 2021 15:31:03 -0400 Subject: [PATCH] Fix various horse bugs (#2115) * Fix horse health display * Fix horses warping back when damaged * Fix horse jumping animation * Fix horses not taking damage while standing on magma * Allow mules and donkeys to jump --- .../animal/horse/AbstractHorseEntity.java | 13 ++++- .../network/session/GeyserSession.java | 6 +++ .../BedrockMoveEntityAbsoluteTranslator.java | 2 + .../bedrock/BedrockPlayerInputTranslator.java | 45 ++++++++++++++++++ .../player/BedrockRiderJumpTranslator.java | 47 +++++++++++++++++++ .../entity/JavaEntityVelocityTranslator.java | 7 +++ 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockRiderJumpTranslator.java diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/AbstractHorseEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/AbstractHorseEntity.java index 41073246e..1fe8d4362 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/AbstractHorseEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/AbstractHorseEntity.java @@ -32,6 +32,7 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.inventory.ContainerType; import com.nukkitx.protocol.bedrock.packet.EntityEventPacket; +import org.geysermc.connector.entity.attribute.AttributeType; import org.geysermc.connector.entity.living.animal.AnimalEntity; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; @@ -44,6 +45,10 @@ public class AbstractHorseEntity extends AnimalEntity { // Specifies the size of the entity's inventory. Required to place slots in the entity. metadata.put(EntityData.CONTAINER_BASE_SIZE, 2); + // Add dummy health attribute since LivingEntity updates the attribute for us + attributes.put(AttributeType.HEALTH, AttributeType.HEALTH.getAttribute(20, 20)); + // Add horse jump strength attribute to allow donkeys and mules to jump + attributes.put(AttributeType.HORSE_JUMP_STRENGTH, AttributeType.HORSE_JUMP_STRENGTH.getAttribute(0.5f, 2)); } @Override @@ -85,9 +90,15 @@ public class AbstractHorseEntity extends AnimalEntity { } // Needed to control horses - metadata.getFlags().setFlag(EntityFlag.CAN_POWER_JUMP, true); + boolean canPowerJump = entityType != EntityType.LLAMA && entityType != EntityType.TRADER_LLAMA; + metadata.getFlags().setFlag(EntityFlag.CAN_POWER_JUMP, canPowerJump); metadata.getFlags().setFlag(EntityFlag.WASD_CONTROLLED, true); super.updateBedrockMetadata(entityMetadata, session); + + if (entityMetadata.getId() == 8) { + // Update the health attribute + updateBedrockAttributes(session); + } } } 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 fe632c224..e521673e2 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 @@ -355,6 +355,12 @@ public class GeyserSession implements CommandSender { @Setter private long lastMovementTimestamp = System.currentTimeMillis(); + /** + * Used to send a ClientVehicleMovePacket for every PlayerInputPacket after idling on a boat/horse for more than 100ms + */ + @Setter + private long lastVehicleMoveTimestamp = System.currentTimeMillis(); + /** * Controls whether the daylight cycle gamerule has been sent to the client, so the sun/moon remain motionless. */ 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 f0b5a1752..b053a204c 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 @@ -41,6 +41,8 @@ public class BedrockMoveEntityAbsoluteTranslator extends PacketTranslator 0) { + sendMovement = true; + } + } + } + if (sendMovement) { + long timeSinceVehicleMove = System.currentTimeMillis() - session.getLastVehicleMoveTimestamp(); + if (timeSinceVehicleMove >= 100) { + Vector3f vehiclePosition = vehicle.getPosition(); + Vector3f vehicleRotation = vehicle.getRotation(); + + if (vehicle instanceof BoatEntity) { + // Remove some Y position to prevents boats flying up + vehiclePosition = vehiclePosition.down(EntityType.BOAT.getOffset()); + } + + ClientVehicleMovePacket clientVehicleMovePacket = new ClientVehicleMovePacket( + vehiclePosition.getX(), vehiclePosition.getY(), vehiclePosition.getZ(), + vehicleRotation.getX() - 90, vehicleRotation.getY() + ); + session.sendDownstreamPacket(clientVehicleMovePacket); + } + } } } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockRiderJumpTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockRiderJumpTranslator.java new file mode 100644 index 000000000..5d375daee --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockRiderJumpTranslator.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019-2021 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.translators.bedrock.entity.player; + +import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerState; +import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerStatePacket; +import com.nukkitx.protocol.bedrock.packet.RiderJumpPacket; +import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.entity.living.animal.horse.AbstractHorseEntity; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.PacketTranslator; +import org.geysermc.connector.network.translators.Translator; + +@Translator(packet = RiderJumpPacket.class) +public class BedrockRiderJumpTranslator extends PacketTranslator { + @Override + public void translate(RiderJumpPacket packet, GeyserSession session) { + Entity vehicle = session.getRidingVehicleEntity(); + if (vehicle instanceof AbstractHorseEntity) { + ClientPlayerStatePacket playerStatePacket = new ClientPlayerStatePacket((int) vehicle.getEntityId(), PlayerState.START_HORSE_JUMP, packet.getJumpStrength()); + session.sendDownstreamPacket(playerStatePacket); + } + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityVelocityTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityVelocityTranslator.java index 1a236f551..1c628503a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityVelocityTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityVelocityTranslator.java @@ -26,6 +26,7 @@ package org.geysermc.connector.network.translators.java.entity; import org.geysermc.connector.entity.Entity; +import org.geysermc.connector.entity.living.animal.horse.AbstractHorseEntity; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; @@ -47,6 +48,12 @@ public class JavaEntityVelocityTranslator extends PacketTranslator