private void HandleTauntAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    npc.IsTaunt = true;
                    TrySeeTarget(npc, target);
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    npc.IsTaunt                = false;
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Пример #2
0
 public void Tick()
 {
     if (0 == m_LastTickTime)
     {
         m_LastTickTime = TimeUtility.GetServerMilliseconds();
     }
     else
     {
         long delta = TimeUtility.GetServerMilliseconds() - m_LastTickTime;
         m_LastTickTime = TimeUtility.GetServerMilliseconds();
         if (null != m_NpcMgr)
         {
             for (LinkedListNode <NpcInfo> linkNode = m_NpcMgr.Npcs.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 NpcInfo npc = linkNode.Value;
                 TickNpc(npc, delta);
             }
         }
         if (null != m_UserMgr)
         {
             for (LinkedListNode <UserInfo> linkNode = m_UserMgr.Users.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 UserInfo user = linkNode.Value;
                 TickUser(user, delta);
             }
         }
     }
 }
        private void HandleRunAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    info.Time += deltaTime;
                    if (info.Time > m_IntervalTime)
                    {
                        info.Time = 0;
                        NotifyNpcRun(npc);
                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                    }
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Пример #4
0
 protected override void UpdateIdle()
 {
     if ((int)AiStateId.Idle == m_Npc.GetAiStateInfo().CurState&& !m_Npc.IsSimulateMove)
     {
         if (!GetOwner().IsDead() && m_CharacterAnimationInfo.IsIdle())
         {
             if (m_IdleState == IdleState.kNotIdle)
             {
                 PlayAnimation(Animation_Type.AT_Stand);
                 m_IdleState     = IdleState.kBegin;
                 m_BeginIdleTime = TimeUtility.GetServerMilliseconds();
                 m_IdleInterval  = CrossEngineHelper.Random.Next(3000, 7000);
             }
             else if (m_IdleState == IdleState.kBegin)
             {
                 if (TimeUtility.GetServerMilliseconds() - m_BeginIdleTime > m_IdleInterval)
                 {
                     PlayAnimation(GetNextIdleAnim());
                     PlayQueuedAnimation(Animation_Type.AT_IdelStand);
                     m_BeginIdleTime = TimeUtility.GetServerMilliseconds();
                     m_IdleInterval  = CrossEngineHelper.Random.Next(3000, 7000);
                 }
             }
             else
             {
                 m_IdleState = IdleState.kNotIdle;
             }
         }
     }
     else
     {
         base.UpdateIdle();
     }
 }
Пример #5
0
        public void Set(string timeoutKey, T callback, Action onTimeout)
        {
            long        startTime = TimeUtility.GetServerMilliseconds();
            TimeoutInfo info      = new TimeoutInfo(callback, startTime, onTimeout);

            m_TimeoutInfoDict.AddOrUpdate(timeoutKey, info, info);
        }
Пример #6
0
        public void OnGfxSetObjLifeTime(int id, long life_remaint_time)
        {
            NpcInfo npcinfo = WorldSystem.Instance.GetCharacterById(id) as NpcInfo;

            if (npcinfo == null)
            {
                return;
            }
            npcinfo.LifeEndTime = TimeUtility.GetServerMilliseconds() + life_remaint_time;
        }
Пример #7
0
 protected void UpdateStoryAnim()
 {
     if (!m_IsStoryAnimationPlaying)
     {
         return;
     }
     if (TimeUtility.GetServerMilliseconds() >= m_StoryAnimStopTime)
     {
         m_IsStoryAnimationPlaying = false;
     }
 }
Пример #8
0
        public void Tick()
        {
            if (0 == m_LastTickTime)
            {
                m_LastTickTime = TimeUtility.GetServerMilliseconds();
                LogSystem.Debug("MovementSystem LastTickTime:{0}", m_LastTickTime);
            }
            else
            {
                long delta = TimeUtility.GetServerMilliseconds() - m_LastTickTime;
                m_LastTickTime = TimeUtility.GetServerMilliseconds();
                if (delta > 1000)
                {
                    delta = 1000;
                }
                if (null != m_NpcMgr)
                {
                    for (LinkedListNode <NpcInfo> node = m_NpcMgr.Npcs.FirstValue; null != node; node = node.Next)
                    {
                        NpcInfo npc = node.Value;
                        if (null != npc)
                        {
                            MoveNpc(npc, delta);

                            /*
                             * npc.TransformShape();
                             * if (null != npc.SceneContext.SightManager) {
                             * npc.SceneContext.SightManager.UpdateObject(npc);
                             * }
                             */
                        }
                    }
                }
                if (null != m_UserMgr)
                {
                    for (LinkedListNode <UserInfo> node = m_UserMgr.Users.FirstValue; null != node; node = node.Next)
                    {
                        UserInfo user = node.Value;
                        if (null != user)
                        {
                            MoveUser(user, delta);

                            /*
                             * user.TransformShape();
                             * if (null != user.SceneContext.SightManager) {
                             * user.SceneContext.SightManager.UpdateObject(user);
                             * }
                             */
                        }
                    }
                }
            }
        }
