Bring em, bitch.
Bring em, bitch.
1080p or GTFO.
Paladin isn't mine, maybe got some icc25 footage incoming later this week but there's nothing really special in these video's
Ps: the fraps key is the toggle run/walk key on the paladin
Last edited by Robske; 05-28-2010 at 07:47 AM.
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." - Martin Golding
"I cried a little earlier when I had to poop" - Sku
Nice, is it state machine based ? I mean do you manually assign priority or your code logic identify which one need to be healed first ?
Anyone it's nice to see things like this.
/me is also waiting Apoc Onyx's new videos.
My blog: https://pimpmykitty.wordpress.com
PyFasm: https://github.com/srounet/pyfasm
Pymem: https://github.com/srounet/pymem
while trying to learn c# mem reading, figured id post some screens from my "hello world" gui project :wave:
big thanks to JuJu for all my stupid questions and all his help making this possible.. thank you!
project was mainly for aion but merged to wow due to several reasons.
Last edited by QKdefus; 05-30-2010 at 10:13 AM.
A massive thank-you to +Rep Flowerew +Rep, without his wowmapper code and wisdom in IRC I would probably still be staring at ADT's in a hexeditor.
I'm using Flowerew's code to extract the geometry from the ADT's/WMO's etc. I then run the data through Recast+Detour to build a navmesh. Pre-computing the mesh takes around 50 seconds per tile on one of my Xeon E5530 (2.40GHz) cores.
My client is simply loading the navmesh tile, and using FindStraightPath (Detour) to return a list of waypoints and my "bot" is a simple CTM waypoint runner. So for example generating a path from the human spawn point to the guard/npc by the gate results in 9 waypoints:
And my waypoint runner just follows the path, using each point returned as a CTM destination. At the moment I am just navigating within a single tile, next I'll be looking at cross-tile and longer trips. Generating paths takes within this one tile takes literally milliseconds, R+D is exceptionally fast.Code:FindStraightPath: returned 9 points. ... X=-8949.95, Y=-132.493, Z=83.5312 ... X=-8998.8, Y=-107.119, Z=88.1083 ... X=-9017.6, Y=-102.519, Z=87.3083 ... X=-9038, Y=-95.3192, Z=87.9083 ... X=-9039.2, Y=-94.1192, Z=88.1083 ... X=-9046.6, Y=-86.3192, Z=88.3083 ... X=-9047.4, Y=-84.1192, Z=88.3083 ... X=-9046.51, Y=-45.7196, Z=88.3319 ... X=-9046.51, Y=-45.7196, Z=88.3319
Here is a video of it navigating around different parts of the Azeroth_32_48 tile (Human starting area) to demonstrate that it can handle Northshire Abbey and the Cave.
As I said, big thanks to Flowerew for making his wowmapper code available under GPL.
ADT's Class in PHP for ADT editing:
Some code examples:
PHP Code:
//===================================
//ADT MDDF INFO
//===================================
$OFFVALUE = "0x".EndianConverter($STRUCT_INFO["MDDF_Offset"]);
fseek($ADT_Handle,0x14+0x04+$OFFVALUE,SEEK_SET);
$NumDoodads = hexdec("0x".EndianConverter(bin2hex(fread($ADT_Handle,4))));
$NumDoodads = $NumDoodads/36;
$MDDX_DATAZ = array(array());
for($x = 0;$x < $NumDoodads;$x++):
$MDX_DATA = bin2hex(fread($ADT_Handle,36)); //Read the MDDX info for each instance
$MDDX_ID = EndianConverter(substr($MDX_DATA, 0, 8)); //convert bytes and extract info
$MDDX_UNIQUEID = EndianConverter(substr($MDX_DATA, 8, 8)); //convert bytes and extract info
$MDDX_X = hexToFloat(EndianConverter(substr($MDX_DATA, 16, 8)));
$MDDX_Y = hexToFloat(EndianConverter(substr($MDX_DATA, 24, 8))); //convert bytes and extract info
$MDDX_Z = hexToFloat(EndianConverter(substr($MDX_DATA, 32, 8))); //convert bytes and extract info
$MDDX_A = hexToFloat(EndianConverter(substr($MDX_DATA, 40, 8))); //convert bytes and extract info
$MDDX_B = hexToFloat(EndianConverter(substr($MDX_DATA, 48, 8))); //convert bytes and extract info
$MDDX_C = hexToFloat(EndianConverter(substr($MDX_DATA, 56, 8))); //convert bytes and extract info
$MDDX_SCALE = EndianConverter(substr($MDX_DATA, 64, 8)); //convert bytes and extract info
$MDDX_DATAZ[$x][MDDX_ID] = hexdec($MDDX_ID);
$MDDX_DATAZ[$x][MDDX_UNIQUEID] = hexdec($MDDX_UNIQUEID);
$MDDX_DATAZ[$x][MDDX_X] = $MDDX_X;
$MDDX_DATAZ[$x][MDDX_Y] = $MDDX_Y;
$MDDX_DATAZ[$x][MDDX_Z] = $MDDX_Z;
$MDDX_DATAZ[$x][MDDX_A] = $MDDX_A;
$MDDX_DATAZ[$x][MDDX_B] = $MDDX_B;
$MDDX_DATAZ[$x][MDDX_C] = $MDDX_C;
$MDDX_DATAZ[$x][MDDX_SCALE] = hexdec($MDDX_SCALE);
endfor;
echo "<pre>";
print_r($MDDX_DATAZ);
echo "</pre>";
PHP Code:
//===================================
//ADT MDDX INFO
//===================================
$OFFVALUE = "0x".EndianConverter($STRUCT_INFO["MMDX_Offset"]);
fseek($ADT_Handle,0x14+0x08+$OFFVALUE,SEEK_SET);
$MDDX_Data = array("");
unset($MDDX_Data["0"]);
$Cadena_Actual = "";
while (1 != 2) {
$Byte_Actual = bin2hex(fread($ADT_Handle,2));
if($Byte_Actual == "4449"){ //(4449) = (DI) == header of MMID (MMID) so we stop here beacuse there are not more MDX
break;
}
fseek($ADT_Handle,-2,SEEK_CUR);
$Byte_Actual = bin2hex(fread($ADT_Handle,1));
if($Byte_Actual == "00"){ // it's -0 terminated string and then we stop reading
$MDDX_Data[] = $Cadena_Actual;
$Cadena_Actual = "";
}else{
$Cadena_Actual .= hexToStr($Byte_Actual);
}
}
echo "<pre>";
print_r($MDDX_Data);
echo "</pre>";
So... what can it do?
After getting the basics of Recast+Detour to do the nav in my private bot earlier in the week I set about giving it a real test. I already had a simple nav system implemented where I could call "Navigation.MoveTo(Point)" and the bot would path around a waypoint graph as best it could to try and get near the destination. All I had to do was call Detour's "FindStraightPath()" to generate the waypoints needed on the fly and little-to-no other code in my client had to change - moving to loot, retrieve corpse, get in combat range, move to hotspot is all now using R+D, magic!.
I decided to tackle questing, and in a couple of hours I got a really simple implementation working. It is entirely reliant on having a database to back it, after looking at how Mangos/Arcemu store quests I drew up a simple XML “Quest DB” description to let me experiment with it. Of course a full Quest DB would need a more efficient implementation but XML Linq was quick to use for a prototype.
So for the first few quests in the Human starting area this is pretty simple, you have Interact style quests “Go Speak to <NPC Name>” and you have Kill-Mobs quests “Kill 8 Kobold Workers”. I wrote up entries in my Quest DB for each quest (locations of the start/end, hotspots to find mobs etc.) and implemented the client code to use it. The result is this:
If the NPC or Mob its looking for is not in the object manager it falls-back to use the coords in its Quest DB. Using an embedded-database (SQLite) I could take all the known quests from open projects like ArcEmu/Mangos and compile all the needed information into my local Quest DB. This would enable me to determine where quest givers are and seek out quests automatically, potentially this could allow me to bot the Loremaster achievement for example.
My thanks go to Flowerew for the excellent wowmapper code, Apoc for his inspirational posts which heavily influenced my approach and others in the memory-editing forum in general!
Love the interaction code, but you might not want to position your char exactly on the mob Add LoS and it will rock.
Very cool, sir. :biggthumpup:
As he said: "I decided to tackle questing, and in a couple of hours I got a really simple implementation working." ...a couple of hours!!! But yeah, if LoS/spell range check is in it would be perfect for that part. Nice video mate and you know: "If you build it, they will come..."