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); }