Exemple #1
0
 public void CastSk(params Object[] args)
 {
     if (castor != null && param != null)
     {
         WarSrcAnimParam srcParam = param as WarSrcAnimParam;
         if (srcParam != null)
         {
             SelfDescribed sd = srcParam.described;
             if (sd != null)
             {
                 EndResult result = sd.targetEnd;
                 if (result != null)
                 {
                     WarServerManager mgr = WarServerManager.Instance;
                     int       target     = result.param3;
                     ServerNPC npc        = mgr.npcMgr.GetNPCByUniqueID(target);
                     if (npc != null)
                     {
                         Vector3 dir = npc.transform.position;
                         dir.y = castor.transform.position.y;
                         dir   = dir - castor.transform.position;
                         Quaternion rot = Quaternion.LookRotation(dir, Vector3.up);
                         castor.transform.rotation = rot;
                         LeanTween.cancel(castor.gameObject);
                         LeanTween.move(castor.gameObject, npc.transform.position, 0.2f);
                         castor.SendNpcMoveMsg(true);
                     }
                 }
             }
         }
     }
 }
        /// <summary>
        /// 释放技能效果
        /// </summary>
        /// <param name="src">效果发起者</param>
        /// <param name="target">目标参数无效</param>
        /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param>
        /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param>
        /// <param name="skTarget">Sk target.</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.Bullet_NPC,
                ShootAction    = skCfg.ShootAction,
                ShootTime      = skCfg.ShootTime,
                ShootEventTime = skCfg.ShootEventTime,
            };
            ///
            /// 有延迟的伤害类技能,伤害的结算都推后
            ///
            SelfDescribed des = new SelfDescribed()
            {
                src       = src.UniqueID,
                target    = src.UniqueID,
                act       = Verb.Creature,
                srcEnd    = null,
                targetEnd = new EndResult()
                {
                    param1 = src.UniqueID,
                    param2 = cfg.ID,
                    param3 = cfg.Param1,
                }
            };

            SrcParam.described = des;
            container.Add(SrcParam);
        }
Exemple #3
0
 public void Init(ServerNPC parent, WarMsgParam param)
 {
     owner = parent;
     wmMgr = WarServerManager.Instance;
     tran  = transform;
     if (param is WarSrcAnimParam)
     {
         WarSrcAnimParam wp = param as WarSrcAnimParam;
         sphereParam = wp;
         WarTarAnimParam[] tars = wp.InjureTar;
         speed  = wp.described.targetEnd.param8;
         maxDis = wp.described.targetEnd.param9;
         if (tars != null && tars.Length > 0)
         {
             SelfDescribed sd = tars[0].described;
             npcId = sd.targetEnd.param5;
             if (wmMgr != null)
             {
                 target = wmMgr.npcMgr.GetNPCByUniqueID(npcId);
                 if (target != null && parent.outLog)
                 {
                     Debug.Log("Sphere target : " + target.name);
                 }
             }
         }
         else
         {
             target = null;
         }
     }
     inited = true;
 }
Exemple #4
0
        public virtual void Awake()
        {
            BuffList    = new List <int>();
            TriggerList = new List <int>();
            hatredList  = new Dictionary <int, Hatredd>();
            childNpc    = new List <ServerNPC>();

            animParam = new WarSrcAnimParam();
        }
        /// <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);
        }
        public override void Init(ServerNPC owner, WarMsgParam param)
        {
            parent = owner;
            ConsoleEx.DebugLog(parent.name);
            wmMgr    = WarServerManager.Instance;
            UniqueId = wmMgr.npcMgr.SignID(this);
            Camp     = Camp.set(owner.Camp);
            WarSrcAnimParam wp = param as WarSrcAnimParam;

            if (wp != null)
            {
                SelfDescribed sd     = wp.described;
                EndResult     result = sd.srcEnd;
                lifeTime = result.param8;
            }
            inited = true;
        }
Exemple #7
0
        public override void OnHandleMessage(MsgParam param)
        {
            base.OnHandleMessage(param);


            if (param is WarTarAnimParam)
            {
                WarTarAnimParam effParam = param as WarTarAnimParam;
                switch (effParam.OP)
                {
                case EffectOp.Injury:
                    BeInjured(effParam);
                    break;

                case EffectOp.Treat:
                    BeTreated(effParam);
                    break;

                case EffectOp.ExchangeNpcAttri:
                    break;
                }
            }
            else if (param is WarSrcAnimParam)
            {
                WarSrcAnimParam src = param as WarSrcAnimParam;
                if (src.OP == EffectOp.ExchangeNpcAttri)
                {
                    Debug.Log("换血了");
                }
            }
            else if (param is WarMsgParam)
            {
                WarMsgParam warParam = param as WarMsgParam;

                switch (warParam.cmdType)
                {
                case WarMsg_Type.Win:
                case WarMsg_Type.Lose:
                    BattleOver();
                    break;
                }
            }
        }
