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);
        }
Exemple #17
0
        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();
        }
Exemple #25
0
        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);
        }