Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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();
        }