Ejemplo n.º 1
0
        /// <summary>
        /// 普通搜索
        /// </summary>
        /// <param name="context"></param>
        /// <param name="data"></param>
        /// <param name="param"></param>
        private void NormalSearch(ISkillContext context,
                                  SkillActionData data, CommonParam param)
        {
            NormalGetTargets(context, data, param);

            FilterTarget(context, data, param);
        }
Ejemplo n.º 2
0
        private Vector3 GetCenterTarget(ISkillContext context,
                                        SkillActionData data, CommonParam param)
        {
            var     centerType = (SkillTargetCenter)data.Center;
            Vector3 pos        = Vector3.zero;

            switch (centerType)
            {
            case SkillTargetCenter.Caster:
                pos = context.GetSelfActor().GetTransform().position;
                break;

            case SkillTargetCenter.Target:
                pos = param.ActorClicked?.GetTransform().position ?? pos;
                break;

            case SkillTargetCenter.Point:
                pos = param.Postion;
                break;

            case SkillTargetCenter.Attacker:
                //todo
                break;

            case SkillTargetCenter.Projectile:
                //todo
                break;

            case SkillTargetCenter.ProjectileHitPoint:
                //todo
                break;
            }

            return(pos);
        }
Ejemplo n.º 3
0
        public static bool ExecRate(out int hitRate, int rate, ISkillContext context, EnumBuffExec execType)
        {
            hitRate = rate;
            int maxRate = SkillDefines.MAXStorePercent;

            switch (execType)
            {
            case EnumBuffExec.None:
                return(true);

            case EnumBuffExec.IgnoreHit:
                if (context.RandomPercent(maxRate) <= rate)
                {
                    hitRate = maxRate;
                }
                else
                {
                    hitRate = 0;
                }
                return(true);

            case EnumBuffExec.MustHit:
                if (context.RandomPercent(maxRate) <= rate)
                {
                    hitRate = maxRate;
                }
                else
                {
                    hitRate = 0;
                }
                return(hitRate > 0);
            }
            return(true);
        }
Ejemplo n.º 4
0
 public static void LoadPlayerSkills(ISkillContext context, ISkillPlayer owner, List <string> skills)
 {
     if (null == owner.SkillCore)
     {
         owner.SkillCore = new SkillCore(context);
     }
     owner.SkillCore.LoadSkill(owner, skills);
 }
Ejemplo n.º 5
0
 public void Init(ISkillContext context)
 {
     this.mContext = context;
     buffMap       = new MapList <int, IBuff>();
     stateMap      = new Dictionary <int, int>();
     buffTimerMap  = new Dictionary <int, Queue <int> >();
     timerService  = ServiceLocate.Instance.GetService <TimerService>();
 }
Ejemplo n.º 6
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>();
 }
Ejemplo n.º 7
0
 public virtual void Init(SkillData skillData, ISkillContext skillContext)
 {
     data           = skillData;
     context        = skillContext;
     id             = data?.Id ?? 0;
     skillParamDic  = new Dictionary <int, CommonParam>();
     buffParamDic   = new Dictionary <int, CommonParam>();
     skillRecordDic = new Dictionary <int, Dictionary <int, int> >();
     isInit         = true;
     OnOwnedSkill(identifyId);
 }
Ejemplo n.º 8
0
        public void Init(ISkillContext context)
        {
            if (context == null)
            {
                return;
            }

            skillContext = context;
            skills       = SkillWorldContext.CreateSKillList(context);
            isInit       = true;
        }
Ejemplo n.º 9
0
 public void GetTargets(ISkillContext context,
                        SkillActionData data, CommonParam param)
 {
     if (param.IsBounce && param.BounceParam.BounceTime > 1) //弹射
     {
         BounceSearch(context, data, param);
     }
     else
     {
         NormalSearch(context, data, param);
     }
 }
Ejemplo n.º 10
0
        public SkillCore(ISkillContext context)
        {
            this._context = context;
            var dic = new Dictionary <EnumSkillTimeType, List <ISkill> >(6);

            dic[EnumSkillTimeType.Session]   = new List <ISkill>();
            dic[EnumSkillTimeType.Section]   = new List <ISkill>();
            dic[EnumSkillTimeType.Minute]    = new List <ISkill>();
            dic[EnumSkillTimeType.Round]     = new List <ISkill>();
            dic[EnumSkillTimeType.PreDecide] = new List <ISkill>();
            this._skillDic  = dic;
            this._skillList = new List <ISkill>();
        }
