summaryrefslogtreecommitdiffstats
path: root/src/Mobs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Mobs/Monster.cpp49
-rw-r--r--src/Mobs/Monster.h12
2 files changed, 39 insertions, 22 deletions
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index 1db16ab71..9ba18f4d1 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -259,6 +259,17 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
if (m_bMovingToDestination)
{
+ if (m_bOnGround)
+ {
+ int NextHeight = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
+
+ if (DoesPosYRequireJump(NextHeight))
+ {
+ m_bOnGround = false;
+ AddPosY(1.5); // Jump!!
+ }
+ }
+
Vector3f Distance = m_Destination - GetPosition();
if(!ReachedDestination() && !ReachedFinalDestination()) // If we haven't reached any sort of destination, move
{
@@ -285,17 +296,6 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
TickPathFinding(); // We have reached the next point in our path, calculate another point
}
}
-
- if(m_bOnGround)
- {
- int NextHeight = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
-
- if (IsNextYPosReachable(NextHeight))
- {
- m_bOnGround = false;
- SetSpeedY(5.f); // Jump!!
- }
- }
}
if (ReachedFinalDestination())
@@ -373,6 +373,11 @@ int cMonster::FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ)
{
int PosY = (int)floor(GetPosY());
+ if (PosY < 0)
+ PosY = 0;
+ else if (PosY > cChunkDef::Height)
+ PosY = cChunkDef::Height;
+
if (!g_BlockIsSolid[m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))])
{
while (!g_BlockIsSolid[m_World->GetBlock((int)floor(a_PosX), PosY, (int)floor(a_PosZ))] && (PosY > 0))
@@ -494,7 +499,7 @@ void cMonster::KilledBy(cEntity * a_Killer)
void cMonster::CheckEventSeePlayer(void)
{
// TODO: Rewrite this to use cWorld's DoWithPlayers()
- cPlayer * Closest = m_World->FindClosestPlayer(GetPosition(), (float)m_SightDistance);
+ cPlayer * Closest = m_World->FindClosestPlayer(GetPosition(), (float)m_SightDistance, false);
if (Closest != NULL)
{
@@ -548,6 +553,11 @@ void cMonster::EventLosePlayer(void)
void cMonster::InStateIdle(float a_Dt)
{
+ if (m_bMovingToDestination)
+ {
+ return; // Still getting there
+ }
+
m_IdleInterval += a_Dt;
if (m_IdleInterval > 1)
@@ -557,20 +567,19 @@ void cMonster::InStateIdle(float a_Dt)
m_IdleInterval -= 1; // So nothing gets dropped when the server hangs for a few seconds
Vector3d Dist;
- Dist.x = (double)m_World->GetTickRandomNumber(m_SightDistance * 2) - m_SightDistance;
- Dist.z = (double)m_World->GetTickRandomNumber(m_SightDistance * 2) - m_SightDistance;
+ Dist.x = (double)m_World->GetTickRandomNumber(10) - 5;
+ Dist.z = (double)m_World->GetTickRandomNumber(10) - 5;
if ((Dist.SqrLength() > 2) && (rem >= 3))
{
- m_Destination.x = GetPosX() + Dist.x;
- m_Destination.z = GetPosZ() + Dist.z;
+ Vector3d Destination(GetPosX() + Dist.x, 0, GetPosZ() + Dist.z);
- int NextHeight = FindFirstNonAirBlockPosition(m_Destination.x, m_Destination.z);
+ int NextHeight = FindFirstNonAirBlockPosition(Destination.x, Destination.z);
- if (IsNextYPosReachable(NextHeight + 1))
+ if (IsNextYPosReachable(NextHeight))
{
- m_Destination.y = (double)NextHeight;
- MoveToPosition(m_Destination);
+ Destination.y = NextHeight;
+ MoveToPosition(Destination);
}
}
}
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index c8129e63d..d04cb8941 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -168,10 +168,18 @@ protected:
If current Y is nonsolid, goes down to try to find a solid block, then returns that + 1
If current Y is solid, goes up to find first nonsolid block, and returns that */
int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);
- /** Returns if a monster can actually reach a given height by jumping */
+ /** Returns if a monster can actually reach a given height by jumping or walking */
inline bool IsNextYPosReachable(int a_PosY)
{
- return (a_PosY > (int)floor(GetPosY())) && (a_PosY == (int)floor(GetPosY()) + 1);
+ return (
+ (a_PosY <= (int)floor(GetPosY())) ||
+ DoesPosYRequireJump(a_PosY)
+ );
+ }
+ /** Returns if a monster can reach a given height by jumping */
+ inline bool DoesPosYRequireJump(int a_PosY)
+ {
+ return ((a_PosY > (int)floor(GetPosY())) && (a_PosY == (int)floor(GetPosY()) + 1));
}
/** A semi-temporary list to store the traversed coordinates during active pathfinding so we don't visit them again */