static public int AddSkill(IntPtr l)
 {
     try {
         int argc = LuaDLL.lua_gettop(l);
         if (argc == 2)
         {
             GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
             GameFramework.SkillInfo      a1;
             checkType(l, 2, out a1);
             self.AddSkill(a1);
             pushValue(l, true);
             return(1);
         }
         else if (argc == 3)
         {
             GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
             System.Int32 a1;
             checkType(l, 2, out a1);
             GameFramework.SkillInfo a2;
             checkType(l, 3, out a2);
             self.AddSkill(a1, a2);
             pushValue(l, true);
             return(1);
         }
         pushValue(l, false);
         LuaDLL.lua_pushstring(l, "No matched override function to call");
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int RemoveAllImpact(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         self.RemoveAllImpact();
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int get_BuffChanged(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         pushValue(l, true);
         pushValue(l, self.BuffChanged);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int constructor(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo o;
         o = new GameFramework.SkillStateInfo();
         pushValue(l, true);
         pushValue(l, o);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int IsSkillActivated(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         var ret = self.IsSkillActivated();
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int GetTotalSkillLevel(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         var ret = self.GetTotalSkillLevel();
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int set_BuffChanged(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         bool v;
         checkType(l, 2, out v);
         self.BuffChanged = v;
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int RemoveImpact(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         System.Int32 a1;
         checkType(l, 2, out a1);
         self.RemoveImpact(a1);
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 static public int GetSkillLevel(IntPtr l)
 {
     try {
         GameFramework.SkillStateInfo self = (GameFramework.SkillStateInfo)checkSelf(l);
         System.Int32 a1;
         checkType(l, 2, out a1);
         var ret = self.GetSkillLevel(a1);
         pushValue(l, true);
         pushValue(l, ret);
         return(2);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
        internal static SkillInfo NpcFindCanUseSkill(EntityInfo npc, AiData_General aidata, bool includeManualSkill)
        {
            SkillInfo      selectSkill = null;
            SkillStateInfo skStateInfo = npc.GetSkillStateInfo();
            int            priority    = -1;
            SkillInfo      skInfo      = null;
            long           curTime     = TimeUtility.GetLocalMilliseconds();

            if (includeManualSkill && npc.ManualSkillId > 0)
            {
                skInfo = skStateInfo.GetSkillInfoById(npc.ManualSkillId);
                if (null != skInfo && !skInfo.IsInCd(curTime))
                {
                    selectSkill = skInfo;
                }
            }
            if (null == selectSkill)
            {
                if (npc.AutoSkillIds.Count <= 0)
                {
                    return(null);
                }
                int randIndex = Helper.Random.Next(0, npc.AutoSkillIds.Count);
                skInfo = skStateInfo.GetSkillInfoById(npc.AutoSkillIds[randIndex]);
                if (null != skInfo && !skInfo.IsInCd(curTime))
                {
                    selectSkill = skInfo;
                }
                else
                {
                    for (int i = 0; i < npc.AutoSkillIds.Count; i++)
                    {
                        skInfo = skStateInfo.GetSkillInfoById(npc.AutoSkillIds[i]);
                        if (null != skInfo && !skInfo.IsInCd(curTime) && skInfo.InterruptPriority > priority)
                        {
                            selectSkill = skInfo;
                            priority    = skInfo.InterruptPriority;
                        }
                    }
                }
            }
            if (null != selectSkill)
            {
                aidata.LastUseSkillTime = TimeUtility.GetLocalMilliseconds();
            }
            return(selectSkill);
        }
        private void CombatHandler(EntityInfo npc, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }

            AiStateInfo info          = npc.GetAiStateInfo();
            EntityInfo  leader        = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.LeaderID);
            bool        isAutoOperate = IsAutoOperate(leader);

            ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D();
            Vector3 homePos = Vector3.Zero;

            if (null != leader)
            {
                GetHomePos(npc.GetMovementStateInfo().FormationIndex, leader);
            }
            float distSqrToHome = Geometry.DistanceSquare(srcPos, homePos);

            if (distSqrToHome > npc.GohomeRange * npc.GohomeRange)
            {
                NotifyAiStopPursue(npc);
                ChangeToState(npc, (int)AiStateId.GoHome);
                return;
            }

            ///
            EntityInfo     attackTarget = null;
            SkillStateInfo currSkInfo   = npc.GetSkillStateInfo();
            ///找到可以使用的技能
            SkillInfo skInfo = AiLogicUtility.NpcFindCanUseSkill(npc, this.GetAiData(npc), isAutoOperate);

            NotifyAiSelectSkill(npc, skInfo);
            if (skInfo == null)
            {
                //没有可以使用的技能就切换到Idle状态
                ChangeToState(npc, (int)AiStateId.Idle);
                return;
            }

            CharacterRelation relation =
                (skInfo.TargetType == SkillTargetType.Friend ||
                 skInfo.TargetType == SkillTargetType.RandFriend) ?
                CharacterRelation.RELATION_FRIEND :
                CharacterRelation.RELATION_ENEMY;

            attackTarget = AiLogicUtility.GetNearstTargetHelper(
                npc, skInfo.Distance, relation);

            if (attackTarget != null && null != skInfo) //攻击范围内找到可攻击目标
            {
                info.Target = attackTarget.GetId();
                NotifyAiStopPursue(npc);
                NotifyAiSkill(npc, skInfo.SkillId); //攻击目标
                return;
            }
            attackTarget = AiLogicUtility.GetNearstTargetHelper(
                npc, npc.ViewRange, relation);
            if (attackTarget != null && isAutoOperate)                                    //视野范围内找到可攻击目标
            {
                NotifyAiPursue(npc, attackTarget.GetMovementStateInfo().GetPosition3D()); // 追赶目标
                return;
            }

            currSkInfo.SetCurSkillInfo(0);
            NotifyAiStopPursue(npc);
            ChangeToState(npc, (int)AiStateId.GoHome);
        }
        private void CombatHandler(EntityInfo npc, long deltaTime)
        {
            AiStateInfo   aiInfo = npc.GetAiStateInfo();
            AiData_Leader aiData = GetAiData(npc);

            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            ///
            SkillStateInfo currSkInfo = npc.GetSkillStateInfo();
            ///找到可以使用的技能
            SkillInfo skInfo = AiLogicUtility.NpcFindCanUseSkill(npc, this.GetAiData(npc), aiData.IsAutoOperate);

            NotifyAiSelectSkill(npc, skInfo);
            if (skInfo == null)
            {
                //没有可以使用的技能就切换到Idle状态
                ChangeToState(npc, (int)AiStateId.Idle);
                return;
            }

            CharacterRelation relation =
                (skInfo.TargetType == SkillTargetType.Friend ||
                 skInfo.TargetType == SkillTargetType.RandFriend) ?
                CharacterRelation.RELATION_FRIEND :
                CharacterRelation.RELATION_ENEMY;
            EntityInfo attackTarget = AiLogicUtility.GetNearstAttackerHelper(npc, relation, aiData);

            if (null != attackTarget)
            {
                NotifyAiTarget(npc, attackTarget);
                if (Geometry.DistanceSquare(npc.GetMovementStateInfo().GetPosition3D(), attackTarget.GetMovementStateInfo().GetPosition3D()) < skInfo.Distance * skInfo.Distance)
                {
                    aiInfo.Target = attackTarget.GetId();
                    NotifyAiStopPursue(npc);
                    NotifyAiSkill(npc, skInfo.SkillId);
                    return;
                }
            }
            attackTarget = AiLogicUtility.GetNearstTargetHelper(npc, skInfo.Distance, relation);
            if (attackTarget != null && null != skInfo)   //攻击范围内找到可攻击目标
            {
                NotifyAiTarget(npc, attackTarget);
                aiInfo.Target = attackTarget.GetId();
                NotifyAiStopPursue(npc);
                NotifyAiSkill(npc, skInfo.SkillId); //攻击目标
                return;
            }
            if (aiData.IsAutoOperate)
            {
                attackTarget = AiLogicUtility.GetNearstTargetHelper(npc, npc.ViewRange, relation);
                if (attackTarget != null && null != skInfo)   //视野内找到可攻击目标
                {
                    NotifyAiPursue(npc, attackTarget.GetMovementStateInfo().GetPosition3D());
                    return;
                }
            }

            ///退出战斗模式清理一下手动技能
            currSkInfo.SetCurSkillInfo(0);
            aiData.ManualSkillId = 0;
            NotifyAiStopPursue(npc);
            ChangeToState(npc, (int)AiStateId.Idle);
        }