Example #1
0
        // Update is called once per frame
        public void Update()
        {
            if (inited)
            {
                lifeTime -= Time.deltaTime;
                if (lifeTime < 0f)
                {
                    inited = false;
                    WarTarAnimParam deadParam = new WarTarAnimParam();
                    deadParam.OP = EffectOp.Injury;

                    SelfDescribed des = new SelfDescribed()
                    {
                        src       = UniqueID,
                        target    = UniqueID,
                        act       = Verb.Punch,
                        srcEnd    = null,
                        targetEnd = new EndResult()
                        {
                            param1 = 9999999,
                            param2 = 0,
                            param3 = 0,
                            param4 = 0,
                        },
                    };

                    deadParam.described = des;

                    deadParam.Sender   = UniqueID;
                    deadParam.Receiver = UniqueID;

                    wmMgr.npcMgr.SendMessage(UniqueID, UniqueID, deadParam);
                }
            }
        }
Example #2
0
        /// <summary>
        /// Raises the trigger enter event.
        /// </summary>
        /// <param name="col">Col.</param>
        void OnTriggerEnter(Collider col)
        {
            if (alreadyContacted.Contains(col.gameObject) || !inited)
            {
                return;
            }
            alreadyContacted.Add(col.gameObject);
            ServerNPC npc = col.GetComponent <ServerNPC>();

            if (npc != null)
            {
                WarTarAnimParam param = new WarTarAnimParam();
                param.arg1     = effectID;
                param.arg2     = parent.UniqueID;
                param.OP       = EffectOp.Bullet_NPC;
                param.cmdType  = WarMsg_Type.OnAttacked;
                param.Sender   = parent.UniqueID;
                param.Receiver = npc.UniqueID;
                wmMgr.npcMgr.SendMessageAsync(npc.UniqueID, npc.UniqueID, param);
                if (damageType == 1 || damageType == 2)
                {
                    if (target != null && npc.UniqueID == target.UniqueID && disappearType == 0)
                    {
                        inited = false;
                        DestroyMe();
                    }
                }
            }
        }
Example #3
0
        //更多的buff结束处理
        public void EndCastStep2(RtBufData rtBf)
        {
            container.Clear();
            ///
            /// 通知UI,去除Buff的UI显示
            ///
            int action = rtBf.BuffCfg.BuffAction;

            if (action > 0)
            {
                ///分析BuffAction的信息
                SelfDescribed des = new SelfDescribed()
                {
                    src       = rtBf.CastorNpcID,
                    target    = rtBf.HangUpNpcID,
                    act       = Verb.BuffEffect,
                    targetEnd = null,
                    srcEnd    = new EndResult()
                    {
                        param2 = action,
                        param3 = 1,
                    },
                };

                WarTarAnimParam warUI = new WarTarAnimParam()
                {
                    OP        = EffectOp.DotHot,
                    HitAction = action,
                    described = des,
                };
                container.Add(warUI);

                dispatchMsg(container, null);
            }
        }
Example #4
0
        public virtual void OnNewStateReceived(WarMsgParam param)
        {
            if (param is WarSrcAnimParam)
            {
                switch (param.cmdType)
                {
                case WarMsg_Type.ManualInput:
                    On_ManualInput(param);
                    break;

                case WarMsg_Type.Stand:
                    On_Stand(param);
                    break;

                case WarMsg_Type.Running:
                    On_Run(param);
                    break;

                case WarMsg_Type.Attack:
                    On_Attack(param);
                    break;

                case WarMsg_Type.UseSkill:
                    On_CastSkill(param);
                    break;

                case WarMsg_Type.UseBuff:
                    On_CastBuff(param);
                    break;

                case WarMsg_Type.UseTrigger:
                    On_CastTrigger(param);
                    break;

                case WarMsg_Type.BeKilled:
                    On_Killed(param);
                    break;

                case WarMsg_Type.Respawn:
                    On_Respawn(param);
                    break;

                case WarMsg_Type.Idle:
                    On_Idle(param);
                    break;

                case WarMsg_Type.Destroy:
                    On_Destroy(param);
                    break;
                }
            }
            else if (param is WarTarAnimParam)
            {
                WarTarAnimParam tarParam = param as WarTarAnimParam;
                OnNewUIStateReceived(tarParam);
            }
        }
