示例#1
0
        public static List <string> SwitchTo(this CtorNpcAttri flags)
        {
            List <string> switchData = new List <string>();
            bool          found      = flags.check(CtorNpcAttri.MaxAndCur_Hp);

            if (found)
            {
                switchData.Add("totalConstHp");
                switchData.Add("curHp");
            }

            found = flags.check(CtorNpcAttri.PhysicalAndMagical);
            if (found)
            {
                switchData.Add("attackpower");
                switchData.Add("spellpower");
            }

            found = flags.check(CtorNpcAttri.Physical_Resistant);
            if (found)
            {
                switchData.Add("armorclass");
            }

            found = flags.check(CtorNpcAttri.Magical_Resistant);
            if (found)
            {
                switchData.Add("spellresistance");
            }

            return(switchData);
        }
示例#2
0
 public static bool check(this CtorNpcAttri flags, CtorNpcAttri totest)
 {
     return((flags & totest) == totest);
 }
示例#3
0
 public static CtorNpcAttri set(this CtorNpcAttri flags, CtorNpcAttri totest)
 {
     return(flags | totest);
 }
示例#4
0
        /// <summary>
        /// 释放技能效果
        /// </summary>
        /// <param name="src">效果发起者</param>
        /// <param name="skTarget">技能选择的目标, 无意义</param>
        /// <param name="target">技能先选择目标后,再次Effect选择后的目标</param>
        /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param>
        /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param>
        public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container)
        {
                        #if DEBUG
            Utils.Assert(skCfg == null, "Skill Configure is null in BulletNpcEffect routine.");
                        #endif

            WarSrcAnimParam SrcParam = new WarSrcAnimParam()
            {
                OP             = EffectOp.CtorNPC,
                ShootAction    = skCfg.ShootAction,
                ShootTime      = skCfg.ShootTime,
                ShootEventTime = skCfg.ShootEventTime,
            };

            int   CtorNpcId = cfg.Param1;
            float LifeTime  = cfg.Param2 * Consts.OneThousand;

            CtorNpcPos pos = (CtorNpcPos)Enum.ToObject(typeof(CtorNpcPos), cfg.Param3);

            //碰撞
            bool Collide = cfg.Param4 == 1;
            int  AI_ID   = cfg.Param5;

            int param_1 = cfg.Param8;
            int param_2 = cfg.Param10;

            //会有的Buff
            int[] BuffIDList = cfg.Param11;

            //数据源
            CtorNpcSource datasrc = (CtorNpcSource)Enum.ToObject(typeof(CtorNpcSource), cfg.Param6);

            //数据源的修正
            CtorNpcAttri attr_1 = (CtorNpcAttri)Enum.ToObject(typeof(CtorNpcAttri), cfg.Param7);
            CtorNpcAttri attr_2 = (CtorNpcAttri)Enum.ToObject(typeof(CtorNpcAttri), cfg.Param9);

            ///
            /// 获取数据源
            ///
            NPCData        data = new NPCData();
            NPCConfigData  cfgD = null;
            NPCRuntimeData rtD  = null;

            if (datasrc == CtorNpcSource.NPC_Table)
            {
                NPCModel model = Core.Data.getIModelConfig <NPCModel>();
                cfgD = model.get(CtorNpcId);
                Utils.Assert(cfgD == null, "Can't find NPC configure. NPC ID = " + CtorNpcId);
            }
            else if (datasrc == CtorNpcSource.NPC_Castro_Cur)
            {
                cfgD = src.data.configData;
                rtD  = src.data.rtData.ShallowCopy();
            }
            else if (datasrc == CtorNpcSource.NPC_Castor_Init)
            {
                cfgD = src.data.configData;
            }

            rtD = rtD ?? new NPCRuntimeData(cfgD);

            List <String> changed_1 = attr_1.SwitchTo();
            List <String> changed_2 = attr_2.SwitchTo();

            int cnt = changed_1.Count;
            if (cnt > 0)
            {
                for (int i = 0; i < cnt; ++i)
                {
                    rtD.setValue(changed_1[i], (Int32Fog)param_1);
                }
            }

            cnt = changed_2.Count;
            if (cnt > 0)
            {
                for (int i = 0; i < cnt; ++i)
                {
                    rtD.setValue(changed_2[i], (Int32Fog)param_2);
                }
            }

            data.configData = cfgD;
            data.rtData     = rtD;

            ///
            /// 获取目标位置
            ///
            List <UVec3> TargetVec3 = new List <UVec3>();
            if (pos == CtorNpcPos.Castor_Forward)
            {
                TargetVec3.Add(src.transform.forward);
            }
            else if (pos == CtorNpcPos.Target)
            {
                foreach (ServerNPC t in target)
                {
                    TargetVec3.Add(t.transform.position);
                }
            }
            else if (pos == CtorNpcPos.Castor_Surround)
            {
                TargetVec3.Add(src.transform.position);
            }


            ///
            /// ------ 获取统计信息 ------
            ///
            SelfDescribed des = new SelfDescribed()
            {
                src    = src.UniqueID,
                target = src.UniqueID,
                act    = Verb.Creature,
                srcEnd = new EndResult {
                    param1 = CtorNpcId,
                    param2 = AI_ID,
                    param8 = LifeTime,
                },
                targetEnd = null,
            };

            des.srcEnd.obj     = ctorToShowcase(Collide, data, BuffIDList, TargetVec3, src);
            SrcParam.SkillId   = skCfg.ID;
            SrcParam.described = des;

            container.Add(SrcParam);
        }