Jump to content

[ToolBox][Vanilla - WOTLK] Many Useful Functions (Custom script)


Recommended Posts

Hi,

this is a toolbox kit i put together with different some code i had laying around, enjoy!

using robotManager.Helpful;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using wManager.Wow.Bot.Tasks;
using wManager.Wow.Enums;
using wManager.Wow.Helpers;
using wManager.Wow.ObjectManager;

public class Tool
{
    public static void LearningSpells(string SpellName)
    {
        Lua.LuaDoString(string.Format(@"
        for i=1,GetNumTrainerServices() do
        local name = GetTrainerServiceInfo(i)
        if (name == '{0}') then
            BuyTrainerService(i)
         end
        end
        ", SpellName.Replace("'", "\'")));
    }

    public static bool RecipeIsKnown(string profession, string RecipeName)
    {
        bool Known = Lua.LuaDoString<bool>(string.Format(@"
            if not TradeSkillFrame then
            CastSpellByName('{0}')
            end
            if TradeSkillFrame:IsVisible() == nil then
            CastSpellByName('{0}')
            end 
            numTradeSkills = GetNumTradeSkills()
            for i = 1, numTradeSkills do
            tradeSkillName, _, _, _ = GetTradeSkillInfo(i)
            if (tradeSkillName == '{1}') then
            return true;
            end
            if (TradeSkillFrame:IsVisible()) then
            TradeSkillFrame:Hide();
            end
            end
            return false;
        ", profession, RecipeName));

        Thread.Sleep(100);
        return Known;
    }
    // Craft works for Wrath of the Lich king
    public static void Craft(string profession, string itemName, int quantity)
    {
        if (RecipeIsKnown(profession, itemName) == true)
        {
            if (Usefuls.WowVersion == 12340)
            {
                Lua.LuaDoString(string.Format(@"
                  if not TradeSkillFrame then
                           CastSpellByName('{0}')
                   end

                    if TradeSkillFrame:IsVisible() == nil then
                      CastSpellByName('{0}')
                     end 

                     for i=1,GetNumTradeSkills() do
                  local name, _, _, _ = GetTradeSkillInfo(i)
                   if (name == '{1}') then
                  DoTradeSkill(i, {2})
                      end
                  
                  if (TradeSkillFrame:IsVisible() and {2} < 2) then
                  TradeSkillFrame:Hide();
                  end
                      end
               ",
                  profession, itemName, quantity));
            }
            else
            if (Usefuls.WowVersion == 8606 || Usefuls.WowVersion == 5875)
            {
                Lua.LuaDoString(string.Format(@"
             if not TradeSkillFrame then
             CastSpellByName('{0}')
             end
            if TradeSkillFrame:IsVisible() == nil then
             CastSpellByName('{0}')
             end 
             for i=1,GetNumTradeSkills() do
            local name, _, _, _ = GetTradeSkillInfo(i)
            if (name == '{1}') then
            DoTradeSkill(i, {2})
            end
            if (TradeSkillFrame:IsVisible() and {2} < 2) then
            TradeSkillFrame:Hide();
            end
            end
            ", profession, itemName, quantity));
            }
        }
    }

    public static void RemoveItem(int Itemid)
    {
        Lua.LuaDoString(string.Format(@"for i=0,4 do
	        for p=1,36 do
		        if GetContainerItemID(i,p) == {0} then
			         PickupContainerItem(i,p)
			           DeleteCursorItem();
			         return
		         end
	         end
        end", Itemid));
    }

    public static void UseItem(int itemID)
    {
        Lua.LuaDoString(string.Format(@"for bag = 0,4 do
	    for slot = 1,GetContainerNumSlots(bag) do
		    local item = GetContainerItemID(bag, slot)
		                if (item and item == {0}) then
			                  if (GetContainerItemCooldown(bag,slot)==0) then
			            	    UseContainerItem(bag,slot)
			                 return true
			            end
		            end
	            end
            end
        ", itemID));
    }

    public static int HasItem(string itemName)
    {
        var execute =
            "local itemCount = 0; " +
            "for b=0,4 do " +
                "if GetBagName(b) then " +
                    "for s=1, GetContainerNumSlots(b) do " +
                        "local itemLink = GetContainerItemLink(b, s) " +
                        "if itemLink then " +
                            "local _, stackCount = GetContainerItemInfo(b, s)\t " +
                            "if string.find(itemLink, \"" + itemName + "\") then " +
                                "itemCount = itemCount + stackCount; " +
                            "end " +
                        "end " +
                    "end " +
                "end " +
            "end; " +
            "return itemCount; ";
        return Lua.LuaDoString<int>(execute);
    }

public static bool Faction(string FactionName)
    {
        bool rep = Lua.LuaDoString<bool>("for factionIndex = 1, GetNumFactions() do local name, _, standingId = GetFactionInfo(factionIndex); if string.find(name, '" + FactionName.Replace("'", "\'") + "') then return standingId; end end");
        return rep;
    }

    public static void AbandonQuest(string questName)
    {
        Lua.LuaDoString("local name = '" + questName + "' for i=1,GetNumQuestLogEntries() do local questTitle, level, questTag, suggestedGroup, isHeader, isCollapsed, isComplete = GetQuestLogTitle(i) if string.find(questTitle, name) then SelectQuestLogEntry(i) SetAbandonQuest() AbandonQuest() end end");
    }


    public static bool haveKey(int keyId)
    {
        bool haveKey = Lua.LuaDoString<bool>("local itemIdSearch = " + keyId + "; local bag = KEYRING_CONTAINER; for slot = 1,MAX_CONTAINER_ITEMS do local itemLink = GetContainerItemLink(bag,slot); local _, itemCount = GetContainerItemInfo(bag,slot); if itemLink and itemCount then local _,_,itemId = string.find(itemLink, '.*|Hitem:(%d+):.*'); if itemId and tonumber(itemId) == itemIdSearch then return true end end end return false");
        return haveKey;
    }

    public static void BuyItem(string name, int amount)
    {
        Lua.LuaDoString(string.Format(@"
        local itemName = ""{0}""
        local quantity = {1}
        for i=1, GetMerchantNumItems() do
            local name = GetMerchantItemInfo(i)
            if name and name == itemName then 
                BuyMerchantItem(i, quantity)
            end
        end", name, amount));
    }

    public static void Sellitem(string ItemName)
    {
        Lua.LuaDoString(string.Format(@"
        local ItemToSell = '{0}'
        for bag = 0,4,1 do 
        for slot = 1, GetContainerNumSlots(bag), 1 do
                local name = GetContainerItemLink(bag, slot);
                if name and string.find(name, ItemToSell) then
                if (MerchantFrame:IsShown() ) then
                     ShowMerchantSellCursor(1)
                    UseContainerItem(bag, slot)
                   end
                end
            end
        end", ItemName));
    }

    public static bool Face(Vector3 vector3)
    {
        var player = new Vector3(vector3);
        ObjectManager.Me.Rotation = robotManager.Helpful.Math.TargetFacingToRadian(ObjectManager.Me.Position, player);
        Move.StrafeLeft();
        Move.StrafeRight();
        return true;

    }
    public static void Fish(Vector3 vector3, Vector3 Water, int SkillLineStart, int SkillLineEnd, uint rode, uint sword)
    {
        while (Skill.GetValue(SkillLine.Fishing) >= SkillLineStart && Skill.GetValue(SkillLine.Fishing) <= SkillLineEnd)
        {
            ItemsManager.UseItem(rode);
            if (!FishingTask.IsLaunched)
            {
                if (GoToTask.ToPosition(vector3, 1.5f))
                {
                    Face(Water);
                    FishingTask.LoopFish();

                }
            }
        }
        FishingTask.StopLoopFish();
        ItemsManager.UseItem(sword);
    }
    public static void CheckUpdate()
    {
        try
        {
            string onlineFile = "Github Raw link";
            Quester.Bot.QuesterSetting.Load();
            string profileName = "File.xml";

            string currentFile = System.Windows.Forms.Application.StartupPath + @"\Profiles\Quester\" + profileName;
            var currentFileContent = System.IO.File.ReadAllText(currentFile, System.Text.Encoding.UTF8);
            var onlineFileContent = new System.Net.WebClient { Encoding = System.Text.Encoding.UTF8 }.DownloadString(onlineFile);

            if (!string.IsNullOrWhiteSpace(currentFileContent) && !string.IsNullOrWhiteSpace(onlineFileContent))
            {
                if (currentFileContent != onlineFileContent)
                {
                    Logging.Write("New version found, try to update file", (Logging.LogType)1, System.Drawing.Color.Red);
                    System.IO.File.WriteAllText(currentFile, onlineFileContent);
                    Thread.Sleep(500);
                    new Thread(() => robotManager.Products.Products.ProductRestart()).Start();
                }
            }
            Logging.Write("[Auto Updater]The version on your pc is the latest updated version.", (Logging.LogType)1, System.Drawing.Color.Red);
        }
        catch (Exception e)
        {
            Logging.WriteError("Auto update: " + e);

        }
    }

    public static int InteractItems(List<string> itemNames, int interactions = int.MaxValue)
    {
        if (!itemNames.Any())
            return -1;
        var execute =
            "local counter = 0; " +
            "local leftStacks = 0; " +
            "for b=0,4 do " +
            "if GetBagName(b) then " +
            "for s=1, GetContainerNumSlots(b) do " +
            "local itemLink = GetContainerItemLink(b, s) " +
            "if itemLink then " +
            "local _, stackCount = GetContainerItemInfo(b, s)\t" +
            "if string.find(itemLink, \"" + itemNames.FirstOrDefault() + "\") ";
        if (itemNames.Count > 1)
        {
            execute = itemNames.Where(obj => itemNames.FirstOrDefault() != obj).Aggregate(execute, (current, obj) => current + "or string.find(itemLink, \"" + obj + "\") ");
        }
        execute = execute +
                  "then " +
                  "if (counter < " + interactions + ") then " +
                  "UseContainerItem(b, s); " +
                  "counter = counter + 1; " +
                  "else " +
                  "leftStacks = leftStacks + 1;" +
                  "end " +
                  "\tend\tend\tend end end return leftStacks;";
        return Lua.LuaDoString<int>(execute);
    }

    /// <summary>
    /// Sends a mail to a recipient.
    /// </summary>
    /// <param name="recipient">The recipient.</param>
    /// <param name="subject">The subject.</param>
    /// <param name="itemNames">The items to send as names.</param>
    /// <returns>true if successful ; false if no mailbox available or stacks are left.</returns>
    public static bool SendItems(string recipient, string subject, List<string> itemNames)
    {
        var mailBox = ObjectManager.GetObjectWoWGameObject().FirstOrDefault(i => i.IsMailbox && i.GetDistance <= 5);
        if (mailBox == null || string.IsNullOrWhiteSpace(recipient))
            return false;
        if (subject.Length == 0)
            subject = "-";
        if (mailBox)
        {
            const int delayMs = 800;
            var timeOut = DateTime.Now.AddSeconds(40);
            Interact.InteractGameObject(mailBox.GetBaseAddress);
            Thread.Sleep(delayMs);
            Lua.LuaDoString("RunMacroText('/click MailFrameTab2');");
            Thread.Sleep(delayMs);

            var leftStack = InteractItems(itemNames, 12);
            Thread.Sleep(delayMs);
            Lua.LuaDoString(@"SendMail(\" + recipient + ",\"{subject}\",\" \");");
            Thread.Sleep(delayMs * 3);

            while (leftStack != 0 && DateTime.Now < timeOut)
            {
                leftStack = InteractItems(itemNames, 12);
                Thread.Sleep(delayMs);
                Lua.LuaDoString(string.Format(@"SendMail(\" + recipient + ",\"{subject}\",\" \");"));
                Thread.Sleep(delayMs * 3);
            }

            Lua.LuaDoString("CloseMail();");
            if (leftStack != 0)
                return false;
        }
        return true;
    }
 public static bool Achievement(int achievementID, int index)
    {
        bool haveAchievement = Lua.LuaDoString<bool>("local achievementID = " + achievementID + "; local indexCriteria = " + index +"; local achievementInfo = {GetAchievementInfo(achievementID)}; if achievementInfo[4] then return achievementInfo[4] end local achCriteriaInfo = {GetAchievementCriteriaInfo(achievementID, indexCriteria)}; return achCriteriaInfo[3];");
        return haveAchievement;
    }
}
public static class Travel
{
    public static class Flight
    {
        //Thunderbluff to Orgrimmar
        static readonly Vector3 ThunderBluffFlightMaster = new Vector3(-1196.75f, 26.0777f, 176.9492f);
        static readonly int FlightMasterID = 2995;
        static readonly Vector3 OrgrimmarPlateform = new Vector3(1676.25f, -4313.45f, 61.79468f);
        static readonly string Orgrimmar = "Orgrimmar";

        //Orgrimmar to Thunderbluff
        static readonly Vector3 OrgrimmarFlightMaster = new Vector3(1676.25f, -4313.45f, 61.79468f);
        static readonly int OrgrimmarFlightMasterID = 3310;
        static readonly Vector3 ThunderBluffPlateform = new Vector3(-1196.75f, 26.0777f, 176.9492f);
        static readonly string Thunderbluff = "Thunder Bluff";

        private static void Wait(Vector3 arrival, int distance)
        {
            if (ObjectManager.Me.IsOnTaxi)
            {
                while (ObjectManager.Me.Position.DistanceTo(arrival) > distance)
                {
                    Thread.Sleep(5000);
                }
            }
        }

        public static bool FlightPathChecker(string FlightPath)
        {
            bool Flight = Lua.LuaDoString<bool>(string.Format(@"
                local node = '{0}'
                if ( TaxiFrame:IsVisible() ) then
					for i=1,NumTaxiNodes() do
						if string.find(TaxiNodeName(i), node) then
							return true;
						end
					end
					return false;
				end", FlightPath.Replace("'", "\'")));

            return Flight;
        }
        public static bool Flying(int npcID, Vector3 vector, string FlightName)
        { 
            if (!ObjectManager.Me.IsOnTaxi)
            {
                while (GoToTask.ToPositionAndIntecractWithNpc(vector, npcID, 1) && !ObjectManager.Me.IsOnTaxi)
                {
                    if (FlightPathChecker(FlightName) == false)
                    {
                        Logging.Write("[Travel]Flight: " + "Sorry, you do not have the flightpath to " + FlightName);
                        break;
                    }
                    int node;
                    node = Lua.LuaDoString<int>("for i=0,30 do if string.find(TaxiNodeName(i),'" + FlightName + "') then return i end end");
                    Lua.LuaDoString("TakeTaxiNode(" + node + ")");
                }
            }
            return true;
        }
        public static void ThunderBluffToOrgrimmar()
        {
            Flying(FlightMasterID, ThunderBluffFlightMaster, Orgrimmar);
            Wait(OrgrimmarPlateform, 5);
        }

        public static void OrgrimmarToThunderBluff()
        {
            Flying(OrgrimmarFlightMasterID, OrgrimmarFlightMaster, Thunderbluff);
            Wait(ThunderBluffPlateform, 5);
        }
    }
}

How to use Tool: 

RunCode (Action): 
- Tool.LearningSpells("Name Of spell"); // Put in name of the spell you wish to buy.
- Tool.Craft("profession", "RecipeName", 1); // This code will only work for Wrath of the lich king
- Tool.RemoveItem(55); // Removes item by ID
- Tool.UseItem(55); // Uses item by ID
- Tool.AbandonQuest("Quest Name"); //Abandon Quest by Name
- Tool.Sellitem("Item Name"); // sell item by name
- Tool.Fish(new Vector3(1, 1, 1), new Vector3(1, 1, 1), 0, 75, 6562, 111); 
- Tool.CheckUpdate(); // updates quester profiles from github.raw
- Tool.SendItems("name", "note", new List<string> { "Super Healing Potion", });  // mail itemlist to another player 

If statements : 
- Tool.RecipeIsKnown("profession", "RecipeName") == true // check if you have this Recipe! If statement!
- Tool.HasItem("itemname") <= 0
- Tool.Faction("Name of the faction", 5) == true // add name of faction, and amount of rep you want to check aganst.  42999 is max rep.  
- Tool.haveKey(KeyID) // checks if you have a key 
- Tool.Achievement(int achievementID, int index)

How to use Travel (RunCode):

Flight : 
- Travel.Flight.ThunderBluffToOrgrimmar();
- Travel.Flight.OrgrimmarToThunderBluff();

I want to say thank you to both @Droidz For his hints on what the problem with was for some code.
ToolBox has many useful functions to help you develop different products. 
Credits (Thanks to these people for there help and or code.) : 
@Droidz for Auto updater.
@reaper for his SendMailing code.
@Ordush for his Crafting Code.
@Matenia for all the helpful links and hints to get this project Toolbox. Must respect!

If you find any bugs or want me to implement anything, Join our discord server and send me a messagehttps://discordapp.com/invite/xQuhs5C

Edited by TheSmokie
Updating 09/26/2020

Updated :

  • added sell specific item (string name) to vender 
  • Remove quest by name 

Code to sell items (you will need code above in your custom script.)

if(wManager.Wow.Bot.Tasks.GoToTask.ToPositionAndIntecractWithNpc(new Vector3(x, y, z), NpcID, 1))
        {
            TB.Sellitem("Name of item");
        }

 

Edited by TheSmokie

Update :
Added - Tool.Fish
Added - Tool.Sendmail
Added - Tool.CheckUpdate
Added - Tool.Havekey

Edited by TheSmokie
  • 4 weeks later...
  • 1 month later...

How can I even use these snippets? I can't figure out where to paste all of it as a whole, to be able to call these statements etc.

I want to use for example HasItem as an "Can condition" and "Is Complete condition" in the Easy Quests Editor

I basically want to interact with custom NPC, as first quest. And my LUA code running from addon folder will take care of buying the item. But I want to tell the bot when the "quest" is complete!

checking for the item with this (not sure if this is correct honestly):
 

Tool.HasItem("Graccu's Mince Meat Fruitcake") > 0

Tool.HasItem("Graccu's Mince Meat Fruitcake") < 1

I can't get it to work, actually I get an error when launching

mg0qwZc.png

lVOZgWY.png

This is precisely what I pasted into Custom Script:

public class Tool
{
    public static int HasItem(string itemName)
    {
        var execute =
            "local itemCount = 0; " +
            "for b=0,4 do " +
                "if GetBagName(b) then " +
                    "for s=1, GetContainerNumSlots(b) do " +
                        "local itemLink = GetContainerItemLink(b, s) " +
                        "if itemLink then " +
                            "local _, stackCount = GetContainerItemInfo(b, s)\t " +
                            "if string.find(itemLink, \"" + itemName + "\") then " +
                                "itemCount = itemCount + stackCount; " +
                            "end " +
                        "end " +
                    "end " +
                "end " +
            "end; " +
            "return itemCount; ";
        return Lua.LuaDoString<int>(execute);
    }
}

 

Oh yeah, I had 2 missing semicolons -- got that sorted

Now I'm confused, the correct way to return is actually this? I'm getting no error if I added it like this:

image.thumb.png.8700cde8fce147469ee5c7e51378a046.png

return Tool.HasItem("Graccu's Mince Meat Fruitcake") > 0;

 

But I'm getting error when I add it like this:

Tool.HasItem("Graccu's Mince Meat Fruitcake") > 0;

image.png.584e986e50cc6fd565f0157a7ca11146.png

So like I did it was correct, simple, nothing complex there. Strange, my bot is not moving to interact with the npc what could I possibly be missing?

Hmm ? maybe the Pulse part is my issue here, gonna look into that

image.thumb.png.760387eabec7a5864cf076f62967aca3.png

image.png.00de4cb3ab9d00e5b589b5980bafc82b.png

I'm just using SuperMacro (this is in my extend file) and have buying the food evented like so, works every time when I right click the vendor and I don't have food on me:

BOTNET:RegisterEvent("MERCHANT_SHOW")

function BOTNET:OnEvent()
    if event == "MERCHANT_SHOW" then
        if itemCount("Graccu's Mince Meat Fruitcake") < 1 and ((UnitName("target") == "Food Vendor")) then
            BuyMerchantItem(1,200);
        end
    end
end

BOTNET:SetScript("OnEvent", BOTNET.OnEvent)

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...