Save current state before testing sleep animation fix
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<EllieEntity> {
|
||||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user