public override void Run()
        {
            Logger.LogDebug("************ RUNNING BUY AND LEARN RECIPE STATE ************");

            Step currentStep  = profession.CurrentStep;
            var  RecipeVendor = currentStep.ItemoCraft.RecipeVendor;

            Logger.Log($"Buying {currentStep.ItemoCraft.Name} recipe at NPC {profession.ProfessionTrainer.Entry}");

            // Check if continent ok
            if ((ContinentId)Usefuls.ContinentId != RecipeVendor.ContinentId)
            {
                Logger.Log($"The vendor is on continent {RecipeVendor.ContinentId}, launching traveler");
                Bot.SetContinent(RecipeVendor.ContinentId);
                return;
            }

            Broadcaster.autoBroadcast = false;

            if (GoToTask.ToPositionAndIntecractWithNpc(RecipeVendor.Position, RecipeVendor.Entry, RecipeVendor.GossipOption))
            {
                Vendor.BuyItem(ItemsManager.GetNameById(currentStep.ItemoCraft.RecipeItemId), 1);
                Thread.Sleep(2000);

                ItemsManager.UseItemByNameOrId(currentStep.ItemoCraft.RecipeItemId.ToString());
                Usefuls.WaitIsCasting();
                Thread.Sleep(300);
            }

            currentStep.KnownRecipe = ToolBox.RecipeIsKnown(currentStep.ItemoCraft.Name, profession);

            Broadcaster.autoBroadcast = true;
        }
        public override void Run()
        {
            Logger.LogDebug("************ RUNNING BUY MATERIALS STATE ************");
            Broadcaster.autoBroadcast = false;

            Step currentStep = profession.CurrentStep;

            foreach (Item.Mat mat in currentStep.ItemoCraft.Materials)
            {
                int amountMissing = currentStep.GetAmountMissingMaterial(mat);
                if (mat.Item.CanBeBought)
                {
                    Npc vendor = mat.Item.Vendor ?? profession.SuppliesVendor;
                    Logger.Log($"Buying {amountMissing} {mat.Item.Name} from NPC {vendor.Entry}");

                    // Check if continent ok
                    if ((ContinentId)Usefuls.ContinentId != vendor.ContinentId)
                    {
                        Logger.Log($"The vendor is on continent {vendor.ContinentId}, launching traveler");
                        Bot.SetContinent(vendor.ContinentId);
                        return;
                    }

                    int estimatedPrice = mat.Item.EstimatedPrice * mat.Amount * amountMissing;
                    Logger.Log($"Estimated price : {estimatedPrice}");
                    if (ObjectManager.Me.GetMoneyCopper >= mat.Amount * amountMissing)
                    {
                        if (GoToTask.ToPositionAndIntecractWithNpc(vendor.Position, vendor.Entry, vendor.GossipOption))
                        {
                            //Vendor.SellItems(wManagerSetting.CurrentSetting.ForceSellList, wManagerSetting.CurrentSetting.DoNotSellList, ToolBox.vendorQuality);

                            int amountToHaveInBag = amountMissing + ItemsManager.GetItemCountById(mat.Item.ItemId);
                            while (ItemsManager.GetItemCountById(mat.Item.ItemId) < amountToHaveInBag && Bag.GetContainerNumFreeSlots > 1)
                            {
                                Logger.LogDebug($"Buying {mat.Item.Name}");
                                Vendor.BuyItem(ItemsManager.GetNameById(mat.Item.ItemId), amountMissing);
                                Thread.Sleep(200);
                            }
                        }
                    }
                    else
                    {
                        Logger.Log($"You don't have enough money to buy {mat.Amount * amountMissing} x {mat.Item.Name} ({estimatedPrice} Copper).");
                    }
                }
            }

            Broadcaster.autoBroadcast = true;
        }
