Exemple #1
0
        void Mutate(MovementGenerator m, MovementSlot _slot)
        {
            int slot = (int)_slot;
            MovementGenerator curr = Impl[slot];

            if (curr != null)
            {
                Impl[slot] = null; // in case a new one is generated in this slot during directdelete
                if (_top == slot && Convert.ToBoolean(_cleanFlag & MMCleanFlag.UPDATE))
                {
                    DelayedDelete(curr);
                }
                else
                {
                    DirectDelete(curr);
                }
            }
            else if (_top < slot)
            {
                _top = slot;
            }

            Impl[slot] = m;
            if (_top > slot)
            {
                _needInit[slot] = true;
            }
            else
            {
                _needInit[slot] = false;
                m.Initialize(_owner);
            }
        }
Exemple #2
0
        void StartMovement(IMovementGenerator m, MovementSlot slot)
        {
            IMovementGenerator curr = _slot[(int)slot];

            if (curr != null)
            {
                _slot[(int)slot] = null; // in case a new one is generated in this slot during directdelete
                if (_top == (int)slot && Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update))
                {
                    DelayedDelete(curr);
                }
                else
                {
                    DirectDelete(curr);
                }
            }
            else if (_top < (int)slot)
            {
                _top = (int)slot;
            }

            _slot[(int)slot] = m;
            if (_top > (int)slot)
            {
                _initialize[(int)slot] = true;
            }
            else
            {
                _initialize[(int)slot] = false;
                m.Initialize(_owner);
            }
        }
Exemple #3
0
        public void MoveFollow(Unit target, float dist, float angle, MovementSlot slot = MovementSlot.ACTIVE)
        {
            // ignore movement request if target not exist
            if (target == null || target == _owner || _owner.HasFlag(UnitFields.Flags, UnitFlags.DisableMove))
            {
                return;
            }

            //_owner->AddUnitState(UNIT_STATE_FOLLOW);
            if (_owner.GetTypeId() == ObjectType.Player)
            {
                Log.outDebug("Player (GUID: {0}) follow to {1} (GUID: {2})", _owner.GetGUIDLow(),
                             target.GetTypeId() == ObjectType.Player ? "player" : "creature",
                             target.GetTypeId() == ObjectType.Player ? target.GetGUIDLow() : target.ToCreature().GetGUIDLow());
                Mutate(new FollowMovementGenerator <Player>(target, dist, angle), slot);
            }
            else
            {
                Log.outDebug("Creature (Entry: {0} GUID: {1}) follow to {2} (GUID: {3})",
                             _owner.GetEntry(), _owner.GetGUIDLow(),
                             target.GetTypeId() == ObjectType.Player ? "player" : "creature",
                             target.GetTypeId() == ObjectType.Player ? target.GetGUIDLow() : target.ToCreature().GetGUIDLow());
                Mutate(new FollowMovementGenerator <Creature>(target, dist, angle), slot);
            }
        }
Exemple #4
0
        public IMovementGenerator GetMotionSlot(MovementSlot slot)
        {
            if (Empty() || slot >= MovementSlot.Max || _slot[(int)slot] == null)
            {
                return(null);
            }

            return(_slot[(int)slot]);
        }
Exemple #5
0
        public MovementGeneratorType GetMotionSlotType(MovementSlot slot)
        {
            if (Empty() || slot >= MovementSlot.Max || _slot[(int)slot] == null)
            {
                return(MovementGeneratorType.Max);
            }

            return(_slot[(int)slot].GetMovementGeneratorType());
        }
Exemple #6
0
 public MovementGeneratorType GetMotionSlotType(MovementSlot slot)
 {
     if (_slot[(int)slot] == null)
     {
         return(MovementGeneratorType.Null);
     }
     else
     {
         return(_slot[(int)slot].GetMovementGeneratorType());
     }
 }
        void DelayedClean(MovementSlot slot)
        {
            IMovementGenerator motion = GetMotionSlot(slot);

            if (motion != null)
            {
                _slot[(int)slot] = null;
                DelayedDelete(motion);
            }

            while (!Empty() && Top() == null)
            {
                --_top;
            }
        }
        public void Clear(MovementSlot slot)
        {
            if (Empty() || slot >= MovementSlot.Max)
            {
                return;
            }

            if (_cleanFlag.HasAnyFlag(MMCleanFlag.Update))
            {
                DelayedClean(slot);
            }
            else
            {
                DirectClean(slot);
            }
        }
Exemple #9
0
        public void MoveFollow(Unit target, float dist = 0.0f, float angle = 0.0f, MovementSlot slot = MovementSlot.Idle)
        {
            if (!target || target == _owner)
            {
                return;
            }

            if (_owner.IsTypeId(TypeId.Player))
            {
                StartMovement(new FollowMovementGenerator <Player>(target, dist, angle), slot);
            }
            else
            {
                StartMovement(new FollowMovementGenerator <Creature>(target, dist, angle), slot);
            }
        }
            private void StartMovement(MovementGenerator movement, MovementSlot newMovementSlot)
            {
                int newMovementIndex = (int)newMovementSlot;

                FinishMovement(newMovementIndex);

                if (currentMovementIndex < newMovementIndex)
                {
                    currentMovementIndex = newMovementIndex;
                }

                movementGenerators[newMovementIndex] = movement;

                if (currentMovementIndex > newMovementIndex)
                {
                    startedMovement[newMovementIndex] = false;
                }
                else
                {
                    BeginMovement(newMovementIndex);
                }
            }
            private void CancelMovement(MovementType movementType, MovementSlot cancelledMovementSlot)
            {
                int cancelledIndex = (int)cancelledMovementSlot;

                if (movementGenerators[cancelledIndex] == null)
                {
                    return;
                }

                if (movementGenerators[cancelledIndex].Type != movementType)
                {
                    return;
                }

                if (currentMovementIndex == cancelledIndex)
                {
                    ResetCurrentMovement();
                }
                else
                {
                    FinishMovement(cancelledIndex);
                }
            }
Exemple #12
0
        void DirectClean(MovementSlot slot)
        {
            IMovementGenerator motion = GetMotionSlot(slot);

            if (motion != null)
            {
                _slot[(int)slot] = null;
                DirectDelete(motion);
            }

            while (!Empty() && Top() == null)
            {
                --_top;
            }

            if (Empty())
            {
                Initialize();
            }
            else if (NeedInitTop())
            {
                InitTop();
            }
        }
Exemple #13
0
 public IMovementGenerator GetMotionSlot(MovementSlot slot)
 {
     Cypher.Assert((int)slot >= 0);
     return(_slot[(int)slot]);
 }