Exemple #1
0
        private void FinishedMechanicsed(uint skillId, List <KeyValuePair <uint, uint> > targets, bool isPlayer)
        {
            SkillData     skillData     = SkillData.GetSkillDataById(skillId);
            MechanicsData mechanicsData = MechanicsData.GetMechanicsDataById(skillData.timeline.First().Value.First());//第一个作用效果

            switch (mechanicsData.targetType)
            {
            case TargetType.Ally:    //己方暂不用更新状态,因为己方给己方使用技能,状态未改变
                break;

            case TargetType.Enemy:
            {
                for (int i = 0, iCount = targets.Count; i < iCount; i++)
                {
                    KeyValuePair <uint, uint> kvp = targets[i];
                    uint characterId = kvp.Key;

                    if (!VirtualServerControllerUtil.ExistInDic(characterId, beLcokedDic))
                    {
                        FinishedMechanicsed(characterId, !isPlayer);
                    }
                }
            }
            break;
            }
        }
Exemple #2
0
        public static List <CharacterEntity> SwitchCharacterLayer(SkillInfo skillInfo, List <Dictionary <uint, List <KeyValuePair <uint, uint> > > > timelineList, bool isPlayer, int layer)
        {
            List <CharacterEntity> result = new List <CharacterEntity>();

            for (int j = 0, count = timelineList.Count; j < count; j++)
            {
                Dictionary <uint, List <KeyValuePair <uint, uint> > > mechanicsDic = timelineList[j];
                List <uint> mechanicsKeys = mechanicsDic.GetKeys();
                //List<Triple<float, float, float>> mechanicsValues = skillInfo.skillData.mechanicsValues[j];
                for (int k = 0, kCount = mechanicsKeys.Count; k < kCount; k++)
                {
                    uint mechanicsId = mechanicsKeys[k];
                    List <KeyValuePair <uint, uint> > tids = mechanicsDic[mechanicsId];
                    MechanicsData mechanicsData            = MechanicsData.GetMechanicsDataById(mechanicsId);
                    for (int m = 0, mCount = tids.Count; m < mCount; m++)
                    {
                        KeyValuePair <uint, uint> tid     = tids[m];
                        CharacterEntity           target1 = CharacterUtil.FindTarget(mechanicsData.targetType, isPlayer, tid.Key);
                        //CharacterEntity target2 = CharacterUtil.FindTarget(mechanicsData.targetType, isPlayer, tid.Value);
                        if (target1)
                        {
                            TransformUtil.SwitchLayer(target1.transform, layer);
                            result.Add(target1);
                        }
                        //TransformUtil.SwitchLayer(target2.transform, layer);
                    }
                }
            }
            return(result);
        }
Exemple #3
0
        public BuffInfo(CharacterEntity character, CharacterEntity target, SkillInfo skillInfo, MechanicsData mechanics, BuffType buffType, SkillLevelBuffAddType skillLevelBuffAddType, BuffAddType buffAddType, int count, uint targetSkillId, float value, uint level, int judgeType)
        {
            this.mechanics   = mechanics;
            this.character   = character;
            this.target      = target;
            this.skillInfo   = skillInfo;
            this.buffType    = buffType;
            this.buffAddType = buffAddType;
            this.judgeType   = judgeType;
#if UNITY_EDITOR
            this.skillLevelBuffAddType = skillLevelBuffAddType;
#endif
            this.targetSkillId = targetSkillId;
            this.count         = count;
            switch (skillLevelBuffAddType)
            {
            case SkillLevelBuffAddType.Time:

                break;

            case SkillLevelBuffAddType.Value:
            {
                float result = Skill.SkillUtil.GetMechanicsValueByAdvanceLevel(value, character.characterInfo.dlevel);
                result     = BuffUtil.GetBuffValue(result, level);
                this.value = result;
            }
            break;
            }
            kindness      = BuffUtil.Judge(this.buffType, this.value);
            originalValue = this.value;
            interval      = 1;
        }
        public static void RemoveFromDic(uint characterId, Dictionary <string, List <KeyValuePair <uint, uint> > > beLcokedDic)
        {
            List <string> lockedKeys = beLcokedDic.GetKeys();
            List <KeyValuePair <uint, uint> > lockedList = null;

            for (int j = 0, count = lockedKeys.Count; j < count; j++)
            {
                string key = lockedKeys[j];
                KeyValuePair <uint, uint> kvp = key.SplitToKeyValuePair <uint, uint>();
                SkillData     sd = SkillData.GetSkillDataById(kvp.Value);
                MechanicsData md = MechanicsData.GetMechanicsDataById(sd.timeline.First().Value.First());//第一个作用效果
                if (md.targetType == TargetType.Ally)
                {
                    continue;
                }
                lockedList = beLcokedDic[key];
                for (int i = 0, iCount = lockedList.Count; i < iCount; i++)
                {
                    if (lockedList[i].Key == characterId)
                    {
                        lockedList.RemoveAt(i);
                        break;
                    }
                }
                lockedList = null;
            }
            lockedKeys.Clear();
            lockedKeys = null;
        }
Exemple #5
0
 public BuffInfo(CharacterEntity target, MechanicsData mechanics, BuffType buffType, float time, float intervalTime, int count, float value)
 {
     this.mechanics = mechanics;
     this.target    = target;
     this.buffType  = buffType;
     this.time      = TimeController.instance.fightSkillTime + time;
     this.value     = value;
     this.count     = count;
     kindness       = BuffUtil.Judge(this.buffType, this.value);
     interval       = (int)intervalTime;
 }