Exemple #8
0
 public void MoveStop(string MoveStopInfo)
 {
     AsyncTask.QueueOnMainThread(
         () => {
         WarServerManager mgr = WarServerManager.Instance;
         if (mgr != null)
         {
             NpcAnimInfo info      = JSON.Instance.ToObject <NpcAnimInfo>(MoveStopInfo);
             ServerLifeNpc npc     = monitor.CharactorPool.findActionNpc(info.ui);
             WarSrcAnimParam param = new WarSrcAnimParam();
             param.cmdType         = WarMsg_Type.Stand;
             param.param           = MoveStopInfo;
             mgr.npcMgr.SendMessageAsync(npc.UniqueID, npc.UniqueID, param);
         }
     }
         );
     processedMsg = new NetMQMessage();
     processedMsg.Append(WarMsgConsts.MoveStopRep);
 }
Exemple #9
0
        public void CastSk(params Object[] args)
        {
            if (castor != null && param != null)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                if (srcParam != null)
                {
                    SelfDescribed sd = srcParam.described;
                    if (sd != null)
                    {
                        EndResult result = sd.srcEnd;
//                        float x = result.param8;
//                        float z = result.param9;
                        Vector3 pos = Vector3.zero;
//                        castor.transform.position = pos;
//                        castor.SendNpcMoveMsg(true);
                        if (castor is ServerLifeNpc)
                        {
                            ServerLifeNpc sCastor = castor as ServerLifeNpc;
                            sCastor.HitAnimReset();
                        }
                        int clearFlag = result.param1;
                        if (clearFlag == 0)
                        {
                            ServerNPC npc = castor.getOneChildNpc(result.param2);
                            if (npc != null)
                            {
                                pos   = npc.transform.position;
                                pos.y = 0.1f;
                                castor.transform.position = pos;
                                castor.SendNpcMoveMsg(true);
                                castor.removeChild(npc);
                                WarServerManager mgr = WarServerManager.Instance;
                                IpcDestroyNpcMsg msg = new IpcDestroyNpcMsg();
                                msg.id = npc.UniqueID;
                                mgr.realServer.proxyCli.NpcDestroy(msg);
                                UnityEngine.GameObject.Destroy(npc.gameObject);
                            }
                        }
                    }
                }
            }
        }
Exemple #10
0
        /// <summary>
        /// 释放技能效果
        /// </summary>
        /// <param name="src">效果发起者</param>
        /// <param name="skTarget">技能选择的目标,本参数在这里无意义</param>
        /// <param name="target">技能先选择目标后,再次Effect选择后的目标。本参数数量 >= 0 </param></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 DotHotEffect.");
            Utils.Assert(skCfg == null, "skill configure is null in DotHotEffect.");
                        #endif

            foreach (ServerNPC bnpc in target)
            {
                WarTarAnimParam param = new WarTarAnimParam()
                {
                    OP        = EffectOp.DotHot,
                    HitAction = cfg.HitAction,
                };

                BuffMgr bufMgr = WarServerManager.Instance.bufMgr;

                BuffCtorParamEx ctor = new BuffCtorParamEx()
                {
                    fromNpcId = src.UniqueID,
                    toNpcId   = bnpc.UniqueID,
                    cfg       = base.cfg,
                };
                //创建BUff
                RtBufData maybe = bufMgr.createBuff(ctor);
                //statistics
                SelfDescribed des = statistics(maybe, src, bnpc);
                param.described = des;
                container.Add(param);
            }

            //通知给技能释放者的目标
            WarSrcAnimParam SrcParam = new WarSrcAnimParam()
            {
                OP             = EffectOp.DotHot,
                ShootAction    = skCfg.ShootAction,
                ShootTime      = skCfg.ShootTime,
                ShootEventTime = skCfg.ShootEventTime,
                described      = toSelf(src.UniqueID),
            };
            container.Add(SrcParam);
        }
