Esempio n. 1
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)
        {
            //获取本地的EffectAttribute
            var efType         = GetType();
            var classAttribute = (EffectAttribute)Attribute.GetCustomAttribute(efType, typeof(EffectAttribute));

            WarSrcAnimParam param = new WarSrcAnimParam();

            param.OP             = classAttribute.OP;
            param.ShootAction    = skCfg.ShootAction;
            param.ShootTime      = skCfg.ShootTime;
            param.ShootEventTime = skCfg.ShootEventTime;

            /// 将自己位移到符合<param1>条件的子物体位置,原有子物体是否存在由<param2>决定
            MvToChildCon   con   = (MvToChildCon)Enum.ToObject(typeof(MvToChildCon), cfg.Param1);
            MvToChildAlive alive = (MvToChildAlive)Enum.ToObject(typeof(MvToChildAlive), cfg.Param2);


            IEnumerable <ServerNPC> reTargets = select(src, ((ServerNPC)src).getChildNpc, con);

            if (reTargets.Any())
            {
                ServerNPC final = reTargets.First();
                if (final != null)
                {
                    UVec3 pos = final.transform.position;

                    SelfDescribed desc = new SelfDescribed()
                    {
                        src    = src.UniqueID,
                        target = src.UniqueID,
                        act    = Verb.Blink,
                        srcEnd = new EndResult()
                        {
                            param1  = (int)alive,
                            param2  = final.UniqueID,
                            param8  = pos.x,
                            param9  = pos.y,
                            param10 = pos.z,
                        },
                        targetEnd = null,
                    };

                    param.described = desc;
                }
            }

            container.Add(param);
        }
Esempio n. 2
0
        /// <summary>
        /// 根据Param1来选择目标
        /// </summary>
        /// <param name="castor">Castor.</param>
        /// <param name="targets">Targets.</param>
        IEnumerable <ServerNPC> select(ServerNPC castor, IEnumerable <ServerNPC> targets, MvToChildCon condition)
        {
            List <ServerNPC>        chosen = new List <ServerNPC>();
            IEnumerable <ServerNPC> itor   = chosen.AsEnumerable <ServerNPC>();

            switch (condition)
            {
            case MvToChildCon.None:
                itor = targets;
                break;

            case MvToChildCon.Farest:
                UVec3     pp     = castor.transform.position;
                ServerNPC farest = targets.OrderBy(n => UVec3.SqrMagnitude(n.transform.position - pp)).LastOrDefault();
                if (farest != null)
                {
                    chosen.Add(farest);
                }
                break;

            case MvToChildCon.Nearest:
                UVec3     p       = castor.transform.position;
                ServerNPC nearest = targets.OrderBy(n => UVec3.SqrMagnitude(n.transform.position - p)).FirstOrDefault();
                if (nearest != null)
                {
                    chosen.Add(nearest);
                }
                break;

            case MvToChildCon.HpHighest:
                ServerNPC highest = targets.OrderByDescending(n => n.data.rtData.CurHpNested).FirstOrDefault();
                if (highest != null)
                {
                    chosen.Add(highest);
                }
                break;

            case MvToChildCon.HpLowest:
                ServerNPC lowest = targets.OrderBy(n => n.data.rtData.CurHpNested).FirstOrDefault();
                if (lowest != null)
                {
                    chosen.Add(lowest);
                }
                break;
            }

            return(itor);
        }