Esempio n. 3
0
        public override void Run()
        {
            List <Npc> listNPCs = new List <Npc>();
            Npc        mailBox  = null;

            // Stop fisher if needed
            if (Products.Products.ProductName == "Fisherbot" && FishingTask.IsLaunched)
            {
                FishingTask.StopLoopFish();
                // Then break the cast
                MovementsAction.MoveBackward(true);
                Thread.Sleep(50);
                MovementsAction.MoveBackward(false);
            }
            // If we need to send items.
            if (nManagerSetting.CurrentSetting.ActivateAutoMaillingFeature && !_suspendMailing &&
                nManagerSetting.CurrentSetting.MaillingFeatureRecipient != string.Empty &&
                Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SendMailWhenLessThanXSlotLeft)
            {
                if (_useMollE)
                {
                    MountTask.DismountMount();
                    ItemsManager.UseItem(ItemsManager.GetItemNameById(40768));
                    Thread.Sleep(2000);
                    WoWGameObject portableMailbox = ObjectManager.ObjectManager.GetNearestWoWGameObject(
                        ObjectManager.ObjectManager.GetWoWGameObjectById(191605));
                    if (portableMailbox.IsValid &&
                        portableMailbox.CreatedBy == ObjectManager.ObjectManager.Me.Guid)
                    {
                        mailBox = new Npc
                        {
                            Entry          = portableMailbox.Entry,
                            Position       = portableMailbox.Position,
                            Name           = portableMailbox.Name,
                            ContinentIdInt = Usefuls.ContinentId,
                            Faction        = ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde"
                                ? Npc.FactionType.Horde
                                : Npc.FactionType.Alliance,
                            SelectGossipOption = 0,
                            Type = Npc.NpcType.Mailbox
                        };
                    }
                }
                if (mailBox == null && NpcDB.GetNpcNearby(Npc.NpcType.Mailbox).Entry > 0)
                {
                    mailBox = NpcDB.GetNpcNearby(Npc.NpcType.Mailbox);
                }
                listNPCs.Add(mailBox);
            }
            // If we need to repair.
            if (ObjectManager.ObjectManager.Me.GetDurability <=
                nManagerSetting.CurrentSetting.RepairWhenDurabilityIsUnderPercent &&
                nManagerSetting.CurrentSetting.ActivateAutoRepairFeature)
            {
                if (_magicMountMammoth && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0)
                {
                    if (_travelersTundraMammoth.HaveBuff || _travelersTundraMammoth.IsSpellUsable)
                    {
                        if (!_travelersTundraMammoth.HaveBuff)
                        {
                            MountTask.DismountMount();
                            _travelersTundraMammoth.Launch(true, true, true);
                            Thread.Sleep(2000);
                        }
                        if (ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde")
                        {
                            WoWUnit drixBlackwrench =
                                ObjectManager.ObjectManager.GetNearestWoWUnit(
                                    ObjectManager.ObjectManager.GetWoWUnitByEntry(32641));
                            if (drixBlackwrench.IsValid && drixBlackwrench.IsAlive)
                            {
                                Npc drixBlackwrenchNpc = new Npc
                                {
                                    Entry              = drixBlackwrench.Entry,
                                    Position           = drixBlackwrench.Position,
                                    Name               = drixBlackwrench.Name,
                                    ContinentIdInt     = Usefuls.ContinentId,
                                    Faction            = Npc.FactionType.Horde,
                                    SelectGossipOption = 0,
                                    Type               = Npc.NpcType.Repair
                                };
                                listNPCs.Add(drixBlackwrenchNpc);
                            }
                        }
                        else
                        {
                            WoWUnit gnimo =
                                ObjectManager.ObjectManager.GetNearestWoWUnit(
                                    ObjectManager.ObjectManager.GetWoWUnitByEntry(32639));
                            if (gnimo.IsValid && gnimo.IsAlive)
                            {
                                Npc gnimoNpc = new Npc
                                {
                                    Entry              = gnimo.Entry,
                                    Position           = gnimo.Position,
                                    Name               = gnimo.Name,
                                    ContinentIdInt     = Usefuls.ContinentId,
                                    Faction            = Npc.FactionType.Alliance,
                                    SelectGossipOption = 0,
                                    Type               = Npc.NpcType.Repair
                                };
                                listNPCs.Add(gnimoNpc);
                            }
                        }
                    }
                }
                else if (_magicMountYak && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0)
                {
                    if (_grandExpeditionYak.HaveBuff || _grandExpeditionYak.IsSpellUsable)
                    {
                        if (!_grandExpeditionYak.HaveBuff)
                        {
                            MountTask.DismountMount();
                            _grandExpeditionYak.Launch(true, true, true);
                            Thread.Sleep(2000);
                        }
                        WoWUnit cousinSlowhands =
                            ObjectManager.ObjectManager.GetNearestWoWUnit(
                                ObjectManager.ObjectManager.GetWoWUnitByEntry(62822));
                        if (cousinSlowhands.IsValid && cousinSlowhands.IsAlive)
                        {
                            Npc cousinSlowhandsNpc = new Npc
                            {
                                Entry          = cousinSlowhands.Entry,
                                Position       = cousinSlowhands.Position,
                                Name           = cousinSlowhands.Name,
                                ContinentIdInt = Usefuls.ContinentId,
                                Faction        = ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde"
                                    ? Npc.FactionType.Horde
                                    : Npc.FactionType.Alliance,
                                SelectGossipOption = 0,
                                Type = Npc.NpcType.Repair
                            };
                            listNPCs.Add(cousinSlowhandsNpc);
                        }
                    }
                }
                else if (_use74A)
                {
                    Npc npcA = DoSpawnRobot("74A", Npc.NpcType.Repair);
                    if (npcA != null)
                    {
                        listNPCs.Add(npcA);
                    }
                }
                else if (_use110G)
                {
                    Npc npcG = DoSpawnRobot("110G", Npc.NpcType.Repair);
                    if (npcG != null)
                    {
                        listNPCs.Add(npcG);
                    }
                }
                else if (_useJeeves)
                {
                    Npc npcJeeves = DoSpawnRobot("Jeeves", Npc.NpcType.Repair);
                    if (npcJeeves != null)
                    {
                        listNPCs.Add(npcJeeves);
                    }
                }
                else
                {
                    if (NpcDB.GetNpcNearby(Npc.NpcType.Repair).Entry > 0)
                    {
                        listNPCs.Add(NpcDB.GetNpcNearby(Npc.NpcType.Repair));
                    }
                }
            }

            // If we need to sell.
            if (NeedFoodSupplies() || NeedDrinkSupplies() ||
                Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SellItemsWhenLessThanXSlotLeft &&
                nManagerSetting.CurrentSetting.ActivateAutoSellingFeature && !_suspendSelling)
            {
                if (_magicMountMammoth && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0)
                {
                    if (_travelersTundraMammoth.HaveBuff || _travelersTundraMammoth.IsSpellUsable)
                    {
                        if (!_travelersTundraMammoth.HaveBuff)
                        {
                            MountTask.DismountMount();
                            _travelersTundraMammoth.Launch(true, true, true);
                            Thread.Sleep(2000);
                        }
                        if (ObjectManager.ObjectManager.Me.PlayerFaction.ToLower() == "horde")
                        {
                            WoWUnit mojodishu =
                                ObjectManager.ObjectManager.GetNearestWoWUnit(
                                    ObjectManager.ObjectManager.GetWoWUnitByEntry(32642));
                            if (mojodishu.IsValid && mojodishu.IsAlive)
                            {
                                Npc mojodishuNpc = new Npc
                                {
                                    Entry              = mojodishu.Entry,
                                    Position           = mojodishu.Position,
                                    Name               = mojodishu.Name,
                                    ContinentIdInt     = Usefuls.ContinentId,
                                    Faction            = Npc.FactionType.Horde,
                                    SelectGossipOption = 0,
                                    Type               = Npc.NpcType.Vendor
                                };
                                listNPCs.Add(mojodishuNpc);
                            }
                        }
                        else
                        {
                            WoWUnit hakmuddArgus =
                                ObjectManager.ObjectManager.GetNearestWoWUnit(
                                    ObjectManager.ObjectManager.GetWoWUnitByEntry(32638));
                            if (hakmuddArgus.IsValid && hakmuddArgus.IsAlive)
                            {
                                Npc hakmuddArgusNpc = new Npc
                                {
                                    Entry              = hakmuddArgus.Entry,
                                    Position           = hakmuddArgus.Position,
                                    Name               = hakmuddArgus.Name,
                                    ContinentIdInt     = Usefuls.ContinentId,
                                    Faction            = Npc.FactionType.Alliance,
                                    SelectGossipOption = 0,
                                    Type               = Npc.NpcType.Vendor
                                };
                                listNPCs.Add(hakmuddArgusNpc);
                            }
                        }
                    }
                }
                else if (_magicMountYak && MountTask.GetMountCapacity() >= MountCapacity.Ground && Skill.GetValue(SkillLine.Riding) > 0)
                {
                    if (_grandExpeditionYak.HaveBuff || _grandExpeditionYak.IsSpellUsable)
                    {
                        if (!_grandExpeditionYak.HaveBuff)
                        {
                            MountTask.DismountMount();
                            _grandExpeditionYak.Launch(true, true, true);
                            Thread.Sleep(2000);
                        }
                        WoWUnit cousinSlowhands =
                            ObjectManager.ObjectManager.GetNearestWoWUnit(
                                ObjectManager.ObjectManager.GetWoWUnitByEntry(62822));
                        if (cousinSlowhands.IsValid && cousinSlowhands.IsAlive)
                        {
                            Npc cousinSlowhandsNpc = new Npc
                            {
                                Entry              = cousinSlowhands.Entry,
                                Position           = cousinSlowhands.Position,
                                Name               = cousinSlowhands.Name,
                                ContinentIdInt     = Usefuls.ContinentId,
                                Faction            = Npc.FactionType.Neutral,
                                SelectGossipOption = 0,
                                Type               = Npc.NpcType.Vendor
                            };
                            listNPCs.Add(cousinSlowhandsNpc);
                        }
                    }
                }
                else if (_use74A)
                {
                    Npc npcA = DoSpawnRobot("74A", Npc.NpcType.Vendor);
                    if (npcA != null)
                    {
                        listNPCs.Add(npcA);
                    }
                }
                else if (_use110G)
                {
                    Npc npcG = DoSpawnRobot("110G", Npc.NpcType.Vendor);
                    if (npcG != null)
                    {
                        listNPCs.Add(npcG);
                    }
                }
                else if (_useJeeves)
                {
                    Npc npcJeeves = DoSpawnRobot("Jeeves", Npc.NpcType.Vendor);
                    if (npcJeeves != null)
                    {
                        listNPCs.Add(npcJeeves);
                    }
                }
                else
                {
                    if (NpcDB.GetNpcNearby(Npc.NpcType.Vendor).Entry > 0)
                    {
                        listNPCs.Add(NpcDB.GetNpcNearby(Npc.NpcType.Vendor));
                    }
                }
            }

            #region Repairer, Seller/Buyer, MailBox

            if (listNPCs.Count > 0)
            {
                listNPCs.Sort(OnComparison);
                foreach (Npc npc in listNPCs)
                {
                    Npc  target   = npc;
                    bool doTravel = target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 400 || target.ContinentIdInt != Usefuls.ContinentId;
                    if (!doTravel && target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) <= 400)
                    {
                        // Close NPC but no path ?
                        bool success;
                        PathFinder.FindPath(ObjectManager.ObjectManager.Me.Position, target.Position, Usefuls.ContinentNameMpq, out success);
                        if (!success)
                        {
                            doTravel = true;
                        }
                    }
                    //Start travel

                    if (_travelLocation != null && _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 0.1f)
                    {
                        if (Products.Products.TravelRegenerated && Products.Products.TravelFrom.IsValid)
                        {
                            _travelLocation = Products.Products.TravelFrom;
                            Products.Products.TravelRegenerated = false;
                        }
                    }
                    if (doTravel && (_travelLocation == null || _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) > 0.1f) && !_travelDisabled && !Usefuls.IsFlying)
                    {
                        MovementManager.StopMove();
                        switch (npc.Type)
                        {
                        case Npc.NpcType.Repair:
                            Logging.Write("Calling travel system to NpcRepair " + npc.Name + " (" + npc.Entry + ")...");
                            break;

                        case Npc.NpcType.Vendor:
                            Logging.Write("Calling travel system to NpcVendor " + npc.Name + " (" + npc.Entry + ")...");
                            break;

                        case Npc.NpcType.Mailbox:
                            Logging.Write("Calling travel system to Mailbox " + npc.Name + " (" + npc.Entry + ")...");
                            break;

                        default:
                            Logging.Write("Calling travel system for ToTown to " + npc.Name + " (" + npc.Entry + ")...");
                            break;
                        }
                        Products.Products.TravelToContinentId   = target.ContinentIdInt;
                        Products.Products.TravelTo              = target.Position;
                        Products.Products.TravelFromContinentId = Usefuls.ContinentId;
                        Products.Products.TravelFrom            = ObjectManager.ObjectManager.Me.Position;
                        // Pass the check for valid destination as a lambda
                        Products.Products.TargetValidationFct = Quest.IsNearQuestGiver; // compare me.Pos to dest.Pos
                        _travelLocation = Products.Products.TravelFrom;
                        return;
                    }
                    if (_travelLocation != null && _travelLocation.DistanceTo(ObjectManager.ObjectManager.Me.Position) <= 0.1f)
                    {
                        _travelDisabled = true; // don't forget to release travel once arrived.
                    }
                    //Start target finding based on Seller.
                    uint baseAddress = MovementManager.FindTarget(ref target, 0, !ObjectManager.ObjectManager.Me.IsMounted);
                    if (!target.ValidPath)
                    {
                        Logging.WriteDebug("No valid path/travel to Npc " + target.Name + ", removing him from NpcDB.");
                        NpcDB.DelNpc(target);
                    }
                    if (MovementManager.InMovement)
                    {
                        return;
                    }
                    if (target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) >= 5f)
                    {
                        return;
                    }
                    _travelDisabled = false;
                    if (baseAddress == 0 && target.Position.DistanceTo(ObjectManager.ObjectManager.Me.Position) < 5f)
                    {
                        NpcDB.DelNpc(target);
                    }
                    else if (baseAddress > 0)
                    {
                        if (!_travelersTundraMammoth.HaveBuff)
                        {
                            DoProspectingInTown(target);
                            DoMillingInTown(target);
                        }
                        Interact.InteractWith(baseAddress);
                        Thread.Sleep(500);
                        MovementManager.StopMove();
                        if (target.SelectGossipOption != 0)
                        {
                            Lua.LuaDoString("SelectGossipOption(" + target.SelectGossipOption + ")");
                            Thread.Sleep(500);
                        }
                        else if (target.Type == Npc.NpcType.Repair || target.Type == Npc.NpcType.Vendor)
                        {
                            if (!Gossip.SelectGossip(Gossip.GossipOption.Vendor))
                            {
                                Logging.WriteError("Problem with NPC " + npc.Name + " Removing it for NpcDB");
                                NpcDB.DelNpc(npc);
                                return;
                            }
                        }
                        // NPC Repairer
                        if (target.Type == Npc.NpcType.Repair)
                        {
                            Logging.Write("Repair items from " + target.Name + " (" + target.Entry + ").");
                            Vendor.RepairAllItems();
                            Thread.Sleep(1000);
                        }
                        // End NPC Repairer

                        if (target.Type == Npc.NpcType.Vendor)
                        {
                            // NPC Buyer
                            Logging.Write("Selling items to " + target.Name + " (" + target.Entry + ").");
                            List <WoWItemQuality> vQuality = new List <WoWItemQuality>();
                            if (nManagerSetting.CurrentSetting.SellGray)
                            {
                                vQuality.Add(WoWItemQuality.Poor);
                            }
                            if (nManagerSetting.CurrentSetting.SellWhite)
                            {
                                vQuality.Add(WoWItemQuality.Common);
                            }
                            if (nManagerSetting.CurrentSetting.SellGreen)
                            {
                                vQuality.Add(WoWItemQuality.Uncommon);
                            }
                            if (nManagerSetting.CurrentSetting.SellBlue)
                            {
                                vQuality.Add(WoWItemQuality.Rare);
                            }
                            if (nManagerSetting.CurrentSetting.SellPurple)
                            {
                                vQuality.Add(WoWItemQuality.Epic);
                            }
                            Vendor.SellItems(nManagerSetting.CurrentSetting.ForceToSellTheseItems, nManagerSetting.CurrentSetting.DontSellTheseItems, vQuality);
                            Thread.Sleep(3000);
                            if (Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SellItemsWhenLessThanXSlotLeft)
                            {
                                _suspendSelling = true;
                            }
                            // End NPC Buyer

                            // NPC Seller
                            if (NeedFoodSupplies() || NeedDrinkSupplies())
                            {
                                Logging.Write("Buying beverages and food from " + target.Name + " (" + target.Entry + ").");
                            }
                            for (int i = 0; i < 10 && NeedFoodSupplies(); i++)
                            {
                                Vendor.BuyItem(nManagerSetting.CurrentSetting.FoodName, 1);
                            }
                            for (int i = 0; i < 10 && NeedDrinkSupplies(); i++)
                            {
                                Vendor.BuyItem(nManagerSetting.CurrentSetting.BeverageName, 1);
                            }
                            // End NPC Seller
                        }
                        if (target.Type == Npc.NpcType.Repair || target.Type == Npc.NpcType.Vendor)
                        {
                            Gossip.CloseGossip();
                        }

                        // MailBox
                        if (target.Type == Npc.NpcType.Mailbox)
                        {
                            List <WoWItemQuality> mQuality = new List <WoWItemQuality>();
                            if (nManagerSetting.CurrentSetting.MailGray)
                            {
                                mQuality.Add(WoWItemQuality.Poor);
                            }
                            if (nManagerSetting.CurrentSetting.MailWhite)
                            {
                                mQuality.Add(WoWItemQuality.Common);
                            }
                            if (nManagerSetting.CurrentSetting.MailGreen)
                            {
                                mQuality.Add(WoWItemQuality.Uncommon);
                            }
                            if (nManagerSetting.CurrentSetting.MailBlue)
                            {
                                mQuality.Add(WoWItemQuality.Rare);
                            }
                            if (nManagerSetting.CurrentSetting.MailPurple)
                            {
                                mQuality.Add(WoWItemQuality.Epic);
                            }

                            bool mailSendingCompleted = false;
                            for (int i = 7; i > 0 && !mailSendingCompleted; i--)
                            {
                                Interact.InteractWith(baseAddress);
                                Thread.Sleep(1000);
                                Mail.SendMessage(nManagerSetting.CurrentSetting.MaillingFeatureRecipient,
                                                 nManagerSetting.CurrentSetting.MaillingFeatureSubject, "",
                                                 nManagerSetting.CurrentSetting.ForceToMailTheseItems,
                                                 nManagerSetting.CurrentSetting.DontMailTheseItems, mQuality,
                                                 out mailSendingCompleted);
                                Thread.Sleep(500);
                            }
                            if (mailSendingCompleted)
                            {
                                Logging.Write("Sending items to the player " + nManagerSetting.CurrentSetting.MaillingFeatureRecipient + " using " + target.Name + " (" +
                                              target.Entry + ").");
                            }
                            if (Usefuls.GetContainerNumFreeSlots <= nManagerSetting.CurrentSetting.SendMailWhenLessThanXSlotLeft)
                            {
                                _suspendMailing = true;
                            }
                            Lua.LuaDoString("CloseMail()");
                        }
                        // End MailBox
                    }
                    // still on the road, but not in movement for some reasons
                }
            }

            #endregion Repairer, Seller/Buyer, MailBox
        }