Exemple #11
0
        /// <summary>
        /// 释放技能效果
        /// </summary>
        /// <param name="src">效果发起者</param>
        /// <param name="target">目标参数无效</param>
        /// <param name="skDirectHurt">是否是技能的直接伤害, 这个没有伤害</param>
        /// <param name="container">所有数据展现的容器,本次Effect施法的效果会依次加入</param>
        /// <param name="skTarget">Sk target.</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

            int finalTarget = 0;
            HookNpcDisappearType disappearType = (HookNpcDisappearType)Enum.ToObject(typeof(HookNpcDisappearType), cfg.Param2);
            if (disappearType == HookNpcDisappearType.DisWhenFinalTar)
            {
                Utils.Assert(target.Count() != 1, "HookNpcEffect is DisWhenFinalTar type, so only one target is allowed.");
                finalTarget = target.First().UniqueID;
            }

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

            SelfDescribed des = new SelfDescribed()
            {
                src       = src.UniqueID,
                target    = src.UniqueID,
                act       = Verb.Creature,
                srcEnd    = null,
                targetEnd = new EndResult()
                {
                    param1 = src.UniqueID,
                    param2 = cfg.ID,
                    param3 = finalTarget,
                }
            };

            SrcParam.described = des;
            container.Add(SrcParam);
        }
        /// <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
            //有且只有一个
            //Utils.Assert(target.Count() != 1, "HookNpcEffect is DisWhenFinalTar type, so only one target is allowed.");
            int targetId = 0;

            if (target != null && target.Count() > 0)
            {
                targetId = target.First().UniqueID;
            }

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

            SelfDescribed des = new SelfDescribed()
            {
                src       = src.UniqueID,
                target    = src.UniqueID,
                act       = Verb.Move,
                srcEnd    = null,
                targetEnd = new EndResult()
                {
                    param1 = cfg.ID,
                    param2 = src.UniqueID,
                    param3 = targetId,
                }
            };

            SrcParam.described = des;
            container.Add(SrcParam);
        }
        public virtual void Skill_Handle()
        {
            if (STATE == NpcAnimState.CastSkill)
            {
                animationTimer      -= Time.deltaTime;
                animationEventTimer -= Time.deltaTime;
                if (animationEventTimer <= 0f && canTriggerEvent)
                {
                    canTriggerEvent = false;

                    WarSrcAnimParam srcParam = skParam as WarSrcAnimParam;
                    int             index    = srcParam.arg1;
                    List <ISkImp>   ops      = null;
                    ISkImp          sk       = null;
                    if (!sk_Imps.TryGetValue(index, out ops))
                    {
                        ops = new List <ISkImp>();
                        sk_Imps.Add(index, ops);
                    }
                    sk = ops.Find(imp => imp.SkOp() == srcParam.OP);
                    if (sk == null)
                    {
                        sk = SkImpFactory.getSkImp(srcParam.OP);
                        ops.Add(sk);
                    }
                    sk.Reset();
                    sk.InitSk(cachedNpc, srcParam);
                    sk.CastSk();
                }
                if (animationTimer < 0f)
                {
                    isCastSkill = false;
                    canNextAnim = true;
                    cachedNpc.HitAnimReset();
                    cachedNpc.curStatus = cachedNpc.curStatus.clear(NpcStatus.InSkill);
                    On_Stand(null);
                }
            }
        }
Exemple #14
0
        /// <summary>
        /// Init the specified owner and param.
        /// </summary>
        /// <param name="owner">Owner.</param>
        /// <param name="param">Parameter.</param>
        public override void Init(ServerNPC owner, WarMsgParam param)
        {
            parent = owner;
            tran   = transform;
            wmMgr  = WarServerManager.Instance;
            Camp   = Camp.set(parent.Camp);

            WarSrcAnimParam srcParam = param as WarSrcAnimParam;

            if (srcParam != null)
            {
                SelfDescribed sd = srcParam.described;
                if (sd != null)
                {
                    EndResult result      = sd.targetEnd;
                    int       effectIndex = result.param2;
                    targetIndex = result.param5;
                    if (targetIndex > 0)
                    {
                        if (wmMgr != null)
                        {
                            target = wmMgr.npcMgr.GetNPCByUniqueID(targetIndex);
                        }
                    }
                    EffectConfigData effect = Core.Data.getIModelConfig <EffectModel>().get(effectIndex);
                    if (effect != null)
                    {
                        effectID      = effectIndex;
                        speed         = effect.Param3 / 1000f;
                        maxDis        = effect.Param4 / 1000;
                        damageType    = effect.Param8;
                        disappearType = effect.Param5;
                    }
//                    string msg = string.Format("[effect:{0} speed:{1} maxDis:{2} disappearType:{3} damageType:{4}]", effectID, speed, maxDis, disappearType, damageType);
//                    Debug.Log(msg);
                }
                inited = true;
            }
        }
Exemple #15
0
 public void CastSk(params Object[] args)
 {
     if (castor != null && param != null)
     {
         WarSrcAnimParam srcParam = param as WarSrcAnimParam;
         if (srcParam != null)
         {
             WarTarAnimParam[] targets = srcParam.InjureTar;
             if (targets != null && targets.Length > 0)
             {
                 WarServerManager mgr = WarServerManager.Instance;
                 for (int i = 0; i < targets.Length; i++)
                 {
                     if (targets[i] != null)
                     {
                         mgr.npcMgr.SendMessageAsync(castor.UniqueID, targets[i].described.target, targets[i]);
                     }
                 }
             }
         }
     }
 }
