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 }); } } }
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--; }; } } }