Ejemplo n.º 11
0
        public static int GetTimeWeight(ISkillContext context, EnumSkillTimeType timeType)
        {
            switch (timeType)
            {
            case EnumSkillTimeType.Minute:
                return(context.RoundPerMinute);

            case EnumSkillTimeType.Section:
                return(context.RoundPerSection);

            default:
                return(1);
            }
        }
Ejemplo n.º 12
0
        private bool IsValid(ISkill skill, int id, int identifyId, bool isBuff, ref SkillActionData data)
        {
            if (skill == null)
            {
                SkillUtil.LogError("skill is nullptr");
                return(false);
            }

            data = SkillUtil.GetSkillActionData(id);
            ISkillContext skillContext = skill.GetContext();

            if (data == null)
            {
                SkillUtil.LogError(SkillUtil.GetSkillDebugDes(skill) + "技能数据尚未初始化");
                return(false);
            }

            if (skillContext == null)
            {
                SkillUtil.LogError(SkillUtil.GetSkillDebugDes(skill) + "技能数据尚未初始化");
                return(false);
            }

            var param = skill.GetParam(identifyId, isBuff);

            if (param == null)
            {
                return(false);
            }

            SkillTargetSearch.Instance.GetTargets(skillContext, data, param);

            if (!param.HasTargets())
            {
                if (param.IsBounce)
                {
                    SkillUtil.Log(SkillUtil.GetSkillDebugDes(skill) + "技能没有目标 弹射结束");
                    skill.RemoveSkillAction(data.Id, param);
                }
                else
                {
                    SkillUtil.LogError(SkillUtil.GetSkillDebugDes(skill) + "ActionID->" + id + " 技能没有目标");
                }

                return(false);
            }

            return(true);
        }
Ejemplo n.º 13
0
        private void FilterTarget(ISkillContext context, SkillActionData data, CommonParam param)
        {
            removelist.Clear();

            var targets      = param.Targets;
            var needTeamType = (SkillTargetTeamType)data.Team;

            for (int i = 0; i < targets.Count; i++)
            {
                var target = targets[i];

                if (needTeamType != SkillTargetTeamType.ALl) //阵营
                {
                    var targetTeamType = target.GetTargetTeamType();
                    if (target == context.GetSelfActor()) //todo 待数据层成型 删除
                    {
                        targetTeamType = SkillTargetTeamType.Friend;
                    }
                    if (targetTeamType != needTeamType)
                    {
                        removelist.Add(target);
                    }
                }

                if (!data.Type.Contains((int)SkillTargetType.All))  //类型
                {
                    for (int j = 0; j < data.Type.Count; j++)
                    {
                        var needType = (SkillTargetType)data.Type[j];
                        if (needType == target.GetTargetType())
                        {
                            break;
                        }
                        if (j == data.Type.Count - 1)
                        {
                            removelist.Add(target);
                        }
                    }
                }
            }


            for (int i = 0; i < removelist.Count; i++)
            {
                targets.Remove(removelist[i]);
            }
        }
Ejemplo n.º 14
0
        public static void LoadHideSkills(ISkillContext context, ISkillManager owner)
        {
            var hideSkills = RawSkillCache.Instance().GetHideSkills();

            if (hideSkills.Count == 0)
            {
                return;
            }
            ISkill skill = null;

            foreach (var rawSkill in hideSkills)
            {
                skill = new Skill(context, owner, "");
                skill.Load(rawSkill);
                skill.Invoke();
            }
        }
Ejemplo n.º 15
0
        public static EnumSkillTimeType CheckSkillTime(ISkillContext context)
        {
            int round = context.MatchRound;

            if (round <= 0)
            {
                return(EnumSkillTimeType.Session);
            }
            int weight = context.RoundPerSection;

            if (weight > 0 && round % weight == 1)
            {
                return(EnumSkillTimeType.Section);
            }
            weight = context.RoundPerMinute;
            if (weight > 0 && round % weight == 1)
            {
                return(EnumSkillTimeType.Minute);
            }
            return(EnumSkillTimeType.Round);
        }
Ejemplo n.º 16
0
        static List <ISkill> CreateFakeSkillDatas(ISkillContext skillContext)
        {
            if (skillContext == null)
            {
                SkillUtil.LogError("skillContext is Null");
                return(null);
            }

            List <ISkill> dataList       = new List <ISkill>();
            int           skillContextId = skillContext.GetSkillContextId();

            if (dic.ContainsKey(skillContextId))
            {
                var lists = dic[skillContextId];
                for (int i = 0; i < lists.Count; i++)
                {
                    ISkill skill = new Skill();
                    skill.Init(SkillUtil.GetSkillData(lists[i]), skillContext);
                    dataList.Add(skill);
                }
            }

            return(dataList);
        }
