Save current state before testing sleep animation fix

This commit is contained in:
SashegDev
2026-07-09 23:44:47 +00:00
parent 15a31b1aec
commit c51a6081b5
5 changed files with 85 additions and 28 deletions
Vendored Regular → Executable
View File
@@ -16,7 +16,9 @@ public class EllieSleepGoal extends Goal {
private BlockPos bedPos; private BlockPos bedPos;
private int sleepTimer; private int sleepTimer;
private boolean claimed; private boolean claimed;
private int scanCooldown;
private static final int MAX_SLEEP_TICKS = 6000; 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; private static final double REACH_DIST_SQR = 1.8 * 1.8;
public EllieSleepGoal(EllieEntity ellie, int searchRadius) { 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) { if (stored != null && isFreeBed(stored) && ellie.distanceToSqr(Vec3.atCenterOf(stored)) < 50 * 50) {
return stored; return stored;
} }
if (scanCooldown-- > 0) return null;
scanCooldown = SCAN_INTERVAL;
return findNearestBed(); return findNearestBed();
} }
@@ -108,7 +112,7 @@ public class EllieSleepGoal extends Goal {
if (sleepTimer >= MAX_SLEEP_TICKS) return false; if (sleepTimer >= MAX_SLEEP_TICKS) return false;
if (bedPos != null) { if (bedPos != null) {
BlockState state = ellie.level().getBlockState(bedPos); BlockState state = ellie.level().getBlockState(bedPos);
if (!state.isBed(ellie.level(), bedPos, null)) return false; if (!(state.getBlock() instanceof BedBlock)) return false;
} }
return true; return true;
} }
@@ -23,6 +23,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.DoorBlock;
import net.minecraft.world.level.block.state.BlockState; 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.world.level.block.state.properties.BedPart;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import software.bernie.geckolib.animatable.GeoEntity; import software.bernie.geckolib.animatable.GeoEntity;
@@ -57,6 +58,7 @@ public class EllieEntity extends Animal implements GeoEntity {
private int ticksWithoutSleep; private int ticksWithoutSleep;
private float relationshipPoints; private float relationshipPoints;
private BlockPos bedPos; private BlockPos bedPos;
private Direction lastBedDir;
private double lastX, lastZ; private double lastX, lastZ;
private int moveDetectCooldown; private int moveDetectCooldown;
private BlockPos lastOpenedDoor; private BlockPos lastOpenedDoor;
@@ -176,6 +178,9 @@ public class EllieEntity extends Animal implements GeoEntity {
if (sleeping) { if (sleeping) {
setPose(Pose.SLEEPING); setPose(Pose.SLEEPING);
crouchTimer = 0; crouchTimer = 0;
if (bedPos != null && distanceToSqr(Vec3.atCenterOf(bedPos)) > 9.0) {
wakeUp();
}
} else if (lowCeiling) { } else if (lowCeiling) {
if (onGround() || wasCrouching) { if (onGround() || wasCrouching) {
setPose(Pose.CROUCHING); setPose(Pose.CROUCHING);
@@ -260,19 +265,29 @@ public class EllieEntity extends Animal implements GeoEntity {
if (!(state.getBlock() instanceof BedBlock)) return; if (!(state.getBlock() instanceof BedBlock)) return;
Direction facing = state.getValue(BedBlock.FACING); Direction facing = state.getValue(BedBlock.FACING);
BlockPos footPos = state.getValue(BedBlock.PART) == BedPart.HEAD BlockPos headPos = state.getValue(BedBlock.PART) == BedPart.HEAD
? pos.relative(facing.getOpposite()) ? pos
: pos; : pos.relative(facing);
float yRot = facing.toYRot(); setPos(headPos.getX() + 0.5, pos.getY() + 0.6875, headPos.getZ() + 0.5);
setPos(footPos.getX() + 0.5, footPos.getY() + 0.5625, footPos.getZ() + 0.5); lastBedDir = facing;
setYRot(yRot);
yRotO = yRot;
setYHeadRot(yRot);
setSleeping(true); setSleeping(true);
setPose(Pose.SLEEPING); 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() { public void wakeUp() {
releaseBed(); releaseBed();
setSleeping(false); setSleeping(false);
@@ -2,9 +2,9 @@ package me.sashegdev.fabled_hearts.entity.ellie;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis; import com.mojang.math.Axis;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.Pose;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -18,21 +18,31 @@ public class EllieRenderer extends GeoEntityRenderer<EllieEntity> {
@Override @Override
public RenderType getRenderType(EllieEntity animatable, ResourceLocation texture, 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); return RenderType.entityTranslucent(texture);
} }
@Override @Override
public void render(EllieEntity entity, float entityYaw, float partialTick, PoseStack poseStack, protected void applyRotations(EllieEntity entity, PoseStack poseStack, float tick, float yRot, float partialTick) {
MultiBufferSource bufferSource, int packedLight) {
if (entity.getPose() == Pose.SLEEPING) { if (entity.getPose() == Pose.SLEEPING) {
poseStack.pushPose(); Direction bedDir = entity.getBedOrientation();
poseStack.translate(0, 0.5625f, 0); if (bedDir == null) bedDir = entity.getLastBedDir();
poseStack.mulPose(Axis.XP.rotationDegrees(-90)); if (bedDir != null) {
super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); float targetYRot = bedDir.toYRot();
poseStack.popPose(); // North/South fix: model lies on side without this
} else { if (bedDir == Direction.NORTH || bedDir == Direction.SOUTH) {
super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); 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);
}
} }
@@ -14029,19 +14029,19 @@
"leftarm": { "leftarm": {
"rotation": { "rotation": {
"0.0": { "0.0": {
"vector": [0, -82.5, -80] "vector": [-17.1045, 0.5398, 22.7077]
}, },
"0.2083": { "0.2083": {
"vector": [0, -82.5, -80] "vector": [-17.1045, 0.5398, 22.7077]
}, },
"1.2083": { "1.2083": {
"vector": [18.3312, -82.0966, -98.4951] "vector": [-14.6045, 0.5398, 22.7077]
}, },
"1.4583": { "1.4583": {
"vector": [24.8777, -81.7278, -105.1071] "vector": [-14.6045, 0.5398, 22.7077]
}, },
"2.2083": { "2.2083": {
"vector": [0, -82.5, -80] "vector": [-17.1045, 0.5398, 22.7077]
} }
}, },
"position": { "position": {
@@ -14051,6 +14051,12 @@
"0.2083": { "0.2083": {
"vector": [-1, 0, 0] "vector": [-1, 0, 0]
}, },
"1.2083": {
"vector": [-1, 0, 0]
},
"1.4583": {
"vector": [-1, 0, 0]
},
"2.2083": { "2.2083": {
"vector": [-1, 0, 0] "vector": [-1, 0, 0]
} }
@@ -14058,17 +14064,31 @@
}, },
"loverleftarm": { "loverleftarm": {
"rotation": { "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": { "leftleg": {
"rotation": { "rotation": {
"vector": [-30, 0, 0] "vector": [-15, 0, 0]
} }
}, },
"loverleg_L": { "loverleg_L": {
"rotation": { "rotation": {
"vector": [70, 0, 0] "vector": [47.5, 0, 0]
} }
}, },
"closed_L": { "closed_L": {
@@ -14080,6 +14100,14 @@
"position": { "position": {
"vector": [0, 0, 1] "vector": [0, 0, 1]
} }
},
"clothleg_lower_L": {
"rotation": {
"vector": [42.5, 0, 0]
},
"position": {
"vector": [0, -0.5, -0.3]
}
} }
} }
}, },