Beispiel #1
0
        public override IEnumerable <RunStatus> Execute(ITreeRoot context)
        {
            var root = context as AITreeRoot;

            key = string.Empty;

            var magics = root.Character.Magics;

            if (magics == null || magics.Count == 0)
            {
                yield return(RunStatus.Failure);

                yield break;
            }

            var list = new List <CharacterMagicData>();

            foreach (var i in magics)
            {
                if (i.ReleaseType == (int)Proto.MagicReleaseType.NormalAttack)
                {
                    if (root.Character.IsCoolDown(i.ID, root.Time, false))
                    {
                        list.Add(i);
                    }
                }
            }

            if (list.Count == 0)
            {
                yield return(RunStatus.Failure);

                yield break;
            }

            int result = -1;

            switch (Node.resultType)
            {
            case MagicResultType.Random:
                result = GRandomer.RandomList(list).ID;
                break;

            case MagicResultType.Frist:
                result = list[0].ID;
                break;

            case MagicResultType.Sequence:
                foreach (var i in list)
                {
                    if (releaseHistorys.Contains(i.ID))
                    {
                        continue;
                    }
                    result = i.ID;
                }
                if (result == -1)
                {
                    releaseHistorys.Clear();
                    result = list[0].ID;
                }
                releaseHistorys.Add(result);
                break;
            }
            if (result == -1)
            {
                yield return(RunStatus.Failure);

                yield break;
            }
            root[AITreeRoot.SELECT_MAGIC_ID] = result;
            var config = ExcelToJSONConfigManager.Current.GetConfigByID <CharacterMagicData>(result);

            if (config != null)
            {
                key = config.MagicKey;
            }
            yield return(RunStatus.Success);
        }
        public override G2C_EquipmentLevelUp DoResponse(C2G_EquipmentLevelUp request, Client client)
        {
            var      userID = (long)client.UserState;
            UserData userData;

            if (!MonitorPool.S.Get <UserDataManager>().TryToGetUserData(userID, out userData))
            {
                return(new G2C_EquipmentLevelUp {
                    Code = ErrorCode.NoGamePlayerData
                });
            }

            var item = userData.GetItemByGuid(request.Guid);

            if (item == null)
            {
                return new G2C_EquipmentLevelUp {
                           Code = ErrorCode.NOFoundItem
                }
            }
            ;
            var itemconfig = ExcelToJSONConfigManager.Current.GetConfigByID <ItemData>(item.ItemID);

            if ((ItemType)itemconfig.ItemType != ItemType.Equip)
            {
                return new G2C_EquipmentLevelUp {
                           Code = ErrorCode.Error
                }
            }
            ;
            //装备获取失败
            var equipconfig = ExcelToJSONConfigManager
                              .Current.GetConfigByID <EquipmentData>(int.Parse(itemconfig.Params1));

            if (equipconfig == null)
            {
                return new G2C_EquipmentLevelUp {
                           Code = ErrorCode.Error
                }
            }
            ;

            var equip = userData.GetEquipByGuid(request.Guid);

            if (equip == null)
            {
                if (!userData.MakeEquipInit(request.Guid))
                {
                    return(new G2C_EquipmentLevelUp {
                        Code = ErrorCode.Error
                    });                                                        //nofound item?
                }
                else
                {
                    equip = userData.GetEquipByGuid(request.Guid);
                }
            }

            if (equip == null)
            {
                return(new G2C_EquipmentLevelUp {
                    Code = ErrorCode.Error
                });
            }

            //等级不一样
            if (equip.Level != request.Level)
            {
                return(new G2C_EquipmentLevelUp
                {
                    Code = ErrorCode.Error
                });
            }

            var levelconfig = ExcelToJSONConfigManager
                              .Current
                              .FirstConfig <EquipmentLevelUpData>(t =>
            {
                return(t.Level == request.Level + 1 && t.Quility == equipconfig.Quility);
            });

            if (levelconfig == null)
            {
                //max level
                return(new G2C_EquipmentLevelUp {
                    Code = ErrorCode.Error
                });
            }

            if (levelconfig.CostGold > userData.Gold || levelconfig.CostCoin > userData.Coin)
            {
                return(new G2C_EquipmentLevelUp {
                    Code = ErrorCode.NoEnoughtGold
                });
            }


            if (levelconfig.CostGold > 0)
            {
                userData.SubGold(levelconfig.CostGold);
            }
            if (levelconfig.CostCoin > 0)
            {
                userData.SubCoin(levelconfig.CostCoin);
            }

            var levelUp = GRandomer.Probability10000(levelconfig.Pro);

            if (levelUp)
            {
                userData.LevelUpGuild(request.Guid);
            }

            return(new G2C_EquipmentLevelUp
            {
                Code = ErrorCode.OK,
                LevelUp = levelUp,
                Coin = userData.Coin,
                Gold = userData.Gold,
                ResultEquip = equip
            });
        }
    }
}
Beispiel #3
0
        public override IEnumerable <RunStatus> Execute(ITreeRoot context)
        {
            //state =LastStatus.HasValue? LastStatus.Value:RunStatus.Failure;
            var character = context.UserState as BattleCharacter;
            var per       = character.Controllor.Perception as BattlePerception;
            var root      = context as AITreeRoot;
            var list      = new List <BattleCharacter>();
            var distance  = node.Distance;

            if (!root.GetDistanceByValueType(node.valueOf, distance, out distance))
            {
                getDistanceValue = -1;
                yield return(RunStatus.Failure);

                yield break;
            }
            getDistanceValue = distance;

            //是否保留之前目标
            if (!node.findNew)
            {
                var older = root[AITreeRoot.TRAGET_INDEX];
                if (older != null)
                {
                    var targetCharacter = per.State[(int)older] as BattleCharacter;
                    if (targetCharacter != null)
                    {
                        if (per.Distance(targetCharacter, root.Character) <= distance)
                        {
                            yield return(RunStatus.Success);

                            yield break;
                        }
                    }
                }
            }
            //清除
            root[AITreeRoot.TRAGET_INDEX] = -1L;
            var type = node.teamType;

            //处理使用魔法目标
            if (node.useMagicConfig)
            {
                var magicID = root[AITreeRoot.SELECT_MAGIC_ID];
                if (magicID == null)
                {
                    yield return(RunStatus.Failure);

                    yield break;
                }
                var data = ExcelToJSONConfigManager.Current.GetConfigByID <CharacterMagicData>((int)magicID);
                if (data == null)
                {
                    yield return(RunStatus.Failure);

                    yield break;
                }
                type = (TargetTeamType)data.ReleaseAITargetType;
            }

            per.State.Each <BattleCharacter>(t =>
            {
                //隐身的不进入目标查找
                if (t.Lock.IsLock(ActionLockType.INHIDEN))
                {
                    return(false);
                }

                switch (type)
                {
                case TargetTeamType.Enemy:
                    if (character.TeamIndex == t.TeamIndex)
                    {
                        return(false);
                    }
                    break;

                case TargetTeamType.OwnTeam:
                    if (character.TeamIndex != t.TeamIndex)
                    {
                        return(false);
                    }
                    break;

                case TargetTeamType.OwnTeamWithOutSelf:
                    if (character.Index == t.Index)
                    {
                        return(false);
                    }
                    if (character.TeamIndex != t.TeamIndex)
                    {
                        return(false);
                    }
                    break;

                case TargetTeamType.Own:
                    {
                        if (character.Index != t.Index)
                        {
                            return(false);
                        }
                    }
                    break;

                case TargetTeamType.ALL:
                    {
                        //all
                    }
                    break;

                default:
                    return(false);
                }


                if (per.Distance(t, root.Character) > distance)
                {
                    return(false);
                }
                switch (node.filter)
                {
                case TargetFilterType.Hurt:
                    if (t.HP == t.MaxHP)
                    {
                        return(false);
                    }
                    break;
                }
                list.Add(t);
                return(false);
            });

            //getTargets = list.Count;
            if (list.Count == 0)
            {
                yield return(RunStatus.Failure);

                yield break;
            }


            BattleCharacter target = null;

            switch (node.selectType)
            {
            case TargetSelectType.Nearest:
            {
                target = list[0];
                var d = UVector3.Distance(target.View.Transform.position, character.View.Transform.position);
                foreach (var i in list)
                {
                    var temp = UVector3.Distance(i.View.Transform.position, character.View.Transform.position);
                    if (temp < d)
                    {
                        d      = temp;
                        target = i;
                    }
                }
            }
            break;

            case TargetSelectType.Random:
                target = GRandomer.RandomList(list);
                break;

            case TargetSelectType.HPMax:
            {
                target = list[0];
                var d = target.HP;
                foreach (var i in list)
                {
                    var temp = i.HP;
                    if (temp > d)
                    {
                        d      = temp;
                        target = i;
                    }
                }
            }
            break;

            case TargetSelectType.HPMin:
            {
                target = list[0];
                var d = target.HP;
                foreach (var i in list)
                {
                    var temp = i.HP;
                    if (temp < d)
                    {
                        d      = temp;
                        target = i;
                    }
                }
            }
            break;

            case TargetSelectType.HPRateMax:
            {
                target = list[0];
                var d = (float)target.HP / (float)target.MaxHP;
                foreach (var i in list)
                {
                    var temp = (float)i.HP / (float)i.MaxHP;;
                    if (temp > d)
                    {
                        d      = temp;
                        target = i;
                    }
                }
            }
            break;

            case TargetSelectType.HPRateMin:
            {
                target = list[0];
                var d = (float)target.HP / (float)target.MaxHP;
                foreach (var i in list)
                {
                    var temp = (float)i.HP / (float)i.MaxHP;
                    if (temp < d)
                    {
                        d      = temp;
                        target = i;
                    }
                }
            }
            break;
            }

            index = target.Index;
            root[AITreeRoot.TRAGET_INDEX] = target.Index;


            yield return(RunStatus.Success);
        }
        //处理怪物生成
        private void CreateMonster(BattlePerception per)
        {
            //process Drop;
            if (drop != null)
            {
                DoDrop();
            }

            {
                var groupPos = Data.Monsters.Where(t => t != group)
                               .ToArray();
                group = GRandomer.RandomArray(groupPos);

                var groups = LevelData.MonsterGroupID.SplitToInt();

                var monsterGroups = ExcelToJSONConfigManager.Current.GetConfigs <MonsterGroupData>(t =>
                {
                    return(groups.Contains(t.ID));
                });


                var monsterGroup = GRandomer.RandomArray(monsterGroups);
                drop = ExcelToJSONConfigManager.Current.GetConfigByID <DropGroupData>(monsterGroup.DropID);

                int maxCount = GRandomer.RandomMinAndMax(monsterGroup.MonsterNumberMin, monsterGroup.MonsterNumberMax);
                for (var i = 0; i < maxCount; i++)
                {
                    var m           = monsterGroup.MonsterID.SplitToInt();
                    var p           = monsterGroup.Pro.SplitToInt().ToArray();
                    var monsterID   = m[GRandomer.RandPro(p)];
                    var monsterData = ExcelToJSONConfigManager.Current.GetConfigByID <MonsterData>(monsterID);
                    var data        = ExcelToJSONConfigManager.Current.GetConfigByID <CharacterData>(monsterData.CharacterID);
                    var magic       = ExcelToJSONConfigManager.Current.GetConfigs <CharacterMagicData>(t => { return(t.CharacterID == data.ID); });
                    var Monster     = per.CreateCharacter(monsterData.Level,
                                                          data,
                                                          magic.ToList(),
                                                          2,
                                                          group.Pos.ToGVector3()
                                                          + new UVector3(GRandomer.RandomMinAndMax(-1, 1), 0, GRandomer.RandomMinAndMax(-1, 1)) * i,
                                                          new UVector3(0, 0, 0), -1);
                    //data
                    Monster[HeroPropertyType.DamageMax]
                    .SetBaseValue(Monster[HeroPropertyType.DamageMax].BaseValue + monsterData.DamageMax);
                    Monster[HeroPropertyType.DamageMin]
                    .SetBaseValue(Monster[HeroPropertyType.DamageMin].BaseValue + monsterData.DamageMax);
                    Monster[HeroPropertyType.Force]
                    .SetBaseValue(Monster[HeroPropertyType.Force].BaseValue + monsterData.Force);
                    Monster[HeroPropertyType.Agility]
                    .SetBaseValue(Monster[HeroPropertyType.Agility].BaseValue + monsterData.Agility);
                    Monster[HeroPropertyType.Knowledge]
                    .SetBaseValue(Monster[HeroPropertyType.Knowledge].BaseValue + monsterData.Knowledeg);
                    Monster[HeroPropertyType.MaxMP]
                    .SetBaseValue(Monster[HeroPropertyType.MaxHP].BaseValue + monsterData.HPMax);
                    Monster[HeroPropertyType.MaxMP]
                    .SetBaseValue(Monster[HeroPropertyType.MaxMP].BaseValue + monsterData.HPMax);
                    Monster.Name = string.Format("{0}.{1}", monsterData.NamePrefix, data.Name);

                    Monster.Reset();
                    per.ChangeCharacterAI(data.AIResourcePath, Monster);

                    AliveCount++;
                    Monster.OnDead = (el) =>
                    {
                        CountKillCount++;
                        AliveCount--;
                    };
                }
            }
        }