Exemple #6
0
        public BuffInfo(CharacterEntity character, CharacterEntity target, SkillInfo skillInfo, MechanicsData mechanics, BuffType buffType, SkillLevelBuffAddType skillLevelBuffAddType, BuffAddType buffAddType, float time, float value, uint level, int judgeType)
        {
            this.mechanics   = mechanics;
            this.character   = character;
            this.target      = target;
            this.skillInfo   = skillInfo;
            this.buffType    = buffType;
            this.buffAddType = buffAddType;
            this.judgeType   = judgeType;
#if UNITY_EDITOR
            this.skillLevelBuffAddType = skillLevelBuffAddType;
#endif
            switch (skillLevelBuffAddType)
            {
            case SkillLevelBuffAddType.Time:
            {
                float result = Skill.SkillUtil.GetMechanicsValueByAdvanceLevel(time, character.characterInfo.dlevel);
                result     = BuffUtil.GetBuffValue(result, level);
                this.time  = TimeController.instance.fightSkillTime + result;
                this.value = value;
                break;
            }

            case SkillLevelBuffAddType.Value:
            {
                float result = Skill.SkillUtil.GetMechanicsValueByAdvanceLevel(value, character.characterInfo.dlevel);
                result     = BuffUtil.GetBuffValue(result, level);
                this.value = result;
                this.time  = TimeController.instance.fightSkillTime + time;
                break;
            }

            default:
                this.time  = TimeController.instance.fightSkillTime + time;
                this.value = value;
                break;
            }
            kindness      = BuffUtil.Judge(this.buffType, this.value);
            originalValue = this.value;
            interval      = 1;
        }
Exemple #7
0
        private uint GetTargetAreaPositionId(MechanicsData mechanicsData, List <KeyValuePair <uint, uint> > tids, bool isPlayer)
        {
            uint positionId = 0;

            switch (mechanicsData.rangeType)
            {
            case RangeType.CurrentSingle:
            case RangeType.CurrentRow:
            case RangeType.CurrentColumn:
            case RangeType.All:
            case RangeType.CurrentAndBehindFirst:
            case RangeType.CurrentAndNearCross:
            case RangeType.CurrentBehindFirst:
            case RangeType.CurrentBehindSecond:
            case RangeType.CurrentIntervalOne:
            case RangeType.CurrentAndRandomTwo:
            case RangeType.Weakness:
            case RangeType.LowestHP:
            case RangeType.RandomSingle:
            case RangeType.CurrentAndBehindTowColum:
                CharacterEntity firstTarget = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tids.First().Key);
                positionId = firstTarget.positionId;
                break;

            case RangeType.RandomN:
            case RangeType.Cross:
            case RangeType.SecondColum:
            case RangeType.ExceptMidpoint:
            case RangeType.Midpoint:
            case RangeType.AllAbsolutely:
            case  RangeType.BehindTowColum:
                switch (mechanicsData.targetType)
                {
                case TargetType.Ally:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Player_Position_5;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_5;
                    }
                    break;

                case TargetType.Enemy:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_5;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Player_Position_5;
                    }
                    break;
                }
                break;

            case RangeType.FirstColum:
            case RangeType.SecondRow:
                switch (mechanicsData.targetType)
                {
                case TargetType.Ally:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Player_Position_2;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_2;
                    }
                    break;

                case TargetType.Enemy:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_2;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Player_Position_2;
                    }
                    break;
                }
                break;

            case RangeType.ThirdColum:
                switch (mechanicsData.targetType)
                {
                case TargetType.Ally:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Player_Position_7;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_7;
                    }
                    break;

                case TargetType.Enemy:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_7;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Player_Position_7;
                    }
                    break;
                }
                break;

            case RangeType.FirstRow:
            case RangeType.LeadingDiagonal:
                switch (mechanicsData.targetType)
                {
                case TargetType.Ally:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Player_Position_1;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_1;
                    }
                    break;

                case TargetType.Enemy:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_1;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Player_Position_1;
                    }
                    break;
                }
                break;

            case RangeType.ThirdRow:
            case RangeType.SecondaryDiagonal:
                switch (mechanicsData.targetType)
                {
                case TargetType.Ally:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Player_Position_3;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_3;
                    }
                    break;

                case TargetType.Enemy:
                    if (isPlayer)
                    {
                        positionId = (uint)FormationPosition.Enemy_Position_3;
                    }
                    else
                    {
                        positionId = (uint)FormationPosition.Player_Position_3;
                    }
                    break;
                }
                break;
            }
            return(positionId);
        }
