Pudge
-
Posts
348 -
Joined
-
Last visited
Reputation Activity
-
Pudge reacted to Matenia in Matenia's HumanMasterPlugin, all Fightclasses and experimental projects for later expansions, including a Quester
Edit: If you send me a PM about this asking for free support, YOU WILL BE BLOCKED. I will NOT compile any of it for you. Do not PM me asking to buy or asking me to help you compile it. If you can't add the binaries to your build to compile it, it's not for you. Put in the effort to learn or ask someone else to do it for you.
The experimental project contains its own quester, own combat engine and own fightclasses using that combat engine. It was developed with 3.3.5a in mind and I tried to move it to Legion+ and 64 bit. None of it works in its current form. Git history may help. This also has a modified version of Reapler's WowDB.
The fightclasses zip contains everything ever posted on here. It has HMP, my fightclasses etc. This works 100%, you just need to put your own WRobot binaries into the projects.
I can't maintain the code anymore and at the moment it just costs me money. Everything has officially been abandoned. Servers will go down in June or July whenever my contract runs out.
Feel free to do with this code whatever you want and do as you please. This does NOT include turning it into paid products.
I had a good run here on WRobot and hope at least the Wholesome team can make use of some of this.
wrobot-experimental.zip wrobot-fightclasses.zip
-
Pudge reacted to TechMecca in How to read packets?
not gonna lie, would be awesome if @DroidzAdd a Asm DetourHook class to wrobot so we can hook functions and have more control over wow. but i know he is using Break points and i dont know if having asm hook will mess with break points.
@Pudgei wrote my own packet sniffer for wow in c++ (its not public) if you want to message me, i can let you use a copy of it.
-
-
Pudge got a reaction from M4k5P0w3r in [Solved] wow error 132 0x80000004 (SINGLE_STEP) at 0023:6B56279F
Relogger > General settings
-
Pudge reacted to Droidz in Autorun plugin
Hi,
I just added the possibility to execute code when starting the bot (code executed after connecting to the authentication server).
The file must be named 'autorun.cs' and be in the 'Plugins' folder. The static method 'Main.Autorun()' is called after compilation.
using System.Windows.Forms; public class Main { public static void Autorun() { MessageBox.Show("Hello World!"); } }
autorun.cs
-
Pudge reacted to Droidz in Getting offsets/opcodes
Hi, the correct code is :
public static string GetTextFixed(string commandline) { uint FrameScript_GetText = 0x0819d40; var commandByte = System.Text.Encoding.UTF8.GetBytes(commandline + "\0"); var luaGetLocalizedTextSpace = wManager.Wow.Memory.WowMemory.AllocData.Get(commandByte.Length); var rCodecave = wManager.Wow.Memory.WowMemory.AllocData.Get(IntPtr.Size); if (luaGetLocalizedTextSpace <= 0) return ""; wManager.Wow.Memory.WowMemory.Memory.WriteBytes(luaGetLocalizedTextSpace, commandByte); wManager.Wow.Memory.WowMemory.Memory.WritePtr(rCodecave, 0); var asm = new[] { wManager.Wow.Memory.WowMemory.CallWrapperCodeRebaseEsp(FrameScript_GetText, 0x0C, luaGetLocalizedTextSpace, -1, 0), "mov ecx, " + rCodecave, "mov [ecx], eax", wManager.Wow.Memory.WowMemory.RetnToHookCode }; wManager.Wow.Memory.WowMemory.InjectAndExecute(asm); var sResult = string.Empty; var a = wManager.Wow.Memory.WowMemory.Memory.ReadPtr(rCodecave); if (a > 0) sResult = wManager.Wow.Memory.WowMemory.Memory.ReadStringUTF8(a); if (string.IsNullOrEmpty(sResult)) sResult = string.Empty; wManager.Wow.Memory.WowMemory.AllocData.Free(luaGetLocalizedTextSpace); wManager.Wow.Memory.WowMemory.AllocData.Free(rCodecave); return sResult; }
-
Pudge reacted to Droidz in 10-year anniversary
Happy New Year to all !
I'm excited to start another year and look forward to continuing to serve you with WRobot.
This year marks a special milestone for us as we celebrate the 10-year anniversary of WRobot.
I'm grateful for your support and look forward to many more years of success together.
Thank you for choosing WRobot, and I hope you have a happy, healthy, and prosperous new year!
View full article
-
Pudge reacted to Droidz in Cannot compile plugin in relogger
Hello,
WRobot compiler doesn't accept recent C# feature like "$".
Use code like
var smth = "123"; Logging.Write("smth = " + smth);
-
Pudge got a reaction from happiness7 in Relogger plugin
Hi, I am trying to make a plugin for a relogger that will change account data depending on the conditions. I am facing a problem.
System.Threading.Tasks.Task.Factory.StartNew(() => { for (int i = 0; i < Relogger.Classes.ReloggerGeneralSettings.CurrentSetting.Profiles.Count; i++) { try { var p = Relogger.Classes.ReloggerGeneralSettings.CurrentSetting.Profiles[i]; if (p.Checked && p.Name.ToLower().Contains("myaccountname")) { robotManager.Helpful.Logging.Write("124"); p.CurrentWowAccount.AccountName = "1242"; p.CurrentWowAccount.Password = "1242"; } } catch (Exception e) { robotManager.Helpful.Logging.WriteError(Name + " > " + e); } } }); When trying to read or change the field CurrentWowAccount.AccountName or CurrentWowAccount.Password I get the error:
[E] 22:26:06 - CHANGEKEY > System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в MyNamespace.MyPlugin.b__0()
Is it possible to implement changing account data through a plugin or is this error a consequence of data protection?
-
Pudge reacted to Droidz in Settings question
You can try to host http server in relogger (with relogger plugin) (you can get/return values (or xml) from it.
It's sample of http server, but for wrobot plugin :
using System.Net; using System.Text; using System.Threading.Tasks; using robotManager.Helpful; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : wManager.Plugin.IPlugin { /* Samples: http://localhost:8000/name http://localhost:8000/jump http://localhost:8000/pos http://localhost:8000/runlua?code=print(%22test%20from%20web%22) */ private readonly bool _debugLog = true; private HttpListener _listener; private readonly string _url = "http://localhost:8000/"; private int _requestCount; private bool _runServer; public void Initialize() { // Create a Http server and start listening for incoming connections _listener = new HttpListener(); _listener.Prefixes.Add(_url); _listener.Start(); if (_debugLog) Logging.WriteDebug("Listening for connections on " + _url); // Handle requests var listenTask = HandleIncomingConnections(); listenTask.GetAwaiter().GetResult(); } public void Dispose() { if (_listener != null) { _runServer = false; _listener.Close(); _listener = null; } } public void Settings() { } private async Task HandleIncomingConnections() { _runServer = true; // While a user hasn't visited the `shutdown` url, keep on handling requests while (_runServer) { // Will wait here until we hear from a connection var ctx = await _listener.GetContextAsync(); // Peel out the requests and response objects var req = ctx.Request; var resp = ctx.Response; // Print out some info about the request if (_debugLog) { Logging.WriteDebug("Request #: " + ++_requestCount); Logging.WriteDebug(req.Url.ToString()); Logging.WriteDebug(req.HttpMethod); Logging.WriteDebug(req.UserHostName); Logging.WriteDebug(req.UserAgent); Logging.WriteDebug(req.Url.AbsolutePath); } var content = string.Empty; // Parse if (req.Url.AbsolutePath == "/name") { content = ObjectManager.Me.Name; } else if (req.Url.AbsolutePath == "/jump") { Move.JumpOrAscend(); content = "done"; } else if (req.Url.AbsolutePath == "/pos") { content = ObjectManager.Me.Position.ToStringXml(); } else if (req.Url.AbsolutePath.StartsWith("/runlua")) { //var r = System.Web.HttpUtility.ParseQueryString(req.Url.Query).Get("code"); var r = req.QueryString["code"]; if (!string.IsNullOrWhiteSpace(r)) { Lua.LuaDoString(r); content = "ok"; } else content = "failed"; } // Write the response info byte[] data = Encoding.UTF8.GetBytes(content); resp.ContentType = "text/html"; resp.ContentEncoding = Encoding.UTF8; resp.ContentLength64 = data.LongLength; // Write out to the response stream (asynchronously), then close it await resp.OutputStream.WriteAsync(data, 0, data.Length); resp.Close(); } } }
-
Pudge reacted to Droidz in Global variable associated with the license key
Hi,
I wrote few time ago sample HTTP server plugin: Test server http.cs
using System.Net; using System.Text; using System.Threading.Tasks; using robotManager.Helpful; using wManager.Wow.Helpers; using wManager.Wow.ObjectManager; public class Main : wManager.Plugin.IPlugin { /* Samples: http://localhost:8000/name http://localhost:8000/jump http://localhost:8000/pos http://localhost:8000/runlua?code=print(%22test%20from%20web%22) */ private readonly bool _debugLog = true; private HttpListener _listener; private readonly string _url = "http://localhost:8000/"; private int _requestCount; private bool _runServer; public void Initialize() { // Create a Http server and start listening for incoming connections _listener = new HttpListener(); _listener.Prefixes.Add(_url); _listener.Start(); if (_debugLog) Logging.WriteDebug("Listening for connections on " + _url); // Handle requests var listenTask = HandleIncomingConnections(); listenTask.GetAwaiter().GetResult(); } public void Dispose() { if (_listener != null) { _runServer = false; _listener.Close(); _listener = null; } } public void Settings() { } private async Task HandleIncomingConnections() { _runServer = true; // While a user hasn't visited the `shutdown` url, keep on handling requests while (_runServer) { // Will wait here until we hear from a connection var ctx = await _listener.GetContextAsync(); // Peel out the requests and response objects var req = ctx.Request; var resp = ctx.Response; // Print out some info about the request if (_debugLog) { Logging.WriteDebug("Request #: " + ++_requestCount); Logging.WriteDebug(req.Url.ToString()); Logging.WriteDebug(req.HttpMethod); Logging.WriteDebug(req.UserHostName); Logging.WriteDebug(req.UserAgent); Logging.WriteDebug(req.Url.AbsolutePath); } var content = string.Empty; // Parse if (req.Url.AbsolutePath == "/name") { content = ObjectManager.Me.Name; } else if (req.Url.AbsolutePath == "/jump") { Move.JumpOrAscend(); content = "done"; } else if (req.Url.AbsolutePath == "/pos") { content = ObjectManager.Me.Position.ToStringXml(); } else if (req.Url.AbsolutePath.StartsWith("/runlua")) { //var r = System.Web.HttpUtility.ParseQueryString(req.Url.Query).Get("code"); var r = req.QueryString["code"]; if (!string.IsNullOrWhiteSpace(r)) { Lua.LuaDoString(r); content = "ok"; } else content = "failed"; } // Write the response info byte[] data = Encoding.UTF8.GetBytes(content); resp.ContentType = "text/html"; resp.ContentEncoding = Encoding.UTF8; resp.ContentLength64 = data.LongLength; // Write out to the response stream (asynchronously), then close it await resp.OutputStream.WriteAsync(data, 0, data.Length); resp.Close(); } } } You can use one port by bot.
But in any case what you want to do require programming knowledge. You can also create one server with API type REST to store data (with C# or more easy tools like python or nodejs), and use this API with bot plugin. You have a lot of possibility, but I can't add it to the bot API.
-
Pudge reacted to Sye in Snippets C# codes for Fight Classes
(Csharp) - return all the Glyph a player has.
private static List<string> Glyphs() { var GlyphNames = @" local Index = {} for i = 1, GetNumGlyphSockets() do local id = select(3, GetGlyphSocketInfo(i)); if id ~= nil then local GlyphName = GetSpellInfo(id); tinsert(Index, GlyphName); end end return unpack(Index); "; return Lua.LuaDoString<List<string>>(GlyphNames); } or if people do not wanna use .Contain in a list format. here is a boolen.
private static bool Glyphs(string GlyphNum) { var GlyphNames = $@" for i = 1, GetNumGlyphSockets() do local id = select(3, GetGlyphSocketInfo(i)); if id ~= nil then local GlyphName = GetSpellInfo(id); if GlyphName and string.find(GlyphName, ""{GlyphNum}"") return true; break; end end end return false; "; return Lua.LuaDoString<bool>(GlyphNames); }
-
Pudge got a reaction from 79135 in Pathfinder
⚠️⚠️⚠️ The problem is urgent. The bot breaks through the wall in cities like harry potter into the portal to hogwarts. What happens to meshes / pathfinding? And why in cities? Why can't the meshes be saved in the bot folder in case of problems with the pathfinder server ?
-
Pudge reacted to Droidz in Copy log to desktop code
Hi, it is code:
private void ButtonCopyLog(object sender, System.Windows.RoutedEventArgs e) { try { var logFilePath = $@"{Others.GetCurrentDirectory}\Logs\{Logging.NameCurrentLogFile()}"; var logCopyDest = $@"{Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)}\{Logging.NameCurrentLogFile()}"; if (File.Exists(logCopyDest)) File.Delete(logCopyDest); File.Copy(logFilePath, logCopyDest); Logging.Write("[Logging]" + Logging.NameCurrentLogFile() + " copied on your desktop."); } catch { } }
-
Pudge got a reaction from 79135 in urgently
[E] 19:09:33 - PathFinder server seem down, use offline pathfinder.
Offline pathfinding does not work, a bunch of bots run into the wall in capitals.
@Droidz, maybe you can do something with it, this is not the first time a problem arises when your servers crash and many of bots, after casting the hearthstone, simply run into the wall in one place, in front of everyone's eyes.
-
Pudge got a reaction from bio33 in urgently
[E] 19:09:33 - PathFinder server seem down, use offline pathfinder.
Offline pathfinding does not work, a bunch of bots run into the wall in capitals.
@Droidz, maybe you can do something with it, this is not the first time a problem arises when your servers crash and many of bots, after casting the hearthstone, simply run into the wall in one place, in front of everyone's eyes.
-
Pudge got a reaction from scsfl in fly away if you meet a specific player
Wonderful, it finally worked, but he still doesn’t want to mount, he had to add the command manually.
You can use it to avoid unwanted players, if this occurs, the bot will stop all actions and fly away to the Crystal Song Forest, the position can be changed, it works only in Northrend
plagin.cs
-
Pudge reacted to Droidz in Help - PathFinder server seem down
Hello, I restarted all servers, problem should be resolved
-
Pudge reacted to Droidz in Stop group of bots by Relogger
Hi, try
for (int i = 0; i < Relogger.Classes.ReloggerGeneralSettings.CurrentSetting.Profiles.Count; i++) { var p = Relogger.Classes.ReloggerGeneralSettings.CurrentSetting.Profiles[i]; if (p.CurrentWowAccount.Server == "Server Name") { if (p.Status == Relogger.Classes.Status.Running) { if (p.ExistWowProcess()) { p.KillWowProcess(); robotManager.Helpful.Logging.Write(Name + ": Kill wow for " + p.Name); } if (p.ExistWRobotProcess()) { p.ExistWRobotProcess(); robotManager.Helpful.Logging.Write(Name + ": Kill Bot for " + p.Name); } p.Stop(); Thread.Sleep(Others.Random(5000, 10000)); } } } I added
if (p.CurrentWowAccount.Server == "Server Name") Make one plugin by serveur
-
Pudge got a reaction from happiness7 in ResetCustomClass
Hi everyone, I have a question, how better to change the fight class... When I use the next code
if(ObjectManager.Me.WowClass == WoWClass.Paladin) { wManager.wManagerSetting.CurrentSetting.CustomClass = "ret_pal.cs"; } CustomClass.DisposeCustomClass(); Thread.Sleep(2000); CustomClass.LoadCustomClass(); Sometimes the fiteclass for some reason does not load, can someone tell me another way without bugs?
And I would also like to understand what the CustomClass.ResetCustomClass() method does?
-
Pudge reacted to Zer0 in ResetCustomClass
CustomClass.ResetCustomClass() reloads the current FightClass. Most products call it when the PLAYER_LEVEL_UP Lua event is fired.
-
Pudge reacted to Marsbar in Custom Script Question
You can hook onto the https://wrobot.eu/byme/doc/html/E-robotManager.Products.Products.OnChangedIsStarted.htm event and run whatever you need to in there
-
Pudge reacted to Droidz in Official WRobot API Documentation
WRobot API Documentation
Website: https://wrobot.eu/byme/doc/
Offline documentation: https://wrobot.eu/byme/doc/WRobot.chm
(from Wotlk version, Updated the 01 February 2021)
Unofficial documentation is available here , it is still very useful because it contains examples and descriptions that are not available in the official.
-
Pudge reacted to Zer0 in c# offmesh connection to use elevator
Here's the method I've made to handle elevators:
public static void AddTransportOffMesh( Vector3 waitForTransport, Vector3 stepIn, Vector3 objectDeparture, Vector3 objectArrival, Vector3 stepOut, int objectId, ContinentId continentId, string name = "", float precision = 0.5f) { OffMeshConnection offMeshConnection = new OffMeshConnection(new List<Vector3> { waitForTransport, new Vector3(stepIn.X, stepIn.Y, stepIn.Z, "None") { Action = "c#: Logging.WriteNavigator(\"Waiting for transport\"); " + "while (Conditions.InGameAndConnectedAndProductStartedNotInPause) " + "{ " + $"var elevator = ObjectManager.GetWoWGameObjectByEntry({objectId}).OrderBy(o => o.GetDistance).FirstOrDefault(); " + $"if (elevator != null && elevator.IsValid && elevator.Position.DistanceTo(new Vector3({objectDeparture.X.ToString().Replace(",", ".")}, {objectDeparture.Y.ToString().Replace(",", ".")}, {objectDeparture.Z.ToString().Replace(",", ".")})) < {precision.ToString().Replace(",", ".")}) " + "break; " + "Thread.Sleep(100); " + "}" }, new Vector3(stepOut.X, stepOut.Y, stepOut.Z, "None") { Action = "c#: Logging.WriteNavigator(\"Wait to leave Elevator\"); " + "while (Conditions.InGameAndConnectedAndProductStartedNotInPause) " + "{ " + $"var elevator = ObjectManager.GetWoWGameObjectByEntry({objectId}).OrderBy(o => o.GetDistance).FirstOrDefault(); " + $"if (elevator != null && elevator.IsValid && elevator.Position.DistanceTo(new Vector3({objectArrival.X.ToString().Replace(",", ".")}, {objectArrival.Y.ToString().Replace(",", ".")}, {objectArrival.Z.ToString().Replace(",", ".")})) < {precision.ToString().Replace(",", ".")}) " + "break; " + "Thread.Sleep(100); " + "}" }, }, (int)continentId, OffMeshConnectionType.Unidirectional, true); offMeshConnection.Name = name; OffMeshConnections.Add(offMeshConnection, true); } And here is how I use it:
AddTransportOffMesh(new Vector3(2865.628, 6211.75, 104.262), // wait for transport new Vector3(2878.712, 6224.032, 105.3798), // Step in new Vector3(2878.315, 6223.635, 105.3792), // Object departure new Vector3(2892.18, 6236.34, 208.908), // Object arrival new Vector3(2880.497, 6226.416, 208.7462, "None"), // Step out 188521, ContinentId.Northrend, "Warsong Hold Elevator UP"); AddTransportOffMesh(new Vector3(2880.497, 6226.416, 208.7462, "None"), // wait for transport new Vector3(2891.717, 6236.516, 208.9086, "None"), // Step in new Vector3(2892.18, 6236.34, 208.908), // Object departure new Vector3(2878.315, 6223.635, 105.3792), // Object arrival new Vector3(2865.628, 6211.75, 104.262), // Step out 188521, ContinentId.Northrend, "Warsong Hold Elevator DOWN"); I've used this for our FlightMaster plugin. In theory, it should also work for other transports.
-
Pudge reacted to TheSmokie in Get Account Name
Hey @pudge, While i was looking to help you, I've looking into offsets that does what you asking, this works, I tested it on my account and it returned the name. enjoy.
Note : i only ran in dev tools.
var accountName = wManager.Wow.Memory.WowMemory.Memory.ReadStringUTF8(0x10D7914); if(!string.IsNullOrEmpty(accountName)) { Logging.Write(accountName.ToString()); }