/// <summary> /// Auto equip hero if there is better equipment available /// </summary> /// <param name="acc">Account</param> public static void AutoEquipHero(Account acc) { foreach (Classificator.HeroItemCategory category in (Classificator.HeroItemCategory[])Enum.GetValues(typeof(Classificator.HeroItemCategory))) { if (category == Classificator.HeroItemCategory.Others) { continue; // Don't equip into hero bag } int currentTier = 0; if (acc.Hero.Equipt.TryGetValue(category, out var item)) { // Hero already has an equipt item for this category currentTier = GetHeroItemTier(item); } var equipWith = acc.Hero.Items .Where(x => GetHeroItemCategory(x.Item) == category) .OrderBy(x => GetHeroItemTier(x.Item)) .LastOrDefault(); if (equipWith != null && GetHeroItemTier(equipWith.Item) > currentTier && acc.Hero.Status == Hero.StatusEnum.Home) { TaskExecutor.AddTaskIfNotExists(acc, new HeroEquip() { ExecuteAt = DateTime.Now, Items = new List <(Classificator.HeroItemEnum, int)>() { (equipWith.Item, 0) } });
public static void StartAccountTasks(Account acc) { // If we don't know server speed, go and get it if (acc.AccInfo.ServerSpeed == 0) { TaskExecutor.AddTaskIfNotExists(acc, new GetServerSpeed() { ExecuteAt = DateTime.MinValue.AddHours(2) }); } if (acc.AccInfo.MapSize == 0) { TaskExecutor.AddTaskIfNotExists(acc, new GetMapSize() { ExecuteAt = DateTime.MinValue.AddHours(2) }); } //FL if (acc.Farming.Enabled) { TaskExecutor.AddTaskIfNotExists(acc, new SendFLs() { ExecuteAt = DateTime.Now }); } //research / improve / train troops foreach (var vill in acc.Villages) { //if (vill.Troops.Researched.Count == 0) TaskExecutor.AddTask(acc, new UpdateTroops() { ExecuteAt = DateTime.Now, vill = vill }); TroopsHelper.ReStartResearchAndImprovement(acc, vill); if (!TroopsHelper.EverythingFilled(acc, vill)) { TroopsHelper.ReStartTroopTraining(acc, vill); } BuildingHelper.ReStartBuilding(acc, vill); BuildingHelper.ReStartDemolishing(acc, vill); MarketHelper.ReStartSendingToMain(acc, vill); //todo } }
/// <summary> /// Initializes a new village model and creates the task to update the village /// </summary> /// <param name="acc">Account</param> /// <param name="newVill">new village</param> public static void NewVillageFound(Account acc, VillageChecked newVill) { var vill = new Village() { Active = newVill.Active, Coordinates = newVill.Coordinates, Id = newVill.Id, Name = newVill.Name, UnderAttack = newVill.UnderAttack, UnfinishedTasks = new List <VillUnfinishedTask>() // Move this inside Init()? }; vill.Init(acc); acc.Villages.Add(vill); // Update the village TaskExecutor.AddTaskIfNotExistInVillage(acc, vill, new UpdateVillage() { ExecuteAt = DateTime.Now.AddHours(-2), Vill = vill, ImportTasks = true }); DefaultConfigurations.SetDefaultTransitConfiguration(acc, vill); // Copy default settings to the new village. TODO: use automapper for this. //var defaultSettings = acc.NewVillages.DefaultSettings; //vill.Settings = new VillSettings() //{ // Type = defaultSettings.Type, // BarracksTrain = defaultSettings.BarracksTrain, // StableTrain = defaultSettings.StableTrain, // WorkshopTrain = defaultSettings.WorkshopTrain, // GreatBarracksTrain = defaultSettings.GreatBarracksTrain, // GreatStableTrain = defaultSettings.GreatStableTrain, // SendRes = defaultSettings.SendRes, // GetRes = defaultSettings.GetRes, //}; // Change village name var newVillageFromList = acc.NewVillages.Locations .FirstOrDefault(x => x.SettlersSent && x.Coordinates.x == vill.Coordinates.x && x.Coordinates.y == vill.Coordinates.y ); if (newVillageFromList != null) { if (string.IsNullOrEmpty(newVillageFromList.Name)) { newVillageFromList.Name = NewVillageHelper.GenerateName(acc); } acc.NewVillages.Locations.Remove(newVillageFromList); TaskExecutor.AddTaskIfNotExists(acc, new ChangeVillageName() { ExecuteAt = DateTime.Now, ChangeList = new List <(int, string)> { (vill.Id, newVillageFromList.Name) } });
/// <summary> /// Initializes a new village model and creates the task to update the village /// </summary> /// <param name="acc">Account</param> /// <param name="newVill">new village</param> public static void NewVillageFound(Account acc, VillageChecked newVill) { var vill = new Village() { Active = newVill.Active, Coordinates = newVill.Coordinates, Id = newVill.Id, Name = newVill.Name, UnderAttack = newVill.UnderAttack }; vill.Init(acc); acc.Villages.Add(vill); //on new village set the tasks if (string.IsNullOrEmpty(acc.NewVillages.BuildingTasksLocationNewVillage)) { DefaultConfigurations.FarmVillagePlan(acc, vill); } else { IoHelperCore.AddBuildTasksFromFile(acc, vill, acc.NewVillages.BuildingTasksLocationNewVillage); } DefaultConfigurations.SetDefaultTransitConfiguration(acc, vill); vill.Build.AutoBuildResourceBonusBuildings = true; vill.Troops.TroopToTrain = (Classificator.TroopsEnum)((int)(acc.AccInfo.Tribe ?? Classificator.TribeEnum.Any) * 10); //change to acc wide setting // Copy default settings to the new village. TODO: use automapper for this. var defaultSettings = acc.NewVillages.DefaultSettings; vill.Settings = new Models.Settings.VillSettings() { Type = defaultSettings.Type, BarracksTrain = defaultSettings.BarracksTrain, StableTrain = defaultSettings.StableTrain, WorkshopTrain = defaultSettings.WorkshopTrain, GreatBarracksTrain = defaultSettings.GreatBarracksTrain, GreatStableTrain = defaultSettings.GreatStableTrain, SendRes = defaultSettings.SendRes, GetRes = defaultSettings.GetRes, }; // Update the village UpdateDorfs(acc, vill); // Change village name var newVillageFromList = acc.NewVillages.Locations .FirstOrDefault(x => x.SettlersSent && x.coordinates.x == vill.Coordinates.x && x.coordinates.y == vill.Coordinates.y ); if (newVillageFromList != null) { if (string.IsNullOrEmpty(newVillageFromList.Name)) { newVillageFromList.Name = NewVillageHelper.GenerateName(acc); } acc.NewVillages.Locations.Remove(newVillageFromList); TaskExecutor.AddTaskIfNotExists(acc, new ChangeVillageName() { ExecuteAt = DateTime.Now, ChangeList = new List <(int, string)> { (vill.Id, newVillageFromList.Name) } });
public static void StartAccountTasks(Account acc) { // Get the server info (on first running the account) if (acc.AccInfo.ServerSpeed == 0 || acc.AccInfo.MapSize == 0) { TaskExecutor.AddTaskIfNotExists(acc, new GetServerInfo() { ExecuteAt = DateTime.MinValue.AddHours(2) }); } if (acc.AccInfo.Tribe == null) { TaskExecutor.AddTaskIfNotExists(acc, new GetTribe() { ExecuteAt = DateTime.MinValue.AddHours(3) }); } //FL if (acc.Farming.Enabled) { TaskExecutor.AddTaskIfNotExists(acc, new SendFLs() { ExecuteAt = DateTime.Now }); } // Bot sleep TaskExecutor.AddTaskIfNotExists(acc, new Sleep() { ExecuteAt = DateTime.Now + TimeHelper.GetWorkTime(acc), AutoSleep = true }); // Access change var nextAccessChange = TimeHelper.GetNextProxyChange(acc); if (nextAccessChange != TimeSpan.MaxValue) { TaskExecutor.AddTaskIfNotExists(acc, new ChangeAccess() { ExecuteAt = DateTime.Now + nextAccessChange }); } //research / improve / train troops foreach (var vill in acc.Villages) { //if (vill.Troops.Researched.Count == 0) TaskExecutor.AddTask(acc, new UpdateTroops() { ExecuteAt = DateTime.Now, vill = vill }); TroopsHelper.ReStartResearchAndImprovement(acc, vill); TroopsHelper.ReStartTroopTraining(acc, vill); BuildingHelper.ReStartBuilding(acc, vill); BuildingHelper.ReStartDemolishing(acc, vill); MarketHelper.ReStartSendingToMain(acc, vill); ReStartCelebration(acc, vill); VillageHelper.SetNextRefresh(acc, vill); if (vill.FarmingNonGold.OasisFarmingEnabled) { TaskExecutor.AddTaskIfNotExistInVillage(acc, vill, new AttackOasis() { Vill = vill }); } // Remove in later updates! if (vill.Settings.RefreshMin == 0) { vill.Settings.RefreshMin = 30; } if (vill.Settings.RefreshMax == 0) { vill.Settings.RefreshMax = 60; } } // Remove in later updates! if (acc.Hero.Settings.MinUpdate == 0) { acc.Hero.Settings.MinUpdate = 40; } if (acc.Hero.Settings.MaxUpdate == 0) { acc.Hero.Settings.MaxUpdate = 80; } // Hero update info if (acc.Hero.Settings.AutoRefreshInfo) { Random ran = new Random(); TaskExecutor.AddTask(acc, new HeroUpdateInfo() { ExecuteAt = DateTime.Now.AddMinutes(ran.Next(40, 80)), Priority = Tasks.BotTask.TaskPriority.Low }); } }
/// <summary> /// Will be called before each task to update resources/msg?,villages,quests,hero health, adventures num, gold/silver /// </summary> /// <param name="acc">Account</param> /// <returns>True if successful, false if error</returns> private static bool PreTaskRefresh(Account acc) { var html = acc.Wb.Html; try { //check & update dorf1/dorf2 if (!UpdateAccountObject.UpdateVillages(html, acc)) { return(false); //Web browser not initiali } var activeVill = acc.Villages.FirstOrDefault(x => x.Active); //update dorf1/dorf2 if (acc.Wb.CurrentUrl.Contains("dorf1")) { UpdateDorf1Info(acc); } else if (acc.Wb.CurrentUrl.Contains("dorf2")) { UpdateDorf2Info(acc); } acc.AccInfo.CulturePoints = RightBarParser.GetCulurePoints(html, acc.AccInfo.ServerVersion); var villExpansionReady = acc.Villages.FirstOrDefault(x => x.Expansion.ExpensionAvailable); if (acc.AccInfo.CulturePoints.MaxVillages > acc.AccInfo.CulturePoints.VillageCount && villExpansionReady != null) { villExpansionReady.Expansion.ExpensionAvailable = false; TaskExecutor.AddTaskIfNotExists(acc, new SendSettlers() { ExecuteAt = DateTime.Now, vill = villExpansionReady }); } acc.AccInfo.Tribe = LeftBarParser.GetAccountTribe(acc, html); acc.Quests = RightBarParser.GetQuests(html); var goldSilver = RightBarParser.GetGoldAndSilver(html, acc.AccInfo.ServerVersion); acc.AccInfo.Gold = goldSilver[0]; acc.AccInfo.Silver = goldSilver[1]; acc.AccInfo.PlusAccount = RightBarParser.HasPlusAccount(html, acc.AccInfo.ServerVersion); //Check reports/msg count if (MsgParser.UnreadMessages(html, acc.AccInfo.ServerVersion) > 0 && !acc.Wb.CurrentUrl.Contains("messages.php") && !IsTaskOnQueue(acc, typeof(ReadMessage))) { TaskExecutor.AddTask(acc, new ReadMessage() { ExecuteAt = DateTime.Now.AddMilliseconds(AccountHelper.Delay() * 30) }); } //update loyalty of village activeVill.Res.FreeCrop = RightBarParser.GetFreeCrop(html); activeVill.Res.Capacity = ResourceParser.GetResourceCapacity(html, acc.AccInfo.ServerVersion); activeVill.Res.Stored = ResourceParser.GetResources(html); float ratio = (float)activeVill.Res.Stored.Resources.Crop / activeVill.Res.Capacity.GranaryCapacity; if (ratio >= 0.99 && acc.AccInfo.Gold >= 3 && activeVill.Market.Npc.Enabled && (activeVill.Market.Npc.NpcIfOverflow || !MarketHelper.NpcWillOverflow(activeVill))) { //npc crop! TaskExecutor.AddTaskIfNotExistInVillage(acc, activeVill, new NPC() { ExecuteAt = DateTime.MinValue, vill = activeVill }); } if (acc.Settings.AutoActivateProductionBoost && CheckProductionBoost(acc)) { TaskExecutor.AddTask(acc, new TTWarsPlusAndBoost() { ExecuteAt = DateTime.Now.AddSeconds(1) }); } acc.Hero.AdventureNum = HeroParser.GetAdventureNum(html, acc.AccInfo.ServerVersion); acc.Hero.Status = HeroParser.HeroStatus(html, acc.AccInfo.ServerVersion); acc.Hero.HeroInfo.Health = HeroParser.GetHeroHealth(html, acc.AccInfo.ServerVersion); bool heroReady = (acc.Hero.HeroInfo.Health > acc.Hero.Settings.MinHealth && acc.Hero.Settings.AutoSendToAdventure && acc.Hero.Status == Hero.StatusEnum.Home && acc.Hero.NextHeroSend < DateTime.Now); // Update adventures if (heroReady && (acc.Hero.AdventureNum != acc.Hero.Adventures.Count() || HeroHelper.AdventureInRange(acc))) //update adventures { AddTaskIfNotExists(acc, new StartAdventure() { ExecuteAt = DateTime.Now.AddSeconds(10) }); } if (acc.Hero.AdventureNum == 0 && acc.Hero.Settings.BuyAdventures) //for UNL servers, buy adventures { AddTaskIfNotExists(acc, new TTWarsBuyAdventure() { ExecuteAt = DateTime.Now.AddSeconds(5) }); } if (acc.Hero.Status == Hero.StatusEnum.Dead && acc.Hero.Settings.AutoReviveHero) //if hero is dead, revive him { AddTaskIfNotExists(acc, new ReviveHero() { ExecuteAt = DateTime.Now.AddSeconds(5), vill = AccountHelper.GetHeroReviveVillage(acc) }); } if (HeroParser.LeveledUp(html) && acc.Hero.Settings.AutoSetPoints) { AddTaskIfNotExists(acc, new HeroSetPoints() { ExecuteAt = DateTime.Now }); } return(true); } catch (Exception e) { Console.WriteLine("Error in PreTask " + e.Message + "\n\nStack Trace: " + e.StackTrace + "\n-----------------------"); return(false); } }