summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Monster.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Monster.h')
-rw-r--r--src/Mobs/Monster.h58
1 files changed, 7 insertions, 51 deletions
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index 7b6c0c488..1e1012f57 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -7,17 +7,12 @@
#include "../Item.h"
#include "../Enchantments.h"
#include "MonsterTypes.h"
-
+#include "PathFinder.h"
class cClientHandle;
class cWorld;
-// Fwd: cPath
-enum class ePathFinderStatus;
-class cPath;
-
-
// tolua_begin
class cMonster :
@@ -168,34 +163,19 @@ protected:
/** A pointer to the entity this mobile is aiming to reach */
cEntity * m_Target;
- cPath * m_Path; // TODO unique ptr
- /** Stores if mobile is currently moving towards the ultimate, final destination */
- bool m_IsFollowingPath;
+ /** The pathfinder instance handles pathfinding for this monster. */
+ cPathFinder m_PathFinder;
/** Stores if pathfinder is being used - set when final destination is set, and unset when stopped moving to final destination */
bool m_PathfinderActivated;
- /* If 0, will give up reaching the next m_NextWayPointPosition and will re-compute path. */
- int m_GiveUpCounter;
- int m_TicksSinceLastPathReset;
-
/** Coordinates of the next position that should be reached */
Vector3d m_NextWayPointPosition;
/** Coordinates for the ultimate, final destination. */
Vector3d m_FinalDestination;
- /** Coordinates for the ultimate, final destination last given to the pathfinder. */
- Vector3d m_PathFinderDestination;
-
- /** True if there's no path to target and we're walking to an approximated location. */
- bool m_NoPathToTarget;
-
- /** Whether The mob has finished their path, note that this does not imply reaching the destination,
- the destination may sometimes differ from the current path. */
- bool m_NoMoreWayPoints;
-
/** Finds the lowest non-air block position (not the highest, as cWorld::GetHeight does)
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.
@@ -203,48 +183,25 @@ protected:
int FindFirstNonAirBlockPosition(double a_PosX, double a_PosZ);
/** Returns if the ultimate, final destination has been reached. */
- bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).Length() < GetWidth()/2); }
+ bool ReachedFinalDestination(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < WAYPOINT_RADIUS * WAYPOINT_RADIUS); }
/** Returns whether or not the target is close enough for attack. */
bool TargetIsInRange(void) { return ((m_FinalDestination - GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); }
- /** Returns if the intermediate waypoint of m_NextWayPointPosition has been reached */
- bool ReachedNextWaypoint(void) { return ((m_NextWayPointPosition - GetPosition()).SqrLength() < 0.25); }
-
/** Returns if a monster can reach a given height by jumping. */
inline bool DoesPosYRequireJump(int a_PosY)
{
return ((a_PosY > POSY_TOINT) && (a_PosY == POSY_TOINT + 1));
}
- /** Finds the next place to go by calculating a path and setting the m_NextWayPointPosition variable for the next block to head to
- This is based on the ultimate, final destination and the current position, as well as the A* algorithm, and any environmental hazards
- Returns if a path is ready, and therefore if the mob should move to m_NextWayPointPosition
- */
- bool TickPathFinding(cChunk & a_Chunk);
-
/** Move in a straight line to the next waypoint in the path, will jump if needed. */
void MoveToWayPoint(cChunk & a_Chunk);
- /** Ensures the destination is not buried underground or under water. Also ensures the destination is not in the air.
- Only the Y coordinate of m_FinalDestination might be changed.
- 1. If m_FinalDestination is the position of a water block, m_FinalDestination's Y will be modified to point to the heighest water block in the pool in the current column.
- 2. If m_FinalDestination is the position of a solid, m_FinalDestination's Y will be modified to point to the first airblock above the solid in the current column.
- 3. If m_FinalDestination is the position of an air block, Y will keep decreasing until hitting either a solid or water.
- Now either 1 or 2 is performed. */
- bool EnsureProperDestination(cChunk & a_Chunk);
-
- /** Resets a pathfinding task, be it due to failure or something else
- Resets the pathfinder. If m_IsFollowingPath is true, TickPathFinding starts a brand new path.
- Should only be called by the pathfinder, cMonster::Tick or StopMovingToPosition. */
- void ResetPathFinding(void);
-
- /** Stops pathfinding
- Calls ResetPathFinding and sets m_IsFollowingPath to false */
+ /** Stops pathfinding. Calls ResetPathFinding and sets m_IsFollowingPath to false */
void StopMovingToPosition();
- /** Sets the body yaw and head yaw / pitch based on next / ultimate destinations */
- void SetPitchAndYawFromDestination(void);
+ /** Sets the body yaw and head yaw */
+ void SetPitchAndYawFromDestination(bool a_IsFollowingPath);
virtual void HandleFalling(void);
int m_LastGroundHeight;
@@ -297,5 +254,4 @@ protected:
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */
void AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel);
-
} ; // tolua_export