public void OnHappen(MsgParam msg, WarServerNpcMgr npcMgr) { WarAnimParam warParam = msg as WarAnimParam; if (warParam != null && warParam.described != null) { SelfDescribed described = warParam.described; if (described.srcEnd != null && described.srcEnd.param1 > 0) { //转发消息 ServerNPC tag = npcMgr.TagNpc("Trigger"); switch (described.act) { case Verb.LineEnemy: warParam.cmdType = WarMsg_Type.LineEnemy; //创建一个触发器 warMgr.triMgr.CreateTrigger(described.src, described.srcEnd.param1, null); npcMgr.SendMessageAsync(tag.UniqueID, tag.UniqueID, msg); break; } } } }
public void OnHappen(MsgParam msg, WarServerNpcMgr npcMgr) { WarAnimParam warParam = msg as WarAnimParam; if (warParam != null && warParam.described != null) { //转发消息 ServerNPC tag = npcMgr.TagNpc("Trigger"); SelfDescribed described = warParam.described; if (described.srcEnd != null) { warParam.cmdType = WarMsg_Type.CounterAttack; npcMgr.SendMessageAsync(tag.UniqueID, tag.UniqueID, warParam); } } }
public void OnHappen(MsgParam msg, WarServerNpcMgr npcMgr) { //TODO : do something WarAnimParam warParam = msg as WarAnimParam; if (warParam != null && warParam.described != null) { SelfDescribed described = warParam.described; if (described.srcEnd != null) { //转发消息 ServerNPC tag = npcMgr.TagNpc("Trigger"); warParam.cmdType = WarMsg_Type.RmBufIfKilling; npcMgr.SendMessageAsync(tag.UniqueID, tag.UniqueID, warParam); } } }
/// <summary> /// 派发出去消息 /// </summary> /// <param name="outMsg">Out message.</param> void dispatchMsg(List <MsgParam> outMsg, RtSkData skill) { if (outMsg != null && outMsg.Count > 0) { int count = outMsg.Count; for (int i = 0; i < count; ++i) { MsgParam msg = outMsg[i]; WarAnimParam warMsg = msg as WarAnimParam; warMsg.cmdType = WarMsg_Type.UseBuff; warMsg.SkillId = skill == null ? -1 : skill.Num; if (warMsg != null && warMsg.described != null) { SelfDescribed des = warMsg.described; #if DEBUG ConsoleEx.DebugLog("Buff Msg is going out : " + fastJSON.JSON.Instance.ToJSON(des), ConsoleEx.YELLOW); #endif msgMgr.SendMessageAsync(des.src, des.target, warMsg); } } } }
/// <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); } }
/// <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 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); } } }
//发送给Trigger的数据 void toTriggerMsg(ServerNPC caster, ServerNPC sufferer, WarServerNpcMgr npcMgr) { ServerNPC tri = npcMgr.TagNpc("Trigger"); NPCData sfData = sufferer.data; NPCRuntimeData sfRt = sfData.rtData; if (sfRt.curHp > 0) { /// TODO: add OnAttack,在释放出添加, 不在这里 /// TODO: add BeAttack SelfDescribed des = new SelfDescribed() { srcEnd = new EndResult() { param1 = caster.UniqueID, param2 = sufferer.UniqueID, }, targetEnd = null, }; WarAnimParam param = new WarAnimParam() { cmdType = WarMsg_Type.BeAttacked, described = des, }; npcMgr.SendMessageAsync(sufferer.UniqueID, tri.UniqueID, param); } if (sfRt.curHp <= 0) { /// TODO: add OnKilled SelfDescribed des = new SelfDescribed() { srcEnd = new EndResult() { param1 = caster.UniqueID, param2 = sufferer.UniqueID, }, targetEnd = null, }; WarAnimParam param = new WarAnimParam() { cmdType = WarMsg_Type.OnKilled, described = des, }; npcMgr.SendMessageAsync(sufferer.UniqueID, tri.UniqueID, param); /// TODO: add BeKilled SelfDescribed des2 = new SelfDescribed() { srcEnd = new EndResult() { param1 = caster.UniqueID, param2 = sufferer.UniqueID, }, targetEnd = null, }; WarAnimParam param2 = new WarAnimParam() { cmdType = WarMsg_Type.BeKilled, described = des2, }; npcMgr.SendMessageAsync(sufferer.UniqueID, tri.UniqueID, param2); } }