Пример #9
0
        public virtual void Tick(CharacterInfo obj, int impactId)
        {
            ImpactInfo impactInfo = obj.GetSkillStateInfo().GetImpactInfoById(impactId);

            if (null != impactInfo && impactInfo.m_IsActivated)
            {
                long curTime = TimeUtility.GetServerMilliseconds();
                if (curTime > impactInfo.m_StartTime + impactInfo.m_ImpactDuration)
                {
                    impactInfo.m_IsActivated = false;
                }
            }
        }
        public override void OnEvent(NpcInfo npc, int eventId, CharacterInfo target, long deltaTime)
        {
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                NormalForceStopHandler(npc);
                switch (eventId)
                {
                case (int)AiEventEnum.CONTROL_TIME_OVERFLOW:
                    if (data.MaxControlEventActions.Count > 0)
                    {
                        data.ActionStack.Clear();
                    }
                    int plusActionCount = data.MaxControlEventPlusActions.Count;
                    if (plusActionCount > 0)
                    {
                        data.ActionStack.Push(data.MaxControlEventPlusActions[CrossEngineHelper.Random.Next(plusActionCount)]);
                    }
                    for (int i = data.MaxControlEventActions.Count - 1; i >= 0; --i)
                    {
                        if (data.MaxControlEventActions[i].IsSatifyCD(TimeUtility.GetServerMilliseconds()) &&
                            data.MaxControlEventActions[i].IsLuckyEnough())
                        {
                            data.ActionStack.Push(data.MaxControlEventActions[i]);
                        }
                    }
                    break;

                case (int)AiEventEnum.GET_UP:
                    if (data.GetUpEventActions.Count > 0)
                    {
                        data.ActionStack.Clear();
                    }
                    for (int i = data.GetUpEventActions.Count - 1; i >= 0; --i)
                    {
                        if (data.GetUpEventActions[i].IsSatifyCD(TimeUtility.GetServerMilliseconds()) &&
                            data.GetUpEventActions[i].IsLuckyEnough())
                        {
                            data.ActionStack.Push(data.GetUpEventActions[i]);
                        }
                    }
                    break;
                }
                if (data.ActionStack.Count > 0)
                {
                    data.ActiveAction = data.ActionStack.Pop();
                }
                ExecAiAction(npc, target, deltaTime);
            }
        }
        private void NormalActionStartHandler(NpcInfo npc, CharacterInfo target)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    //aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                    aiActionInfo.StartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
        private bool IsAiActionSatifyWithOutProbability(NpcInfo npc, CharacterInfo target, AiActionInfo aiActionInfo)
        {
            Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
            Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
            float   dist      = Geometry.Distance(srcPos, targetPos);

            if (aiActionInfo.IsSatifyCD(TimeUtility.GetServerMilliseconds()) &&
                aiActionInfo.IsSatifyDis(dist) &&
                aiActionInfo.IsSatisfySelfHp(npc.Hp, npc.GetActualProperty().HpMax) &&
                aiActionInfo.IsSatisfyTargetHp(target.Hp, target.GetActualProperty().HpMax) &&
                aiActionInfo.IsSatifyUser(npc))
            {
                return(true);
            }
            return(false);
        }
        public override void Tick(CharacterInfo character, int impactId)
        {
            ImpactInfo impactInfo = character.GetSkillStateInfo().GetImpactInfoById(impactId);

            if (null != impactInfo)
            {
                if (impactInfo.m_IsActivated)
                {
                    if (TimeUtility.GetServerMilliseconds() > impactInfo.m_StartTime + impactInfo.m_ImpactDuration)
                    {
                        StopImpact(character, impactId);
                    }
                }
            }
            ;
        }
Пример #14
0
 public void StartChallenge(ArenaTargetInfo target, int sign)
 {
     IsBattleStarted        = true;
     IsBeginFight           = false;
     ChallengeTarget        = target;
     IsEntityCreated        = false;
     TargetInfo             = null;
     BattleStartTime        = TimeUtility.GetServerMilliseconds();
     LastBattleServerTime   = DateTime.Now.AddMilliseconds(BaseConfig.BattleCd);
     IsChallengeOver        = false;
     LeftFightCount        -= 1;
     IsChallengeSuccess     = false;
     CurCameraTargetPartner = -1;
     LastChallengeResult    = null;
     Sign = sign - (int)target.Guid;
 }
