From 8a5df43e6c72efd899fc59b04168ecd5526300e4 Mon Sep 17 00:00:00 2001 From: Safwat Halaby Date: Fri, 20 Nov 2015 10:03:20 +0200 Subject: Decoupled cMonster and path recalc logic, re-implemented recalc --- src/Mobs/Monster.h | 58 +++++++----------------------------------------------- 1 file changed, 7 insertions(+), 51 deletions(-) (limited to 'src/Mobs/Monster.h') 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 -- cgit v1.2.3