fix(Core/Pathfinding): pets chase & transport (#4451)
This commit is contained in:
@@ -269,6 +269,10 @@ void MotionTransport::AddPassenger(WorldObject* passenger, bool withAll)
|
|||||||
passenger->m_movementInfo.flags |= MOVEMENTFLAG_ONTRANSPORT;
|
passenger->m_movementInfo.flags |= MOVEMENTFLAG_ONTRANSPORT;
|
||||||
passenger->m_movementInfo.transport.guid = GetGUID();
|
passenger->m_movementInfo.transport.guid = GetGUID();
|
||||||
passenger->m_movementInfo.transport.pos.Relocate(x, y, z, o);
|
passenger->m_movementInfo.transport.pos.Relocate(x, y, z, o);
|
||||||
|
if (passenger->ToUnit())
|
||||||
|
{
|
||||||
|
passenger->ToUnit()->AddUnitState(UNIT_STATE_IGNORE_PATHFINDING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,6 +294,10 @@ void MotionTransport::RemovePassenger(WorldObject* passenger, bool withAll)
|
|||||||
passenger->m_movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
|
passenger->m_movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT;
|
||||||
passenger->m_movementInfo.transport.guid = 0;
|
passenger->m_movementInfo.transport.guid = 0;
|
||||||
passenger->m_movementInfo.transport.pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
|
passenger->m_movementInfo.transport.pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
if (passenger->ToUnit())
|
||||||
|
{
|
||||||
|
passenger->ToUnit()->ClearUnitState(UNIT_STATE_IGNORE_PATHFINDING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ static bool IsMutualChase(Unit* owner, Unit* target)
|
|||||||
if (target->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
|
if (target->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return target->GetVictim() == owner->GetVictim();
|
return target->GetVictim() == owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@@ -43,8 +43,10 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
|||||||
if (!owner || !owner->IsAlive())
|
if (!owner || !owner->IsAlive())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
Creature* cOwner = owner->ToCreature();
|
||||||
|
|
||||||
// the owner might be unable to move (rooted or casting), or we have lost the target, pause movement
|
// the owner might be unable to move (rooted or casting), or we have lost the target, pause movement
|
||||||
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || HasLostTarget(owner) || (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->IsMovementPreventedByCasting()))
|
if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || HasLostTarget(owner) || (cOwner && cOwner->IsMovementPreventedByCasting()))
|
||||||
{
|
{
|
||||||
i_path = nullptr;
|
i_path = nullptr;
|
||||||
owner->StopMoving();
|
owner->StopMoving();
|
||||||
@@ -57,8 +59,6 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Creature* cOwner = owner->ToCreature();
|
|
||||||
|
|
||||||
bool forceDest =
|
bool forceDest =
|
||||||
//(cOwner && (cOwner->isWorldBoss() || cOwner->IsDungeonBoss())) || // force for all bosses, even not in instances
|
//(cOwner && (cOwner->isWorldBoss() || cOwner->IsDungeonBoss())) || // force for all bosses, even not in instances
|
||||||
(i_target->GetTypeId() == TYPEID_PLAYER && i_target->ToPlayer()->IsGameMaster()) || // for .npc follow
|
(i_target->GetTypeId() == TYPEID_PLAYER && i_target->ToPlayer()->IsGameMaster()) || // for .npc follow
|
||||||
@@ -96,8 +96,7 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasMoveState = owner->HasUnitState(UNIT_STATE_CHASE_MOVE) || owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE);
|
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && owner->movespline->Finalized())
|
||||||
if (hasMoveState && owner->movespline->Finalized())
|
|
||||||
{
|
{
|
||||||
i_recalculateTravel = false;
|
i_recalculateTravel = false;
|
||||||
i_path = nullptr;
|
i_path = nullptr;
|
||||||
@@ -114,7 +113,7 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
|||||||
|
|
||||||
_lastTargetPosition = i_target->GetPosition();
|
_lastTargetPosition = i_target->GetPosition();
|
||||||
|
|
||||||
if (PositionOkay(owner, target, maxRange, angle) && !hasMoveState)
|
if (PositionOkay(owner, target, maxRange, angle) && !owner->HasUnitState(UNIT_STATE_CHASE_MOVE))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bool moveToward = !owner->IsInDist(target, maxRange);
|
bool moveToward = !owner->IsInDist(target, maxRange);
|
||||||
@@ -145,8 +144,6 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (target->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
shortenPath = false;
|
|
||||||
// otherwise, we fall back to nearpoint finding
|
// otherwise, we fall back to nearpoint finding
|
||||||
target->GetNearPoint(owner, x, y, z, (moveToward ? maxTarget : minTarget) - hitboxSum, 0, angle ? target->ToAbsoluteAngle(angle->RelativeAngle) : target->GetAngle(owner));
|
target->GetNearPoint(owner, x, y, z, (moveToward ? maxTarget : minTarget) - hitboxSum, 0, angle ? target->ToAbsoluteAngle(angle->RelativeAngle) : target->GetAngle(owner));
|
||||||
shortenPath = false;
|
shortenPath = false;
|
||||||
@@ -237,7 +234,7 @@ bool FollowMovementGenerator<T>::PositionOkay(T* owner, Unit* target, float rang
|
|||||||
if (owner->GetExactDistSq(target) > G3D::square(owner->GetCombatReach() + target->GetCombatReach() + range))
|
if (owner->GetExactDistSq(target) > G3D::square(owner->GetCombatReach() + target->GetCombatReach() + range))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return !owner->IsPet() || !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner));
|
return !owner->IsPet() || !angle || angle->IsAngleOkay(target->GetRelativeAngle(owner)); // need to check - dont think we need !pet exception here because there are scripts with MoveFollow that require angle
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
|||||||
Reference in New Issue
Block a user