/// <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> /// 创建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); }