Exemple #16
0
        public void CastSk(params Object[] args)
        {
            if (castor != null && param != null)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                if (srcParam != null)
                {
                    SelfDescribed sd = srcParam.described;
                    if (sd != null)
                    {
                        EndResult result = sd.targetEnd;
                        if (result != null)
                        {
                            int modelId             = result.param3;
                            VirtualNpcLoader loader = Core.ResEng.getLoader <VirtualNpcLoader>();

                            Transform tran = castor.transform;
                            Vector3   pos  = tran.position + tran.rotation * Vector3.forward;
                            pos.y = 0.1f;

                            GameObject obj = loader.LoadBulletNpc(modelId, castor.Camp, pos, tran.rotation);
                            Physics.IgnoreCollision(castor.collider, obj.collider);

                            if (obj != null)
                            {
                                ServerBulletNpc npc = obj.GetComponent <ServerBulletNpc>();
                                {
                                    SendCrtBulletMsg(npc);
                                    castor.addChildNpc(npc);
                                    npc.Init(castor, param);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #17
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);
        }
Exemple #18
0
        //百分比交换
        void PercentExchange(List <AttrbuteConfig> used, NPCData self, NPCData tar, float Min, WarSrcAnimParam SrcParam, WarTarAnimParam TarParam)
        {
            int cnt = used.Count;

            if (cnt <= 0)
            {
                return;
            }

            for (int i = 0; i < cnt; ++i)
            {
                AttrbuteConfig att = used[i];

                NPCRuntimeData selfRt = self.rtData;
                NPCRuntimeData tarRt  = tar.rtData;

                NPCConfigData selfCfg = self.configData;
                NPCConfigData tarCfg  = tar.configData;

                float selfCfgVal = selfCfg.getValue <float>(att.note);
                float tarCfgVal  = tarCfg.getValue <float>(att.note);

                float selfRtVal = selfRt.getFloatValue(att.note);
                float tarRtVal  = tarRt.getFloatValue(att.note);
                //自己的值
                float self_att1_per = selfRtVal / selfCfgVal;
                //敌人的值
                float tar_att1_per = tarRtVal / tarCfgVal;
                //敌人值的下限
                float tar_att1_per_min = Min;


                float tarVal = 0f;
                //如果传递过去的百分比大于下限,则将自己的值和敌人直接替换
                if (self_att1_per > tar_att1_per_min)
                {
                    tarVal = tarCfgVal * self_att1_per;
                }
                else
                {
                    tarVal = tarCfgVal * tar_att1_per_min;
                }

                if (att.type == "float")
                {
                    tarRt.setValue(att.note, tarVal);
                }
                else
                {
                    tarRt.setValue(att.note, (int)tarVal);
                }

                float selfVal = selfCfgVal * tar_att1_per;
                if (att.type == "float")
                {
                    selfRt.setValue(att.note, selfVal);
                }
                else
                {
                    selfRt.setValue(att.note, (int)selfVal);
                }

                ///
                /// 血量的信息需要特别的传递给UI
                ///
                if (att.note == "curHp")
                {
                    SrcParam.described.srcEnd = new EndResult()
                    {
                        param1 = (int)(selfVal - selfRtVal),
                        param2 = TarParam.described.target,
                    };

                    TarParam.described.targetEnd = new EndResult()
                    {
                        param1 = (int)(tarVal - tarRtVal),
                        param2 = TarParam.described.target,
                    };
                }
            }
        }
Exemple #19
0
        public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container)
        {
                        #if DEBUG
            Utils.Assert(cfg == null, "Effect Configure Data is null in ExchangeNpcAttrEffect.");
                        #endif

            bool any = target.Any();
            if (any)
            {
                NPCAttributeModel model = Core.Data.getIModelConfig <NPCAttributeModel>();
                AttrbuteConfig    att1  = model.get(cfg.Param1);
                AttrbuteConfig    att2  = model.get(cfg.Param2);
                AttrbuteConfig    att3  = model.get(cfg.Param3);

                List <AttrbuteConfig> used = new List <AttrbuteConfig>();
                if (att1 != null)
                {
                    used.Add(att1);
                }
                if (att2 != null)
                {
                    used.Add(att2);
                }
                if (att3 != null)
                {
                    used.Add(att3);
                }

                //是否为固定值还是比例值
                bool Fixture = cfg.Param6 == 0;
                //设置可改变下限-- 只有当cfg.Param6 = 1时才有意义
                float factor = cfg.Param5 * Consts.OneThousand;
                //设置可改变下限-- 只有当cfg.Param6 = 0时才有意义
                int Min = cfg.Param5;

                //运行时的数据,
                ServerNPC tar = target.FirstOrDefault();

                if (tar != null)
                {
                    //统计信息
                    WarSrcAnimParam SrcParam = new WarSrcAnimParam()
                    {
                        OP        = EffectOp.ExchangeNpcAttri,
                        OringinOP = EffectOp.ExchangeNpcAttri,
                        SkillId   = skCfg.ID,
                        described = new SelfDescribed()
                        {
                            src    = src.UniqueID,
                            target = src.UniqueID,
                        },
                        ShootAction    = skCfg.ShootAction,
                        ShootTime      = skCfg.ShootTime,
                        ShootEventTime = skCfg.ShootEventTime,
                    };

                    WarTarAnimParam TarParam = new WarTarAnimParam()
                    {
                        OP        = EffectOp.ExchangeNpcAttri,
                        OringinOP = EffectOp.ExchangeNpcAttri,
                        SkillId   = skCfg.ID,
                        described = new SelfDescribed()
                        {
                            src    = src.UniqueID,
                            target = tar.UniqueID,
                        },
                        HitAction = cfg.HitAction,
                    };


                    if (Fixture)
                    {
                        FixtureExchange(used, src.data.rtData, tar.data.rtData, Min, SrcParam, TarParam);
                    }
                    else
                    {
                        PercentExchange(used, src.data, tar.data, factor, SrcParam, TarParam);
                    }


                    container.Add(SrcParam);
                    container.Add(TarParam);
                }
            }
        }
        public virtual void On_Attack(WarMsgParam param)
        {
            if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                atkParam = srcParam;
//                Debug.Log(JSON.Instance.ToJSON(atkParam), gameObject);
                if (srcParam != null)
                {
                    int index = cachedNpc.AttIndex;
                    STATE = NpcAnimState.Attack;
                    Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction);
                    if (ecd != null)
                    {
                        isAttack            = true;
                        canNextAnim         = false;
                        canTriggerEvent     = true;
                        animationTimer      = srcParam.ShootTime;
                        animationEventTimer = srcParam.ShootEventTime;
                        attackWaitForNext   = 0.3f;
                        attackIndex         = index;
                        SetHandler          = AttackHandle;

                        WarTarAnimParam[] targets = atkParam.InjureTar;
                        BNPC npc = null;
                        if (targets != null && targets.Length > 0)
                        {
                            npc = serMgr.npcMgr.GetNPCByUniqueID(targets[0].described.target);
                            if (npc != null)
                            {
                                lastTarget = "Target:" + targets[0].described.target;
                                Vector3 pos = npc.transform.position;
                                pos.y = cachedTran.position.y;
                                cachedTran.LookAt(pos);
                            }
                        }

                        AnimationMsg msg = new AnimationMsg();
                        msg.animationTimer      = animationTimer;
                        msg.animationEventTimer = animationEventTimer;
                        msg.index         = index;
                        msg.ecd           = ecd;
                        msg.animationName = ecd.Anim;
                        msg.targetId      = (npc == null) ? 0 : npc.UniqueID;
                        msg.arg1          = srcParam.described.targetEnd.param8;
                        msg.arg2          = srcParam.described.targetEnd.param9;

                        string a_data = JSON.Instance.ToJSON(msg);

                        NpcAnimInfo info = new NpcAnimInfo()
                        {
                            ClientID  = DeviceInfo.GUID,
                            nextState = NpcAnimState.Attack,
                            data      = a_data,
                        };

                        animMsg.nextAnim = WarMsg_Type.Attack.ToString();
                        animMsg.uniqueId = cachedNpc.UniqueID;
                        animMsg.data     = JSON.Instance.ToJSON(info);

                        if (serMgr != null)
                        {
                            serMgr.realServer.proxyCli.NPCAnim(animMsg);
                        }
                    }
                    else
                    {
                        On_Stand(null);
                    }
                }
            }
        }
        public virtual void On_CastSkill(WarMsgParam param)
        {
            if (STATE != NpcAnimState.Killed && !isCastSkill)
            {
//                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
//                int index = param.arg1;
//                List<ISkImp> ops = null;
//                ISkImp sk = null;
//                if (!sk_Imps.TryGetValue(index, out ops))
//                {
//                    ops = new List<ISkImp>();
//                    sk_Imps.Add(index, ops);
//                }
//                sk = ops.Find(imp => imp.SkOp() == srcParam.OP);
//                if (sk == null)
//                {
//                    sk = SkImpFactory.getSkImp(srcParam.OP);
//                    ops.Add(sk);
//                }
//                sk.Reset();
//                sk.InitSk(cachedNpc, param);
//                sk.CastSk();
            }
            if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                Debug.Log(JSON.Instance.ToJSON(param));
                skParam = srcParam;
                if (srcParam != null)
                {
                    STATE = NpcAnimState.CastSkill;
                    Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction);
                    if (ecd != null)
                    {
                        isCastSkill         = true;
                        canNextAnim         = false;
                        canTriggerEvent     = true;
                        animationTimer      = srcParam.ShootTime;
                        animationEventTimer = srcParam.ShootEventTime;
                        SetHandler          = Skill_Handle;

                        AnimationMsg msg = new AnimationMsg();
                        msg.animationTimer      = animationTimer;
                        msg.animationEventTimer = animationEventTimer;
                        msg.index         = param.arg1;
                        msg.ecd           = ecd;
                        msg.animationName = ecd.Anim;
                        msg.targetId      = 0;

                        if (srcParam.described != null && srcParam.OP == EffectOp.CtorNPC)
                        {
                            EndResult          result = srcParam.described.srcEnd;
                            CreatNpcDepandency cnd    = (CreatNpcDepandency)result.obj;
                            msg.objCrtV = cnd.TargetVector3;
                        }

                        WarTarAnimParam[] targets = skParam.InjureTar;
                        BNPC npc = null;
                        if (targets != null && targets.Length > 0)
                        {
                            msg.targetId = targets[0].described.target;
                            npc          = serMgr.npcMgr.GetNPCByUniqueID(targets[0].described.target);
                            if (npc != null)
                            {
                                lastTarget = "Target:" + targets[0].described.target;
                                Vector3 pos = npc.transform.position;
                                pos.y = cachedTran.position.y;
                                cachedTran.LookAt(pos);
                            }
                        }

                        string a_data = JSON.Instance.ToJSON(msg);

                        NpcAnimInfo info = new NpcAnimInfo()
                        {
                            ClientID  = DeviceInfo.GUID,
                            nextState = NpcAnimState.CastSkill,
                            data      = a_data,
                        };

                        animMsg.nextAnim = WarMsg_Type.UseSkill.ToString();
                        animMsg.uniqueId = cachedNpc.UniqueID;
                        animMsg.data     = JSON.Instance.ToJSON(info);

                        if (serMgr != null)
                        {
                            serMgr.realServer.proxyCli.NPCAnim(animMsg);
                        }
                    }
                    else
                    {
                        On_Stand(null);
                    }
                }
            }
        }