Exemple #8
0
        private void PlayAOEEffects(float lastDelay, int layer)
        {
            #region aoe
            MechanicsData mechanicsData = null;
            List <float>  timelineKeys  = skillInfo.skillData.timeline.GetKeys();
            Dictionary <CharacterEntity, int> judgeTypeDic = new Dictionary <CharacterEntity, int>();
            for (int j = 0, count = timelineList.Count; j < count; j++)
            {
                Dictionary <uint, List <KeyValuePair <uint, uint> > > mechanicsDic = timelineList[j];
                List <uint> mechanicsKeys = mechanicsDic.GetKeys();
                List <Triple <float, float, float> > mechanicsValues = skillInfo.skillData.mechanicsValues[j];
                uint effectId = 0;
                if (skillInfo.skillData.aoeEffects.Length > j)
                {
                    effectId = skillInfo.skillData.aoeEffects[j];
                }
                for (int k = 0, kCount = mechanicsKeys.Count; k < kCount; k++)
                {
                    uint mechanicsId = mechanicsKeys[k];
                    mechanicsData = MechanicsData.GetMechanicsDataById(mechanicsId);
                    List <KeyValuePair <uint, uint> > tids;
                    if (mechanicsData.mechanicsType == MechanicsType.Reborn)
                    {
                        tids = CharacterUtil.FindDeadTargets(mechanicsData.rangeType, mechanicsData.targetType, isPlayer);
                        if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                        {
                            tids.AddRange(CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer));
                        }
                    }
                    else
                    {
                        if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                        {
                            tids = CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer);
                        }
                        else
                        {
                            tids = mechanicsDic[mechanicsId];
                        }
                    }
                    Triple <float, float, float> mechanicsValue = mechanicsValues[k];
                    float delay = timelineKeys[j] + lastDelay;
                    if (GameSetting.instance.effectable)
                    {
                        EffectInfo effectInfo = new EffectInfo(effectId);
                        if (effectInfo.effectData != null)
                        {
                            effectInfo.character      = character;
                            effectInfo.target         = character;
                            effectInfo.skillInfo      = skillInfo;
                            effectInfo.delay          = delay + effectInfo.effectData.delay;
                            effectInfo.mechanicsData  = mechanicsData;
                            effectInfo.mechanicsValue = mechanicsValue;

                            switch (effectInfo.effectData.effectType)
                            {
                            case EffectType.TargetArea:    //根据范围信息取位置
                                uint positionId = GetTargetAreaPositionId(mechanicsData, tids, isPlayer);
                                effectInfo.pos = PositionData.GetPos(positionId);
                                delay         += effectInfo.effectData.delay;
                                break;
                            }
                            EffectController.instance.PlayEffect(effectInfo, layer);
                        }
                    }
                    bool isLastTarget = false;
                    if (FightController.instance.fightStatus == FightStatus.Normal)//矫正因暂停导致时间线推迟
                    {
                        delay -= skillInfo.skillData.pauseTime;
                    }
                    for (int i = 0, iCount = tids.Count; i < iCount; i++)
                    {
                        if (i == iCount - 1)
                        {
                            isLastTarget = true;
                        }
                        CharacterEntity target1 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tids[i].Key);
                        CharacterEntity target2 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tids[i].Value);
                        if (!target1)
                        {
                            continue;
                        }
                        int judgeType = 0;
                        if (!judgeTypeDic.ContainsKey(target1))
                        {
                            judgeType             = JudgeUtil.GetJudgeResult(character, target1, target2, (int)skillInfo.skillData.skillId);
                            judgeTypeDic[target1] = judgeType;
                            if (judgeType == 0)
                            {
                                EffectController.instance.RemoveEffectByPrefabName(EffectController.SPEED_LINE);
                            }
                        }
                        else
                        {
                            judgeType = judgeTypeDic[target1];
                        }
                        if (isPlayer)
                        {
                            MechanicsController.instance.PlayerMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget);
                        }
                        else
                        {
                            MechanicsController.instance.EnemyMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget);
                        }
                    }
                }
            }
            judgeTypeDic.Clear();
            judgeTypeDic = null;
            #endregion
        }
Exemple #9
0
        public void PlayCasterEffect(int layer)
        {
            if (!GameSetting.instance.effectable)
            {
                return;
            }
            #region black screen
            if (skillInfo.animationData.blackScreen > 0)
            {
                EffectInfo effectInfo = new EffectInfo(skillInfo.animationData.blackScreen);
                if (effectInfo.effectData != null)
                {
                    effectInfo.skillInfo = skillInfo;
                    effectInfo.target    = character;
                    effectInfo.delay     = skillInfo.skillData.blackTime;
                    effectInfo.length    = skillInfo.skillData.blackLength;

                    //switch (skillInfo.animationData.animType)
                    //{
                    //    case AnimType.Root:
                    //        effectInfo.length = skillInfo.skillData.timeline.First().Key;// skillInfo.animationData.length - skillInfo.skillData.pauseTime;
                    //        break;
                    //    case AnimType.Trace:
                    //        effectInfo.length = skillInfo.animationData.moveTime + 0.3f;
                    //        break;
                    //}
                    EffectController.instance.PlayEffect(effectInfo, (int)Logic.Enums.LayerType.Scene);
                }
            }
            if (skillInfo.animationData.bgEffect > 0)
            {
                EffectInfo effectInfoBgEffect = new EffectInfo(skillInfo.animationData.bgEffect);
                if (effectInfoBgEffect.effectData != null)
                {
                    effectInfoBgEffect.skillInfo = skillInfo;
                    effectInfoBgEffect.target    = character;
                    effectInfoBgEffect.delay     = skillInfo.skillData.blackTime;
                    effectInfoBgEffect.length    = skillInfo.skillData.blackLength;
                    EffectController.instance.PlayEffect(effectInfoBgEffect, (int)Logic.Enums.LayerType.Scene);
                }
            }
            #endregion
            #region full screen
            if (skillInfo.animationData.fullScreen > 0 && isPlayer)
            {
                EffectInfo effectInfo = new EffectInfo(skillInfo.animationData.fullScreen);
                if (effectInfo.effectData != null)
                {
                    effectInfo.delay  = skillInfo.skillData.fullScreenTime;// +effectInfo.effectData.delay;
                    effectInfo.target = character;
                    Vector3 pos = PositionData.GetPos((int)FormationPosition.Player_Position_2);
                    effectInfo.pos    = pos;// effectInfo.effectData.offset + new Vector3(0, 0, pos.z);
                    effectInfo.length = skillInfo.skillData.fullScreenLength;
                    //effectInfo.length = skillInfo.animationData.closeupOverTime;
                    EffectController.instance.PlayEffect(effectInfo, layer);
                }
            }
            #endregion
            MechanicsData mechanicsData = MechanicsData.GetMechanicsDataById(timelineList.First().First().Key);//第一个作用效果
            for (int i = 0, count = skillInfo.skillData.effectIds.Length; i < count; i++)
            {
                uint       effectId   = skillInfo.skillData.effectIds[i];
                EffectInfo effectInfo = new EffectInfo(effectId);
                if (effectInfo.effectData == null)
                {
                    continue;
                }
                effectInfo.skillInfo = skillInfo;
                effectInfo.character = character;
                switch (effectInfo.effectData.effectType)
                {
                case EffectType.Root:
                {
                    effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay;
                    Vector3 offset = effectInfo.effectData.offset;
                    if (!isPlayer)
                    {
                        offset.x *= -1;
                    }
                    effectInfo.pos    = PositionData.GetPostionDataById(character.positionId).position + offset;
                    effectInfo.target = character;
                }
                break;

                case EffectType.LockPart:
                    effectInfo.delay     = skillInfo.effectDelay + effectInfo.effectData.delay;
                    effectInfo.lockTrans = TransformUtil.Find(effectInfo.effectData.partName, character.transform);
                    effectInfo.target    = character;
                    break;

                case EffectType.LockTarget:
                    if (effectInfo.effectData.isRotate)
                    {
                        effectInfo.rotateAngles = skillInfo.rotateAngles;
                    }
                    effectInfo.delay  = skillInfo.effectDelay + effectInfo.effectData.delay;
                    effectInfo.target = character;
                    break;

                case EffectType.TargetArea:
                    uint positionId = GetTargetAreaPositionId(mechanicsData, timelineList.First().First().Value, isPlayer);
                    effectInfo.pos    = PositionData.GetPos(positionId);
                    effectInfo.target = character;
                    effectInfo.delay  = effectInfo.effectData.delay;
                    break;

                case EffectType.MoveTargetPos:
                {
                    float moveCost  = (skillInfo.animationData.hitTime - skillInfo.animationData.moveTime);
                    float moveDelay = moveCost * positionRow * GameConfig.timePercent;
                    effectInfo.delay     = skillInfo.effectDelay + effectInfo.effectData.delay + moveDelay;
                    effectInfo.character = character;
                    effectInfo.target    = character;
                    Vector3 offset = effectInfo.effectData.offset;
                    if (!isPlayer)
                    {
                        offset.x *= -1;
                    }
                    effectInfo.pos = endPos + offset;
                }
                break;

                case EffectType.FullScreen:
                    if (!isPlayer)
                    {
                        continue;
                    }
                    effectInfo.delay  = skillInfo.effectDelay + effectInfo.effectData.delay;
                    effectInfo.target = character;
                    Vector3 pos = PositionData.GetPos((int)FormationPosition.Player_Position_2);
                    effectInfo.pos = effectInfo.effectData.offset + new Vector3(0, 0, pos.z);
                    break;

                case EffectType.BlackScreen:
                case EffectType.ShakeScreen:
                    effectInfo.delay = effectInfo.effectData.delay;
                    break;
                }
                EffectController.instance.PlayEffect(effectInfo, layer);
            }
        }