Esempio n. 3
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(cfg == null, "Effect Configure is null in SwitchNpcEffect.");
                        #endif

            int       SwitchToId = cfg.Param1;
            UVec3     Locale     = src.transform.position;
            NPCAIType AI         = (NPCAIType)Enum.ToObject(typeof(NPCAIType), cfg.Param2);

            //数据源
            CtorNpcSource datasrc  = (CtorNpcSource)Enum.ToObject(typeof(CtorNpcSource), cfg.Param3);
            int           chargeOf = cfg.Param4;
            float         duration = cfg.Param5 * Consts.OneThousand;

            //参数10,是否继承普通攻击
            bool inheritNorAtk = cfg.Param10 == 0;

            NPCConfigData  npcCfg = null;
            NPCRuntimeData npcRt  = null;

            //获取参数配置
            NPCModel model = Core.Data.getIModelConfig <NPCModel>();
            switch (datasrc)
            {
            case CtorNpcSource.NPC_Castor_Init:
                npcCfg = src.data.configData.ShallowCopy();
                break;

            case CtorNpcSource.NPC_Castro_Cur:
                npcCfg = src.data.configData.ShallowCopy();
                npcRt  = src.data.rtData.ShallowCopy();
                break;

            case CtorNpcSource.NPC_Table:
                npcCfg = model.get(SwitchToId);
                Utils.Assert(npcCfg == null, "Can't find NPC configure. NPC ID = " + SwitchToId);
                break;
            }

            if (inheritNorAtk == false)
            {
                NPCConfigData swtNpcCfg = model.get(SwitchToId);
                Utils.Assert(swtNpcCfg == null, "Can't find NPC configure. NPC ID = " + SwitchToId);
                npcCfg.ID        = SwitchToId;
                npcCfg.normalHit = swtNpcCfg.normalHit;
            }

            npcRt = npcRt ?? new NPCRuntimeData(npcCfg);

            //额外的属性修改
            NPCAttributeModel AttModel = Core.Data.getIModelConfig <NPCAttributeModel>();
            AttrbuteConfig    att1     = AttModel.get(cfg.Param6);
            AttrbuteConfig    att2     = AttModel.get(cfg.Param8);

            //参数
            float param1 = cfg.Param7 * Consts.OneThousand;
            float param2 = cfg.Param9 * Consts.OneThousand;

            //修正属性的值
            if (att1 != null)
            {
                if (att1.type == "int")
                {
                    npcRt.addIntegerValue(att1.note, param1);
                }
                else if (att1.type == "float")
                {
                    npcRt.addFloatValue(att1.note, param1);
                }
            }

            if (att2 != null)
            {
                if (att2.type == "int")
                {
                    npcRt.addIntegerValue(att2.note, param2);
                }
                else if (att2.type == "float")
                {
                    npcRt.addFloatValue(att2.note, param2);
                }
            }

            //Buff的列表
            int[] BuffIds = cfg.Param11;

            ///
            /// 统计信息
            ///
            WarSrcAnimParam SrcParam = new WarSrcAnimParam()
            {
                OP             = EffectOp.SwitchNpc,
                ShootAction    = skCfg.ShootAction,
                ShootEventTime = skCfg.ShootEventTime,
                ShootTime      = skCfg.ShootTime,
                described      = new SelfDescribed()
                {
                    src    = src.UniqueID,
                    target = src.UniqueID,
                    act    = Verb.Creature,
                    srcEnd = new EndResult {
                        param1 = SwitchToId,
                        param2 = (int)AI,
                        param3 = chargeOf,
                        param8 = duration,
                    },
                    targetEnd = null,
                },

                SkillId   = skCfg.ID,
                OringinOP = EffectOp.SwitchNpc,
            };

            SrcParam.described.srcEnd.obj = ctorToShowcase(npcRt, npcCfg, BuffIds, Locale);

            container.Add(SrcParam);
        }
Esempio n. 4
0
        CreatNpcDepandency ctorToShowcase(NPCRuntimeData rt, NPCConfigData cfg, int[] BuffIDList, UVec3 TargetVec3)
        {
            NPCData data = new NPCData()
            {
                configData = cfg,
                rtData     = rt,
            };

            //有碰撞
            bool Collide = true;
            CreatNpcDepandency depandency = new CreatNpcDepandency()
            {
                IsCollide     = Collide,
                Source        = data,
                Buff_IDs      = BuffIDList,
                TargetVector3 = new List <Vec3F>(),
            };

            depandency.TargetVector3.Add(TargetVec3.toCustomVec3());

            return(depandency);
        }
Esempio n. 5
0
 public bool Equals(UVec3 other)
 {
     return(X == other.X && Y == other.Y && Z == other.Z);
 }