// 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); } } }
/// <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(); } } } }
//更多的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); } }
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); } }
//收到伤害 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(); } } } }
//治疗消息 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); // } // } // } } } }
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); } } }
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; } } }
/// <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); }
/// <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); } } }
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); } } } }
/// <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); } }
//百分比交换 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, }; } } }
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); } } }
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); } } }
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); } } }
/// <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); } } } } } }
//固定比例交换 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, }; } } }