示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        //一定有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));
        }
示例#4
0
        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);
            }
        }
示例#5
0
        //更多的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);
            }
        }
示例#6
0
		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);
		}
示例#7
0
 /// <summary>
 /// 只有cfg有配置的时候才回去调用OnEnd
 /// </summary>
 protected void OnEnd()
 {
     if (typeOfTrigger == TriggerKind.Skill)
     {
         //Get RtBuffData
         RtBufData buf = warMgr.bufMgr.get(HangUpBuffId);
         workOnEnd.IfEnd(buf, this);
     }
 }
示例#8
0
        /// <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);
        }
示例#9
0
        /// <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);
            }
        }
示例#10
0
        //第一个是唯一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);
        }
示例#11
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);
        }
示例#12
0
        /// <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);
        }
示例#13
0
        ///分析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);
        }
示例#14
0
        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();
            }
        }
示例#15
0
        /// <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);
        }
示例#16
0
        /// <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();
        }
示例#17
0
 public void IfEnd(RtBufData buf, Trigger trigger)
 {
 }
示例#18
0
        /// <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);
        }
示例#19
0
        /// <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);
        }
示例#20
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);
        }