/// <summary> /// 这个函数目前没有作用, /// 准备将来用于Buff第一次释放时,需要调用的函数 /// </summary> public void FirstCast(RtBufData rtbf) { /// /// --- 设置NPC的状态 --- /// ServerNPC hang = BFSelector.getHangUp(rtbf); ServerLifeNpc life = hang as ServerLifeNpc; if (life != null) { NpcStatus status = (NpcStatus)Enum.ToObject(typeof(NpcStatus), rtbf.BuffCfg.Status); //去除不需要挂载的状态 status = status.rmDiscrete(); if (status != NpcStatus.None) { life.curStatus = life.curStatus.set(status); } //如果有嘲讽的话 if (status.AnySame(NpcStatus.Taunt)) { life.addHatred(rtbf.CastorNpcID, 1); } } /// /// ---- 释放技能 --- /// castBuff_Skill(rtbf, BuffPhase.Start); }
/// <summary> /// buff属于OriginOfBuff.BornWithSkill这个方法才有效 /// 选择出Buff的目标 /// </summary> /// <param name="adhere">Adhere.</param> /// <param name="bufCfg">Buffer cfg.</param> public ServerNPC locateTarget(RtBufData rtBf) { #if DEBUG Utils.Assert(rtBf == null, "RtBufData is null when relocate buff target."); #endif ServerNPC target = null; if (rtBf.origin == OriginOfBuff.Alone) { target = npcMgr.GetNPCByUniqueID(rtBf.HangUpNpcID); } else { switch (rtBf.BuffCfg.Target) { case BufSel.Add_To_Adhere: target = npcMgr.GetNPCByUniqueID(rtBf.HangUpNpcID); break; case BufSel.Add_To_Caster: target = npcMgr.GetNPCByUniqueID(rtBf.CastorNpcID); break; } } return(target); }
//一定有TriggerConfigData的触发器 //使用Buff创建的Trigger(也可以传递null) public ITriggerItem CreateTrigger(int npcId, int trCfgNum, RtBufData buf) { TriggerConfigData cfg = triggerLoader.get(trCfgNum); Utils.Assert(cfg == null, "Create Trigger is fail because of trigger configure num = " + trCfgNum); return(CreateTrigger(cfg.tEvent, npcId, trCfgNum, buf)); }
void castBuff_Skill(RtBufData rtbf, BuffPhase phase) { container.Clear(); RtSkData skill = null; switch (phase) { case BuffPhase.Start: skill = rtbf.OnStartSkill; break; case BuffPhase.End: skill = rtbf.OnEndSkill; break; case BuffPhase.Cycle: skill = rtbf.onCycleskill; break; } if (skill != null) { ServerNPC castor = BFSelector.locateCastor(rtbf); ServerNPC target = BFSelector.locateTarget(rtbf); List <ServerNPC> Targets = new List <ServerNPC>(); Targets.Add(target); IEnumerable <ServerNPC> itor = Targets.AsEnumerable <ServerNPC>(); EfCastor.Cast(castor, itor, skill, container, false); dispatchMsg(container, skill); } }
//更多的buff结束处理 public void EndCastStep2(RtBufData rtBf) { container.Clear(); /// /// 通知UI,去除Buff的UI显示 /// int action = rtBf.BuffCfg.BuffAction; if (action > 0) { ///分析BuffAction的信息 SelfDescribed des = new SelfDescribed() { src = rtBf.CastorNpcID, target = rtBf.HangUpNpcID, act = Verb.BuffEffect, targetEnd = null, srcEnd = new EndResult() { param2 = action, param3 = 1, }, }; WarTarAnimParam warUI = new WarTarAnimParam() { OP = EffectOp.DotHot, HitAction = action, described = des, }; container.Add(warUI); dispatchMsg(container, null); } }
public void IfEnd (RtBufData buf, Trigger trigger) { var info = trigger.GetType(); var classAttribute = (TriggerAttribute)Attribute.GetCustomAttribute(info, typeof(TriggerAttribute)); WarServerManager warMgr = WarServerManager.Instance; warMgr.bufMgr.rmBuff(buf.ID, buf.HangUpNpcID); warMgr.triMgr.RemoveTrigger(classAttribute.Cmd, trigger.TriggerId, trigger.HangUpNpcId); }
/// <summary> /// 只有cfg有配置的时候才回去调用OnEnd /// </summary> protected void OnEnd() { if (typeOfTrigger == TriggerKind.Skill) { //Get RtBuffData RtBufData buf = warMgr.bufMgr.get(HangUpBuffId); workOnEnd.IfEnd(buf, this); } }
/// <summary> /// 获取挂载BUff的NPC /// </summary> /// <returns>The hang up.</returns> public ServerNPC getHangUp(RtBufData rtBf) { #if DEBUG Utils.Assert(rtBf == null, "RtBufData is null when get Hang Up."); #endif ServerNPC hangUp = npcMgr.GetNPCByUniqueID(rtBf.HangUpNpcID); return(hangUp); }
/// <summary> /// 根据Key找到RtBufData /// </summary> /// <param name="key">Key.</param> public RtBufData get(int key) { RtBufData theOne = null; bool found = OnWork.TryGetValue(key, out theOne); if (found) { return(theOne); } else { return(null); } }
//第一个是唯一ID,第二个是挂载的NPC ID, 第三个是是否已经执行过结束逻辑 public RtBufData rmBuff(int bufId, int npcId, bool endIsExe = false) { RtBufData buf = null; OnWork.TryGetValue(bufId, out buf); //去除管理 OnWork.Remove(bufId); //去除Npc上 ServerNPC npc = WarServerManager.Instance.npcMgr.GetNPCByUniqueID(npcId); npc.rmBuff(bufId); if (buf != null && endIsExe == false) { buf.OnEnd(); } return(buf); }
/// <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释放是挂在NPC身上 /// </summary> /// <returns>The buff.</returns> /// <param name="bufNum">Buffer number.</param> /// <param name="fromNpcId">From npc identifier.</param> /// <param name="toNpcId">To npc identifier.</param> public RtBufData findBuff(int bufNum, int fromNpcId, int toNpcId) { RtBufData theOne = null; foreach (RtBufData buf in OnWork.Values) { if (buf != null) { bool found = buf.HangUpNpcID == toNpcId & buf.CastorNpcID == fromNpcId; found = found & bufNum == buf.Num; if (found) { theOne = buf; break; } } } return(theOne); }
///分析BuffAction的信息 SelfDescribed statistics(RtBufData maybeCreated, ServerNPC src, ServerNPC target) { SelfDescribed described = null; int action = maybeCreated.BuffCfg.BuffAction; if (action > 0) { described = new SelfDescribed(); described.src = src.UniqueID; described.target = target.UniqueID; described.act = Verb.BuffEffect; described.targetEnd = null; described.srcEnd = new EndResult() { param2 = action, param3 = 0, }; } return(described); }
public void Update(float delTime) { foreach (RtBufData buf in OnWork.Values) { if (buf != null) { working.Add(buf); } } int workCnt = working.Count; if (workCnt > 0) { for (int i = 0; i < workCnt; ++i) { RtBufData buf = working[i]; bool alive = buf.Update(delTime); if (!alive) { rmBuff(buf.ID, buf.HangUpNpcID, true); } /// /// 判定当前的是否是引导技能 /// if (buf.canInterrupt) { //检测是否已被打断 ServerNPC npc = NpcMgr.GetNPCByUniqueID(buf.HangUpNpcID); ServerLifeNpc life = npc as ServerLifeNpc; bool interrupt = life.curStatus.AnySame(NpcStatus.Interrupt); if (interrupt) { rmBuff(buf.ID, buf.HangUpNpcID); } } } working.Clear(); } }
/// <summary> /// 创建NPC身上的buff, 最简单的添加逻辑, 只适合在给泉水添加buff等简单情况下的逻辑 /// </summary> /// <returns>The buff.</returns> /// <param name="bufNum">Buffer number.</param> /// <param name="npcId">Npc identifier.</param> /// <param name="level">Level.</param> public RtBufData createBuff(BuffCtorParam param) { allocIdx++; RtBufData buf = new RtBufData(param.bufNum, allocIdx, param.fromNpcId, param.toNpcId, param.origin, param.initLayer, param.duration, param.level); //加入管理 OnWork[allocIdx] = buf; //挂在Npc上 ServerNPC npc = WarServerManager.Instance.npcMgr.GetNPCByUniqueID(param.toNpcId); npc.addBuff(allocIdx); /// /// ---- 注册释放方法 ---- /// buf.RegisterFunc(bfCastor.FirstCast, BuffPhase.Start); buf.RegisterFunc(bfCastor.cast, BuffPhase.Cycle); buf.RegisterFunc(bfCastor.EndCast, BuffPhase.End); buf.RegisterFunc(bfCastor.EndCastStep2, BuffPhase.End); /// /// ---- 需要创建Trigger ------ /// int[] triIds = buf.BuffCfg.TriggerIDList; if (triIds != null) { int cnt = triIds.Length; if (cnt > 0) { for (int i = 0; i < cnt; ++i) { trigMgr.CreateTrigger(param.toNpcId, triIds[i], buf); } } } return(buf); }
/// <summary> /// 删除所有NPC身上的BUFF /// </summary> /// <param name="npcId">Npc identifier.</param> public void rmAllBuff(int npcId) { //去除Npc上 ServerNPC npc = WarServerManager.Instance.npcMgr.GetNPCByUniqueID(npcId); List <int> buffArray = npc.getBuffList; int cnt = buffArray.Count; for (int i = 0; i < cnt; ++i) { int bufId = buffArray[i]; RtBufData buf = null; if (OnWork.TryGetValue(bufId, out buf)) { buf.OnEnd(); } //去除管理 OnWork.Remove(bufId); } npc.rmAllBuff(); }
public void IfEnd(RtBufData buf, Trigger trigger) { }
/// <summary> /// 创建触发器, /// </summary> private ITriggerItem CreateTrigger(WarMsg_Type care, int npcId, int trCfgNum, RtBufData buff) { int id = 0; ITriggerItem one = null; List <ITriggerItem> idleList = null; if (OnIdle.TryGetValue(care, out idleList)) { one = idleList.Count > 0 ? idleList[0] : null; if (one == null) { //Create the new one one = CreateNewTrigger(care, trCfgNum); } else { idleList.RemoveAt(0); TriggerConfigData cfg = null; if (trCfgNum > 0) { cfg = triggerLoader.get(trCfgNum); } ((Trigger)one).Init(cfg, -1); } } else { //Create the new one one = CreateNewTrigger(care, trCfgNum); } id = one.GetID(); List <ITriggerItem> workList = null; if (OnWork.TryGetValue(care, out workList)) { workList.Add(one); } else { workList = new List <ITriggerItem>(); workList.Add(one); OnWork[care] = workList; } //挂在Npc上 ServerNPC npc = WarServerManager.Instance.npcMgr.GetNPCByUniqueID(npcId); npc.addTrigger(id); ((Trigger)one).HangUpNpcId = npcId; //关联的Buff是否存在 if (buff != null) { ((Trigger)one).HangUpBuffId = buff.ID; buff.TriggerID = id; } return(one); }
/// <summary> /// Buff结束时,处理的逻辑 /// </summary> public void EndCast(RtBufData rtbf) { /// /// --- 解除NPC的状态 --- /// ServerNPC hang = BFSelector.getHangUp(rtbf); ServerLifeNpc life = hang as ServerLifeNpc; if (life != null) { NpcStatus status = (NpcStatus)Enum.ToObject(typeof(NpcStatus), rtbf.BuffCfg.Status); //去除不需要挂载的状态 status = status.rmDiscrete(); /// /// 如果还有同类型的,其他Buff则不应该清除Buff的状态 /// if (status != NpcStatus.None) { NpcStatus toCleared = WarServerManager.Instance.bufMgr.SiftOutStatus(status, rtbf.ID, rtbf.HangUpNpcID); life.curStatus = life.curStatus.clear(toCleared); } /// /// 删除嘲讽的目标 /// if (status.check(NpcStatus.Taunt)) { life.clearSpecHatred(rtbf.CastorNpcID); } } /// /// ---- 解除挂载的Trigger ---- /// int NpcId = hang.UniqueID; WarServerManager.Instance.triMgr.RemoveTrigger(rtbf.TriggerID, NpcId); /// /// ---- 是否删除NPC (目前不适用) ---- /// if (life != null) { SelfDescribed des = new SelfDescribed() { src = hang.UniqueID, target = hang.UniqueID, act = Verb.Punch, srcEnd = null, targetEnd = new EndResult( ) { param1 = life.data.rtData.totalHp * 10, param2 = 0, param3 = 2, }, }; WarSrcAnimParam warParam = new WarSrcAnimParam() { OP = EffectOp.Injury, described = des, }; } /// /// ---- 释放技能 --- /// castBuff_Skill(rtbf, BuffPhase.End); }
/// <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); }