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
What do you mean by " Growing community" Wrobot has no alternatives, and it's here for few years already, nothing to advertise, everyone who wanted to bot is already here. With easy free stuff you will just make botting harder cause of gm awarness. More bots - less bots ( cause of more bans from gms ). Botting was that easy with hb in 2013, i had to maintance 120 accounts on EU to get some profit. Thanks to free stuff from azyul. Findeh is right, Just check video on youtube with HB bots on Battleground, it has 529 thousand views, ofcourse gms cant ignore that.
@Ordush The bad thing in supporting bad devs is in my example.
I wanted purchase some good hunter fightclass, i seen only your on the forum, But i purchased few fightclasses from other devs back in days, and was really disapointed with quality and was afraid to invest more in other fightclasses, (in your hunter), But When i purchased your warrior prot for tests, it actually works as in description, i was surprised that something paid works as in description, isnt it funny? For now before any other purchases i will think twice, cause droidz really support devs that have wrong description
@Ordush The bad thing in supporting bad devs is in my example.
I wanted purchase some good hunter fightclass, i seen only your on the forum, But i purchased few fightclasses from other devs back in days, and was really disapointed with quality and was afraid to invest more in other fightclasses, (in your hunter), But When i purchased your warrior prot for tests, it actually works as in description, i was surprised that something paid works as in description, isnt it funny? For now before any other purchases i will think twice, cause droidz really support devs that have wrong description
I never seen HB running to a wrong vendor, meanwhile i should manually clear database in wrobot, so yeah, there are many problems with bot.
Same with vendoring, and npc interactions (inkeepers or any with gossip options)
It's really faster to make your own profile for your needs, instead of waiting developers to do something for you, moreover you probably not gonna leveling all wow classes just for fun, i'm leveling mostly paladins/druids/shamans/rogues/warrios, and made different profiles for each class, had no problems with warriors on atlantiss, 4 days til lvl 40 without any help fully afk, doubt any of paid profiles here can do the same. @Findeh Actually never seen that stupid bot behaviours ingame, only in 2016 maybe.
The main reason why there are no Good paid profiles on the forum, cause only good real botters understand what they can meet midleveling, so even if they do good quester, they 99% not gonna share it, or even sell, cause as said Findeh, 2.5 buyers will make only competition and low profit, worth only bot with it for yourself.
I'm pretty satisfied with not ideal wrobot, cause with easy bot there gonna be more noobs and price for gold or accs will be much less.
P.S , with hb documentation i made 1-90 fully afk quest leveling in RAF mode, (x3 exp award for quests/mobs) With wrobot i dont even know where to google some things.
If only you could make an option to send logs so no one can download it except you, cause i dont want to show ppl where i'm farming gold and leveling
Will try your advices. ty
If only you could make an option to send logs so no one can download it except you, cause i dont want to show ppl where i'm farming gold and leveling
Will try your advices. ty
Now i'm running only 2 wow's on virtual machines, also added pagefile.sys to 500-1000, looks like it fixed. Ram were around 1.5gb of 3, i even tried 4096ram, had the same with 3 accounts. And 1core 3 threads had the same problem, more often when i tried to laucnh 3rd bot, but sometimes even with 2 bots. CPU usage is nearly 20-30% only with 2 accounts, and ram around 30-50%
Actually probably i didnt install SlimDX, maybe it fixed that, gonna try to add one more acc soon, will update info
"Talented programmer" nah dude
They are just checking the time your pc has been running which is possible through warden (Matenia mentioned it before), and if multiple players match the same time, it's obviosly a multi-botter.
Matenia even wrote a script that lets you bypass this, but I can't find it at the moment ?