mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-22 13:16:23 +00:00
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.transport.guid = GetGUID();
|
||||
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.transport.guid = 0;
|
||||
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)
|
||||
return false;
|
||||
|
||||
return target->GetVictim() == owner->GetVictim();
|
||||
return target->GetVictim() == owner;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@@ -43,8 +43,10 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
if (!owner || !owner->IsAlive())
|
||||
return false;
|
||||
|
||||
Creature* cOwner = owner->ToCreature();
|
||||
|
||||
// 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;
|
||||
owner->StopMoving();
|
||||
@@ -57,8 +59,6 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
return true;
|
||||
}
|
||||
|
||||
Creature* cOwner = owner->ToCreature();
|
||||
|
||||
bool forceDest =
|
||||
//(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
|
||||
@@ -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 (hasMoveState && owner->movespline->Finalized())
|
||||
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && owner->movespline->Finalized())
|
||||
{
|
||||
i_recalculateTravel = false;
|
||||
i_path = nullptr;
|
||||
@@ -114,7 +113,7 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
|
||||
_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;
|
||||
|
||||
bool moveToward = !owner->IsInDist(target, maxRange);
|
||||
@@ -145,8 +144,6 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (target->GetTypeId() == TYPEID_PLAYER)
|
||||
shortenPath = false;
|
||||
// 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));
|
||||
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))
|
||||
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>
|
||||
|
||||
Reference in New Issue
Block a user