Esempio n. 1
0
        /// <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)
                        }
                    });
Esempio n. 2
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
     }
 }
Esempio n. 3
0
        /// <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)
                    }
                });
Esempio n. 5
0
        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
                });
            }
        }
Esempio n. 6
0
        /// <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);
            }
        }