Пример #1
0
        void DelayCast(DelayedSkData delaySkData)
        {
            bool skDirecHurt = true;

            List <MsgParam> MsgContainer = new List <MsgParam>();

            IEnumerable <ServerNPC> reTarget = selector.Select(delaySkData.caster, delaySkData.chosen, delaySkData.cfg);

            delaySkData.castor.Cast(delaySkData.caster, delaySkData.chosen, reTarget, skDirecHurt, MsgContainer);
            effMgr.Recycle(delaySkData.cfg, delaySkData.castor);

            ///
            /// ----  进入激活判定器 ----
            ///
            conDicder.EnterIncite(delaySkData.rtsk, delaySkData.cfg, delaySkData.caster, delaySkData.chosen);

            //通知UI的信息
            short             pos    = delaySkData.rtsk.pos;
            Action <MsgParam> Report = delaySkData.Report;

            ///
            ///  回报数据,区分一条数据和多条数据
            ///
            HowToReport(MsgContainer, pos, Report);
        }
Пример #2
0
        public void EnterIncite(RtSkData sk, EffectConfigData efCfg, ServerNPC caster, IEnumerable <ServerNPC> targets)
        {
            bool canEnter = CheckIncite(sk, efCfg);

            if (canEnter)
            {
                bool injured = CheckBeHead(sk);
                if (injured)
                {
                    float Delay = 0.6F;
                    ///
                    /// 检测伤害类的还需要至少延迟了两个FixedUpdate,因为承受伤害的逻辑,还没开始执行
                    /// 所以,目标血量的判定还不能开始
                    ///
                    DelayedSkData data = new DelayedSkData()
                    {
                        caster = caster,
                        chosen = targets,
                        rtsk   = sk,
                    };
                    SkAsyncRunner.AysncRun(EnterIncite, Delay, data);
                }
                else
                {
                    EnterIncite(sk, caster, targets);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 这个是给技能使用的,可能不会立即有结果
        /// </summary>
        /// <param name="caster">Caster.</param>
        /// <param name="chosen">Chosen.</param>
        /// <param name="rtSk">技能</param>
        /// <param name="pos">技能的索引</param>
        /// <param name="Report">Report.</param>
        public void Cast(ServerNPC Caster, IEnumerable <ServerNPC> Chosen, RtSkData RtSk, Action <MsgParam> ReportFunc)
        {
                        #if DEBUG
            Utils.Assert(Caster == null, "Effect Castor");
            Utils.Assert(RtSk == null, "Effect Castor");
                        #endif

            List <EffectConfigData> effCfg = new List <EffectConfigData>();
            foreach (EffectConfigData cfg in RtSk.effectCfgDic.Values)
            {
                effCfg.Add(cfg);
            }
            //虚假的Buff桩对象
            EffectConfigData stub = ctorStubEffCfg(RtSk);
            if (stub != null)
            {
                effCfg.Add(stub);
            }

            ICastEffect[] castor = effMgr.getImplements(effCfg.ToArray(), RtSk.skillCfg);
            if (castor != null)
            {
                int len = castor.Length;
                for (int i = 0; i < len; ++i)
                {
                    if (castor[i] == null)
                    {
                        ConsoleEx.DebugLog("ICastEffect Not Implement. ID = " + effCfg[i].ID, ConsoleEx.YELLOW);
                    }
                    else
                    {
                        float Delay = RtSk.skillCfg.EffectDelayTime[i];
                        if (Delay > 0)
                        {
                            DelayedSkData data = new DelayedSkData()
                            {
                                caster = Caster,
                                chosen = Chosen,
                                castor = castor[i],
                                cfg    = effCfg[i],
                                Report = ReportFunc,
                                rtsk   = RtSk,
                            };
                            SkAsyncRunner.AysncRun(DelayCast, Delay, data);
                        }
                        else
                        {
                            DelayCast(Caster, Chosen, castor[i], effCfg[i], RtSk, ReportFunc);
                        }
                    }
                }
            }
            castor = null;
        }
Пример #4
0
 void EnterIncite(DelayedSkData delayed)
 {
     EnterIncite(delayed.rtsk, delayed.caster, delayed.chosen);
 }