Ejemplo n.º 17
0
        public static List <ISkill> CreateSKillList(ISkillContext skillContext)
        {
            //todo  Load skillList index From Role Data

            return(CreateFakeSkillDatas(skillContext));
        }
Ejemplo n.º 18
0
 public BoostCore(ISkillContext context)
 {
     this._context = context;
 }
Ejemplo n.º 19
0
 public BuffSet(ISkillContext context, IBuff refBuff, int buffId)
 {
     this._context  = context;
     this._buffRoot = refBuff.Clone(buffId);
 }
Ejemplo n.º 20
0
 public BuffCore(ISkillContext context)
 {
     this._context = context;
 }
Ejemplo n.º 21
0
        /// <summary>
        /// 弹射模式下的搜索
        /// </summary>
        /// <param name="context"></param>
        /// <param name="data"></param>
        /// <param name="param"></param>
        private void BounceSearch(ISkillContext context,
                                  SkillActionData data, CommonParam param)
        {
            if (data.Id != param.BounceParam.SearchTargetActionId)
            {
                return;
            }

            param.ResetTarget();
            var bounceData = SkillUtil.GetSkillActionData(param.BounceParam.BounceActionId);

            //弹射检查范围
            SkillUtil.TryParseWithDebug(bounceData.Para4, out int range, "弹射范围");
            bool isIgnoreRepeat = string.Equals("1", data.Para5);

            //todo  fake data,need real check
            var targetArrary = GameObject.FindObjectsOfType <TestSkillActor>();

            param.AddTargets(targetArrary);
            FilterTarget(context, data, param);
            var targets = param.Targets;

            //1.排除自己
            //2.排除已经弹射过的
            //3.找距离最近的
            //4.已经死亡的排除
            float       minDistance  = float.MaxValue;
            ISkillActor nearestActor = null;

            for (int i = 0; i < targets.Count; i++)
            {
                var target = targets[i];
                if (target.IsDead())
                {
                    continue;
                }
                //todo TestSkillActor remove
                if ((TestSkillActor)target == (TestSkillActor)context.GetSelfActor())
                {
                    continue;
                }
                if (!isIgnoreRepeat && param.BounceParam.HasBounced(target))
                {
                    continue;
                }

                var distance = Vector3.Distance(target.GetTransform().position,
                                                param.BounceParam.LastBouncedActor.GetTransform().position);
                if (distance < minDistance && distance <= range)
                {
                    minDistance  = distance;
                    nearestActor = target;
                }
            }

            param.ResetTarget();
            if (nearestActor != null)
            {
                param.AddTarget(nearestActor);
            }
        }
Ejemplo n.º 22
0
        private void NormalGetTargets(ISkillContext context,
                                      SkillActionData data, CommonParam param)
        {
            var rangeType  = (SkillTargetRangeType)data.Radius.Key;
            var centerType = (SkillTargetCenter)data.Center;

            //线性投射会把Hit的目标动态AddTarget进来
            //跟踪投射 策划会配置Center为2
            if (centerType != SkillTargetCenter.ProjectileHitPoint)
            {
                param.ResetTarget();
            }

            if (rangeType == SkillTargetRangeType.None) //不需要检测距离
            {
                switch (centerType)
                {
                case SkillTargetCenter.Caster:
                    //添加技能施放者
                    param.AddTarget(context.GetSelfActor());
                    break;

                case SkillTargetCenter.Target:
                    //添加被施法目标
                    param.AddTarget(param.ActorClicked);
                    break;

                default:     //todo delete this later
                    param.AddTarget(param.ActorClicked);
                    break;
                }
            }
            else
            {
                Vector3 center = Vector3.zero;
                center = GetCenterTarget(context, data, param);
                var range = data.Radius.Value;

                switch (rangeType)
                {
                //todo
                case SkillTargetRangeType.Circle:
                case SkillTargetRangeType.Rect:
                case SkillTargetRangeType.Sector:
                    //todo fake 暂时都按照 Radius处理
                    var targetArrary = GameObject.FindObjectsOfType <TestSkillActor>();
                    for (int i = 0; i < targetArrary.Length; i++)
                    {
                        var target = targetArrary[i];
                        if (target.IsDead())
                        {
                            continue;
                        }
                        var distance = Vector3.Distance(target.GetTransform().position, center);
                        if (distance <= range)
                        {
                            param.AddTarget(target);
                        }
                    }

                    break;
                }
            }
        }