Example #5
0
        //收到伤害
        protected void BeInjured(WarTarAnimParam param)
        {
            if (param == null)
            {
                ConsoleEx.DebugWarning("BeInjured :: BeInjured :: param is null");
                return;
            }


            if (param.described != null)
            {
                SufferInjureEffect sufInjury = warServerMgr.sufMgr.getImplement <SufferInjureEffect>(EffectOp.Injury);
                SelfDescribed      des       = param.described;

                //记录攻击自己的人的ID
                data.btData.atkerID = des.src;

                if (des.target == UniqueId && IsAlive)
                {
                    ServerNPC caster = npcMgr.GetNPCByUniqueID(des.src);
                    sufInjury.Suffer(caster, this, des, npcMgr);
                    Dmg oneDmg = sufInjury.getHandled;

                    hpMsg.uniqueId = UniqueID;
                    hpMsg.deltaHp  = (int)oneDmg.dmgValue;
                    hpMsg.curHp    = data.rtData.curHp;
                    hpMsg.totalHp  = data.rtData.totalHp;
                    hpMsg.isDamage = true;
                    hpMsg.srcID    = des.src;
                    warServerMgr.realServer.proxyCli.NPChp(hpMsg);

//                    if (caster.UniqueID == npcMgr.ActiveHero.UniqueId)
//                    {
//                        if (OnHitByActiveHero != null)
//                        {
//                            Vector3 posIn2D = Vector3.zero;
//                            Vector3 posIn3D = transform.position;
//                            posIn3D.y += 3.5f;
//                            wmMgr.GetUIPos_Ref3DPos (posIn3D, ref posIn2D);
//                            OnHitByActiveHero ((int)oneDmg.dmgValue, true, oneDmg.isCritical, posIn2D);
//                        }
//                    }

                    //检查自己是否被杀
                    if (data.rtData.curHp <= 0)
                    {
                        BeKillded();
                    }
                }
            }
        }
Example #6
0
        //治疗消息
        protected void BeTreated(WarTarAnimParam param)
        {
            if (param == null)
            {
                ConsoleEx.DebugWarning("BeTreated :: BeTreated :: param is null");
                return;
            }

            if (param.described != null)
            {
                SufferTreatEffect treatInjury = warServerMgr.sufMgr.getImplement <SufferTreatEffect>(EffectOp.Treat);

                SelfDescribed des    = param.described;
                ServerNPC     caster = npcMgr.GetNPCByUniqueID(des.src);
                if (des.target == UniqueId)
                {
                    treatInjury.Suffer(caster, this, des, npcMgr);
                    Treat oneTreat = treatInjury.getHandled;

                    if (oneTreat.treatValue > 0)
                    {
                        hpMsg.uniqueId = UniqueID;
                        hpMsg.deltaHp  = (int)oneTreat.treatValue;
                        hpMsg.curHp    = data.rtData.curHp;
                        hpMsg.totalHp  = data.rtData.totalHp;
                        hpMsg.isDamage = false;
                        hpMsg.srcID    = des.src;
                        warServerMgr.realServer.proxyCli.NPChp(hpMsg);
                    }

//                    //回血UI
//                    caster = npcMgr.GetNPCByUniqueID (des.target);
//                    if (caster.UniqueID == warServerMgr.teamMgr.selfActiveHero.UniqueId && data.rtData.curHp < data.rtData.totalHp)
//                    {
//                        if (OnHitByActiveHero != null)
//                        {
//                            if (wmMgr != null)
//                            {
//                                Vector3 posIn2D = Vector3.zero;
//                                Vector3 posIn3D = transform.position;
//                                posIn3D.y += 3.5f;
//                                wmMgr.GetUIPos_Ref3DPos (posIn3D, ref posIn2D);
//                                OnHitByActiveHero ((int)oneTreat.treatValue, false, oneTreat.isCritical, posIn2D);
//                            }
//                        }
//                    }
                }
            }
        }
