Пример #1
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);
        }
Пример #2
0
        /// <summary>
        /// 创建buff,更加通用的处理逻辑
        /// 也许并不创建Buff
        /// </summary>
        /// <returns>The buff.</returns>
        /// <param name="param">Parameter.</param>
        public RtBufData createBuff(BuffCtorParamEx param)
        {
                        #if DEBUG
            Utils.Assert(param.cfg == null, "param.cfg == null");
                        #endif

            int           casterID  = param.fromNpcId;
            int           tarID     = param.toNpcId;
            int           buffID    = param.cfg.Param1;
            float         customDur = param.cfg.Param2 * Consts.OneThousand;
            DotHotDurType durType   = (DotHotDurType)Enum.ToObject(typeof(DotHotDurType), param.cfg.Param3);
            int           Layers    = param.cfg.Param4;

            SkBufferModel  bfModel = Core.Data.getIModelConfig <SkBufferModel>();
            BuffConfigData BuffCfg = bfModel.get(buffID);


            List <RtBufData> TarBuff = new List <RtBufData>();
            foreach (RtBufData buf in OnWork.Values)
            {
                if (buf != null && buf.HangUpNpcID == tarID)
                {
                    TarBuff.Add(buf);
                }
            }

            ///
            /// 1. 判定要创建的buff是否有Group ID 作为主键 的冲突,
            ///    但是释放者的ID必须不相同
            ///

            //buff的分组
            List <RtBufData> Conflict = new List <RtBufData>();
            int groupId = BuffCfg.BuffGroup;
            foreach (RtBufData buf in TarBuff)
            {
                if (buf != null)
                {
                    if (buf.CastorNpcID != casterID && buf.BuffCfg.BuffGroup == groupId)
                    {
                        Conflict.Add(buf);
                    }
                }
            }

            //删除冲突
            if (Conflict.Count > 0)
            {
                int cnt = Conflict.Count;
                for (int i = 0; i < cnt; ++i)
                {
                    RtBufData d = Conflict[i];
                    rmBuff(d.ID, d.HangUpNpcID);
                }
            }


            ///
            /// 2. 判定Buff ID和CasterID 作为主键来决定是否有冲突
            ///
            Conflict.Clear();
            foreach (RtBufData buf in TarBuff)
            {
                if (buf != null)
                {
                    if (buf.CastorNpcID == casterID && buf.BuffCfg.ID == buffID)
                    {
                        Conflict.Add(buf);
                    }
                }
            }

            int       confcnt     = Conflict.Count;
            bool      hasConflict = confcnt > 0;
            RtBufData createOne   = null;

            if (hasConflict)
            {
                //不删除冲突
                for (int i = 0; i < confcnt; ++i)
                {
                    RtBufData d = Conflict[i];
                    //冲突的buff时间处理,
                    switch (durType)
                    {
                    //刷新Buff的时间
                    case DotHotDurType.Fixture:
                        d.setCustomeDuration(d.BuffCfg.Duration);
                        break;

                    case DotHotDurType.Increase:
                        d.setCustomeDurAddtion(customDur);
                        break;

                    case DotHotDurType.Leaveit:
                        break;
                    }

                    //冲突的Buff的层数处理
                    d.setMoreLayer(Layers);
                }

                createOne = Conflict[0];
            }
            else
            {
                //创建Buff
                BuffCtorParam ctor = new BuffCtorParam()
                {
                    bufNum    = buffID,
                    fromNpcId = casterID,
                    toNpcId   = param.toNpcId,
                    //buff的起源
                    origin = OriginOfBuff.BornWithSkill,
                    //初始的层数(默认1)
                    initLayer = 1,
                    //等级(忽略)
                    level = -1,
                    //自定义duration(默认填-1F)
                    duration = Consts.USE_BUFF_CONFIG_DURATION,
                };

                createOne = createBuff(ctor);
            }


            return(createOne);
        }