Пример #15
0
        protected virtual void UpdateIdle()
        {
            if (!GetOwner().IsDead() && m_CharacterAnimationInfo.IsIdle())
            {
                if (m_IdleState == IdleState.kNotIdle)
                {
                    Animation_Type at   = m_IsCombatState ? Animation_Type.AT_CombatStand : Animation_Type.AT_Stand;
                    string         name = GetAnimationNameByType(at);
                    if (!string.IsNullOrEmpty(name))
                    {
                        float fadetime = 0.5f;
                        if (GetOwner() != null && GetOwner().GetSkillStateInfo() != null)
                        {
                            fadetime = GetOwner().GetSkillStateInfo().CrossToStandTime;
                            GetOwner().ResetCross2StandRunTime();
                        }
                        GfxSystem.CrossFadeAnimation(m_Actor, name, fadetime);
                    }

                    m_BeginIdleTime = TimeUtility.GetServerMilliseconds();
                    m_IdleState     = IdleState.kReady;
                    m_IdleInterval  = CrossEngineHelper.Random.Next(1, 3) * 1000;
                }
                else if (m_IdleState == IdleState.kReady)
                {
                    if (TimeUtility.GetServerMilliseconds() - m_BeginIdleTime > m_IdleInterval)
                    {
                        Animation_Type at   = m_IsCombatState ? Animation_Type.AT_CombatStand : Animation_Type.AT_Stand;
                        string         name = GetAnimationNameByType(at);
                        if (!string.IsNullOrEmpty(name))
                        {
                            float fadetime = 0.5f;
                            if (GetOwner() != null && GetOwner().GetSkillStateInfo() != null)
                            {
                                fadetime = GetOwner().GetSkillStateInfo().CrossToStandTime;
                            }
                            GfxSystem.CrossFadeAnimation(m_Actor, name, fadetime);
                        }
                        m_BeginIdleTime = TimeUtility.GetServerMilliseconds();
                    }
                }
            }
            else
            {
                m_IdleState = IdleState.kNotIdle;
            }
        }
Пример #16
0
 public void UpdateTarget(NpcInfo npc)
 {
     if (npc.GetAIEnable())
     {
         NpcAiStateInfo npcAi   = npc.GetAiStateInfo();
         long           curTime = TimeUtility.GetServerMilliseconds();
         if (npcAi.Target > 0)
         {
             if (curTime > npcAi.LastChangeTargetTime + m_ChangeTargetCD && curTime > npc.GetCombatStatisticInfo().LastHitTime + m_MaxChaseTime)
             {
                 npcAi.Target = 0;
                 NotifyNpcTargetChange(npc);
                 npcAi.LastChangeTargetTime = curTime;
                 LogSystem.Debug("Npc {0} changed target", npc.GetId());
             }
         }
     }
 }
Пример #17
0
 internal void PlayStoryAnimation(Animation_Type type, long remain_time, bool isQueued)
 {
     m_IsStoryAnimationPlaying = true;
     m_IdleState     = IdleState.kNotIdle;
     m_StoryAnimName = GetAnimationNameByType(type);
     if (remain_time > 0)
     {
         m_StoryAnimStopTime = TimeUtility.GetServerMilliseconds() + remain_time;
     }
     if (isQueued)
     {
         PlayQueuedAnimation(type, 1.0f);
     }
     else
     {
         PlayAnimation(type, 1.0f);
     }
 }
        private void NormalForceStopHandler(NpcInfo npc)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                npc.IsTaunt = false;
                NotifyNpcRun(npc);
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Пример #19
0
 private void NpcSkill(NpcInfo npc, int skillId)
 {
     if (null != npc)
     {
         if (npc.SkillController != null)
         {
             SkillInfo skillInfo = npc.GetSkillStateInfo().GetSkillInfoById(skillId);
             if (null != skillInfo)
             {
                 long curTime = TimeUtility.GetServerMilliseconds();
                 if (!skillInfo.IsInCd(curTime / 1000.0f))
                 {
                     npc.SkillController.ForceStartSkill(skillId);
                     skillInfo.BeginCD();
                 }
             }
         }
     }
 }
