public override void MovementInform(MovementGeneratorType moveType, uint pointId) { // no action allowed if there is no escort if (!HasEscortState(eEscortState.Escorting)) { return; } if (moveType == MovementGeneratorType.Point) { if (m_uiWPWaitTimer == 0) { m_uiWPWaitTimer = 1; } //Combat start position reached, continue waypoint movement if (pointId == EscortPointIds.LastPoint) { Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original position before combat"); me.SetWalk(!m_bIsRunning); RemoveEscortState(eEscortState.Returning); } else if (pointId == EscortPointIds.Home) { Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original home location and will continue from beginning of waypoint list."); m_bStarted = false; } } else if (moveType == MovementGeneratorType.Waypoint) { //Call WP function WaypointReached(pointId); //End of the line if (LastWP != 0 && LastWP == pointId) { LastWP = 0; m_bStarted = false; m_bEnded = true; m_uiWPWaitTimer = 50; return; } Log.outDebug(LogFilter.Scripts, $"EscortAI Waypoint {pointId} reached"); WaypointMovementGenerator move = (WaypointMovementGenerator)me.GetMotionMaster().top(); if (move != null) { m_uiWPWaitTimer = (uint)move.GetTrackerTimer().GetExpiry(); } //Call WP start function if (m_uiWPWaitTimer == 0 && !HasEscortState(eEscortState.Paused) && move != null) { WaypointStart(move.GetCurrentNode()); } if (m_bIsRunning) { me.SetWalk(false); } else { me.SetWalk(true); } } }
public override void UpdateAI(uint diff) { if (HasEscortState(eEscortState.Escorting) && !me.GetVictim() && m_uiWPWaitTimer != 0 && !HasEscortState(eEscortState.Returning)) { if (m_uiWPWaitTimer <= diff) { if (!HasEscortState(eEscortState.Paused)) { m_uiWPWaitTimer = 0; if (m_bEnded) { me.StopMoving(); me.GetMotionMaster().Clear(false); me.GetMotionMaster().MoveIdle(); m_bEnded = false; if (DespawnAtEnd) { Log.outDebug(LogFilter.Scripts, "EscortAI reached end of waypoints"); if (m_bCanReturnToStart) { float fRetX, fRetY, fRetZ; me.GetRespawnPosition(out fRetX, out fRetY, out fRetZ); me.GetMotionMaster().MovePoint(EscortPointIds.Home, fRetX, fRetY, fRetZ); Log.outDebug(LogFilter.Scripts, $"EscortAI are returning home to spawn location: {EscortPointIds.Home}, {fRetX}, {fRetY}, {fRetZ}"); } else if (m_bCanInstantRespawn) { me.setDeathState(DeathState.JustDied); me.Respawn(); } else { me.DespawnOrUnsummon(); } } else { Log.outDebug(LogFilter.Scripts, "EscortAI reached end of waypoints with Despawn off"); } RemoveEscortState(eEscortState.Escorting); return; } if (!m_bStarted) { m_bStarted = true; me.GetMotionMaster().MovePath(_path, false); } else { WaypointMovementGenerator move = (WaypointMovementGenerator)me.GetMotionMaster().top(); if (move != null) { WaypointStart(move.GetCurrentNode()); } } } } else { m_uiWPWaitTimer -= diff; } } //Check if player or any member of his group is within range if (HasEscortState(eEscortState.Escorting) && !m_uiPlayerGUID.IsEmpty() && !me.GetVictim() && !HasEscortState(eEscortState.Returning)) { m_uiPlayerCheckTimer += diff; if (m_uiPlayerCheckTimer > 1000) { if (DespawnAtFar && !IsPlayerOrGroupInRange()) { if (m_bCanInstantRespawn) { me.setDeathState(DeathState.JustDied); me.Respawn(); } else { me.DespawnOrUnsummon(); } return; } m_uiPlayerCheckTimer = 0; } } UpdateEscortAI(diff); }