Exemple #10
0
        public override void Execute()
        {
            if (skillInfo == null || timelineList == null)
            {
                return;
            }
            if (!character)
            {
                return;
            }
            if (character.status == Status.Dead)
            {
                return;
            }
            foreach (var kvp in character.characterInfo.passiveIdDic)
            {
                LuaInterface.LuaFunction func = PassiveSkillController.instance.GetPassiveSkillLuaFunction(PassiveSkillController.PLAY_SKILL, kvp.Key);
                if (func != null)
                {
                    func.Call(character, kvp.Value);
                }
            }
            int layer = (int)LayerType.Fight;

            if (FightController.instance.fightStatus == FightStatus.Normal)
            {
                if (skillInfo.skillData.pauseTime > 0)
                {
                    TimeScaler.instance.PauseTrigger(character, skillInfo.skillData.pauseTime / Game.GameSetting.instance.speed, GameScaleMode.Animator, Game.GameSetting.instance.speed, character.anim);
                }
            }
            if (skillInfo.skillData.showTime)
            {
                Logic.UI.SkillBanner.View.SkillBannerView skillBannerView = Logic.UI.SkillBanner.View.SkillBannerView.Open();
                skillBannerView.Show(skillInfo);
                if (isPlayer && FightController.instance.fightType != FightType.SkillDisplay)
                {
                    Logic.UI.SkillHead.View.SkillHeadView.SetRoleInfo(character.characterInfo.roleInfo, SkillHeadViewShowType.Left);
                }
            }

            MechanicsData mechanicsData = null;

            #region camera close up
            if (GameSetting.instance.closeupCameraable)
            {
                if (FightController.instance.fightStatus == FightStatus.Normal)
                {
                    if ((isPlayer || (!isPlayer && EnemyController.instance.isBoss(character.characterInfo.instanceID))) && skillInfo.animationData.closeup)
                    //if (isPlayer && skillInfo.animationData.closeup)
                    {
                        FightController.instance.isCloseup = true;
                        layer = (int)LayerType.Closeup;
                        EnemyController.instance.ShowHPBarViews(false);
                        PlayerController.instance.ShowHPBarViews(false);
                        if (Skill.SkillUtil.GetSkillMechanicsType(skillInfo) == MechanicsType.None)
                        {
                            Logic.UI.SkillBar.Controller.SkillBarController.instance.Show(false);
                        }
                        Judge.Controller.JudgeController.instance.ShowDamageBarViewPool(false);
                        Cameras.Controller.CameraController.instance.ShowMainCamera(false);
                        Transform parent = TransformUtil.Find(Logic.Cameras.Controller.CameraController.CAMERA_NODE, character.transform, true);
                        Cameras.Controller.CameraController.instance.ShowCloseupCamera(character, parent);
                        TransformUtil.SwitchLayer(character.transform, layer);
                        List <CharacterEntity> targets = CharacterUtil.SwitchCharacterLayer(skillInfo, timelineList, isPlayer, layer);
                        FightController.instance.SetCloseupCharacter(character, targets);
                    }
                }
            }
            #endregion
            #region camera

            /*
             #if UNITY_EDITOR
             * if (FightController.imitate || character.characterInfo.roleInfo.heroData.starMax >= 5)
             * {
             #else
             * if (character.characterInfo.roleInfo.heroData.starMax >= 5)
             * {
             #endif
             *  if (skillInfo.skillData.skillType == SkillType.Skill)
             *  {
             *      switch (skillInfo.animationData.animType)
             *      {
             *          case AnimType.Root:
             *              {
             *                  float backTime = skillInfo.skillData.timeline.First().Key - 0.3f;
             *                  if (backTime > 0.5f)
             *                  {
             *                      float delay = 0.3f;
             *                      CameraController.instance.CloseTarget(character, delay);
             *                      //int layerNone = (int)LayerType.None;
             *                      //SwitchCharactersLayer(layerNone, false);
             *                      //CameraController.instance.ResetMainCamera(backTime, () =>
             *                      //{
             *                      //    SwitchCharactersLayer((int)LayerType.Fight, true);
             *                      //});
             *                      CameraController.instance.ResetMainCamera(backTime, null);
             *                  }
             *              }
             *              break;
             *          case AnimType.Trace:
             *              {
             *                  float backTime = skillInfo.animationData.moveTime;
             *                  if (backTime > 0.5f)
             *                  {
             *                      float delay = 0.3f;
             *                      CameraController.instance.CloseTarget(character, delay);
             *                      //int layerNone = (int)LayerType.None;
             *                      //SwitchCharactersLayer(layerNone, false);
             *                      //CameraController.instance.ResetMainCamera(backTime, () =>
             *                      //{
             *                      //    SwitchCharactersLayer((int)LayerType.Fight, true);
             *                      //});
             *                      CameraController.instance.ResetMainCamera(backTime, null);
             *                  }
             *              }
             *              break;
             *          case AnimType.Run:
             *              break;
             *
             *      }
             *  }
             #if UNITY_EDITOR
             * }
             #else
             * }
             #endif
             * */
            if (FightController.instance.fightStatus == FightStatus.Normal && skillInfo.skillData.cameraLength > 0)
            {
                CameraController.instance.CloseTarget(character, skillInfo.skillData.cameraTime);
                CameraController.instance.ResetMainCamera(skillInfo.skillData.cameraTime + skillInfo.skillData.cameraLength);
            }

            #endregion
            if (skillInfo.animationData.animType != AnimType.Run)
            {
                AnimatorUtil.Play(character.anim, Animator.StringToHash(AnimatorUtil.BASE_LAYER + skillInfo.animationData.animName), 0, 0f);
            }
            switch (skillInfo.animationData.animType)
            {
            case AnimType.Root:
            case AnimType.Trace:
                PlayCasterEffect(layer);
                break;
            }

            #region 远程技能特效
            if (skillInfo.animationData.animType == AnimType.Root)
            {
                #region aoe
                //aoe 与 单体互斥
                if (skillInfo.skillData.aoeFlyEffects.Length > 0)
                {
                    #region aeo fly  只有表现,没有效果
                    List <float> timelineKeys = skillInfo.skillData.timeline.GetKeys();
                    for (int j = 0, count = timelineList.Count; j < count; j++)
                    {
                        Dictionary <uint, List <KeyValuePair <uint, uint> > > mechanicsDic = timelineList[j];
                        List <uint> mechanicsKeys = mechanicsDic.GetKeys();
                        uint        effectId      = 0;
                        if (skillInfo.skillData.aoeFlyEffects.Length > j)
                        {
                            effectId = skillInfo.skillData.aoeFlyEffects[j];
                        }
                        for (int k = 0, kCount = mechanicsKeys.Count; k < kCount; k++)
                        {
                            uint mechanicsId = mechanicsKeys[k];
                            mechanicsData = MechanicsData.GetMechanicsDataById(mechanicsId);
                            List <KeyValuePair <uint, uint> > tids;
                            if (mechanicsData.mechanicsType == MechanicsType.Reborn)
                            {
                                tids = CharacterUtil.FindDeadTargets(mechanicsData.rangeType, mechanicsData.targetType, isPlayer);
                                if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                                {
                                    tids.AddRange(CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer));
                                }
                            }
                            else
                            {
                                if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                                {
                                    tids = CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer);
                                }
                                else
                                {
                                    tids = mechanicsDic[mechanicsId];
                                }
                            }
                            float delay = 0f;
                            if (GameSetting.instance.effectable)
                            {
                                EffectInfo effectInfo = new EffectInfo(effectId);
                                if (effectInfo.effectData != null)
                                {
                                    effectInfo.character = character;
                                    effectInfo.target    = character;
                                    effectInfo.skillInfo = skillInfo;
                                    effectInfo.delay     = timelineKeys[j] + effectInfo.effectData.delay;
                                    switch (effectInfo.effectData.effectType)
                                    {
                                    case EffectType.Trace:
                                    case EffectType.CurveTrace:    //感觉跟直线轨迹是一样的
                                        uint         positionId   = GetTargetAreaPositionId(mechanicsData, tids, isPlayer);
                                        PositionData positionData = PositionData.GetPostionDataById(positionId);
                                        effectInfo.rotateAngles = skillInfo.rotateAngles;     //FightController.instance.Rotate(character.transform, positionData.position);
                                        Vector3 offset = effectInfo.effectData.offset;
                                        if (!isPlayer)
                                        {
                                            offset.x *= -1;
                                        }
                                        effectInfo.pos = PositionData.GetPostionDataById(character.positionId).position + offset;
                                        float positionRow = PositionData.GetEnemyPositionLevels(character.positionId, positionId);
                                        effectInfo.time = effectInfo.effectData.moveTime * (positionRow * GameConfig.timePercent + 1f);
                                        Vector3 endOffset = effectInfo.effectData.endOffset;
                                        if (!isPlayer)
                                        {
                                            endOffset.x *= -1;
                                        }
                                        effectInfo.endPos = positionData.position + endOffset;
                                        delay             = effectInfo.effectData.delay + effectInfo.time;
                                        EffectController.instance.PlayEffect(effectInfo, layer);
                                        break;
                                    }
                                }
                            }
                            PlayAOEEffects(delay, layer);//aoe飞行特效只计算特效延迟和飞行时间,不加时间点,aoe特效会计入时间点
                        }
                    }
                }
                else if (skillInfo.skillData.aoeEffects.Length > 0)
                {
                    #endregion
                    PlayAOEEffects(0f, layer);
                }

                #endregion
                #region fly effects
                else
                {
                    bool         isLastTarget = false;
                    List <float> timelineKeys = skillInfo.skillData.timeline.GetKeys();
                    Dictionary <CharacterEntity, int> judgeTypeDic = new Dictionary <CharacterEntity, int>();
                    for (int j = 0, count = timelineList.Count; j < count; j++)
                    {
                        Dictionary <uint, List <KeyValuePair <uint, uint> > > mechanicsDic = timelineList[j];
                        List <uint> mechanicsKeys = mechanicsDic.GetKeys();
                        List <Triple <float, float, float> > mechanicsValues = skillInfo.skillData.mechanicsValues[j];
                        for (int k = 0, kCount = mechanicsKeys.Count; k < kCount; k++)
                        {
                            uint mechanicsId = mechanicsKeys[k];
                            mechanicsData = MechanicsData.GetMechanicsDataById(mechanicsId);
                            List <KeyValuePair <uint, uint> > tids;
                            if (mechanicsData.mechanicsType == MechanicsType.Reborn)//获取重生目标
                            {
                                tids = CharacterUtil.FindDeadTargets(mechanicsData.rangeType, mechanicsData.targetType, isPlayer);
                                if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                                {
                                    tids.AddRange(CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer));
                                }
                            }
                            else
                            {
                                if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely)
                                {
                                    tids = CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer);
                                }
                                else
                                {
                                    tids = mechanicsDic[mechanicsId];
                                }
                            }
                            Triple <float, float, float> mechanicsValue = mechanicsValues[k];
                            uint effectId = 0;
                            if (skillInfo.skillData.flyEffectIds.Count > j)
                            {
                                effectId = skillInfo.skillData.flyEffectIds[j];//所有目标都发射伤害特效
                            }
                            for (int m = 0, mCount = tids.Count; m < mCount; m++)
                            {
                                KeyValuePair <uint, uint> tid = tids[m];
                                if (m == mCount - 1 && k == kCount - 1 && j == count - 1)//最后一个移动特效
                                {
                                    isLastTarget = true;
                                }
                                else
                                {
                                    isLastTarget = false;
                                }
                                CharacterEntity target1 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tid.Key);
                                CharacterEntity target2 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tid.Value);
                                if (target1 == null)
                                {
                                    continue;
                                }
                                float delay = timelineKeys[j];

                                if (GameSetting.instance.effectable)
                                {
                                    EffectInfo effectInfo = new EffectInfo(effectId);
                                    if (effectInfo.effectData != null)
                                    {
                                        effectInfo.character      = character;
                                        effectInfo.skillInfo      = skillInfo;
                                        effectInfo.delay          = delay + effectInfo.effectData.delay;
                                        effectInfo.isLastTarget   = isLastTarget;
                                        effectInfo.target         = target1;
                                        effectInfo.mechanicsData  = mechanicsData;
                                        effectInfo.mechanicsValue = mechanicsValue;
                                        switch (effectInfo.effectData.effectType)
                                        {
                                        case EffectType.Root:
                                            //{
                                            //if (isPlayer != target1.isPlayer)//当目标为友方是不旋转
                                            //{
                                            //    PositionData positionData = PositionData.GetPostionDataById(target1.positionId);
                                            //    FightController.instance.Rotate(character.transform, positionData.position);
                                            //}
                                            effectInfo.rotateAngles = skillInfo.rotateAngles;
                                            //}
                                            break;

                                        case EffectType.LockTarget:    //锁定目标技能特效
                                            //{
                                            //    if (isPlayer != target1.isPlayer)
                                            //    {
                                            //        PositionData positionData = PositionData.GetPostionDataById(target1.positionId);
                                            //        FightController.instance.Rotate(character.transform, positionData.position);
                                            //    }
                                            //}
                                            effectInfo.rotateAngles = skillInfo.rotateAngles;
                                            break;

                                        case EffectType.Trace:
                                        case EffectType.CurveTrace:    //感觉跟直线轨迹是一样的
                                        {
                                            PositionData positionData = PositionData.GetPostionDataById(target1.positionId);
                                            //effectInfo.rotateAngles = FightController.instance.Rotate(character.transform, positionData.position);
                                            effectInfo.rotateAngles = skillInfo.rotateAngles;
                                            Vector3 offset = effectInfo.effectData.offset;
                                            if (!isPlayer)
                                            {
                                                offset.x *= -1;
                                            }
                                            effectInfo.pos = PositionData.GetPostionDataById(character.positionId).position + offset;
                                            float positionRow = PositionData.GetEnemyPositionLevels(character.positionId, target1.positionId);
                                            effectInfo.time = effectInfo.effectData.moveTime * (positionRow * GameConfig.timePercent + 1f);
                                            Vector3 endOffset = effectInfo.effectData.endOffset;
                                            if (!isPlayer)
                                            {
                                                endOffset.x *= -1;
                                            }
                                            effectInfo.endPos = positionData.position + endOffset + new Vector3(0, target1.height * 0.6f, 0);
                                        }
                                        break;
                                        }
                                        delay += effectInfo.effectData.delay + effectInfo.time;
                                        EffectController.instance.PlayEffect(effectInfo, layer);
                                    }
                                }
                                if (FightController.instance.fightStatus == FightStatus.Normal)//矫正因暂停导致时间线推迟
                                {
                                    delay -= skillInfo.skillData.pauseTime;
                                }
                                int judgeType = 0;
                                if (!judgeTypeDic.ContainsKey(target1))
                                {
                                    judgeType             = JudgeUtil.GetJudgeResult(character, target1, target2, (int)skillInfo.skillData.skillId);
                                    judgeTypeDic[target1] = judgeType;
                                    if (judgeType == 0)
                                    {
                                        EffectController.instance.RemoveEffectByPrefabName(EffectController.SPEED_LINE);
                                    }
                                }
                                else
                                {
                                    judgeType = judgeTypeDic[target1];
                                }
                                if (isPlayer)
                                {
                                    MechanicsController.instance.PlayerMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget);
                                }
                                else
                                {
                                    MechanicsController.instance.EnemyMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget);
                                }
                            }
                        }
                    }
                    judgeTypeDic.Clear();
                    judgeTypeDic = null;
                }
                #endregion
            }
            for (int i = 0, count = skillInfo.skillData.audioIds.Count; i < count; i++)
            {
                AudioData audioData = AudioData.GetAudioDataById(skillInfo.skillData.audioIds[i]);
                if (audioData != null)
                {
                    AudioController.instance.PlayAudio(audioData.audioName, !audioData.accelerate, skillInfo.skillData.audioDelay);
                }
            }

            Hero.Model.HeroData heroData        = Hero.Model.HeroData.GetHeroDataByID((int)character.characterInfo.baseId);
            AudioData           attackAudioData = AudioData.GetAudioDataById(heroData.audioAttack);
            if (attackAudioData != null)
            {
                AudioController.instance.PlayAudio(attackAudioData.audioName, !attackAudioData.accelerate);
            }
            #endregion
            finish = true;
        }