Пример #20
0
        public void Tick()
        {
            long          curTime    = TimeUtility.GetServerMilliseconds();
            List <string> deleteKeys = new List <string>();

            foreach (KeyValuePair <string, long> kv in m_OperationTimeDict)
            {
                if (curTime - kv.Value > OperationIntervalMs)
                {
                    deleteKeys.Add(kv.Key);
                }
            }
            long startTime;

            foreach (string key in deleteKeys)
            {
                m_OperationTimeDict.TryRemove(key, out startTime);
            }
        }
        private void HandleSelfImpactAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo && !String.IsNullOrEmpty(aiActionInfo.Config.ActionParam))
                {
                    NotifyNpcAddImpact(npc, int.Parse(aiActionInfo.Config.ActionParam));
                }
                data.ActiveAction          = null;
                aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
            }
        }
Пример #22
0
        public NpcInfo AddNpc(int id, Data_Unit unit)
        {
            NpcInfo npc = NewNpcInfo(id);

            npc.SceneContext = m_SceneContext;
            npc.LoadData(unit);
            npc.IsBorning = true;
            npc.SetAIEnable(false);
            npc.SetStateFlag(Operate_Type.OT_AddBit, CharacterState_Type.CST_Invincible);
            npc.BornTime = TimeUtility.GetServerMilliseconds();
            m_Npcs.AddLast(npc.GetId(), npc);
            if (null != m_SceneContext && null != m_SceneContext.SpatialSystem)
            {
                m_SceneContext.SpatialSystem.AddObj(npc.SpaceObject);
            }
            if (null != m_SceneContext && null != m_SceneContext.SightManager)
            {
                m_SceneContext.SightManager.AddObject(npc);
            }
            return(npc);
        }
Пример #23
0
        public void Tick()
        {
            if (0 == m_LastTickTime)
            {
                m_LastTickTime = TimeUtility.GetServerMilliseconds();
            }
            else
            {
                long delta = TimeUtility.GetServerMilliseconds() - m_LastTickTime;
                m_LastTickTime = TimeUtility.GetServerMilliseconds();
                for (LinkedListNode <SceneLogicInfo> node = m_SceneLogicInfoMgr.SceneLogicInfos.FirstValue; null != node; node = node.Next)
                {
                    SceneLogicInfo info = node.Value;
                    if (null != info)
                    {
                        ISceneLogic logic = SceneLogicManager.Instance.GetSceneLogic(info.LogicId);
                        if (null != logic)
                        {
                            logic.Execute(info, delta);
                        }
                        if (info.IsLogicFinished)
                        {
                            m_SceneLogicInfos.Add(info);
                        }
                    }
                }
                for (int i = 0; i < m_SceneLogicInfos.Count; i++)
                {
                    m_SceneLogicInfoMgr.RemoveSceneLogicInfo(m_SceneLogicInfos[i].GetId());
                }

                /*
                 * foreach (SceneLogicInfo info in m_SceneLogicInfos) {
                 * m_SceneLogicInfoMgr.RemoveSceneLogicInfo(info.GetId());
                 * }*/
                m_SceneLogicInfos.Clear();
                m_SceneLogicInfoMgr.ExecuteDelayAdd();
            }
        }
Пример #24
0
        public void Tick()
        {
            long          curTime    = TimeUtility.GetServerMilliseconds();
            List <string> deleteKeys = new List <string>();

            foreach (KeyValuePair <string, TimeoutInfo> kv in m_TimeoutInfoDict)
            {
                if (kv.Value != null && curTime - kv.Value.StartTime > DefaultTimeoutMS)
                {
                    if (kv.Value.OnTimeout != null)
                    {
                        kv.Value.OnTimeout();
                    }
                    deleteKeys.Add(kv.Key);
                }
            }
            TimeoutInfo info = null;

            foreach (string key in deleteKeys)
            {
                m_TimeoutInfoDict.TryRemove(key, out info);
            }
        }
        private void HandleFleeAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = Vector3.Zero;
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    float anglePlus = 0.0f;
                    float.TryParse(aiActionInfo.Config.ActionParam, out anglePlus);
                    if (GetEscapeTargetPos(npc, target, 3.0f, anglePlus, ref targetPos))
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            NotifyNpcRun(npc);
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    data.ActiveAction = null;
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Пример #26
0
        public void Tick(CharacterInfo obj)
        {
            List <ImpactInfo> impactInfos = obj.GetSkillStateInfo().GetAllImpact();
            int ct = impactInfos.Count;

            for (int i = ct - 1; i >= 0; --i)
            {
                ImpactInfo   info  = impactInfos[i];
                IImpactLogic logic = ImpactLogicManager.Instance.GetImpactLogic(info.ConfigData.ImpactLogicId);
                if (info.m_IsActivated)
                {
                    if (null != logic)
                    {
                        logic.Tick(obj, info.m_ImpactId);
                    }
                }
                else
                {
                    logic.OnInterrupted(obj, info.m_ImpactId);
                    obj.GetSkillStateInfo().RemoveImpact(info.m_ImpactId);
                }
            }
            obj.GetSkillStateInfo().CleanupImpactInfoForCheck(TimeUtility.GetServerMilliseconds(), 5000);//用于校验的impact比正常时间晚5秒清除
        }
