//判定是否要消失 bool Disappear(HookNpcDisappearType disappearType, int idx, bool finalTar, bool maxDis, bool returnback) { bool disApp = false; switch (disappearType) { case HookNpcDisappearType.DisWhenFinalTar: disApp = finalTar; break; case HookNpcDisappearType.DisWhenFirstAtked: disApp = idx == 1; break; case HookNpcDisappearType.DisWhenMaxDistance: disApp = maxDis; break; case HookNpcDisappearType.DisWhenReturnback: disApp = returnback; break; } return(disApp); }
/// <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> /// 处理主动打击其他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); } }