Example #7
0
        public void Cast(ServerNPC src, IEnumerable <ServerNPC> skTarget, IEnumerable <ServerNPC> target, bool skDirectHurt, List <MsgParam> container)
        {
                        #if DEBUG
            Utils.Assert(src == null, "Treat Effect can't find attacker.");
                        #endif

            Verb verb = Verb.Punch;
            if (cfg.Param1 > 0)
            {
                verb = (Verb)Enum.ToObject(typeof(Verb), cfg.Param1 + 0xA5);
            }
            if (cfg.Param2 > 0)
            {
                verb = (Verb)Enum.ToObject(typeof(Verb), cfg.Param2 + 0xC5);
            }

            List <ServerNPC> effTarget = target.ToList();
            int count = effTarget.Count;
            if (count > 0)
            {
                for (int i = 0; i < count; ++i)
                {
                    WarTarAnimParam param = new WarTarAnimParam();

                    ServerNPC tar = effTarget[i];

                    SelfDescribed des = new SelfDescribed()
                    {
                        src    = src.UniqueID,
                        target = tar.UniqueID,
                        act    = verb,
                        srcEnd = new EndResult()
                        {
                            param1 = cfg.Param4,
                            param2 = cfg.Param3,
                            param3 = cfg.Param1 > 0 ? 0 : 1,
                        },
                        targetEnd = null,
                    };

                    param.OP        = EffectOp.Trigger;
                    param.SkillId   = skCfg.ID;
                    param.described = des;

                    container.Add(param);
                }
            }
        }
Example #8
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;
                }
            }
        }
Example #9
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);
        }
Example #10
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)
        {
            InjuryOp cal = OpMgr.getImplement <InjuryOp>(EffectOp.Injury);

                        #if DEBUG
            Utils.Assert(src == null, "Treat Effect can't find attacker.");
                        #endif

            List <ServerNPC> effTarget = target.ToList();
            int count = effTarget.Count;
            if (count > 0)
            {
                for (int i = 0; i < count; ++i)
                {
                    WarTarAnimParam param = new WarTarAnimParam();

                    ServerNPC     tar = effTarget[i];
                    Treat         dmg = cal.toTargetTreat(src.data, tar.data, cfg);
                    SelfDescribed des = new SelfDescribed()
                    {
                        src       = src.UniqueID,
                        target    = tar.UniqueID,
                        act       = Verb.Recover,
                        srcEnd    = null,
                        targetEnd = new EndResult()
                        {
                            param1 = (int)dmg.treatValue,
                            param2 = dmg.isCritical ? 1 : 0,
                            param3 = (int)dmg.treatType,
                        },
                    };

                    param.OP        = EffectOp.Treat;
                    param.described = des;

                    container.Add(param);
                }
            }
        }
Example #11
0
        public virtual void OnNewUIStateReceived(WarTarAnimParam param)
        {
            if (param != null)
            {
                if (param.OP == EffectOp.ExchangeNpcAttri || param.OP == EffectOp.Injury)
                {
                    return;
                }

                SelfDescribed sd = param.described;
                if (sd != null && sd.target == cachedNpc.UniqueID && sd.srcEnd != null)
                {
                    EndResult     src    = sd.srcEnd;
                    int           srcId  = sd.src;
                    int           target = sd.target;
                    int           action = src.param2;
                    int           op     = src.param3;
                    NpcEffectInfo info   = new NpcEffectInfo()
                    {
                        ClientID  = DeviceInfo.GUID,
                        from      = srcId,
                        to        = target,
                        hitAction = action,
                        Op        = op,
                    };
                    animMsg.nextAnim = WarMsg_Type.OnEffect.ToString();
                    animMsg.uniqueId = cachedNpc.UniqueID;
                    animMsg.data     = JSON.Instance.ToJSON(info);

                    if (serMgr != null)
                    {
                        serMgr.realServer.proxyCli.NPCAnim(animMsg);
                    }
                }
            }
        }