Exemple #11
0
        /// <summary>
        /// 查找攻击目标范围
        /// </summary>
        /// <param name="target"></param>
        /// <param name="mechanicsData"></param>
        /// <returns></returns>
        public static List <uint> GetTargetRangePositionIds(CharacterEntity target, MechanicsData mechanicsData, bool isPlayer)
        {
            List <uint> result = null;

            switch (mechanicsData.rangeType)
            {
            case RangeType.CurrentRow:
                result = Position.Model.PositionData.GetRows((int)target.positionData.rowNum, isPlayer);
                break;

            case RangeType.CurrentColumn:
                result = Position.Model.PositionData.GetColumns((int)target.positionData.columnNum, isPlayer);
                break;

            case RangeType.All:
            case RangeType.AllAbsolutely:
                result = new List <uint>();
                for (int i = 1; i <= 9; i++)
                {
                    if (isPlayer)
                    {
                        result.Add((uint)i);
                    }
                    else
                    {
                        result.Add((uint)(100 + i));
                    }
                }
                break;

            case RangeType.CurrentAndBehindFirst:
                result = new List <uint>();
                result.Add(target.positionData.positionId);
                if (target.positionData.columnNum <= 2)
                {
                    result.Add(target.positionData.positionId + 3);
                }
                break;

            case RangeType.CurrentAndNearCross:
                result = new List <uint>();
                result.Add(target.positionData.positionId);
                if (target.positionData.rowNum > 1)
                {
                    result.Add(target.positionData.positionId - 1);
                }
                if (target.positionData.rowNum <= 2)
                {
                    result.Add(target.positionData.positionId + 1);
                }
                if (target.positionData.columnNum <= 2)
                {
                    result.Add(target.positionData.positionId + 3);
                }
                break;

            case RangeType.Cross:
                result = new List <uint>();
                for (int i = 1; i <= 9; i++)
                {
                    if (i % 2 == 0 || i == 5)
                    {
                        if (isPlayer)
                        {
                            result.Add((uint)i);
                        }
                        else
                        {
                            result.Add((uint)(100 + i));
                        }
                    }
                }
                break;

            case RangeType.FirstColum:
                result = Position.Model.PositionData.GetColumns(1, isPlayer);
                break;

            case RangeType.SecondColum:
                result = Position.Model.PositionData.GetColumns(2, isPlayer);
                break;

            case RangeType.ThirdColum:
                result = Position.Model.PositionData.GetColumns(3, isPlayer);
                break;

            case RangeType.FirstRow:
                result = Position.Model.PositionData.GetRows(1, isPlayer);
                break;

            case RangeType.SecondRow:
                result = Position.Model.PositionData.GetRows(2, isPlayer);
                break;

            case RangeType.ThirdRow:
                result = Position.Model.PositionData.GetRows(3, isPlayer);
                break;

            case RangeType.ExceptMidpoint:
                result = new List <uint>();
                for (int i = 1; i <= 9; i++)
                {
                    if (i != 5)
                    {
                        if (isPlayer)
                        {
                            result.Add((uint)i);
                        }
                        else
                        {
                            result.Add((uint)(100 + i));
                        }
                    }
                }
                break;

            case RangeType.Midpoint:
                result = new List <uint>();
                if (isPlayer)
                {
                    result.Add((uint)5);
                }
                else
                {
                    result.Add((uint)105);
                }
                break;

            case RangeType.LeadingDiagonal:
                result = new List <uint>();
                if (isPlayer)
                {
                    result.Add((uint)1);
                    result.Add((uint)5);
                    result.Add((uint)9);
                }
                else
                {
                    result.Add((uint)101);
                    result.Add((uint)105);
                    result.Add((uint)109);
                }
                break;

            case RangeType.SecondaryDiagonal:
                result = new List <uint>();
                if (isPlayer)
                {
                    result.Add((uint)3);
                    result.Add((uint)5);
                    result.Add((uint)7);
                }
                else
                {
                    result.Add((uint)103);
                    result.Add((uint)105);
                    result.Add((uint)107);
                }
                break;

            case RangeType.CurrentAndBehindTowColum:
                result = new List <uint>();
                result.Add(target.positionData.positionId);
                if (target.positionData.columnNum < 2)
                {
                    if (target.isPlayer)
                    {
                        result.Add((uint)4);
                        result.Add((uint)5);
                        result.Add((uint)6);
                        result.Add((uint)7);
                        result.Add((uint)8);
                        result.Add((uint)9);
                    }
                    else
                    {
                        result.Add((uint)104);
                        result.Add((uint)105);
                        result.Add((uint)106);
                        result.Add((uint)107);
                        result.Add((uint)108);
                        result.Add((uint)109);
                    }
                }
                else if (target.positionData.columnNum < 3)
                {
                    if (target.isPlayer)
                    {
                        result.Add((uint)7);
                        result.Add((uint)8);
                        result.Add((uint)9);
                    }
                    else
                    {
                        result.Add((uint)107);
                        result.Add((uint)108);
                        result.Add((uint)109);
                    }
                }
                break;

            case RangeType.BehindTowColum:
                result = new List <uint>();
                if (target.isPlayer)
                {
                    result.Add((uint)4);
                    result.Add((uint)5);
                    result.Add((uint)6);
                    result.Add((uint)7);
                    result.Add((uint)8);
                    result.Add((uint)9);
                }
                else
                {
                    result.Add((uint)104);
                    result.Add((uint)105);
                    result.Add((uint)106);
                    result.Add((uint)107);
                    result.Add((uint)108);
                    result.Add((uint)109);
                }
                break;
            }
            return(result);
        }
