Fixed tracer usage in Entity physics handling. (#3720)
This commit is contained in:
parent
ad4172d21c
commit
0551d78dff
@ -1122,12 +1122,14 @@ void cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
Vector3d HitCoords;
|
Vector3d HitCoords;
|
||||||
Vector3i HitBlockCoords;
|
Vector3i HitBlockCoords;
|
||||||
eBlockFace HitBlockFace;
|
eBlockFace HitBlockFace;
|
||||||
if (cLineBlockTracer::FirstSolidHitTrace(*GetWorld(), NextPos, NextPos + NextSpeed, HitCoords, HitBlockCoords, HitBlockFace))
|
Vector3d wantNextPos = NextPos + NextSpeed * DtSec.count();
|
||||||
|
auto isHit = cLineBlockTracer::FirstSolidHitTrace(*GetWorld(), NextPos, wantNextPos, HitCoords, HitBlockCoords, HitBlockFace);
|
||||||
|
if (isHit)
|
||||||
{
|
{
|
||||||
// Set our position to where the block was hit, minus a bit:
|
// Set our position to where the block was hit, minus a bit:
|
||||||
// TODO: The real entity's m_Width should be taken into account here
|
// TODO: The real entity's m_Width should be taken into account here
|
||||||
NextPos = HitCoords - NextSpeed.NormalizeCopy() * 0.1;
|
NextPos = HitCoords - NextSpeed.NormalizeCopy() * 0.1;
|
||||||
if (HitBlockFace == BLOCK_FACE_YM)
|
if (HitBlockFace == BLOCK_FACE_YP)
|
||||||
{
|
{
|
||||||
// We hit the ground, adjust the position to the top of the block:
|
// We hit the ground, adjust the position to the top of the block:
|
||||||
m_bOnGround = true;
|
m_bOnGround = true;
|
||||||
@ -1161,12 +1163,12 @@ void cEntity::HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// We didn't hit anything, so move =]
|
// We didn't hit anything, so move:
|
||||||
NextPos += (NextSpeed * DtSec.count());
|
NextPos += (NextSpeed * DtSec.count());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SetPosition(NextPos);
|
SetPosition(NextPos);
|
||||||
SetSpeed(NextSpeed);
|
SetSpeed(NextSpeed);
|
||||||
|
@ -149,20 +149,21 @@ void cMonster::MoveToWayPoint(cChunk & a_Chunk)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_JumpCoolDown <= 0)
|
||||||
if (m_JumpCoolDown == 0)
|
|
||||||
{
|
{
|
||||||
if (DoesPosYRequireJump(FloorC(m_NextWayPointPosition.y)))
|
if (DoesPosYRequireJump(FloorC(m_NextWayPointPosition.y)))
|
||||||
{
|
{
|
||||||
if (((IsOnGround()) && (GetSpeed().SqrLength() == 0.0f)) ||
|
if (
|
||||||
(IsSwimming()))
|
(IsOnGround() && (GetSpeed().SqrLength() <= 0.5)) || // If walking on the ground, we need to slow down first, otherwise we miss the jump
|
||||||
|
IsSwimming()
|
||||||
|
)
|
||||||
{
|
{
|
||||||
m_bOnGround = false;
|
m_bOnGround = false;
|
||||||
m_JumpCoolDown = 20;
|
m_JumpCoolDown = 20;
|
||||||
// TODO: Change to AddSpeedY once collision detection is fixed - currently, mobs will go into blocks attempting to jump without a teleport
|
|
||||||
AddPosY(1.6); // Jump!!
|
AddPosY(1.6); // Jump!!
|
||||||
|
SetSpeedY(1);
|
||||||
SetSpeedX(3.2 * (m_NextWayPointPosition.x - GetPosition().x)); // Move forward in a preset speed.
|
SetSpeedX(3.2 * (m_NextWayPointPosition.x - GetPosition().x)); // Move forward in a preset speed.
|
||||||
SetSpeedZ(3.2 * (m_NextWayPointPosition.z - GetPosition().z)); // The numbers were picked based on trial and error and 1.6 and 3.2 are perfect.
|
SetSpeedZ(3.2 * (m_NextWayPointPosition.z - GetPosition().z)); // The numbers were picked based on trial and error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,7 +173,7 @@ void cMonster::MoveToWayPoint(cChunk & a_Chunk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Vector3d Distance = m_NextWayPointPosition - GetPosition();
|
Vector3d Distance = m_NextWayPointPosition - GetPosition();
|
||||||
if ((Distance.x != 0.0f) || (Distance.z != 0.0f))
|
if ((std::abs(Distance.x) > 0.05) || (std::abs(Distance.z) > 0.05))
|
||||||
{
|
{
|
||||||
Distance.y = 0;
|
Distance.y = 0;
|
||||||
Distance.Normalize();
|
Distance.Normalize();
|
||||||
|
@ -208,10 +208,10 @@ protected:
|
|||||||
/** Returns whether or not the target is close enough for attack. */
|
/** Returns whether or not the target is close enough for attack. */
|
||||||
bool TargetIsInRange(void) { ASSERT(m_Target != nullptr); return ((m_Target->GetPosition() - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); }
|
bool TargetIsInRange(void) { ASSERT(m_Target != nullptr); return ((m_Target->GetPosition() - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); }
|
||||||
|
|
||||||
/** Returns if a monster can reach a given height by jumping. */
|
/** Returns whether the monster needs to jump to reach a given height. */
|
||||||
inline bool DoesPosYRequireJump(int a_PosY)
|
inline bool DoesPosYRequireJump(double a_PosY)
|
||||||
{
|
{
|
||||||
return ((a_PosY > POSY_TOINT));
|
return (a_PosY > GetPosY() + 0.8); // Assume that differences up to 0.8 blocks can be walked instead of jumped
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Move in a straight line to the next waypoint in the path, will jump if needed. */
|
/** Move in a straight line to the next waypoint in the path, will jump if needed. */
|
||||||
|
Loading…
Reference in New Issue
Block a user