Example #12
0
        /// <summary>
        /// 处理主动打击其他NPC的时候,触发的事情
        /// </summary>
        /// <param name="CasterId">施法者ID</param>
        /// <param name="SufferId">撞击者ID</param>
        /// <param name="idx">几个被撞击者</param>
        /// <param name="finalTar">是否最终目标</param>
        /// <param name="maxDis">是否最大距离</param>
        /// <param name="returnback">返回原处</param>
        /// <param name="EffectId">效果ID</param>
        /// <param name="npcMgr">Npc mgr.</param>
        void HandleOnAttack(int CasterId, int SufferId, int idx, bool finalTar, bool maxDis, bool returnback, int EffectId, WarServerNpcMgr npcMgr)
        {
            ServerNPC caster = npcMgr.GetNPCByUniqueID(CasterId);
            ServerNPC suffer = npcMgr.GetNPCByUniqueID(SufferId);

            ///
            /// -------- 获取Effect的配置 -------
            ///
            EffectModel      efModel = Core.Data.getIModelConfig <EffectModel>();
            EffectConfigData efCfg   = efModel.get(EffectId);

            Utils.Assert(efCfg == null, "Can't find Effect Configure. effect ID = " + EffectId);

            if (efSelector == null)
            {
                efSelector = EffectSufferShared.get(npcMgr);
            }

            ///
            /// 先做技能
            ///
            IEnumerable <ServerNPC> filter = efSelector.Select(caster, new List <ServerNPC> {
                suffer
            }, efCfg);

            if (filter.Any())
            {
                //消失的时候,触发可能的位移
                HookNpcDisappearType disappearType = (HookNpcDisappearType)Enum.ToObject(typeof(HookNpcDisappearType), efCfg.Param2);
                //HookNpcDmgType hookDmgType = (HookNpcDmgType) Enum.ToObject(typeof(HookNpcDmgType), efCfg.Param8);
                HookNpcMoveType moveType = (HookNpcMoveType)Enum.ToObject(typeof(HookNpcMoveType), efCfg.Param5);

                ///
                /// 一定会有伤害,之后,先判定是否消失,如果消失,则再次判定是否移动
                ///

                ///
                /// ------- 开始运算BulletOp --------
                ///
                OperatorMgr OpMgr = OperatorMgr.instance;
                BulletNpcOp op    = OpMgr.getImplement <BulletNpcOp>(EffectOp.Bullet_NPC);

                Dmg  dmg           = op.toTargetDmg(caster.data, suffer.data, efCfg);
                int  moveDirection = 0;
                bool dis           = Disappear(disappearType, idx, finalTar, maxDis, returnback);
                if (dis)
                {
                    moveDirection = (int)moveType;
                }

                SelfDescribed   des   = record(CasterId, SufferId, dmg, dis, moveDirection);
                WarTarAnimParam param = new WarTarAnimParam()
                {
                    OP        = EffectOp.Injury,
                    OringinOP = EffectOp.HookNpc,
                    described = des,
                };
                ///发送消息
                npcMgr.SendMessageAsync(CasterId, SufferId, param);
            }
        }
Example #13
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,
                    };
                }
            }
        }
Example #14
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);
                }
            }
        }
Example #15
0
        void report(int CasterId, int SufferId, Suf suf, WarServerNpcMgr npcMgr)
        {
            //检测护盾
            if (suf.resDmgType.check(ResistanteClass.Protection))
            {
                if (suf.protectVal != null)
                {
                    //统计数据
                    SelfDescribed des = new SelfDescribed()
                    {
                        src    = CasterId,
                        target = SufferId,                         //SufferId 应该变为真实的护盾的NPC
                        act    = Verb.Punch,
                        srcEnd = null,
                    };

                    EndResult tarEnd = new EndResult();

                    Dmg protectDmg = suf.protectVal.Value;
                    tarEnd.param1 = (int)protectDmg.dmgValue;
                    tarEnd.param2 = protectDmg.isCritical ? 1 : 0;
                    tarEnd.param3 = (int)protectDmg.dmgType;
                    tarEnd.param4 = (int)HurtHitClass.None;

                    des.targetEnd = tarEnd;

                    WarTarAnimParam param = new WarTarAnimParam()
                    {
                        OP        = EffectOp.Injury,
                        OringinOP = EffectOp.Injury,
                        described = des,
                    };

                    npcMgr.SendMessageAsync(des.src, des.target, param);
                }
            }

            if (suf.resDmgType.check(ResistanteClass.Bloody) || suf.resDmgType.check(ResistanteClass.Rebound))
            {
                //反弹不为空
                if (suf.rebValue != null)
                {
                    //统计数据
                    SelfDescribed des = new SelfDescribed()
                    {
                        src    = SufferId,
                        target = CasterId,
                        act    = Verb.Punch,
                        srcEnd = null,
                    };

                    EndResult tarEnd = new EndResult();

                    Dmg rebDmg = suf.rebValue.Value;
                    tarEnd.param1 = (int)rebDmg.dmgValue;
                    tarEnd.param2 = rebDmg.isCritical ? 1 : 0;
                    tarEnd.param3 = (int)rebDmg.dmgType;
                    tarEnd.param4 = (int)HurtHitClass.None;

                    des.targetEnd = tarEnd;

                    WarTarAnimParam param = new WarTarAnimParam()
                    {
                        OP        = EffectOp.Injury,
                        OringinOP = EffectOp.Injury,
                        described = des,
                    };

                    npcMgr.SendMessageAsync(des.src, des.target, param);
                }

                //吸血不为空
                if (suf.bdyValue != null)
                {
                    //统计数据
                    SelfDescribed des = new SelfDescribed()
                    {
                        src    = SufferId,
                        target = CasterId,
                        act    = Verb.Recover,
                        srcEnd = null,
                    };

                    EndResult tarEnd = new EndResult();

                    Dmg bdyDmg = suf.bdyValue.Value;
                    tarEnd.param1 = (int)bdyDmg.dmgValue;
                    tarEnd.param2 = bdyDmg.isCritical ? 1 : 0;
                    tarEnd.param3 = (int)bdyDmg.dmgType;
                    tarEnd.param4 = (int)HurtHitClass.None;

                    des.targetEnd = tarEnd;

                    WarTarAnimParam param = new WarTarAnimParam()
                    {
                        OP        = EffectOp.Treat,
                        OringinOP = EffectOp.Treat,
                        described = des,
                    };

                    npcMgr.SendMessageAsync(des.src, des.target, param);
                }
            }
        }
