Exemple #1
0
        //判定是否要消失
        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);
        }
Exemple #2
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);
        }
Exemple #3
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);
            }
        }