Exemple #22
0
        /// <summary>
        /// Buff结束时,处理的逻辑
        /// </summary>
        public void EndCast(RtBufData rtbf)
        {
            ///
            /// --- 解除NPC的状态 ---
            ///

            ServerNPC     hang = BFSelector.getHangUp(rtbf);
            ServerLifeNpc life = hang as ServerLifeNpc;

            if (life != null)
            {
                NpcStatus status = (NpcStatus)Enum.ToObject(typeof(NpcStatus), rtbf.BuffCfg.Status);
                //去除不需要挂载的状态
                status = status.rmDiscrete();

                ///
                /// 如果还有同类型的,其他Buff则不应该清除Buff的状态
                ///
                if (status != NpcStatus.None)
                {
                    NpcStatus toCleared = WarServerManager.Instance.bufMgr.SiftOutStatus(status, rtbf.ID, rtbf.HangUpNpcID);
                    life.curStatus = life.curStatus.clear(toCleared);
                }

                ///
                /// 删除嘲讽的目标
                ///
                if (status.check(NpcStatus.Taunt))
                {
                    life.clearSpecHatred(rtbf.CastorNpcID);
                }
            }

            ///
            /// ---- 解除挂载的Trigger ----
            ///
            int NpcId = hang.UniqueID;

            WarServerManager.Instance.triMgr.RemoveTrigger(rtbf.TriggerID, NpcId);

            ///
            /// ---- 是否删除NPC (目前不适用) ----
            ///
            if (life != null)
            {
                SelfDescribed des = new SelfDescribed()
                {
                    src       = hang.UniqueID,
                    target    = hang.UniqueID,
                    act       = Verb.Punch,
                    srcEnd    = null,
                    targetEnd = new EndResult( )
                    {
                        param1 = life.data.rtData.totalHp * 10,
                        param2 = 0,
                        param3 = 2,
                    },
                };

                WarSrcAnimParam warParam = new WarSrcAnimParam()
                {
                    OP        = EffectOp.Injury,
                    described = des,
                };
            }

            ///
            /// ---- 释放技能 ---
            ///
            castBuff_Skill(rtbf, BuffPhase.End);
        }
        public virtual void On_CastTrigger(WarMsgParam param)
        {
            if (STATE != NpcAnimState.Killed)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                int             index    = param.arg1;
                List <ISkImp>   ops      = null;
                ISkImp          sk       = null;
                if (!sk_Imps.TryGetValue(index, out ops))
                {
                    ops = new List <ISkImp>();
                    sk_Imps.Add(index, ops);
                }
                sk = ops.Find(imp => imp.SkOp() == srcParam.OP);
                if (sk == null)
                {
                    sk = SkImpFactory.getSkImp(srcParam.OP);
                    ops.Add(sk);
                }
                sk.Reset();
                sk.InitSk(cachedNpc, param);
                sk.CastSk();
            }
            if (STATE != NpcAnimState.Killed && !isAttack && !isCastSkill)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                skParam = srcParam;
                if (srcParam != null)
                {
                    STATE = NpcAnimState.CastTrigger;
                    Effect3DModelConfigData ecd = Core.Data.getIModelConfig <Effect3DModel>().get(srcParam.ShootAction);
                    if (ecd != null)
                    {
                        isCastSkill         = true;
                        canNextAnim         = false;
                        canTriggerEvent     = true;
                        animationTimer      = srcParam.ShootTime;
                        animationEventTimer = 0.2f;
                        SetHandler          = Trigger_Handle;

                        AnimationMsg msg = new AnimationMsg();
                        msg.animationTimer      = animationTimer;
                        msg.animationEventTimer = animationEventTimer;
                        msg.ecd           = ecd;
                        msg.animationName = ecd.Anim;
                        msg.targetId      = 0;

                        string a_data = JSON.Instance.ToJSON(msg);

                        NpcAnimInfo info = new NpcAnimInfo()
                        {
                            ClientID  = DeviceInfo.GUID,
                            nextState = NpcAnimState.CastBuff,
                            data      = a_data,
                        };

                        animMsg.nextAnim = WarMsg_Type.UseTrigger.ToString();
                        animMsg.uniqueId = cachedNpc.UniqueID;
                        animMsg.data     = JSON.Instance.ToJSON(info);

                        if (serMgr != null)
                        {
                            serMgr.realServer.proxyCli.NPCAnim(animMsg);
                        }
                    }
                    else
                    {
                        On_Stand(null);
                    }
                }
            }
        }