Example #16
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);
                }
            }
        }
Example #17
0
        /// <summary>
        /// 处理主动打击其他NPC的时候,触发的事情
        /// </summary>
        void HandleOnAttack(MsgParam msg, WarServerNpcMgr npcMgr)
        {
            WarMsgParam warMsg = msg as WarMsgParam;

            if (warMsg != null)
            {
                if (efSelector == null)
                {
                    efSelector = EffectSufferShared.get(npcMgr);
                }

                int CasterId = warMsg.Sender;
                int SufferId = warMsg.Receiver;
                int EffectId = warMsg.arg1;
                int FinalId  = warMsg.arg2;
                //是否是最终目标
                bool IsfinalTarget = SufferId == FinalId;
                ///
                /// -------- 获取Effect的配置 -------
                ///
                EffectModel      efModel = Core.Data.getIModelConfig <EffectModel>();
                EffectConfigData efCfg   = efModel.get(EffectId);
                Utils.Assert(efCfg == null, "Can't find Effect Configure. effect ID = " + EffectId);
                //半径
                float radius = efCfg.Param9 * Consts.oneHundred;

                ServerNPC caster = npcMgr.GetNPCByUniqueID(CasterId);
                ServerNPC suffer = npcMgr.GetNPCByUniqueID(SufferId);

                ///
                /// ----------- 先坐第一步的选择和解析 ------------
                ///
                IEnumerable <ServerNPC> filter = efSelector.Select(caster, new List <ServerNPC> {
                    suffer
                }, efCfg);
                if (filter.Count() > 0)
                {
                    BulletHurtType   HurtType = (BulletHurtType)Enum.ToObject(typeof(BulletHurtType), efCfg.Param8);
                    List <ServerNPC> targets  = selectTarget(HurtType, suffer, IsfinalTarget, npcMgr, radius);

                    int tarCnt = targets.Count;
                    if (tarCnt > 0)
                    {
                        ///
                        /// ------- 开始运算BulletOp --------
                        ///
                        OperatorMgr OpMgr = OperatorMgr.instance;
                        BulletNpcOp op    = OpMgr.getImplement <BulletNpcOp>(EffectOp.Bullet_NPC);

                        for (int i = 0; i < tarCnt; ++i)
                        {
                            ServerNPC target = targets[i];
                            //alive ?
                            if (target.data.rtData.curHp > 0)
                            {
                                Dmg           damage = op.toTargetDmg(caster.data, target.data, efCfg);
                                SelfDescribed des    = record(CasterId, SufferId, damage, i);

                                WarTarAnimParam param = new WarTarAnimParam()
                                {
                                    OP        = EffectOp.Injury,
                                    OringinOP = EffectOp.Bullet_NPC,
                                    described = des,
                                };
                                ///发送消息
                                npcMgr.SendMessageAsync(CasterId, SufferId, param);
                            }
                        }
                    }
                }
            }
        }
Example #18
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,
                    };
                }
            }
        }