private List<SkillInfo> m_SkillList; // 技能容器 #endregion Fields #region Constructors public SkillStateInfo() { m_SkillList = new List<SkillInfo>(); m_CurSkillInfo = null; m_ImpactList = new List<ImpactInfo>(); m_NextImpactSeq = 1; }
static public int constructor(IntPtr l) { try { int argc = LuaDLL.lua_gettop(l); GameFramework.SkillInfo o; if (matchType(l, argc, 2, typeof(int))) { System.Int32 a1; checkType(l, 2, out a1); o = new GameFramework.SkillInfo(a1); pushValue(l, true); pushValue(l, o); return(2); } else if (matchType(l, argc, 2, typeof(TableConfig.Skill))) { TableConfig.Skill a1; checkType(l, 2, out a1); o = new GameFramework.SkillInfo(a1); pushValue(l, true); pushValue(l, o); return(2); } return(error(l, "New object failed.")); } catch (Exception e) { return(error(l, e)); } }
public void AddSkill(int index, SkillInfo info) { if (m_SkillList.Count == index) { m_SkillList.Insert(index, info); } else if (m_SkillList.Count > index) { m_SkillList[index] = info; } }
static public int get_IsSkillActivated(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); pushValue(l, true); pushValue(l, self.IsSkillActivated); return(2); } catch (Exception e) { return(error(l, e)); } }
static public int get_ConfigData(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); pushValue(l, true); pushValue(l, self.ConfigData); return(2); } catch (Exception e) { return(error(l, e)); } }
static public int get_TargetType(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); pushValue(l, true); pushEnum(l, (int)self.TargetType); return(2); } catch (Exception e) { return(error(l, e)); } }
static public int get_m_SkillCDRefreshCount(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); pushValue(l, true); pushValue(l, self.m_SkillCDRefreshCount); return(2); } catch (Exception e) { return(error(l, e)); } }
static public int get_InterruptPriority(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); pushValue(l, true); pushValue(l, self.InterruptPriority); return(2); } catch (Exception e) { return(error(l, e)); } }
static public int Reset(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); self.Reset(); pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int set_IsSkillActivated(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); System.Boolean v; checkType(l, 2, out v); self.IsSkillActivated = v; pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int set_ConfigData(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); TableConfig.Skill v; checkType(l, 2, out v); self.ConfigData = v; pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int set_m_SkillCDRefreshCount(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); System.Int32 v; checkType(l, 2, out v); self.m_SkillCDRefreshCount = v; pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int set_CdEndTime(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); System.Int64 v; checkType(l, 2, out v); self.CdEndTime = v; pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int AddCD(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); System.Int64 a1; checkType(l, 2, out a1); self.AddCD(a1); pushValue(l, true); return(1); } catch (Exception e) { return(error(l, e)); } }
static public int IsInCd(IntPtr l) { try { GameFramework.SkillInfo self = (GameFramework.SkillInfo)checkSelf(l); System.Int64 a1; checkType(l, 2, out a1); var ret = self.IsInCd(a1); pushValue(l, true); pushValue(l, ret); return(2); } catch (Exception e) { return(error(l, e)); } }
public void LoadData(TableConfig.Actor cfg) { m_ConfigData = cfg; SetLinkId(cfg.id); SetModel(cfg.avatar); EntityType = cfg.type; m_Radius = cfg.size; float maxAttackRange = 0; if (cfg.skill0 > 0) { SkillInfo info = new SkillInfo(cfg.skill0); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) maxAttackRange = info.ConfigData.distance; m_NormalSkillId = cfg.skill0; m_AutoSkillIds.Add(cfg.skill0); } if (cfg.skill1 > 0) { SkillInfo info = new SkillInfo(cfg.skill1); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) maxAttackRange = info.ConfigData.distance; m_AutoSkillIds.Add(cfg.skill1); } if (cfg.skill2 > 0) { SkillInfo info = new SkillInfo(cfg.skill2); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) maxAttackRange = info.ConfigData.distance; m_AutoSkillIds.Add(cfg.skill2); } if (cfg.skill3 > 0) { SkillInfo info = new SkillInfo(cfg.skill3); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) maxAttackRange = info.ConfigData.distance; m_AutoSkillIds.Add(cfg.skill3); } if (cfg.skill4 > 0) { SkillInfo info = new SkillInfo(cfg.skill4); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) maxAttackRange = info.ConfigData.distance; m_ManualSkillId = cfg.skill4; //m_AutoSkillIds.Add(cfg.skill4); } if (cfg.skill5 > 0) { SkillInfo info = new SkillInfo(cfg.skill5); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill5); } if (cfg.skill6 > 0) { SkillInfo info = new SkillInfo(cfg.skill6); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill6); } if (cfg.skill7 > 0) { SkillInfo info = new SkillInfo(cfg.skill7); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill7); } if (cfg.skill8 > 0) { SkillInfo info = new SkillInfo(cfg.skill8); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill8); } if (cfg.bornskill > 0) { SkillInfo info = new SkillInfo(cfg.bornskill); GetSkillStateInfo().AddSkill(info); m_BornSkillId = cfg.bornskill; } if (cfg.deadskill > 0) { SkillInfo info = new SkillInfo(cfg.deadskill); GetSkillStateInfo().AddSkill(info); m_DeadSkillId = cfg.deadskill; } ViewRange = cfg.viewrange; GohomeRange = cfg.gohomerange; GetBaseProperty().SetRps(Operate_Type.OT_Absolute, 1); GetBaseProperty().SetAttackBase(Operate_Type.OT_Absolute, cfg.attack); GetBaseProperty().SetDefenceBase(Operate_Type.OT_Absolute, cfg.defence); GetBaseProperty().SetAttackRange(Operate_Type.OT_Absolute, maxAttackRange); GetBaseProperty().SetHpMax(Operate_Type.OT_Absolute, cfg.hp); GetBaseProperty().SetEnergyMax(Operate_Type.OT_Absolute, cfg.mp); GetBaseProperty().SetMoveSpeed(Operate_Type.OT_Absolute, cfg.speed); AttrCalculator.Calc(this); SetHp(Operate_Type.OT_Absolute, GetActualProperty().HpMax); SetEnergy(Operate_Type.OT_Absolute, GetActualProperty().EnergyMax); }
public void LoadData(TableConfig.Actor cfg) { m_ConfigData = cfg; BaseProperty.ConfigData = cfg; BaseProperty.Owner = this; ActualProperty.ConfigData = cfg; ActualProperty.Owner = this; TableConfig.SkillEventProvider.Instance.skillEventTable.TryGetValue(cfg.id, out m_SkillEventConfigData); SetLinkId(cfg.id); SetModel(cfg.avatar); EntityType = cfg.type; m_Radius = cfg.size; m_ViewRange = cfg.viewrange; m_GohomeRange = cfg.gohomerange; float maxAttackRange = 0; if (cfg.skill0 > 0) { SkillInfo info = new SkillInfo(cfg.skill0); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill0); } if (cfg.skill1 > 0) { SkillInfo info = new SkillInfo(cfg.skill1); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill1); } if (cfg.skill2 > 0) { SkillInfo info = new SkillInfo(cfg.skill2); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill2); } if (cfg.skill3 > 0) { SkillInfo info = new SkillInfo(cfg.skill3); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill3); } if (cfg.skill4 > 0) { SkillInfo info = new SkillInfo(cfg.skill4); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_ManualSkillId = cfg.skill4; } if (cfg.skill5 > 0) { SkillInfo info = new SkillInfo(cfg.skill5); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill5); } if (cfg.skill6 > 0) { SkillInfo info = new SkillInfo(cfg.skill6); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill6); } if (cfg.skill7 > 0) { SkillInfo info = new SkillInfo(cfg.skill7); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill7); } if (cfg.skill8 > 0) { SkillInfo info = new SkillInfo(cfg.skill8); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill8); } if (cfg.bornskill > 0) { SkillInfo info = new SkillInfo(cfg.bornskill); GetSkillStateInfo().AddSkill(info); m_BornSkillId = cfg.bornskill; } if (cfg.deadskill > 0) { SkillInfo info = new SkillInfo(cfg.deadskill); GetSkillStateInfo().AddSkill(info); m_DeadSkillId = cfg.deadskill; } foreach (var pair in TableConfig.AttrDefineProvider.Instance.AttrDefineMgr.GetData()) { TableConfig.AttrDefine def = pair.Value as TableConfig.AttrDefine; BaseProperty.SetInt((CharacterPropertyEnum)def.id, def.value); } InitProperty(CharacterPropertyEnum.x1001_基础物理攻击, cfg.x1001); InitProperty(CharacterPropertyEnum.x1002_物理攻击成长, cfg.x1002); InitProperty(CharacterPropertyEnum.x1006_基础法术攻击, cfg.x1006); InitProperty(CharacterPropertyEnum.x1007_法术攻击成长, cfg.x1007); InitProperty(CharacterPropertyEnum.x1011_基础物理防御, cfg.x1011); InitProperty(CharacterPropertyEnum.x1012_物理防御成长, cfg.x1012); InitProperty(CharacterPropertyEnum.x1016_基础法术防御, cfg.x1016); InitProperty(CharacterPropertyEnum.x1017_法术防御成长, cfg.x1017); InitProperty(CharacterPropertyEnum.x1021_暴击等级, cfg.x1021); InitProperty(CharacterPropertyEnum.x1022_抗暴击等级, cfg.x1022); InitProperty(CharacterPropertyEnum.x1024_命中等级, cfg.x1024); InitProperty(CharacterPropertyEnum.x1026_闪避等级, cfg.x1026); InitProperty(CharacterPropertyEnum.x1028_破击等级, cfg.x1028); InitProperty(CharacterPropertyEnum.x1030_格挡等级, cfg.x1030); InitProperty(CharacterPropertyEnum.x1032_格挡强度, cfg.x1032); InitProperty(CharacterPropertyEnum.x1033_暴击伤害, cfg.x1033); InitProperty(CharacterPropertyEnum.x1034_暴击伤害减免, cfg.x1034); InitProperty(CharacterPropertyEnum.x2001_基础生命, cfg.x2001); InitProperty(CharacterPropertyEnum.x2002_生命成长, cfg.x2002); InitProperty(CharacterPropertyEnum.x2007_基础速度, cfg.x2007); InitProperty(CharacterPropertyEnum.x2008_速度成长, cfg.x2008); InitProperty(CharacterPropertyEnum.x4001_职业, cfg.x4001); InitProperty(CharacterPropertyEnum.x4002_阵营, cfg.x4002); InitProperty(CharacterPropertyEnum.x4003_品质, cfg.x4003); InitProperty(CharacterPropertyEnum.x4004_性别, cfg.x4004); AttrCalculator.Calc(this); Hp = ActualProperty.GetInt(CharacterPropertyEnum.x2005_最大生命值); }
public void Reset() { m_SkillList.Clear(); m_ImpactList.Clear(); m_CurSkillInfo = null; m_BuffChanged = false; m_NextImpactSeq = 1; }
public void SetCurSkillInfo(int skillId) { SkillInfo skillInfo = m_SkillList.Find( delegate(SkillInfo info) { if (info == null) return false; return info.SkillId == skillId; } ); if (null != skillInfo) { skillInfo.Reset(); m_CurSkillInfo = skillInfo; } }
public void NotifyAiSelectSkill(EntityInfo entity, SkillInfo skill) { if (null != OnAiSelectSkill) OnAiSelectSkill(entity, skill); }
private void CombatHandler(EntityInfo npc, long deltaTime) { if (npc.GetSkillStateInfo().IsSkillActivated()) { return; } AiStateInfo info = npc.GetAiStateInfo(); Vector3 targetPos = info.HomePos; ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float distSqrToHome = Geometry.DistanceSquare(srcPos, info.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), true); 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) //视野范围内找到可攻击目标 { NotifyAiPursue(npc, attackTarget.GetMovementStateInfo().GetPosition3D()); // 追赶目标 return; } currSkInfo.SetCurSkillInfo(0); NotifyAiStopPursue(npc); ChangeToState(npc, (int)AiStateId.GoHome); }
public void AddSkill(SkillInfo info) { m_SkillList.Add(info); }
public void LoadData(TableConfig.Actor cfg) { m_ConfigData = cfg; SetLinkId(cfg.id); SetModel(cfg.avatar); EntityType = cfg.type; m_Radius = cfg.size; float maxAttackRange = 0; if (cfg.skill0 > 0) { SkillInfo info = new SkillInfo(cfg.skill0); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_NormalSkillId = cfg.skill0; m_AutoSkillIds.Add(cfg.skill0); } if (cfg.skill1 > 0) { SkillInfo info = new SkillInfo(cfg.skill1); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill1); } if (cfg.skill2 > 0) { SkillInfo info = new SkillInfo(cfg.skill2); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill2); } if (cfg.skill3 > 0) { SkillInfo info = new SkillInfo(cfg.skill3); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill3); } if (cfg.skill4 > 0) { SkillInfo info = new SkillInfo(cfg.skill4); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_ManualSkillId = cfg.skill4; //m_AutoSkillIds.Add(cfg.skill4); } if (cfg.skill5 > 0) { SkillInfo info = new SkillInfo(cfg.skill5); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill5); } if (cfg.skill6 > 0) { SkillInfo info = new SkillInfo(cfg.skill6); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill6); } if (cfg.skill7 > 0) { SkillInfo info = new SkillInfo(cfg.skill7); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill7); } if (cfg.skill8 > 0) { SkillInfo info = new SkillInfo(cfg.skill8); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill8); } if (cfg.bornskill > 0) { SkillInfo info = new SkillInfo(cfg.bornskill); GetSkillStateInfo().AddSkill(info); m_BornSkillId = cfg.bornskill; } if (cfg.deadskill > 0) { SkillInfo info = new SkillInfo(cfg.deadskill); GetSkillStateInfo().AddSkill(info); m_DeadSkillId = cfg.deadskill; } ViewRange = cfg.viewrange; GohomeRange = cfg.gohomerange; GetBaseProperty().SetRps(Operate_Type.OT_Absolute, 1); GetBaseProperty().SetAttackBase(Operate_Type.OT_Absolute, cfg.attack); GetBaseProperty().SetDefenceBase(Operate_Type.OT_Absolute, cfg.defence); GetBaseProperty().SetAttackRange(Operate_Type.OT_Absolute, maxAttackRange); GetBaseProperty().SetHpMax(Operate_Type.OT_Absolute, cfg.hp); GetBaseProperty().SetEnergyMax(Operate_Type.OT_Absolute, cfg.mp); GetBaseProperty().SetMoveSpeed(Operate_Type.OT_Absolute, cfg.speed); AttrCalculator.Calc(this); SetHp(Operate_Type.OT_Absolute, GetActualProperty().HpMax); SetEnergy(Operate_Type.OT_Absolute, GetActualProperty().EnergyMax); }
private void TickEntities() { m_DeletedEntities.Clear(); for (LinkedListNode <EntityInfo> linkNode = m_EntityMgr.Entities.FirstValue; null != linkNode; linkNode = linkNode.Next) { EntityInfo info = linkNode.Value; info.RetireAttackerInfos(60000); if (info.LevelChanged || info.GetSkillStateInfo().BuffChanged) { AttrCalculator.Calc(info); info.LevelChanged = false; info.GetSkillStateInfo().BuffChanged = false; } if (info.IsBorning) { if (info.BornTime <= 0) { SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.BornSkillId); if (info.BornSkillId > 0 && null != skillInfo) { info.BornTime = TimeUtility.GetLocalMilliseconds(); } else { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.RemoveState(CharacterPropertyEnum.x3009_无敌); } } else if (info.BornTime + info.BornTimeout < TimeUtility.GetLocalMilliseconds()) { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.RemoveState(CharacterPropertyEnum.x3009_无敌); } } if (info.IsDead() && !info.NeedDelete) { if (info.DeadTime <= 0) { CalcKillIncome(info); //发送npc死亡消息 Msg_RC_NpcDead npcDeadBuilder = new Msg_RC_NpcDead(); npcDeadBuilder.npc_id = info.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_NpcDead, npcDeadBuilder); SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.DeadSkillId); if (info.DeadSkillId > 0 && null != skillInfo) { info.DeadTime = TimeUtility.GetLocalMilliseconds(); OnEntityKilled(info); } else { if (null == info.CustomData as User) { info.DeadTime = 0; info.NeedDelete = true; OnEntityKilled(info); } else { info.DeadTime = TimeUtility.GetLocalMilliseconds(); } } } else { if (null == info.CustomData as User && info.DeadTime + info.DeadTimeout < TimeUtility.GetLocalMilliseconds()) { info.DeadTime = 0; info.NeedDelete = true; //重新发送npc死亡消息 Msg_RC_NpcDead npcDeadBuilder = new Msg_RC_NpcDead(); npcDeadBuilder.npc_id = info.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_NpcDead, npcDeadBuilder); } else if (null != info.CustomData as User && info.DeadTime + info.ReliveTimeout < TimeUtility.GetLocalMilliseconds()) { info.DeadTime = 0; info.Hp = info.HpMax; info.Energy = info.EnergyMax; Msg_RC_SyncProperty npcProp = DataSyncUtility.BuildSyncPropertyMessage(info); NotifyAllUser(RoomMessageDefine.Msg_RC_SyncProperty, npcProp); } } } if (info.NeedDelete) { m_DeletedEntities.Add(info); } } if (m_DeletedEntities.Count > 0) { int enemyCt = 0; int friendCt = 0; Msg_RC_DestroyNpc destroyNpcBuilder = new Msg_RC_DestroyNpc(); for (int i = 0; i < m_DeletedEntities.Count; ++i) { EntityInfo ni = m_DeletedEntities[i]; if (CharacterRelation.RELATION_ENEMY == EntityInfo.GetRelation((int)CampIdEnum.Blue, ni.GetCampId())) { ++enemyCt; } else if (CharacterRelation.RELATION_FRIEND == EntityInfo.GetRelation((int)CampIdEnum.Blue, ni.GetCampId())) { ++friendCt; } //发送npc消失消息 destroyNpcBuilder.npc_id = ni.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_DestroyNpc, destroyNpcBuilder); DestroyEntity(ni); } TryAllKilledOrAllDied(enemyCt > 0, friendCt > 0); } m_EntityMgr.ExecuteDelayAdd(); }
public ImpactInfo SendImpact(TableConfig.Skill cfg, int seq, int curObjId, int srcObjId, int targetId, int impactId, bool isFinal, Dictionary <string, object> args) { EntityViewModel view = GetEntityViewById(targetId); if (null != view && null != view.Entity && null != view.Actor && !view.Entity.IsDeadSkillCasting()) { EntityInfo npc = view.Entity; if (null != cfg) { UnityEngine.Quaternion hitEffectRotation = UnityEngine.Quaternion.identity; UnityEngine.GameObject srcObj = GetGameObject(srcObjId); UnityEngine.GameObject targetObj = view.Actor; if (null != srcObj && null != targetObj) { hitEffectRotation = srcObj.transform.localRotation; } var addArgs = new Dictionary <string, object> { { "hitEffectRotation", hitEffectRotation } }; ImpactInfo impactInfo = null; if (impactId <= 0 || impactId >= SkillInstance.c_FirstInnerHitSkillId) { impactInfo = new ImpactInfo(PredefinedSkill.Instance.HitSkillCfg); impactId = PredefinedSkill.c_HitSkillId; } else { impactInfo = new ImpactInfo(impactId); } if (null != impactInfo.ConfigData) { if (TryInitImpactInfo(impactInfo, cfg, seq, curObjId, srcObjId, args)) { if (impactInfo.ConfigData.type == (int)SkillOrImpactType.Buff) { ImpactInfo oldImpactInfo = npc.GetSkillStateInfo().FindImpactInfoById(impactInfo.ImpactId); if (null != oldImpactInfo) { oldImpactInfo.DurationTime += impactInfo.DurationTime; return(oldImpactInfo); } } impactInfo.DamageData.IsFinal = isFinal; npc.GetSkillStateInfo().AddImpact(impactInfo); SkillInfo skillInfo = npc.GetSkillStateInfo().GetCurSkillInfo(); if (null != skillInfo && cfg.skillData.isInterrupt) { GfxSkillSystem.Instance.StopSkill(targetId, skillInfo.SkillId, 0, true); } GfxSkillSystem.Instance.StartSkill(targetId, impactInfo.ConfigData, impactInfo.Seq, args, addArgs); return(impactInfo); } } else { LogSystem.Error("impact {0} config can't found !", impactInfo.ImpactId); } } } return(null); }
private void OnAiSelectSkill(EntityInfo npc, SkillInfo skill) { if (skill == null) npc.GetSkillStateInfo().SetCurSkillInfo(0); else npc.GetSkillStateInfo().SetCurSkillInfo(skill.SkillId); }
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); }