Пример #27
0
 public void AlwaysClientTick()
 {
     if (0 == m_AlwaysClientLastTickTime)
     {
         m_AlwaysClientLastTickTime = TimeUtility.GetServerMilliseconds();
     }
     else
     {
         long delta = TimeUtility.GetServerMilliseconds() - m_AlwaysClientLastTickTime;
         m_AlwaysClientLastTickTime = TimeUtility.GetServerMilliseconds();
         if (null != m_NpcMgr)
         {
             for (LinkedListNode <NpcInfo> linkNode = m_NpcMgr.Npcs.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 NpcInfo        npc   = linkNode.Value;
                 INpcStateLogic logic = AiLogicManager.Instance.GetAlwaysClientNpcStateLogic(npc.GetAiStateInfo().AiLogic);
                 if (null != logic)
                 {
                     logic.Execute(npc, m_AiCommandDispatcher, delta);
                 }
             }
         }
         if (null != m_UserMgr)
         {
             for (LinkedListNode <UserInfo> linkNode = m_UserMgr.Users.FirstValue; null != linkNode; linkNode = linkNode.Next)
             {
                 UserInfo        user  = linkNode.Value;
                 IUserStateLogic logic = AiLogicManager.Instance.GetAlwaysClientUserStateLogic(user.GetAiStateInfo().AiLogic);
                 if (null != logic)
                 {
                     logic.Execute(user, m_AiCommandDispatcher, delta);
                 }
             }
         }
     }
 }
Пример #28
0
        private int GetCanCastSkillId(UserInfo user, float dis)
        {
            if (null == user)
            {
                return(-1);
            }
            List <int> skillsCanCast = new List <int>();
            int        start         = (int)SkillCategory.kAttack;
            int        end           = (int)SkillCategory.kSkillD;

            for (int i = start; i <= end; i++)
            {
                SkillNode node = user.SkillController.GetHead((SkillCategory)i);
                if (null != node)
                {
                    SkillInfo skillInfo = user.GetSkillStateInfo().GetSkillInfoById(node.SkillId);
                    if (null != skillInfo)
                    {
                        if (skillInfo.ConfigData.SkillRangeMax >= dis && skillInfo.ConfigData.SkillRangeMin <= dis)
                        {
                            if (!skillInfo.IsInCd(TimeUtility.GetServerMilliseconds()))
                            {
                                skillsCanCast.Add(i);
                            }
                        }
                    }
                }
            }
            int count = skillsCanCast.Count;

            if (count > 0)
            {
                return(skillsCanCast[CrossEngineHelper.Random.Next(count)]);
            }
            return(-1);
        }
Пример #29
0
        protected void UpdateState()
        {
            if (GetOwner().IsDead())
            {
                return;
            }
            long now = TimeUtility.GetServerMilliseconds();

            if (IsInCombatState())
            {
                m_LastLeaveCombatTime   = now;
                m_IsCombat2IdleChanging = false;
                m_IsCombatState         = true;
            }
            else if (m_IsCombatState)
            {
                if (GetOwner().GetMovementStateInfo().IsMoving)
                {
                    m_LastLeaveCombatTime   = now;
                    m_IsCombat2IdleChanging = false;
                }
            }
            if (GetOwner().GetId() == WorldSystem.Instance.GetPlayerSelf().GetId())
            {
                if (m_LastLeaveCombatTime + GetOwner().Combat2IdleTime *GetOwner().Combat2IdleCoefficient * 1000 <= now && !m_IsCombat2IdleChanging)
                {
                    GetOwner().SkillController.PushSkill(SkillCategory.kCombat2Idle, Vector3.Zero);
                    m_IsCombat2IdleChanging = true;
                    GetOwner().ResetCombat2IdleCoefficient();
                }
            }
            if (m_IsCombatState && !m_IsWeaponMoved)
            {
                EnterCombatState();
            }
        }
        private void HandleStandAction(NpcInfo npc, CharacterInfo target, long delatTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                NotifyNpcMove(npc);
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                    {
                        data.ActiveAction          = null;
                        aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                    }
                }
            }
        }