From c51a6081b56e5038034153a12d48eef660ebc3c8 Mon Sep 17 00:00:00 2001 From: SashegDev Date: Thu, 9 Jul 2026 23:44:47 +0000 Subject: [PATCH] Save current state before testing sleep animation fix --- gradlew | 0 .../fabled_hearts/ai/EllieSleepGoal.java | 6 ++- .../entity/ellie/EllieEntity.java | 31 +++++++++---- .../entity/ellie/EllieRenderer.java | 32 +++++++++----- .../animations/ellie.animation.json | 44 +++++++++++++++---- 5 files changed, 85 insertions(+), 28 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/me/sashegdev/fabled_hearts/ai/EllieSleepGoal.java b/src/main/java/me/sashegdev/fabled_hearts/ai/EllieSleepGoal.java index 8845cb4..abf1874 100644 --- a/src/main/java/me/sashegdev/fabled_hearts/ai/EllieSleepGoal.java +++ b/src/main/java/me/sashegdev/fabled_hearts/ai/EllieSleepGoal.java @@ -16,7 +16,9 @@ public class EllieSleepGoal extends Goal { private BlockPos bedPos; private int sleepTimer; private boolean claimed; + private int scanCooldown; private static final int MAX_SLEEP_TICKS = 6000; + private static final int SCAN_INTERVAL = 40; private static final double REACH_DIST_SQR = 1.8 * 1.8; public EllieSleepGoal(EllieEntity ellie, int searchRadius) { @@ -39,6 +41,8 @@ public class EllieSleepGoal extends Goal { if (stored != null && isFreeBed(stored) && ellie.distanceToSqr(Vec3.atCenterOf(stored)) < 50 * 50) { return stored; } + if (scanCooldown-- > 0) return null; + scanCooldown = SCAN_INTERVAL; return findNearestBed(); } @@ -108,7 +112,7 @@ public class EllieSleepGoal extends Goal { if (sleepTimer >= MAX_SLEEP_TICKS) return false; if (bedPos != null) { BlockState state = ellie.level().getBlockState(bedPos); - if (!state.isBed(ellie.level(), bedPos, null)) return false; + if (!(state.getBlock() instanceof BedBlock)) return false; } return true; } diff --git a/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieEntity.java b/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieEntity.java index d4747e9..f767759 100644 --- a/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieEntity.java +++ b/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieEntity.java @@ -23,6 +23,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.level.block.state.properties.BedPart; import net.minecraft.server.level.ServerLevel; import software.bernie.geckolib.animatable.GeoEntity; @@ -57,6 +58,7 @@ public class EllieEntity extends Animal implements GeoEntity { private int ticksWithoutSleep; private float relationshipPoints; private BlockPos bedPos; + private Direction lastBedDir; private double lastX, lastZ; private int moveDetectCooldown; private BlockPos lastOpenedDoor; @@ -176,6 +178,9 @@ public class EllieEntity extends Animal implements GeoEntity { if (sleeping) { setPose(Pose.SLEEPING); crouchTimer = 0; + if (bedPos != null && distanceToSqr(Vec3.atCenterOf(bedPos)) > 9.0) { + wakeUp(); + } } else if (lowCeiling) { if (onGround() || wasCrouching) { setPose(Pose.CROUCHING); @@ -260,19 +265,29 @@ public class EllieEntity extends Animal implements GeoEntity { if (!(state.getBlock() instanceof BedBlock)) return; Direction facing = state.getValue(BedBlock.FACING); - BlockPos footPos = state.getValue(BedBlock.PART) == BedPart.HEAD - ? pos.relative(facing.getOpposite()) - : pos; + BlockPos headPos = state.getValue(BedBlock.PART) == BedPart.HEAD + ? pos + : pos.relative(facing); - float yRot = facing.toYRot(); - setPos(footPos.getX() + 0.5, footPos.getY() + 0.5625, footPos.getZ() + 0.5); - setYRot(yRot); - yRotO = yRot; - setYHeadRot(yRot); + setPos(headPos.getX() + 0.5, pos.getY() + 0.6875, headPos.getZ() + 0.5); + lastBedDir = facing; setSleeping(true); setPose(Pose.SLEEPING); } + @Override + public Direction getBedOrientation() { + if (bedPos != null && isSleeping()) { + BlockState state = level().getBlockState(bedPos); + if (state.getBlock() instanceof BedBlock) { + return state.getValue(BedBlock.FACING); + } + } + return null; + } + + public Direction getLastBedDir() { return lastBedDir; } + public void wakeUp() { releaseBed(); setSleeping(false); diff --git a/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieRenderer.java b/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieRenderer.java index b671a25..23f9ca3 100644 --- a/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieRenderer.java +++ b/src/main/java/me/sashegdev/fabled_hearts/entity/ellie/EllieRenderer.java @@ -2,9 +2,9 @@ package me.sashegdev.fabled_hearts.entity.ellie; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Pose; import org.jetbrains.annotations.Nullable; @@ -18,21 +18,31 @@ public class EllieRenderer extends GeoEntityRenderer { @Override public RenderType getRenderType(EllieEntity animatable, ResourceLocation texture, - @Nullable MultiBufferSource bufferSource, float partialTick) { + @Nullable net.minecraft.client.renderer.MultiBufferSource bufferSource, float partialTick) { return RenderType.entityTranslucent(texture); } @Override - public void render(EllieEntity entity, float entityYaw, float partialTick, PoseStack poseStack, - MultiBufferSource bufferSource, int packedLight) { + protected void applyRotations(EllieEntity entity, PoseStack poseStack, float tick, float yRot, float partialTick) { if (entity.getPose() == Pose.SLEEPING) { - poseStack.pushPose(); - poseStack.translate(0, 0.5625f, 0); - poseStack.mulPose(Axis.XP.rotationDegrees(-90)); - super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); - poseStack.popPose(); - } else { - super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); + Direction bedDir = entity.getBedOrientation(); + if (bedDir == null) bedDir = entity.getLastBedDir(); + if (bedDir != null) { + float targetYRot = bedDir.toYRot(); + // North/South fix: model lies on side without this + if (bedDir == Direction.NORTH || bedDir == Direction.SOUTH) { + targetYRot += 180.0F; + } + float offset = 1.655F; + poseStack.translate( + -bedDir.getStepX() * offset, + 0.0F, + -bedDir.getStepZ() * offset + ); + poseStack.mulPose(Axis.YP.rotationDegrees(targetYRot)); + return; + } } + super.applyRotations(entity, poseStack, tick, yRot, partialTick); } } diff --git a/src/main/resources/assets/fabled_hearts/animations/ellie.animation.json b/src/main/resources/assets/fabled_hearts/animations/ellie.animation.json index 04a3e96..753ea21 100644 --- a/src/main/resources/assets/fabled_hearts/animations/ellie.animation.json +++ b/src/main/resources/assets/fabled_hearts/animations/ellie.animation.json @@ -14029,19 +14029,19 @@ "leftarm": { "rotation": { "0.0": { - "vector": [0, -82.5, -80] + "vector": [-17.1045, 0.5398, 22.7077] }, "0.2083": { - "vector": [0, -82.5, -80] + "vector": [-17.1045, 0.5398, 22.7077] }, "1.2083": { - "vector": [18.3312, -82.0966, -98.4951] + "vector": [-14.6045, 0.5398, 22.7077] }, "1.4583": { - "vector": [24.8777, -81.7278, -105.1071] + "vector": [-14.6045, 0.5398, 22.7077] }, "2.2083": { - "vector": [0, -82.5, -80] + "vector": [-17.1045, 0.5398, 22.7077] } }, "position": { @@ -14051,6 +14051,12 @@ "0.2083": { "vector": [-1, 0, 0] }, + "1.2083": { + "vector": [-1, 0, 0] + }, + "1.4583": { + "vector": [-1, 0, 0] + }, "2.2083": { "vector": [-1, 0, 0] } @@ -14058,17 +14064,31 @@ }, "loverleftarm": { "rotation": { - "vector": [0, 0, 12.5] + "0.0": { + "vector": [0, 0, 85] + }, + "0.3333": { + "vector": [0, 0, 85] + }, + "1.3333": { + "vector": [0, 0, 87.5] + }, + "1.5833": { + "vector": [0, 0, 87.5] + }, + "2.25": { + "vector": [0, 0, 85] + } } }, "leftleg": { "rotation": { - "vector": [-30, 0, 0] + "vector": [-15, 0, 0] } }, "loverleg_L": { "rotation": { - "vector": [70, 0, 0] + "vector": [47.5, 0, 0] } }, "closed_L": { @@ -14080,6 +14100,14 @@ "position": { "vector": [0, 0, 1] } + }, + "clothleg_lower_L": { + "rotation": { + "vector": [42.5, 0, 0] + }, + "position": { + "vector": [0, -0.5, -0.3] + } } } },