Example #1
0
        public static bool IfPureBuff(IEffect effect, ISkill srcSkill, ISkillPlayer caster)
        {
            if (effect.PureFlag)
            {
                return(true);
            }
            IBoostBuff  boost   = null;
            int         maxRate = SkillDefines.MAXStorePercent;
            ISkillOwner owner   = caster ?? srcSkill.Owner;

            owner.TryGetPureBuff(ref boost);
            if (srcSkill.TryGetPureBuff(ref boost))
            {
                int rate = boost.Percent;
                if (rate >= maxRate)
                {
                    return(true);
                }
                if (rate > 0 && rate < maxRate)
                {
                    if (srcSkill.Context.RandomPercent(maxRate) <= rate)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
 protected virtual bool AddBuff(ISkill srcSkill, ISkillPlayer caster, ISkillOwner target, bool pureFlag)
 {
     if (!pureFlag)
     {
         if (BoostUtil.IfAntiDebuff(this, srcSkill, target, true, (int)EnumBoostRootType.AntiPropDebuff))
         {
             return(true);
         }
     }
     if (this.ExecType == EnumBuffExec.MustHit)
     {
         int rate    = this.Rate;
         int maxRate = SkillDefines.MAXStorePercent;
         if (rate >= 0 && rate < maxRate)
         {
             if (srcSkill.Context.RandomPercent(maxRate) > rate)
             {
                 return(false);
             }
         }
     }
     target.AddBuff(InnerCreatePropBuff(srcSkill, caster));
     this.AddTgtShowModel(srcSkill, target, this.Last);
     return(true);
 }
Example #3
0
        public static bool IfSilence(ISkill srcSkill, ISkillOwner owner)
        {
            IBuff blurBuff = null;

            if (owner.TryGetBuff((int)EnumBlurType.LockMotion, ref blurBuff))
            {
                return(true);
            }
            if (!owner.TryGetBuff((int)EnumBlurType.LockSkill, ref blurBuff))
            {
                return(false);
            }
            int maxRate = SkillDefines.MAXStorePercent;
            int rate    = blurBuff.Rate;

            if (rate >= maxRate)
            {
                return(true);
            }
            if (rate > 0 && rate < maxRate)
            {
                if (srcSkill.Context.RandomPercent(maxRate) <= rate)
                {
                    return(true);
                }
            }
            return(false);
        }
Example #4
0
    public Attack(ISkillOwner owner, int damage, Action <IBody> onHit, Action <IBody> onKill)
    {
        this.owner  = owner;
        this.damage = damage;

        this.onHit  = onHit;
        this.onKill = onKill;
    }
Example #5
0
 public Skill(ISkillContext context, ISkillOwner owner, string args)
 {
     this._context      = context;
     this._owner        = owner;
     this._args         = args;
     this.boostCore     = new BoostCore(context);
     this.SubEffectors  = new List <IEffector>();
     this.RedoEffectors = new List <IEffector>();
 }
Example #6
0
    // 대상 비지정 스킬
    public bool Active(ISkillOwner owner, Action <IBody> onHit = null, Action <IBody> onKill = null)
    {
        if (!CanActive())
        {
            return(false);
        }
        _activeTime = Time.time;

        void ActiveMethod() => Active_(CreateAttack(owner, onHit, onKill), targetTags);

        StartCoroutine(ActiveCoroutine(owner, ActiveMethod));

        return(true);
    }
Example #7
0
        public void RemoveShowModel(ISkill srcSkill, ISkillOwner owner, bool tgtFlag)
        {
            var player = owner as ISkillPlayer;

            if (null == player || null == player.SkillCore)
            {
                return;
            }
            var model = tgtFlag ? this.TgtModelSetting : this.SrcModelSetting;

            if (null == model || model.ModelId <= 0)
            {
                return;
            }
            player.SkillCore.RemoveShowModel(srcSkill, model.ModelId);
        }
Example #8
0
        public void AddTgtShowModel(ISkill srcSkill, ISkillOwner target, int last)
        {
            var player = target as ISkillPlayer;

            if (null == player || null == player.SkillCore)
            {
                return;
            }
            var model = this.TgtModelSetting;

            if (null == model || model.ModelId <= 0)
            {
                return;
            }
            if (model.ModelLast > 0)
            {
                last = srcSkill.Context.GetBuffLast(srcSkill, null, model.ModelLast);
            }
            player.SkillCore.AddShowModel(srcSkill, model.ModelId, last);
        }
Example #9
0
    private IEnumerator ActiveCoroutine(ISkillOwner owner, Action activeMethod)
    {
        /* ------------------- 선딜레이(캐스팅) -------------- */
        PhaseEvent(owner, preDelay);
        if (0 < preDelay.during)
        {
            yield return(new WaitForSeconds(preDelay.during));
        }

        /* ----------------- 중딜레이(스킬진행중) -------------- */
        PhaseEvent(owner, middleDelay);
        activeMethod();
        if (0 < middleDelay.during)
        {
            yield return(new WaitForSeconds(middleDelay.during));
        }

        /* -------------- 후딜레이(스킬 종료 후 경직) -------------- */
        PhaseEvent(owner, afterDelay);
        /* ------------------------------------ */
    }
Example #10
0
        public void AddShowClip(ISkill srcSkill, ISkillPlayer caster)
        {
            var clip = this.ClipSetting;

            if (null == clip || clip.ClipId <= 0)
            {
                return;
            }
            ISkillOwner owner = caster ?? srcSkill.Owner;

            if (null == owner.SkillCore)
            {
                return;
            }
            byte[] targets = null;
            if (clip.ClipType > 0)
            {
                targets = GetClipTargets(caster);
            }
            owner.SkillCore.AddShowClip(srcSkill, clip, targets);
        }
Example #11
0
    private void PhaseEvent(ISkillOwner owner, PhaseStatus status)
    {
        if (status.isCasting)
        {
            owner.Stun(status.during);
        }

        // 스킬 액티브 사운드가 존재한다면 실행
        if (status.sound != null)
        {
            AudioManager.PlaySound(status.sound);
        }

        // 스킬에 애니메이션이 존재한다면 실행
        if (status.animator != null && !string.IsNullOrEmpty(status.aniTrigger))
        {
            status.animator.SetTrigger(status.aniTrigger);
        }

        // 그 외 추가적인 이벤트 실행
        status.elseEvents?.Invoke();
    }
Example #12
0
 protected virtual bool AddBuff(ISkill srcSkill, ISkillPlayer caster, ISkillOwner target, int buffId, bool pureFlag, int last, int point, int percent)
 {
     if (!pureFlag)
     {
         if (BoostUtil.IfAntiDebuff(this, srcSkill, target, true, (int)EnumBoostRootType.AntiPropDebuff))
         {
             return(true);
         }
         BoostUtil.GetEaseValue(out point, out percent, point, percent, target, ValueBuffUnits(buffId));
         if (this.Last > 0)
         {
             BoostUtil.GetEaseLast(out last, last, target, LastBuffUnits(buffId));
             last = srcSkill.Context.GetBuffLast(srcSkill, caster, last);
         }
     }
     if (!target.AddBuff(InnerCreatePropBuff(srcSkill, point, percent, (short)last)))
     {
         return(false);
     }
     this.AddTgtShowModel(srcSkill, target, last);
     return(true);
 }
Example #13
0
    private Attack CreateAttack(ISkillOwner owner, Action <IBody> onHit, Action <IBody> onKill)
    {
        int    damage = (int)(owner.GetDamage() * this.damage);
        Attack attack = new Attack(owner, damage, onHit, onKill);

        attack.onHit += target =>
        {
            if (hitSound != null)
            {
                AudioManager.PlaySound(hitSound);
            }

            if (hitEffect != null)
            {
                var effect = GlobalObjectPool.GetPooledObject(hitEffect);
                effect.transform.position = target.GetPosition();
                effect.Play();
            }
        };



        return(attack);
    }
Example #14
0
        public static bool IfAntiDebuff(IEffect effect, ISkill srcSkill, ISkillOwner target, bool incRoot, params int[] buffIds)
        {
            if (effect.PureFlag || !effect.DebuffFlag)
            {
                return(false);
            }
            IBoostBuff boost   = null;
            int        maxRate = SkillDefines.MAXStorePercent;
            int        rate    = 0;

            if (incRoot)
            {
                if (target.TryGetAntiDebuff(ref boost))
                {
                    rate = boost.Percent;
                    if (rate >= maxRate || rate > 0 && srcSkill.Context.RandomPercent(maxRate) <= rate)
                    {
                        return(true);
                    }
                    boost.Clear();
                }
            }
            if (null == buffIds || buffIds.Length == 0)
            {
                return(false);
            }
            if (target.TryGetAntiRate(ref boost, buffIds))
            {
                do
                {
                    var boostAnti = boost as IBoostAntiBuff;
                    if (null == boostAnti)
                    {
                        break;
                    }
                    var antiSKill = boostAnti.AntiSkillType;
                    if (null == antiSKill || antiSKill.Length == 0)
                    {
                        break;
                    }
                    int skillType = (int)srcSkill.RawSkill.SrcType;
                    for (int i = 0; i < antiSKill.Length; i++)
                    {
                        if (antiSKill[i] == skillType)
                        {
                            break;
                        }
                        else if (i == antiSKill.Length - 1)
                        {
                            return(false);
                        }
                    }
                }while (false);
                rate = boost.Percent;
                if (rate >= maxRate || rate > 0 && srcSkill.Context.RandomPercent(maxRate) <= rate)
                {
                    return(true);
                }
            }
            return(false);
        }
Example #15
0
 public static bool IfAntiDebuff(IEffect effect, ISkill srcSkill, ISkillOwner target, params int[] buffIds)
 {
     return(IfAntiDebuff(effect, srcSkill, target, false, buffIds));
 }
Example #16
0
 public static bool GetEaseLast(out int last, int inLast, ISkillOwner owner, params int[] buffIds)
 {
     return(GetLastCore(out last, inLast, EnumBoostType.EaseLast, owner, buffIds));
 }
Example #17
0
 public static bool GetEaseValue(out int point, out int percent, ISkillOwner owner, params int[] buffIds)
 {
     return(GetValueCore(out point, out percent, EnumBoostType.EaseValue, owner, buffIds));
 }
Example #18
0
 public static void ClearBlur(ISkillOwner owner)
 {
     owner.RemoveBuff((int)EnumBlurType.LockMotion, 0);
     owner.RemoveBuff((int)EnumBlurType.LockSkill, 0);
 }
Example #19
0
 public static bool GetAntiRate(out int rate, ISkillOwner owner, params int[] buffIds)
 {
     return(GetRateCore(out rate, 0, EnumBoostType.AntiRate, owner, buffIds));
 }
Example #20
0
        public void LoadSkill(ISkillOwner owner, List <string> skills)
        {
            if (null == skills || skills.Count == 0)
            {
                return;
            }
            if (RawSkillCache.Instance().TRACEPlayerSkillFlag&& owner is ISkillPlayer)
            {
                LogUtil.Info("Loading...Player[{0}] Skills[{1}] ", ((ISkillPlayer)owner).SkillPlayerId, string.Join(",", skills));
            }
            if (owner is ISkillManager)
            {
                LogUtil.Info("Loading...Manager[{0}] Skills[{1}] ", ((ISkillManager)owner).InnerId, string.Join(",", skills));
            }
            var dic = this._context.DicBuffer(1);

            dic.Clear();
            for (int i = 0; i < this._skillList.Count; i++)
            {
                dic[_skillList[i].RawSkill.RawSkillId] = i;
            }
            string    skillCode = string.Empty;
            string    args      = string.Empty;
            int       argsIdx   = 0;
            IRawSkill rawSkill  = null;
            ISkill    skill     = null;
            int       idx       = 0;

            foreach (var str in skills)
            {
                skillCode = str;
                argsIdx   = str.IndexOf('.');
                if (argsIdx >= 0)
                {
                    args      = str.Substring(argsIdx + 1);
                    skillCode = str.Substring(0, argsIdx);
                }
                if (!RawSkillCache.Instance().TryGetRawSkill(skillCode, out rawSkill))
                {
                    LogUtil.Info("No RawSkill for SkillCode:" + skillCode);
                    continue;
                }
                if (dic.TryGetValue(rawSkill.RawSkillId, out idx))
                {
                    dic[rawSkill.RawSkillId]    = -1;
                    _skillList[idx].InvalidFlag = false;
                    _skillList[idx].FitCasters();
                    continue;
                }
                skill = new Skill(this._context, owner, args);
                skill.Load(rawSkill);
                this._skillList.Add(skill);
                switch (rawSkill.TimeType)
                {
                case EnumSkillTimeType.Session:
                    _skillDic[EnumSkillTimeType.Session].Add(skill);
                    break;

                case EnumSkillTimeType.Section:
                    _skillDic[EnumSkillTimeType.Session].Add(skill);
                    _skillDic[EnumSkillTimeType.Section].Add(skill);
                    break;

                case EnumSkillTimeType.Minute:
                    _skillDic[EnumSkillTimeType.Section].Add(skill);
                    _skillDic[EnumSkillTimeType.Minute].Add(skill);
                    break;

                case EnumSkillTimeType.Round:
                    _skillDic[EnumSkillTimeType.Minute].Add(skill);
                    _skillDic[EnumSkillTimeType.Round].Add(skill);
                    break;

                case EnumSkillTimeType.PreDecide:
                    _skillDic[EnumSkillTimeType.PreDecide].Add(skill);
                    break;
                }
                this.AddOpenClip(skill);
            }
            foreach (var kvp in dic)
            {
                if (kvp.Value < 0)
                {
                    continue;
                }
                this._skillList[kvp.Value].Revoke();
            }
        }
Example #21
0
        public bool Invoke()
        {
            EnumSkillState skillState = this.SkillState;

            if (skillState == EnumSkillState.Effecting)
            {
                this.Repeat();
                return(false);
            }
            if (skillState != EnumSkillState.Activate)
            {
                return(false);
            }
            ISkillOwner owner = null;

            if (null == this._casters || this._casters.Count == 0)
            {
                owner = this.Owner;
            }
            else if (this._casters.Count == 1)
            {
                owner = this._casters[0];
            }
            byte paralFlag = this.RawSkill.ParalFlag;
            bool checkFlag = null != owner && null != owner.SkillCore;

            if (checkFlag && !owner.SkillCore.GetInvokeFlag(paralFlag))
            {
                return(false);
            }
            short rate = this.RawSkill.Rate;

            if (rate >= 0 && rate < 100)
            {
                IBoostBuff boost = null;
                if (this.TryGetSkillRate(ref boost))
                {
                    rate = Convert.ToInt16(rate + boost.AsPoint + rate * boost.AsPercent);
                }
                if (rate <= 0)
                {
                    return(false);
                }
                if (rate < 100 && this._context.RandomPercent() > rate)
                {
                    return(false);
                }
            }
            if (checkFlag)
            {
                if (null == this._casters || this._casters.Count == 0)
                {
                    return(InvokeCore(null, true, false, true));
                }
                else if (this._casters.Count == 1)
                {
                    return(InvokeCore(_casters[0], true, false, true));
                }
            }
            foreach (var caster in this._casters)
            {
                if (InvokeCore(caster, true, true, true))
                {
                    return(true);
                }
            }
            return(false);
        }