Exemple #24
0
        public void CastSk(params Object[] args)
        {
            if (castor != null && param != null)
            {
                WarSrcAnimParam srcParam = param as WarSrcAnimParam;
                if (srcParam != null)
                {
                    SelfDescribed sd = srcParam.described;
                    if (sd != null)
                    {
                        EndResult          result = sd.srcEnd;
                        CreatNpcDepandency cnd    = (CreatNpcDepandency)result.obj;
                        if (cnd != null && cnd.TargetVector3 != null)
                        {
                            VirtualNpcLoader loader = Core.ResEng.getLoader <VirtualNpcLoader>();

                            GameObject obj = null;
                            Vector3    pos = Vector3.zero;
                            foreach (Vec3F v in cnd.TargetVector3)
                            {
                                pos = v.toUnityVec3();
                                int id = result.param1;
                                obj = loader.LoadNpcObj(id, castor.Camp, pos, Quaternion.LookRotation(Vector3.back));
                                if (obj != null)
                                {
                                    ServerNPC npc = obj.GetComponent <ServerNPC>();
                                    if (npc != null)
                                    {
                                        SendCrtNpcMsg(npc);
                                        castor.addChildNpc(npc);
                                        npc.data = cnd.Source;
                                        npc.Init(castor, srcParam);
                                        if (npc.collider != null)
                                        {
                                            npc.collider.enabled = cnd.IsCollide;
                                        }
                                        if (npc is LifeSummonNPC)
                                        {
                                            AttachAI(npc, result.param2);
                                        }
                                        if (cnd.Buff_IDs != null)
                                        {
                                            for (int i = 0; i < cnd.Buff_IDs.Length; i++)
                                            {
                                                BuffCtorParam bp = new BuffCtorParam();
                                                bp.bufNum    = cnd.Buff_IDs[i];
                                                bp.fromNpcId = castor.UniqueID;
                                                bp.toNpcId   = npc.UniqueID;
                                                bp.origin    = AW.Data.OriginOfBuff.Alone;
                                                bp.duration  = Consts.USE_BUFF_CONFIG_DURATION;
                                                bp.initLayer = 1;

                                                WarServerManager.Instance.bufMgr.createBuff(bp);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #25
0
        //固定比例交换
        void FixtureExchange(List <AttrbuteConfig> used, NPCRuntimeData selfRt, NPCRuntimeData tarRt, int Min, WarSrcAnimParam SrcParam, WarTarAnimParam TarParam)
        {
            int cnt = used.Count;

            if (cnt <= 0)
            {
                return;
            }

            for (int i = 0; i < cnt; ++i)
            {
                AttrbuteConfig att = used[i];
                //自己的值
                float self_att1_val = selfRt.getFloatValue(att.note);
                //敌人的值
                float tar_att1_val = tarRt.getFloatValue(att.note);
                //敌人值的下限
                float tar_att1_val_min = (float)Min;

                float final_tar_val = 0F;

                //如果传递过去的值大于下限,则将自己的值和敌人直接替换
                if (self_att1_val > tar_att1_val_min)
                {
                    final_tar_val = self_att1_val;
                }
                else
                {
                    //如果传递过去的值小于下限,则将敌人的值给自己,敌人的为最低下限
                    final_tar_val = tar_att1_val_min;
                }

                //敌人
                if (att.type == "float")
                {
                    tarRt.setValue(att.note, (FloatFog)final_tar_val);
                }
                else
                {
                    tarRt.setValue(att.note, (Int32Fog)final_tar_val);
                }

                //自己
                if (att.type == "float")
                {
                    selfRt.setValue(att.note, (FloatFog)tar_att1_val);
                }
                else
                {
                    selfRt.setValue(att.note, (Int32Fog)tar_att1_val);
                }

                ///
                /// 血量的信息需要特别的传递给UI
                ///
                if (att.note == "curHp")
                {
                    SrcParam.described.srcEnd = new EndResult()
                    {
                        param1 = (int)(tar_att1_val - self_att1_val),
                        param2 = TarParam.described.target,
                    };

                    TarParam.described.targetEnd = new EndResult()
                    {
                        param1 = (int)(final_tar_val - tar_att1_val),
                        param2 = TarParam.described.target,
                    };
                }
            }
        }
Exemple #26
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);
        }
Exemple #27
0
        public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container)
        {
                        #if DEBUG
            Utils.Assert(src == null, "Injury Effect can't find attacker.");
            Utils.Assert(skCfg == null, "Skill Configure is null in Injury Effect .");
                        #endif

            //发起者的信息
            WarSrcAnimParam SrcParam = new WarSrcAnimParam()
            {
                OP             = EffectOp.Injury,
                ShootAction    = skCfg.ShootAction,
                ShootTime      = skCfg.ShootTime,
                ShootEventTime = skCfg.ShootEventTime,
                //Debug信息
                SkillId = skCfg == null ? -1 : skCfg.ID,
            };

            SelfDescribed SrcDes = new SelfDescribed()
            {
                src       = src.UniqueID,
                target    = src.UniqueID,
                act       = Verb.Punch,
                srcEnd    = null,
                targetEnd = new EndResult()
                {
                    param1 = 0,
                    param2 = 0,
                    param3 = 0,
                    param4 = 0,
                    param8 = skCfg.MissileSpeed,
                    param9 = skCfg.Distance,
                },
            };

            SrcParam.described = SrcDes;

            List <ServerNPC> effTarget = target.ToList();
            int count = effTarget.Count;
            //如果没有目标的时候
            if (count == 0)
            {
                SrcParam.InjureTar = null;
                //新建一个目标为空的序列,主要告知skCfg.MissileSpeed 和 skCfg.Distance
                //该技能没有目标去命中
                container.Add(SrcParam);
                return;
            }
            //如果存在目标的时候
            InjuryOp cal = OpMgr.getImplement <InjuryOp>(EffectOp.Injury);

            List <ServerNPC> skillTarget = skTarget.ToList();

            ///
            /// ---- 获取主目标
            ///
            int MainTargetID = 0;
            int skcount      = skillTarget.Count;
            if (skcount > 0)
            {
                ServerNPC npc = skillTarget[0];
                MainTargetID = npc.UniqueID;
            }

            //count 必定 > 0
            //如果是技能直接的伤害
            if (skDirectHurt)
            {
                WarTarAnimParam[] TarList = new WarTarAnimParam[count];

                for (int i = 0; i < count; ++i)
                {
                    WarTarAnimParam TarParam = new WarTarAnimParam()
                    {
                        OP        = EffectOp.Injury,
                        HitAction = cfg.HitAction,
                        SkillId   = skCfg.ID,
                    };

                    ServerNPC     tar = effTarget[i];
                    Dmg           dmg = cal.toTargetDmg(src.data, tar.data, cfg);
                    SelfDescribed des = new SelfDescribed()
                    {
                        src       = src.UniqueID,
                        target    = tar.UniqueID,
                        act       = Verb.Punch,
                        srcEnd    = null,
                        targetEnd = new EndResult()
                        {
                            param1 = (int)dmg.dmgValue,
                            param2 = dmg.isCritical ? 1 : 0,
                            param3 = (int)dmg.dmgType,
                            param4 = (int)dmg.hitCls,
                            param5 = MainTargetID,
                            param8 = skCfg.MissileSpeed,
                            param9 = skCfg.Distance,
                        },
                    };
                    TarParam.described = des;

                    TarList[i] = TarParam;
                }

                SrcParam.InjureTar = TarList;
                container.Add(SrcParam);
            }
            else
            {
                container.Add(SrcParam);
                //如果不是技能的伤害,而是buff或者Trigger的伤害
                for (int i = 0; i < count; ++i)
                {
                    WarTarAnimParam TarParam = new WarTarAnimParam()
                    {
                        OP        = EffectOp.Injury,
                        HitAction = cfg.HitAction,
                        SkillId   = skCfg.ID,
                    };

                    ServerNPC     tar = effTarget[i];
                    Dmg           dmg = cal.toTargetDmg(src.data, tar.data, cfg);
                    SelfDescribed des = new SelfDescribed()
                    {
                        src       = src.UniqueID,
                        target    = tar.UniqueID,
                        act       = Verb.Punch,
                        srcEnd    = null,
                        targetEnd = new EndResult()
                        {
                            param1 = (int)dmg.dmgValue,
                            param2 = dmg.isCritical ? 1 : 0,
                            param3 = (int)dmg.dmgType,
                            param4 = (int)dmg.hitCls,
                            param5 = MainTargetID,
                            param8 = skCfg.MissileSpeed,
                            param9 = skCfg.Distance,
                        },
                    };

                    TarParam.described = des;

                    container.Add(TarParam);
                }
            }
        }