public override bool DoUpdate(T owner, uint diff) { if (!owner || !owner.IsAlive()) { return(false); } if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) { AddFlag(MovementGeneratorFlags.Interrupted); owner.StopMoving(); _path = null; return(true); } else { RemoveFlag(MovementGeneratorFlags.Interrupted); } // waiting for next move _timer.Update(diff); if ((HasFlag(MovementGeneratorFlags.SpeedUpdatePending) && !owner.MoveSpline.Finalized()) || (_timer.Passed() && owner.MoveSpline.Finalized())) { RemoveFlag(MovementGeneratorFlags.Transitory); Position destination = new(_reference); float distance = (float)(4.0f * RandomHelper.FRand(0.0f, 1.0f) - 2.0f); float angle = RandomHelper.FRand(0.0f, 1.0f) * MathF.PI * 2.0f; owner.MovePositionToFirstCollision(destination, distance, angle); if (_path == null) { _path = new PathGenerator(owner); _path.SetPathLengthLimit(30.0f); } bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath) || _path.GetPathType().HasAnyFlag(PathType.Shortcut)) { _timer.Reset(100); return(true); } owner.AddUnitState(UnitState.ConfusedMove); MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(true); int traveltime = init.Launch(); _timer.Reset(traveltime + RandomHelper.URand(800, 1500)); } return(true); }
void _setTargetLocation(T owner) { if (owner == null) { return; } if (owner.HasUnitState(UnitState.Root | UnitState.Stunned)) { return; } if (owner.IsMovementPreventedByCasting()) { owner.CastStop(); return; } owner.AddUnitState(UnitState.FleeingMove); float x, y, z; _getPoint(owner, out x, out y, out z); Position mypos = owner.GetPosition(); bool isInLOS = Global.VMapMgr.isInLineOfSight(owner.GetMapId(), mypos.posX, mypos.posY, mypos.posZ + 2.0f, x, y, z + 2.0f); if (!isInLOS) { i_nextCheckTime.Reset(200); return; } PathGenerator path = new PathGenerator(owner); path.SetPathLengthLimit(30.0f); bool result = path.CalculatePath(x, y, z); if (!result || path.GetPathType().HasAnyFlag(PathType.NoPath)) { i_nextCheckTime.Reset(100); return; } MoveSplineInit init = new MoveSplineInit(owner); init.MovebyPath(path.GetPath()); init.SetWalk(false); int traveltime = init.Launch(); i_nextCheckTime.Reset(traveltime + RandomHelper.URand(800, 1500)); }
void SetTargetLocation(T owner) { if (owner == null || !owner.IsAlive()) { return; } if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting()) { AddFlag(MovementGeneratorFlags.Interrupted); owner.StopMoving(); _path = null; return; } Position destination = new (owner.GetPosition()); GetPoint(owner, destination); // Add LOS check for target point if (!owner.IsWithinLOS(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ())) { _timer.Reset(200); return; } if (_path == null) { _path = new PathGenerator(owner); _path.SetPathLengthLimit(30.0f); } bool result = _path.CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); if (!result || _path.GetPathType().HasFlag(PathType.NoPath) || _path.GetPathType().HasFlag(PathType.Shortcut) || _path.GetPathType().HasFlag(PathType.FarFromPoly)) { _timer.Reset(100); return; } owner.AddUnitState(UnitState.FleeingMove); MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(false); int traveltime = init.Launch(); _timer.Reset(traveltime + RandomHelper.URand(800, 1500)); }
public override bool DoUpdate(T owner, uint time_diff) { if (owner.HasUnitState(UnitState.Root | UnitState.Stunned | UnitState.Distracted)) { return(true); } if (i_nextMoveTime.Passed()) { // currently moving, update location owner.AddUnitState(UnitState.ConfusedMove); if (owner.MoveSpline.Finalized()) { i_nextMoveTime.Reset(RandomHelper.IRand(800, 1500)); } } else { // waiting for next move i_nextMoveTime.Update(time_diff); if (i_nextMoveTime.Passed()) { // start moving owner.AddUnitState(UnitState.ConfusedMove); float dest = (float)(4.0f * RandomHelper.NextDouble() - 2.0f); Position pos = new Position(i_x, i_y, i_z); owner.MovePositionToFirstCollision(ref pos, dest, 0.0f); PathGenerator path = new PathGenerator(owner); path.SetPathLengthLimit(30.0f); bool result = path.CalculatePath(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); if (!result || path.GetPathType().HasAnyFlag(PathType.NoPath)) { i_nextMoveTime.Reset(100); return(true); } MoveSplineInit init = new MoveSplineInit(owner); init.MovebyPath(path.GetPath()); init.SetWalk(true); init.Launch(); } } return(true); }
void SetRandomLocation(Creature owner) { if (owner == null) { return; } if (owner.HasUnitState(UnitState.NotMove | UnitState.LostControl) || owner.IsMovementPreventedByCasting()) { AddFlag(MovementGeneratorFlags.Interrupted); owner.StopMoving(); _path = null; return; } Position position = new(_reference); float distance = RandomHelper.FRand(0.0f, 1.0f) * _wanderDistance; float angle = RandomHelper.FRand(0.0f, 1.0f) * MathF.PI * 2.0f; owner.MovePositionToFirstCollision(position, distance, angle); uint resetTimer = RandomHelper.randChance(50) ? RandomHelper.URand(5000, 10000) : RandomHelper.URand(1000, 2000); if (_path == null) { _path = new PathGenerator(owner); _path.SetPathLengthLimit(30.0f); } bool result = _path.CalculatePath(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ()); if (!result || _path.GetPathType().HasAnyFlag(PathType.NoPath) || _path.GetPathType().HasAnyFlag(PathType.Shortcut)) { _timer.Reset(100); return; } owner.AddUnitState(UnitState.RoamingMove); bool walk = true; switch (owner.GetMovementTemplate().GetRandom()) { case CreatureRandomMovementType.CanRun: walk = owner.IsWalking(); break; case CreatureRandomMovementType.AlwaysRun: walk = false; break; default: break; } MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(walk); int traveltime = init.Launch(); _timer.Reset(traveltime + resetTimer); // Call for creature group update owner.SignalFormationMovement(position); }
void SetRandomLocation(Creature owner) { if (owner == null) { return; } if (owner.HasUnitState(UnitState.NotMove | UnitState.LostControl) || owner.IsMovementPreventedByCasting()) { AddFlag(MovementGeneratorFlags.Interrupted); owner.StopMoving(); _path = null; return; } Position position = new(_reference); float distance = RandomHelper.FRand(0.0f, _wanderDistance); float angle = RandomHelper.FRand(0.0f, MathF.PI * 2.0f); owner.MovePositionToFirstCollision(position, distance, angle); // Check if the destination is in LOS if (!owner.IsWithinLOS(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ())) { // Retry later on _timer.Reset(200); return; } if (_path == null) { _path = new PathGenerator(owner); _path.SetPathLengthLimit(30.0f); } bool result = _path.CalculatePath(position.GetPositionX(), position.GetPositionY(), position.GetPositionZ()); if (!result || _path.GetPathType().HasFlag(PathType.NoPath) || _path.GetPathType().HasFlag(PathType.Shortcut) || _path.GetPathType().HasFlag(PathType.FarFromPoly)) { _timer.Reset(100); return; } RemoveFlag(MovementGeneratorFlags.Transitory | MovementGeneratorFlags.TimedPaused); owner.AddUnitState(UnitState.RoamingMove); bool walk = true; switch (owner.GetMovementTemplate().GetRandom()) { case CreatureRandomMovementType.CanRun: walk = owner.IsWalking(); break; case CreatureRandomMovementType.AlwaysRun: walk = false; break; default: break; } MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); init.SetWalk(walk); int splineDuration = init.Launch(); --_wanderSteps; if (_wanderSteps != 0) // Creature has yet to do steps before pausing { _timer.Reset(splineDuration); } else { // Creature has made all its steps, time for a little break _timer.Reset(splineDuration + RandomHelper.URand(4, 10) * Time.InMilliseconds); // Retails seems to use rounded numbers so we do as well _wanderSteps = RandomHelper.URand(2, 10); } // Call for creature group update owner.SignalFormationMovement(); }