コード例 #1
0
        void DirectClean(bool reset)
        {
            while (size() > 1)
            {
                IMovementGenerator curr = top();
                pop();
                if (curr != null)
                {
                    DirectDelete(curr);
                }
            }

            if (empty())
            {
                return;
            }

            if (needInitTop())
            {
                InitTop();
            }
            else if (reset)
            {
                top().Reset(_owner);
            }
        }
コード例 #2
0
        void StartMovement(IMovementGenerator m, MovementSlot slot)
        {
            int _slot = (int)slot;
            IMovementGenerator 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);
            }
        }
コード例 #3
0
        void DirectExpire(bool reset)
        {
            if (size() > 1)
            {
                IMovementGenerator curr = top();
                pop();
                DirectDelete(curr);
            }

            while (!empty() && top() == null)//not sure this will work
            {
                --_top;
            }

            if (empty())
            {
                Initialize();
            }
            else if (needInitTop())
            {
                InitTop();
            }
            else if (reset)
            {
                top().Reset(_owner);
            }
        }
コード例 #4
0
        void ClearExpireList()
        {
            for (int i = 0; i < _expireList.Count; ++i)
            {
                IMovementGenerator mg = _expireList[i];
                DirectDelete(mg);
            }

            _expireList = null;

            if (empty())
            {
                Initialize();
            }
            else if (NeedInitTop())
            {
                InitTop();
            }
            else if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Reset))
            {
                top().Reset(_owner);
            }

            _cleanFlag &= ~MMCleanFlag.Reset;
        }
コード例 #5
0
 void DirectDelete(IMovementGenerator curr)
 {
     if (IsStatic(curr))
     {
         return;
     }
     curr.Finalize(_owner);
 }
コード例 #6
0
ファイル: MotionMaster.cs プロジェクト: zgbjmy2009/CypherCore
        void DelayedDelete(IMovementGenerator curr)
        {
            if (IsStatic(curr))
            {
                return;
            }

            _expireList.Add(curr);
        }
コード例 #7
0
 void DelayedClean()
 {
     while (Size() > 1)
     {
         IMovementGenerator curr = Top();
         Pop();
         if (curr != null)
         {
             DelayedDelete(curr);
         }
     }
 }
コード例 #8
0
        public virtual void UpdateMotion(uint diff)
        {
            if (!_owner)
            {
                return;
            }

            if (_owner.HasUnitState(UnitState.Root | UnitState.Stunned))
            {
                return;
            }

            Contract.Assert(!empty());

            _cleanFlag |= MMCleanFlag.Update;
            if (!top().Update(_owner, diff))
            {
                _cleanFlag &= ~MMCleanFlag.Update;
                MovementExpired();
            }
            else
            {
                _cleanFlag &= ~MMCleanFlag.Update;
            }

            if (_expList != null)
            {
                for (int i = 0; i < _expList.Count; ++i)
                {
                    IMovementGenerator mg = _expList[i];
                    DirectDelete(mg);
                }

                _expList = null;

                if (empty())
                {
                    Initialize();
                }
                else if (needInitTop())
                {
                    InitTop();
                }
                else if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Reset))
                {
                    top().Reset(_owner);
                }

                _cleanFlag &= ~MMCleanFlag.Reset;
            }

            _owner.UpdateUnderwaterState(_owner.GetMap(), _owner.GetPositionX(), _owner.GetPositionY(), _owner.GetPositionZ());
        }
コード例 #9
0
 void DelayedDelete(IMovementGenerator curr)
 {
     if (IsStatic(curr))
     {
         return;
     }
     if (_expireList == null)
     {
         _expireList = new List <IMovementGenerator>();
     }
     _expireList.Add(curr);
 }
コード例 #10
0
 public void InitDefault()
 {
     if (_owner.IsTypeId(TypeId.Unit))
     {
         IMovementGenerator movement = AISelector.SelectMovementAI(_owner.ToCreature());
         StartMovement(movement ?? staticIdleMovement, MovementSlot.Idle);
     }
     else
     {
         StartMovement(staticIdleMovement, MovementSlot.Idle);
     }
 }
コード例 #11
0
        public void Initialize()
        {
            while (!Empty())
            {
                IMovementGenerator curr = Top();
                Pop();
                if (curr != null)
                {
                    DirectDelete(curr);
                }
            }

            InitDefault();
        }
コード例 #12
0
        void DelayedExpire()
        {
            if (size() > 1)
            {
                IMovementGenerator curr = top();
                pop();
                DelayedDelete(curr);
            }

            while (!empty() && top() == null)
            {
                --_top;
            }
        }
コード例 #13
0
        void DelayedExpire()
        {
            if (Size() > 1)
            {
                IMovementGenerator curr = Top();
                Pop();
                DelayedDelete(curr);
            }

            while (!Empty() && Top() == null)
            {
                --_top;
            }
        }
コード例 #14
0
ファイル: MotionMaster.cs プロジェクト: zgbjmy2009/CypherCore
        void DelayedClean(MovementSlot slot)
        {
            IMovementGenerator motion = GetMotionSlot(slot);

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

            while (!Empty() && Top() == null)
            {
                --_top;
            }
        }
コード例 #15
0
ファイル: MotionMaster.cs プロジェクト: zgbjmy2009/CypherCore
        public void PropagateSpeedChange()
        {
            if (Empty())
            {
                return;
            }

            IMovementGenerator movement = Top();

            if (movement == null)
            {
                return;
            }

            movement.UnitSpeedChanged();
        }
コード例 #16
0
ファイル: MotionMaster.cs プロジェクト: zgbjmy2009/CypherCore
        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();
            }
        }
コード例 #17
0
 bool IsStatic(IMovementGenerator movement)
 {
     return(movement == staticIdleMovement);
 }
コード例 #18
0
 bool isStatic(IMovementGenerator mv)
 {
     return(mv == staticIdleMovement);
 }
コード例 #19
0
 void push(IMovementGenerator _Val)
 {
     ++_top;
     Impl[_top] = _Val;
 }