From 135eb44a7f9e28b15f90e8bcf58a41e47ede35fe Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Tue, 24 Jun 2025 19:33:20 +0200 Subject: [PATCH] A few comments / start implementing happy ghast movements --- .../geyser/entity/type/LivingEntity.java | 5 +++ .../vehicle/HappyGhastVehicleComponent.java | 35 ++++++++++++++++++ .../entity/vehicle/VehicleComponent.java | 37 +++++++++++++------ 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java index 4c5cb9f8a..1a6da0d91 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/LivingEntity.java @@ -528,6 +528,11 @@ public class LivingEntity extends Entity { setAttributeScale((float) AttributeUtils.calculateValue(javaAttribute)); updateBedrockMetadata(); } + case WATER_MOVEMENT_EFFICIENCY -> { + if (this instanceof ClientVehicle clientVehicle) { + clientVehicle.getVehicleComponent().setWaterMovementEfficiency(AttributeUtils.calculateValue(javaAttribute)); + } + } } } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java b/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java index 82fadb7f1..7d361d6fa 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java +++ b/core/src/main/java/org/geysermc/geyser/entity/vehicle/HappyGhastVehicleComponent.java @@ -25,10 +25,13 @@ package org.geysermc.geyser.entity.vehicle; +import it.unimi.dsi.fastutil.objects.ObjectDoublePair; import lombok.Setter; import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.type.living.animal.HappyGhastEntity; +import org.geysermc.geyser.level.block.Fluid; +import org.geysermc.mcprotocollib.protocol.data.game.entity.attribute.AttributeType; public class HappyGhastVehicleComponent extends VehicleComponent { @@ -37,6 +40,35 @@ public class HappyGhastVehicleComponent extends VehicleComponent fluidHeight = updateFluidMovement(ctx); + + // HappyGhast#travel + float speed = flyingSpeed * 5.0f / 3.0f; + + // TODO implement LivingEntity#travelFlying cases +// switch (fluidHeight.left()) { +// default -> { +// throw new GoodLuckImplementingThisException(); +// } +// } } protected Vector3f getInputVelocity(VehicleContext ctx, float speed) { @@ -66,4 +98,7 @@ public class HappyGhastVehicleComponent extends VehicleComponent { private static final float MIN_VELOCITY = 0.003f; protected final T vehicle; + @Getter protected final BoundingBox boundingBox; protected float stepHeight; + @Getter @Setter protected float moveSpeed; protected double gravity; + @Getter @Setter + protected double waterMovementEfficiency; protected int effectLevitation; protected boolean effectSlowFalling; protected boolean effectWeaving; @@ -78,6 +84,7 @@ public class VehicleComponent { this.stepHeight = stepHeight; this.moveSpeed = (float) AttributeType.Builtin.MOVEMENT_SPEED.getDef(); this.gravity = AttributeType.Builtin.GRAVITY.getDef(); + this.waterMovementEfficiency = AttributeType.Builtin.WATER_MOVEMENT_EFFICIENCY.getDef(); double width = vehicle.getBoundingBoxWidth(); double height = vehicle.getBoundingBoxHeight(); @@ -117,10 +124,6 @@ public class VehicleComponent { boundingBox.translate(vec); } - public BoundingBox getBoundingBox() { - return this.boundingBox; - } - public void setEffect(Effect effect, int effectAmplifier) { switch (effect) { case LEVITATION -> effectLevitation = effectAmplifier + 1; @@ -137,14 +140,6 @@ public class VehicleComponent { } } - public void setMoveSpeed(float moveSpeed) { - this.moveSpeed = moveSpeed; - } - - public float getMoveSpeed() { - return moveSpeed; - } - public void setStepHeight(float stepHeight) { this.stepHeight = MathUtils.clamp(stepHeight, 1.0f, 10.0f); } @@ -208,6 +203,7 @@ public class VehicleComponent { BlockPositionIterator iter = BlockPositionIterator.fromMinMax(min.getFloorX(), min.getFloorY(), min.getFloorZ(), max.getFloorX(), max.getFloorY(), max.getFloorZ()); + // Mojmap Entity#updateInWaterStateAndDoFluidPushing double waterHeight = getFluidHeightAndApplyMovement(ctx, iter, Fluid.WATER, 0.014, min.getY()); double lavaHeight = getFluidHeightAndApplyMovement(ctx, iter, Fluid.LAVA, vehicle.getSession().getDimensionType().ultrawarm() ? 0.007 : 0.007 / 3, min.getY()); @@ -373,6 +369,7 @@ public class VehicleComponent { return BlockUtils.getCollision(adjacentBlockId) instanceof SolidCollision; } + // Mojmap: LivingEntity#travelInFluid protected void waterMovement(VehicleContext ctx) { double gravity = getGravity(); float drag = vehicle.getFlag(EntityFlag.SPRINTING) ? 0.9f : 0.8f; // 0.8f: getBaseMovementSpeedMultiplier @@ -380,6 +377,21 @@ public class VehicleComponent { boolean falling = vehicle.getMotion().getY() <= 0; // NOT IMPLEMENTED: depth strider and dolphins grace +// float g = 0.02f; +// float waterMovementEfficiencyMultiplier = (float) waterMovementEfficiency; +// if (!vehicle.isOnGround()) { +// // TODO test +// waterMovementEfficiencyMultiplier *= 0.5f; +// } +// +// if (waterMovementEfficiencyMultiplier > 0.0F) { +// drag += (0.54600006F - drag) * waterMovementEfficiencyMultiplier; +// g += (this.getSpeed() - g) * waterMovementEfficiencyMultiplier; +// } + +// if (this.hasEffect(MobEffects.DOLPHINS_GRACE)) { +// drag = 0.96F; +// } boolean horizontalCollision = travel(ctx, 0.02f); @@ -570,6 +582,7 @@ public class VehicleComponent { * * @return true if there was a horizontal collision */ + // Mojmap: LivingEntity#moveRelative protected boolean travel(VehicleContext ctx, float speed) { Vector3f motion = vehicle.getMotion();