Exemple #12
0
        public static List <string> GetEffects(int heroId, bool isSkill)
        {
            List <string> result    = new List <string>();
            List <uint>   effectIds = new List <uint>();
            HeroData      heroData  = HeroData.GetHeroDataByID(heroId);

            if (heroData != null)
            {
                List <uint> skillIds     = new List <uint>();
                List <uint> mechanicsIds = new List <uint>();
                if (!isSkill)
                {
                    if (heroData.hitId > 0)
                    {
                        skillIds.Add(heroData.hitId);
                    }
                    if (heroData.passiveId1 > 0)
                    {
                        for (int i = 0; i < 5; i++)//预留5个被动效果
                        {
                            int passiveMechanicsId = heroId * 100 + 55 + i;
                            if (MechanicsData.ExistMechanicsId((uint)passiveMechanicsId))
                            {
                                mechanicsIds.Add((uint)passiveMechanicsId);
                            }
                        }
                    }
                }
                else
                {
                    if (heroData.skillId1 > 0)
                    {
                        skillIds.Add(heroData.skillId1);
                    }
                    if (heroData.skillId2 > 0)
                    {
                        skillIds.Add(heroData.skillId2);
                    }
                }
                for (int i = 0, count = skillIds.Count; i < count; i++)
                {
                    SkillData skillData = SkillData.GetSkillDataById(skillIds[i]);
                    if (skillData != null)
                    {
                        foreach (var kvp in skillData.timeline)
                        {
                            mechanicsIds.AddRange(kvp.Value);
                        }
                        if (skillData.effectIds.Length > 0)
                        {
                            effectIds.AddRange(skillData.effectIds, true);
                        }
                        if (skillData.aoeEffects.Length > 0)
                        {
                            effectIds.AddRange(skillData.aoeEffects, true);
                        }
                        if (skillData.aoeFlyEffects.Length > 0)
                        {
                            effectIds.AddRange(skillData.aoeFlyEffects, true);
                        }
                        if (skillData.flyEffectIds.Count > 0)
                        {
                            effectIds.AddRange(skillData.flyEffectIds, true);
                        }
                    }
                }
                for (int i = 0, count = mechanicsIds.Count; i < count; i++)
                {
                    MechanicsData mechanicsData = MechanicsData.GetMechanicsDataById(mechanicsIds[i]);
                    if (mechanicsData != null)
                    {
                        if (mechanicsData.effectIds.Length > 0)
                        {
                            effectIds.AddRange(mechanicsData.effectIds, true);
                        }
                    }
                }
            }
            //Debugger.Log("{0} effects count:{1}", heroId, effectIds.Count);
            for (int i = 0, count = effectIds.Count; i < count; i++)
            {
                //Debugger.Log("effect id:{0}", effectIds[i]);
                EffectData effectData = EffectData.GetEffectDataById(effectIds[i]);
                if (effectData != null)
                {
                    switch (effectData.effectType)
                    {
                    case Logic.Enums.EffectType.Root:
                    case Logic.Enums.EffectType.Trace:
                    case Logic.Enums.EffectType.TargetArea:
                    case Logic.Enums.EffectType.LockPart:
                    case Logic.Enums.EffectType.LockTarget:
                    case Logic.Enums.EffectType.CurveTrace:
                    case Logic.Enums.EffectType.MoveTargetPos:
                    case Logic.Enums.EffectType.FullScreen:
                        string path = string.Format("effects/prefabs/{0}", effectData.effectName);
                        if (!result.Contains(path))
                        {
                            result.Add(path);
                        }
                        break;
                    }
                }
            }
            return(result);
        }