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 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]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user