TheSmokie 242 Posted April 12, 2020 Share Posted April 12, 2020 (edited) 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 message. : https://discordapp.com/invite/xQuhs5C Edited October 20, 2020 by TheSmokie Updating 09/26/2020 maukor and Avvi 2 Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/ Share on other sites More sharing options...
mita 1 Posted April 12, 2020 Share Posted April 12, 2020 @Smokie good guy! learn more from your code. And thank for your help. About" TB.Hasitem(55)". If i want check i have item and item quantity,do you have any idea. TheSmokie 1 Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-57606 Share on other sites More sharing options...
TheSmokie 242 Posted April 12, 2020 Author Share Posted April 12, 2020 @mita I have got a method that should work, I’ll release it today. Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-57613 Share on other sites More sharing options...
TheSmokie 242 Posted August 9, 2020 Author Share Posted August 9, 2020 (edited) 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 August 16, 2020 by TheSmokie Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59447 Share on other sites More sharing options...
TheSmokie 242 Posted August 16, 2020 Author Share Posted August 16, 2020 (edited) Update : Added - Tool.Fish Added - Tool.Sendmail Added - Tool.CheckUpdate Added - Tool.Havekey Edited August 16, 2020 by TheSmokie Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59559 Share on other sites More sharing options...
TheSmokie 242 Posted August 20, 2020 Author Share Posted August 20, 2020 Update : Added - Flight Master Code. Added - Flights from Orgrimmar To Thunderbluff and Thunderbluff to Orgrimmar. Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59583 Share on other sites More sharing options...
Andoido 75 Posted August 20, 2020 Share Posted August 20, 2020 Great work man, amazing. Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59584 Share on other sites More sharing options...
TheSmokie 242 Posted August 22, 2020 Author Share Posted August 22, 2020 Update : Added - FlightPathChecker Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59635 Share on other sites More sharing options...
happiness7 3 Posted September 15, 2020 Share Posted September 15, 2020 Nice code, took something. Thank you. But for what public static bool Face(Vector3 vector3) wrobot have MovementManager.Face(vector3); Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-59936 Share on other sites More sharing options...
TheSmokie 242 Posted September 26, 2020 Author Share Posted September 26, 2020 @happiness7 when ever i used MovementManager.Face(new Vector3()); it never worked for me. Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60102 Share on other sites More sharing options...
TheSmokie 242 Posted September 26, 2020 Author Share Posted September 26, 2020 Readded : Achievement (more advanced lua) Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60103 Share on other sites More sharing options...
TheSmokie 242 Posted October 20, 2020 Author Share Posted October 20, 2020 Fixed : Achievement Rep Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60278 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 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 Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60712 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 Add to custom script Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60713 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 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 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); } } Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60715 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 The error kinda tells you the problem mate Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60716 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 return Tool.HasItem("Graccu's Mince Meat Fruitcake") > 0; Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60717 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 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: 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; Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60718 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 It’s Boolean based so you neeed a return to see if it’s true or false. Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60719 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 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 Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60720 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 I’d need to see the profile to add help Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60726 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 Thanks for trying to help, I did not figure it out!!! Basically I'm trying to right click on npc vendors (they are custom npcs in our private server) InteractWithNpcs.xml Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60727 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 Can i see the addon your using? Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60728 Share on other sites More sharing options...
Sorcerer 0 Posted November 30, 2020 Share Posted November 30, 2020 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) Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60729 Share on other sites More sharing options...
TheSmokie 242 Posted November 30, 2020 Author Share Posted November 30, 2020 Your trying to mix c# and lua badly Link to comment https://wrobot.eu/forums/topic/12034-toolboxvanilla-wotlk-many-useful-functions-custom-script/#findComment-60731 Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now