void FleeingMovementGenerator<T>::DoInitialize(T* owner) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_TRANSITORY | MOVEMENTGENERATOR_FLAG_DEACTIVATED); MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); if (!owner || !owner->IsAlive()) return; // TODO: UNIT_FIELD_FLAGS should not be handled by generators owner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING); _path = nullptr; SetTargetLocation(owner); }
bool FleeingMovementGenerator<T>::DoUpdate(T* owner, uint32 diff) { if (!owner || !owner->IsAlive()) return false; if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting()) { MovementGenerator::AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); owner->StopMoving(); _path = nullptr; return true; } else MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED); _timer.Update(diff); if ((MovementGenerator::HasFlag(MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING) && !owner->movespline->Finalized()) || (_timer.Passed() && owner->movespline->Finalized())) { MovementGenerator::RemoveFlag(MOVEMENTGENERATOR_FLAG_TRANSITORY); SetTargetLocation(owner); } return true; }
//---------------------------------------------------------------------------------- // //---------------------------------------------------------------------------------- void ManagerImplemented::SetTargetLocation( Handle handle, float x, float y, float z ) { SetTargetLocation( handle, Vector3D( x, y, z ) ); }
void HomeMovementGenerator<Creature>::DoInitialize(Creature* owner) { SetTargetLocation(owner); }
void AMagicBattleSoccerWeapon::ServerSetTargetLocation_Implementation(FVector TargetLocation) { SetTargetLocation(TargetLocation); }
void FollowMovementGenerator<Creature>::Initialize(Creature &owner) { owner.AddUnitState(UNIT_STATE_FOLLOW | UNIT_STATE_FOLLOW_MOVE); _updateSpeed(owner); SetTargetLocation(owner); }
void ChaseMovementGenerator<Creature>::Initialize(Creature &owner) { owner.SetWalk(false); owner.AddUnitState(UNIT_STATE_CHASE | UNIT_STATE_CHASE_MOVE); SetTargetLocation(owner); }
void ChaseMovementGenerator<Player>::Initialize(Player &owner) { owner.AddUnitState(UNIT_STATE_CHASE | UNIT_STATE_CHASE_MOVE); SetTargetLocation(owner); }
bool TargetedMovementGeneratorMedium<T,D>::Update(T &owner, const uint32 & time_diff) { if (!_target.isValid() || !_target->IsInWorld()) { if (_targetSearchingTimer >= TARGET_NOT_ACCESSIBLE_MAX_TIMER) return false; else { _targetSearchingTimer += time_diff; return true; } } if (!owner.isAlive()) return false; if (owner.HasUnitState(UNIT_STATE_NOT_MOVE)) { D::_clearUnitStateMove(owner); return true; } // prevent movement while casting spells with cast time or channel time if (owner.HasUnitState(UNIT_STATE_CASTING)) { if (!owner.IsStopped()) { // some spells should be able to be cast while moving // maybe some attribute? here, check the entry of creatures useing these spells switch (owner.GetEntry()) { case 36633: // Ice Sphere (Lich King) case 37562: // Volatile Ooze and Gas Cloud (Putricide) case 37697: break; default: owner.StopMoving(); } } return true; } // prevent crash after creature killed pet if (static_cast<D*>(this)->LostTarget(owner)) { D::_clearUnitStateMove(owner); if (_targetSearchingTimer >= TARGET_NOT_ACCESSIBLE_MAX_TIMER) return false; else { _targetSearchingTimer += time_diff; return true; } } _recheckDistance.Update(time_diff); if (_recheckDistance.Passed()) { _recheckDistance.Reset(RECHECK_DISTANCE_TIMER); G3D::Vector3 dest = owner.movespline->FinalDestination(); float allowed_dist = 0.0f; bool targetIsVictim = owner.getVictim() && owner.getVictim()->GetGUID() == _target->GetGUID(); if (targetIsVictim) allowed_dist = owner.GetMeleeReach() + owner.getVictim()->GetMeleeReach(); else allowed_dist = _target->GetObjectSize() + owner.GetObjectSize() + sWorld->getRate(RATE_TARGET_POS_RECALCULATION_RANGE); if (allowed_dist < owner.GetObjectSize()) allowed_dist = owner.GetObjectSize(); bool targetMoved = false; if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->IsFlying()) targetMoved = !_target->IsWithinDist3d(dest.x, dest.y, dest.z, allowed_dist); else targetMoved = !_target->IsWithinDist2d(dest.x, dest.y, allowed_dist); if (targetIsVictim && owner.GetTypeId() == TYPEID_UNIT && !((Creature*)&owner)->isPet()) { if ((!owner.getVictim() || !owner.getVictim()->isAlive()) && owner.movespline->Finalized()) return false; if (!_offset && owner.movespline->Finalized() && !owner.IsWithinMeleeRange(owner.getVictim()) && !_target->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_PENDING_STOP)) { if (_targetSearchingTimer >= TARGET_NOT_ACCESSIBLE_MAX_TIMER) { owner.DeleteFromThreatList(owner.getVictim()); return false; } else { _targetSearchingTimer += time_diff; targetMoved = true; } } else _targetSearchingTimer = 0; } else _targetSearchingTimer = 0; if (targetMoved) SetTargetLocation(owner); } if (owner.movespline->Finalized()) { static_cast<D*>(this)->MovementInform(owner); if (_angle == 0.f && !owner.HasInArc(0.01f, _target.getTarget())) owner.SetInFront(_target.getTarget()); if (!_targetReached) { _targetReached = true; static_cast<D*>(this)->ReachTarget(owner); } } else { if (_recalculateTravel) SetTargetLocation(owner); } return true; }