[Help] Runes Of Magic
-
- Posts: 37
- Joined: Wed Apr 23, 2008 7:11 am
[Help] Runes Of Magic
I have kinda given up on Atlantica because i find it kinda boring, and so i have moved on to a new game: Runes of Magic.
It is your typical MMORPG. I need to find the address to know whether I currently have a target. During game-play when u select a target the targets name appears on top center of the screen, and when you attack it there will be a message that says "Enter Battle" and when you kill it or run too far away from it it says "leave battle". Can someone please teach me how to find the address to know when I am in battle and when I am not in battle? Thanks!
It is your typical MMORPG. I need to find the address to know whether I currently have a target. During game-play when u select a target the targets name appears on top center of the screen, and when you attack it there will be a message that says "Enter Battle" and when you kill it or run too far away from it it says "leave battle". Can someone please teach me how to find the address to know when I am in battle and when I am not in battle? Thanks!
- 3cmSailorfuku
- Posts: 354
- Joined: Mon Jan 21, 2008 6:25 pm
Re: [Help] Runes Of Magic
It's to 99% always a boolean. It depends on what you wanna focus, personally I always pick the adress for the GUI element that has been showing on the top if a monster has been selected or not.Mesosmagnet wrote:I have kinda given up on Atlantica because i find it kinda boring, and so i have moved on to a new game: Runes of Magic.
It is your typical MMORPG. I need to find the address to know whether I currently have a target. During game-play when u select a target the targets name appears on top center of the screen, and when you attack it there will be a message that says "Enter Battle" and when you kill it or run too far away from it it says "leave battle". Can someone please teach me how to find the address to know when I am in battle and when I am not in battle? Thanks!
Though there may also be adresses that have the state of the selected monster, like attacking, idling etc.
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
I typically use the pointer to the selected target. In most games, the pointer will be 0 (NULL) if none selected, else it will contain a pointer to the target's struct/class.
You can start by having a monster selected, and do an unknown initial value, 4 bytes search. Once this step completes, deselect a monster, and search for an exact value 0. Now select a monster again, and search for a changed value. Now change to a different monster, changed value again. Deselect, search for exact value 0. Etc. Eventually you'll get down to ~10 results or less (hopefully).
Unless the address you find is green in the address menu (I'm assuming you're using Cheat Engine here), you'll need to look up a pointer. Use my tutorial in the memory editing section of the tutorial for this. Typically, it's a double pointer, so you'll need to find a pointer to the pointer you just found. I know, it sounds confusing, but take it step at a time.
This method, although a bit more complicated and time consuming, might eventually allow you to access your target's HP, MP, position, level, and other important data.
You can start by having a monster selected, and do an unknown initial value, 4 bytes search. Once this step completes, deselect a monster, and search for an exact value 0. Now select a monster again, and search for a changed value. Now change to a different monster, changed value again. Deselect, search for exact value 0. Etc. Eventually you'll get down to ~10 results or less (hopefully).
Unless the address you find is green in the address menu (I'm assuming you're using Cheat Engine here), you'll need to look up a pointer. Use my tutorial in the memory editing section of the tutorial for this. Typically, it's a double pointer, so you'll need to find a pointer to the pointer you just found. I know, it sounds confusing, but take it step at a time.
This method, although a bit more complicated and time consuming, might eventually allow you to access your target's HP, MP, position, level, and other important data.
Re: [Help] Runes Of Magic
Started looking at this one myself. I get down to four addresses. When I check to see what is accessing one to find the pointer I get a Proction error 103 msg dialog. The odd thing is I receive the same exact dialog with Perfect World. Has anyone come across this one? Been disabling AV and other programs with no luck.
using CE 5.4
using CE 5.4
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
What operating system are you using? It could just be another protection error caused by Vista's UAC. Make sure you run CE with adequate privileges (set it to run as administrator) and try again.
Since I have not gotten into RoM's beta, I cannot be of any more assistance.
Since I have not gotten into RoM's beta, I cannot be of any more assistance.
-
- Posts: 37
- Joined: Wed Apr 23, 2008 7:11 am
Re: [Help] Runes Of Magic
0060c03c this address always pops up when i try to search for any addresses that write to my current HP address(which changes every time i restart the game or use another character). So after getting that...how do i find my HP address?
I'm going to try your monster pointer tip now. Hope it works out! Owh and I will be reading your tutorial so I wont sound so irritating the next time i come for some answers. Thanks
[EDIT] I tried to search for unknown value and it crashed my PC and now even after restarting it everything is just too slow and not responding as it should. The game itself is extremely buggy and I dont want my PC to ever crash like that again I'm going to put a pause to Runes Of Magic for the time being.
I'm going to try your monster pointer tip now. Hope it works out! Owh and I will be reading your tutorial so I wont sound so irritating the next time i come for some answers. Thanks
[EDIT] I tried to search for unknown value and it crashed my PC and now even after restarting it everything is just too slow and not responding as it should. The game itself is extremely buggy and I dont want my PC to ever crash like that again I'm going to put a pause to Runes Of Magic for the time being.
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
I'm sorry to hear that. With so little information, it'd be hard for me to help you anyways. Once the game is in open beta, I'll get around to messing with it.
Re: [Help] Runes Of Magic
OK, with CE working was able to track down pointers and offsets
pointer
014fe124
hp
0x314
energy/mana(primary class bar)
0x320
energy/mana(secondary class bar)
0x328
gonna work on target next.
pointer
014fe124
hp
0x314
energy/mana(primary class bar)
0x320
energy/mana(secondary class bar)
0x328
gonna work on target next.
Re: [Help] Runes Of Magic
can someone help me out. I made this simple code for a KNIGHT class, but i cant test it out because it cannot read the process from the game. I really dont know anything about reading processes and offset, so this is as far as i can try
i get the following error when trying to run the code
\micromacro\scripts\rom.lua:35: Wrong number of parameters supplied to memoryReadBytePtr().
i get the following error when trying to run the code
\micromacro\scripts\rom.lua:35: Wrong number of parameters supplied to memoryReadBytePtr().
Code: Select all
proc = 0;
win = 0;
HP_addr = "220CDA1C";
MANA_addr = "220CDA28";
maxHP_addr = "220CDA24";
maxMANA_addr = "220CDA2C";
maxHP = 10000;
maxMANA = 10000;
HP = 10000; -- default, this corrects itself (don't change it!)
MANA = 10000;-- default, this corrects itself (don't change it!)
count=o;
rotatecount=0;
--------------------------------
--------------------------------
----NOTE: These value are in percentage
HP_sit = 75; -- %HP to rest at
MANA_sit = 30; -- %MANA to rest at
HP_emergency = 50; -- %emergency! use a potion!
MANA_emergency = 25;
key_attack = key.VK_1; -- normal melee attack
sit_key = key.VK_X;
-------------------------------
function update_vars()
HP = memoryReadIntPtr(proc, HP_addr);
MANA = memoryReadIntPtr(proc, MANA_addr);
maxHP = memoryReadIntPtr(proc, maxHP_addr);
maxMANA = memoryReadIntPtr(proc, maxMANA_addr);
end
-- fight as a knight
function knight_fight()
keyboardHold(key_attack);
yrest(150);
keyboardRelease(key_attack);
if( (HP / maxHP * 100)< HP_sit and HP_sit > 0) then sit(); end
if( (MANA / maxMANA * 100) < MANA_sit and MANA_sit > 0 ) then sit(); end
pickup();
pickup();
end
function pickup()
keyboardHold(key_attack);
yrest(200);
keyboardRelease(key_attack);
end
function target_monster()
keyboardHold(key.VK_TAB);
yrest(50);
keyboardRelease(key.VK_TAB);
end
function have_target()
r,g,b = getPixel(hdc, 415, 50);
--- print("Color R,G,B: ", r, g, b);
-- check for the red HP bar in the monster's HP window
if( r ==156 and g == 1 and b == 0) then
return true;
else
return false;
end
end ---end for have_target function
function rotate_cam()
keyboardHold(key.VK_E);
yrest(1000);
keyboardRelease(key.VK_E);
if ( rotatecount==5 ) then
keyboardHold(key.VK_W);
yrest(2000);
keyboardRelease(key.VK_W);
rotatecount=0;
end
end
function emergency_heal()
keyboardHold(key.VK_DASH);
yrest(100);
keyboardRelease(key.VK_DASH);
end
function emergency_mana()
keyboardHold(key.VK_EQUAL);
yrest(100);
keyboardRelease(key.VK_EQUAL);
end
-- rest untill healed
function sit()
printf( os.date("Resting... %X\n") );
keyboardPress(sit_key);
local last_hp = HP;
yrest(1000);
while( true ) do
-- sit there looking stupid.
if( HP == maxHP and MANA == maxMANA ) then break; end;
-- exiting rest disabled for now.
if( HP < last_hp ) then printf("Exiting! Under attack."); break; end; -- exit rest if under attack
last_hp = HP;
yrest(100);
end
printf( os.date("Exiting rest. %X\n") );
keyboardPress(sit_key);
end
function main()
win = findWindow("Runes of Magic");
hdc = openDC(win);
proc = openProcess( findProcessByExe("Client.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
while( 1 ) do
target_monster();
yrest(500);
if ( have_target() ) then
while ( have_target() ) do
knight_fight();
end
else
rotate_cam();
yrest(500);
rotatecount=rotatecount+1;
end
if( (HP / maxHP * 100)< HP_sit and HP_sit > 0) then sit(); end
if( (MANA / maxMANA * 100) < MANA_sit and MANA_sit > 0 ) then sit(); end
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
end ---end for while loop
detach();
closeProcess(proc);
end
startMacro(main);
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
See the online manual for memory reading information. You are doing several things wrong. One of them being specifying addresses as strings, which has long since been deprecated. The error you're getting is due to trying to read a pointer without given an offset (memorRead*Ptr functions require offsets).
I wouldn't worry about it anyways. In a few days the bot that's in the private section of this forum will be released. There's still just a few bugs to work out first.
I wouldn't worry about it anyways. In a few days the bot that's in the private section of this forum will be released. There's still just a few bugs to work out first.
Re: [Help] Runes Of Magic
i am also interested in this game, and feel bored in the leveling way. may i get the bot atm?Administrator wrote:See the online manual for memory reading information. You are doing several things wrong. One of them being specifying addresses as strings, which has long since been deprecated. The error you're getting is due to trying to read a pointer without given an offset (memorRead*Ptr functions require offsets).
I wouldn't worry about it anyways. In a few days the bot that's in the private section of this forum will be released. There's still just a few bugs to work out first.
Re: [Help] Runes Of Magic
tcflying
As the boss guy said above. It is still being developed and has some bugs to work out. Though I would think it should be ready by christmas if not sooner seeing as how he is the guru
Zeph
As the boss guy said above. It is still being developed and has some bugs to work out. Though I would think it should be ready by christmas if not sooner seeing as how he is the guru
Zeph
Re: [Help] Runes Of Magic
yes. thx to Zephyr first of all. i just be afraid that admin said in the private section. don't know if i can see the section. but thx for the answer anyway.
Re: [Help] Runes Of Magic
yes it is in the private section and you wont be able to even see the forum. But be assured it is being tested and should be bug free soon.
Re: [Help] Runes Of Magic
thx to Zephyr. i also to join the text and will report the bug. how can i do?
Re: [Help] Runes Of Magic
hello, dear admin. is there any news for ROM bot?
Re: [Help] Runes Of Magic
hey, can someone help me with my code. It run really fine for Knight and Priest combo. It just m having trouble with my death() function. Especially with any mouse function
I cant seem to make the mouseSet to move where i wanted it and perform mouseLHold() and mouseLRelease().
Basically, I want the mouse to click on revival button but the mouse wont move to that location.
I'm using MicroMacro v0.99.
My other question is about the pointer and the offset. This address and offset below seem to work every time i start my bot on this comp, its XP. But on my vista it has different address but same pointer. what with that.
I cant seem to make the mouseSet to move where i wanted it and perform mouseLHold() and mouseLRelease().
Basically, I want the mouse to click on revival button but the mouse wont move to that location.
I'm using MicroMacro v0.99.
My other question is about the pointer and the offset. This address and offset below seem to work every time i start my bot on this comp, its XP. But on my vista it has different address but same pointer. what with that.
Code: Select all
--------------------------------
--Edit THESE
--------------------------------
class = CLASS_KNIGHT; ---INPUT your class: warrior or knight
--- this code only work with warrior or knight now
--CLASS_KNIGHT, CLASS_WARRIOR, CLASS_CLERIC, CLASS_MAGE, CLASS_ARCHER = 4;
----NOTE: These value are in percentage
HP_sit = 1; -- %HP to rest at
HP_emergency = 45; -- %emergency! use a potion!
HP_regeneration = 85; ---HP when wants to use regeneration spell
MANA_sit = 40; -- sit when SP go down to 40%
MANA_emergency = 25; --when SP potion when SP go down to 25%
holyshield_HP = 15; ---percent to use holyshield, this give u few sec of invul
frenzy_HP = 25; ---when HP go down to 25%, frenzy will be used.
have_buff1 = true; --if true or false if you have buff spell
have_buff2 = true;
have_buff3 = true;
buff1_duration = 2; -- buff durations in minutes
buff2_duration = 4; -- this will auto buff after duration is up
buff3_duration = 10;
key_hppotion = key.VK_DASH; ---HP potion key
key_sppotion = key.VK_EQUAL; ---MP potion key
enraged_key = key.VK_2; ---enrage skill for class warrior
key_frenzy = key.VK_8; ---frenzy skill for warrior
key_attack = key.VK_1; -- normal melee attack (default is 1)
key_skill2 = key.VK_2; ---Skill 2 key
key_skill3 = key.VK_3; ---Skill 3 key
key_skill4 = key.VK_4; ---skill 4 key
key_skill5 = key.VK_5; ---skill 4 key
key_regen = key.VK_6; ---regeneration skill
key_absorp = key.VK_4; ---Mana Absorption Skill key
key_resolution = key.VK_7; --Resolution skill key
key_holyshield = key.VK_8; ---Knight holy shield skill
key_buff1 = key.VK_9; ---buff skill #1
key_buff2 = key.VK_0; ---buff skill #2
key_buff3 = key.VK_NUMPAD9; ---buff skill #3
sit_key = key.VK_X; ----Sit/Resting key (default is X)
-------------------------------
--Dont EDIT anything below
--------------------------------
CLASS_KNIGHT = 0;
CLASS_WARRIOR = 1;
CLASS_CLERIC = 2;
CLASS_MAGE = 3;
CLASS_ARCHER = 4;
proc = 0;
win = 0;
success = true;
HP_addr = 0x014ED760;
HP_offset = 796;
maxHP_addr = 0x014ED760;
maxHP_offset = 804;
maxHP = 10000;
MANA_addr = 0x014ED760;
MANA_offset = 808;
maxMANA_addr = 0x014ED760;
maxMANA_offset = 812;
maxHP = 10000;
maxMANA = 10000;
HP = 10000; -- default, this corrects itself (don't change it!)
MANA = 10000;-- default, this corrects itself (don't change it!)
monstercount = 0
regen_duration = 18;
count=o;
rotatecount=0;
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
regen_needed = true;
-------------------------------------------------
function update_vars()
HP,success = memoryReadIntPtr(proc, HP_addr,HP_offset);
maxHP = memoryReadIntPtr(proc, maxHP_addr,maxHP_offset);
if (class ~= CLASS_WARRIOR) then
MANA = memoryReadIntPtr(proc, MANA_addr, MANA_offset );
maxMANA = memoryReadIntPtr(proc, maxMANA_addr, maxMANA_offset);
end
end
function fight()
-- fight as a knight
buff();
if (class == CLASS_KNIGHT ) then
--print("HP ", HP);
--print("maxHP ", maxHP);
--print("MANA ", MANA);
--print("maxMANA ", maxMANA);
if( (HP / maxHP * 100) < HP_regeneration ) then regeneration_heal(); end
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
keyboardHold(key_attack);
yrest(150);
keyboardRelease(key_attack);
if( math.random(100) > 85 ) then
if( math.random(100) >= 50 ) then
yrest(100);
keyboardHold(key_skill2);
yrest(50);
keyboardRelease(key_skill2);
yrest(150);
else
yrest(100);
keyboardHold(key_skill3);
yrest(50);
keyboardRelease(key_skill3);
yrest(150);
end
end
----holyshield code
if( (HP / maxHP * 100) < holyshield_HP ) then
yrest(500);
keyboardPress(key_holyshield);
yrest(500);
end
----resolution skill code (this give you big burst of HP when it get low, so u wont die)
if( ((HP / maxHP * 100)+10) < holyshield_HP ) then keyboardPress(key_resolution); end
---mana absorption code
keyboardPress(key_absorp);
rotatecount=0;
if( HP == 0 ) then
death();
end
end --end for if class is knight
-- fight as a warrior
if (class == CLASS_WARRIOR) then
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
keyboardPress(enraged_key);
yrest(50);
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
if( math.random(100) > 75 ) then
if( math.random(100) >= 50 ) then
yrest(50);
keyboardHold(key_skill3);
yrest(50);
keyboardRelease(key_skill3);
yrest(1100);
keyboardHold(key_skill4);
yrest(50);
keyboardRelease(key_skill4);
yrest(50);
else
keyboardHold(key_skill5);
yrest(50);
keyboardRelease(key_skill5);
yrest(50);
end
end
----Frezy skill code
if( (HP / maxHP * 100) < frenzy_HP ) then keyboardPress(key_frenzy); end
rotatecount=0;
end --end for the if class is warrior
end ---end for the fight fuction
-- toggle cast needed for buff1
function buff1_timer()
buff1_needed = true;
end
-- toggle cast needed for buff2
function buff2_timer()
buff2_needed = true;
end
-- toggle cast needed for buff3
function buff3_timer()
buff3_needed = true;
end
function regen_timer()
regen_needed = true;
end
function pickup()
keyboardHold(key_attack);
yrest(200);
keyboardRelease(key_attack);
end
function target_monster()
keyboardHold(key.VK_TAB);
yrest(50);
keyboardRelease(key.VK_TAB);
end
function have_target()
r,g,b = getPixel(hdc, 415, 50);
--print("Color R,G,B: ", r, g, b);
-- check for the red HP bar in the monster's HP window
if( r ==156 and g == 1 and b == 0 ) then
return true;
else
return false;
end
end ---end for have_target function
function player()
r2,g2,b2 = getPixel(hdc, 430, 30);
-- print("Color R,G,B: ", r, g, b);
if( r2 ==0 and g2 == 120 and b2 == 0 ) then
return true;
else
return false;
end
end --- end for the player function
function targetbox()
rt,gt,bt = getPixel(hdc, 540, 30);
--print("Color Rt,Gt,Bt: ", rt, gt, bt);
if( rt ==227 and gt == 221 and bt == 212 ) then
return true;
else
return false;
end
end --end for targetbox function
function rotate_cam()
keyboardHold(key.VK_D);
yrest(550);
keyboardRelease(key.VK_D);
if ( rotatecount>=8 ) then
keyboardHold(key.VK_W);
yrest(2000);
keyboardRelease(key.VK_W);
rotatecount=0;
end
end
function emergency_heal()
keyboardHold(key_hppotion);
yrest(100);
keyboardRelease(key_hppotion);
end
function emergency_mana()
keyboardHold(key_sppotion);
yrest(100);
keyboardRelease(key_sppotion);
end
function regeneration_heal()
if( regen_needed ) then
yrest(1000);
keyboardHold(key_regen);
yrest(300);
keyboardRelease(key_regen);
print("Regen used, wait 20 sec");
regen_needed = false;
end
end
-- rest untill healed
function sit()
printf( os.date("Resting... %X\n") );
yrest(500);
keyboardHold(sit_key);
yrest(200);
keyboardRelease(sit_key);
local last_hp = HP;
yrest(1000);
while( true ) do
-- sit there looking stupid.
if( class == CLASS_WARRIOR and HP == maxHP ) then break;
elseif (class ~= CLASS_WARRIOR and HP == maxHP and MANA == maxMANA) then break; end;
-- exiting rest disabled for now.
if( HP < last_hp ) then
printf("Exiting! Under attack.");
yrest(2500);
keyboardHold(key.VK_E);
yrest(100);
keyboardRelease(key.VK_E);
keyboardHold(key.VK_S);
yrest(1500);
keyboardRelease(key.VK_S);
break;
end; -- exit rest if under attack
while ( have_target() ) do
fight();
end
if ( targetbox() ) then
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
last_hp = HP;
yrest(100);
end
printf( os.date("Exiting rest. %X\n") );
keyboardPress(sit_key);
end
function death()
wx,wy = windowRect(win);
yrest(5000);
print("dHP ", HP);
print("dmaxHP ", maxHP);
printf("You're Dead, reviving and keep on botting\n");
yrest(5000); --wait 10 secs for the revive box pop up
--- click on the resurrect box
print("wx ", wx);
print("wy ", wy);
mouseSet(wx+500, wy+190);
yrest(200);
mouseLHold();
yrest(100);
mouseLRelease();
yrest(100);
yrest(120000); --wait 120 secs for the comp to load and rev weakness to be gone
---this mouse click will fix the targeting system bug
mouseSet(60, 60);
yrest(200);
mouseLHold();
yrest(100);
mouseLRelease();
yrest(100);
if ( player() ) then
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
end --end of the function
function buff()
if( buff1_needed and have_buff1) then
yrest(1000);
keyboardHold(key_buff1);
yrest(100);
keyboardRelease(key_buff1);
buff1_needed = false;
yrest(1000);
end
if( buff2_needed and have_buff2) then
yrest(1000);
keyboardHold(key_buff2);
yrest(100);
keyboardRelease(key_buff2);
buff2_needed = false;
yrest(1000);
end
if( buff3_needed and have_buff3) then
yrest(1000);
keyboardHold(key_buff3);
yrest(100);
keyboardRelease(key_buff3);
buff3_needed = false;
yrest(1000);
end
if ( player() ) then
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
end --end of function
function changeweapon()
yrest(150);
keyboardHold(key.VK_B);
yrest(200);
keyboardRelease(key.VK_B);
yrest(150);
mouseSet(773, 394);
yrest(200);
mouseRHold();
yrest(150);
mouseRRelease();
yrest(200);
end
function main()
win = findWindow("Runes of Magic");
hdc = openDC(win);
proc = openProcess( findProcessByExe("Client.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", 60000*buff1_duration, buff1_timer);
registerTimer("buff2_timer", 60000*buff2_duration, buff2_timer);
registerTimer("buff3_timer", 60000*buff3_duration, buff3_timer);
registerTimer("regen_timer", 1000*regen_duration, regen_timer);
while( 1 ) do
--print("HP ", HP);
--print("maxHP ", maxHP);
--print("MANA ", MANA);
--print("maxMANA ", maxMANA);
if( HP == 0 ) then death(); end
target_monster();
yrest(500);
for j=0,2 do
if ( have_target() ) then
monstercount = monstercount + 1;
print(" monster killed ", monstercount);
while ( have_target() ) do
fight();
end
for i = 0,3 do
pickup();
yrest(500);
end
if ( targetbox() or player()) then
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
yrest(1500);
---- following code to get the character oriented correctly
keyboardHold(key.VK_D);
yrest(100);
keyboardRelease(key.VK_D);
yrest(100);
-----------------------------
-- else
--rotate_cam();
--rotatecount=rotatecount+1;
--yrest(400);
end ---end for if have_target loop
end --- end for the for loop
rotate_cam();
rotatecount=rotatecount+1;
yrest(500);
if( (HP / maxHP * 100)< HP_sit and (HP / maxHP * 100) > HP_emergency) then sit(); end
if( class ~= CLASS_WARRIOR and (MANA / maxMANA * 100) < MANA_sit and (MANA / maxMANA * 100) > MANA_emergency ) then sit(); end
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( class ~= CLASS_WARRIOR and (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
buff();
if (monstercount >= 150 and monstercount <= 300) then
changeweapon(); ---because current weapon durability is zero
monstercount = 0;
end
end ---end for while loop
detach();
closeProcess(proc);
closeDC(hdc);
end
startMacro(main);
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
Attached mouse input does not work for RoM. You'd need to use normal mouse input.
Now about your pointer issue... There is nothing to worry about. This is normal. As you open and close the game, it is clearing and re-allocating in the same memory regions. This happens mostly just by chance, as any other programs could potentially allocate memory in that space, causing RoM to have to allocate memory at a different address. As long as you've found a static pointer (one that does not change across systems or when restarting the game), you are done.
Code: Select all
detach(); --deatch temporarily
mouseSet(x, y);
mouseLClick();
attach(win); --re-attach.
Now about your pointer issue... There is nothing to worry about. This is normal. As you open and close the game, it is clearing and re-allocating in the same memory regions. This happens mostly just by chance, as any other programs could potentially allocate memory in that space, causing RoM to have to allocate memory at a different address. As long as you've found a static pointer (one that does not change across systems or when restarting the game), you are done.
Re: [Help] Runes Of Magic
thanx, now the mouse works great.
well now m trying to improve my bot. Currently m using pixel base target detection, but m trying to switch to targetID memory address so i can create a MonsterList like in perfect world bot. I just wonder how can you find the targetID address. I'm guesing u search for unknown value, target a monster, search for unknown again, repeat until u have few addresses. I wonder how u go about doing that. like what type of search do i do, what byte, or value, etc.? I was able to find the addresses for HP and MP, but for the target box my hand are tied.
here's the rough version of my bot in case anyone wanna to use it.
well now m trying to improve my bot. Currently m using pixel base target detection, but m trying to switch to targetID memory address so i can create a MonsterList like in perfect world bot. I just wonder how can you find the targetID address. I'm guesing u search for unknown value, target a monster, search for unknown again, repeat until u have few addresses. I wonder how u go about doing that. like what type of search do i do, what byte, or value, etc.? I was able to find the addresses for HP and MP, but for the target box my hand are tied.
here's the rough version of my bot in case anyone wanna to use it.
Code: Select all
---************************************************************************
--------------------------------
--Edit THESE ---run in FULLSCREEN, 1024x768
--------------------------------
class = CLASS_KNIGHT; ---INPUT your PRIMARY class (got to be exact, CAPs and everything)
--CLASS_KNIGHT, CLASS_WARRIOR, CLASS_PRIEST, CLASS_MAGE, CLASS_SCOUT, CLASS_ROGUE
sclass = CLASS_PRIEST; ---Input your SECONDARY class (put the same as primary if u dont have one)
----NOTE: These value are in percentage
HP_sit = 5; -- %HP to rest at
HP_emergency = 60; -- %emergency! use a potion!
MANA_sit = 50; -- sit when SP go down to 40%
MANA_emergency = 30; --when SP potion when SP go down to 25%
--- check your class below to see what key to put
key_attack = key.VK_1; -- normal melee attack (default is 1)
key_skill2 = key.VK_2; ---Skill 2 key
key_skill3 = key.VK_3; ---Skill 3 key
key_skill4 = key.VK_4; ---skill 4 key
key_skill5 = key.VK_5; ---skill 5 key
key_skill6 = key.VK_6; ---skill 6 key
--buff, work for all classes
have_buff1 = false; --if true or false if you have buff spell
have_buff2 = false;
have_buff3 = false;
key_buff1 = key.VK_9; ---buff skill #1
key_buff2 = key.VK_0; ---buff skill #2
key_buff3 = key.VK_NUMPAD8; ---buff skill #3
buff1_duration = 3.7; -- buff durations is in minutes
buff2_duration = 1.9; -- this will auto buff after duration is up
buff3_duration = 10;
key_hppotion = key.VK_DASH; ---HP potion key
key_sppotion = key.VK_EQUAL; ---MP potion key
--knight
if (class == CLASS_KNIGHT or sclass == CLASS_KNIGHT) then
holyshield_HP = 15; ---percent to use holyshield, this give u few sec of invul
key_holyshield = key.VK_NUMPAD1; ---Knight holy shield skill
resolution_HP = 60; ---percent to use resolution spell
key_resolution = key.VK_8; --Resolution skill key
key_absorp = key.VK_4; ---Mana Absorption Skill key
end
--priest
if (class == CLASS_PRIEST or sclass == CLASS_PRIEST) then
soulsource_HP = 10; ---Soul Source spell will be used when HP down to 10%, emergency use only
key_soulsource = key.VK_NUMPAD7;
priestspell1 = key.VK_2; ---the mage will cast a spell that take 3 second to load, and follow by instant spell.
priestspell2 = key.VK_2; ---Then it will continue cast 2nd spell that is 3 second long, and follow by 2nd instant spell
pinstantspell1 = key.VK_4;
pinstantspell2 = key.VK_5;
holyaura_HP = 80; --percent to use holy aura
key_holyaura = key.VK_NUMPAD0;
HP_regeneration = 95; ---HP when wants to use regeneration spell
key_regen = key.VK_6; ---regeneration skill
end
--warrior
if (class == CLASS_WARRIOR or sclass == CLASS_WARRIOR) then
frenzy_HP = 35; ---when HP go down to 35%, frenzy will be used.
enraged_key = key.VK_2; ---enrage skill for class warrior
key_frenzy = key.VK_8; ---frenzy skill for warrior
sneakattack_key = key.VK_NUMPAD2;
end
-- mage
if (class == CLASS_MAGE or sclass == CLASS_MAGE) then
castspell1 = key.VK_2; ---the mage will cast a spell that take 3 second to load, and follow by instant spell.
castspell2 = key.VK_2; ---Then it will continue cast 2nd spell that is 3 second long, and follow by 2nd instant spell
instantspell1 = key.VK_4;
instantspell2 = key.VK_5;
end
-- rogue
if (class == CLASS_ROGUE or sclass == CLASS_ROGUE) then
key_blindstab = key.VK_NUMPAD5;
key_shadowfoce = key.VK_5;
end
sit_key = key.VK_X; ----Sit/Resting key (default is X)
---switch weapon after few hrs
switchinput = false; ---true/false, true if u want to switch weapons and armors after 100 kills, why? cuz durability.
--- see screenshot to see how to set up items for switch. file named switch.jpg
--- uhhh, sorry no SS for now, so leave it to false
--*******************************************************************************************
--------------------------------------------------------------------------
--Don't edit anything below unless u know what u doing
---------------------------------------------------------------------------
CLASS_KNIGHT = 0;
CLASS_WARRIOR = 1;
CLASS_CLERIC = 2;
CLASS_MAGE = 3;
CLASS_ARCHER = 4;
proc = 0;
win = 0;
success = true;
HP_addr = 0x014ED760;
HP_offset = 796;
maxHP_addr = 0x014ED760;
maxHP_offset = 804;
maxHP = 10000;
MANA_addr = 0x014ED760;
MANA_offset = 808;
maxMANA_addr = 0x014ED760;
maxMANA_offset = 812;
maxHP = 10000;
maxMANA = 10000;
HP = 10000; -- default, this corrects itself (don't change it!)
MANA = 10000;-- default, this corrects itself (don't change it!)
cx1 = 773;
sx = cx1;
cy = 394;
sy = 560;
btx1 = 761; --backpack tab1 x-coord
bty1 = 352; --backpack tab1 y-coord
cii=6;
magespell = 1;
instantspell = 1;
priestspell = 1;
instantspell =1;
monstercount = 0;
monstercount2 = 0;
monsterkilled = 0;
regen_duration = 18;
count=o;
deathcount = 0;
kcount = 0;
rotatecount=0;
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
regen_needed = true;
-------------------------------------------------
function update_vars()
HP,success = memoryReadIntPtr(proc, HP_addr,HP_offset);
maxHP = memoryReadIntPtr(proc, maxHP_addr,maxHP_offset);
if (class ~= CLASS_WARRIOR) then
MANA = memoryReadIntPtr(proc, MANA_addr, MANA_offset );
maxMANA = memoryReadIntPtr(proc, maxMANA_addr, maxMANA_offset);
end
end
function fight()
------------ fight as a knight
if (class == CLASS_KNIGHT ) then
--print("HP ", HP);
--print("maxHP ", maxHP);
--print("MANA ", MANA);
--print("maxMANA ", maxMANA);
if( (HP / maxHP * 100) < HP_regeneration ) then regeneration_heal(); end
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
keyboardHold(key_attack);
yrest(150);
keyboardRelease(key_attack);
if( math.random(100) > 90 ) then
yrest(150);
keyboardHold(key_skill3);
yrest(100);
keyboardRelease(key_skill3);
yrest(150);
end
if( math.random(100) > 90 ) then
if( math.random(100) >= 50 ) then
yrest(100);
keyboardHold(key_skill2);
yrest(100);
keyboardRelease(key_skill2);
yrest(150);
else
yrest(100);
keyboardHold(key_skill4);
yrest(100);
keyboardRelease(key_skill4);
yrest(150);
end
end
----holyshield code
if( (HP / maxHP * 100) < holyshield_HP ) then
yrest(200);
keyboardPress(key_holyshield);
yrest(200);
end
---holy aura code (give 5 second of invul
if( ((HP / maxHP * 100)) < holyaura_HP ) then
yrest(200);
keyboardPress(key_holyaura);
yrest(200);
end
----resolution skill code (this give you big burst of HP when it get low, so u wont die)
if( (HP / maxHP * 100) < resolution_HP ) then
if( MANA < 100 ) then emergency_mana(); end
yrest(150);
keyboardPress(key_resolution);
yrest(250);
end
---mana absorption code
keyboardPress(key_absorp);
end --end for if class is knight
------------------ fight as a warrior
if (class == CLASS_WARRIOR) then
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
keyboardPress(enraged_key);
yrest(100);
keyboardPress(sneakattack_key);
yrest(150);
keyboardPress(key_attack);
yrest(75);
keyboardPress(key_blindstab);
yrest(150);
keyboardPress(key_shadowfoce);
yrest(150);
if( math.random(100) > 65 ) then
yrest(100);
keyboardPress(key_skill3);
yrest(1100);
keyboardPress(key_skill4);
yrest(150);
else
yrest(100);
keyboardPress(key_skill6);
yrest(150);
end
----Frezy skill code
if( (HP / maxHP * 100) < frenzy_HP ) then keyboardPress(key_frenzy); end
end --end for the if class is warrior
----------- fight as a mage
if (class == CLASS_MAGE) then
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
if ( magespell == 1) then
yrest(100);
for mi=1,7 do
keyboardPress(castspell1);
yrest(500);
end
keyboardPress(instantspell1);
yrest(1000);
magespell = 2;
else
yrest(100);
for mi=1,7 do
keyboardPress(castspell2);
yrest(500);
end
yrest(3500);
keyboardPress(instantspell2);
yrest(1000);
magespell = 1;
end --- end of the if function magespell
if( (HP / maxHP * 100) < HP_regeneration ) then regeneration_heal(); end
rotatecount=0;
end --end for the if class is mage
---------- fight as a Priest
if (class == CLASS_PRIEST) then
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
keyboardPress(key.VK_S);
if ( priestspell == 1) then
yrest(100);
for mi=1,7 do
keyboardPress(priestspell1);
yrest(500);
end
keyboardPress(pinstantspell1);
yrest(1000);
priestspell = 2;
else
yrest(100);
for mi=1,7 do
keyboardPress(priestspell2);
yrest(500);
end
keyboardPress(pinstantspell2);
yrest(1000);
priestspell = 1;
end
----soul source spell code
if( (HP / maxHP * 100) < soulsource_HP ) then
keyboardPress(key_soulsource);
yrest(200);
end
---holy aura code (give 5 second of invul
if( ((HP / maxHP * 100)) < holyaura_HP ) then
yrest(200);
keyboardPress(key_holyaura);
yrest(200);
end
if( (HP / maxHP * 100) < HP_regeneration ) then regeneration_heal(); end
rotatecount=0;
end --end for the if class is mage
---- if killing take too long, then move onto the next target
if (class == CLASS_PRIEST) then
ki = 10;
else
ki = 250;
end
if ( kcount >= ki) then
keyboardPress(key.VK_ESCAPE);
rotate_cam();
kcount = 0;
end
if( HP == 0 or HP == nil ) then
death();
end
end ---end for the fight fuction
-- toggle cast needed for buff1
function buff1_timer()
buff1_needed = true;
end
-- toggle cast needed for buff2
function buff2_timer()
buff2_needed = true;
end
-- toggle cast needed for buff3
function buff3_timer()
buff3_needed = true;
end
function regen_timer()
regen_needed = true;
end
function pickup()
keyboardHold(key_attack);
yrest(200);
keyboardRelease(key_attack);
if (class == CLASS_MAGE) then
key_skill3 = instantspell1;
end
yrest(100);
keyboardHold(key_skill3);
yrest(50);
keyboardRelease(key_skill3);
yrest(150);
end
function target_monster()
keyboardHold(key.VK_TAB);
yrest(50);
keyboardRelease(key.VK_TAB);
end
function have_target()
r,g,b = getPixel(hdc, 415, 50);
-- print("Color R,G,B: ", r, g, b);
-- check for the red HP bar in the monster's HP window
if( r ==156 and g == 1 and b == 0 ) then
return true;
else
return false;
end
end ---end for have_target function
function player()
r2,g2,b2 = getPixel(hdc, 430, 30);
-- print("Color R,G,B: ", r, g, b);
if( r2 ==0 and g2 == 120 and b2 == 0 ) then
return true;
else
return false;
end
end --- end for the player function
function targetbox()
rt,gt,bt = getPixel(hdc, 540, 30);
--print("Color Rt,Gt,Bt: ", rt, gt, bt);
if( rt ==227 and gt == 221 and bt == 212 ) then
return true;
else
return false;
end
end --end for targetbox function
function rotate_cam()
keyboardHold(key.VK_D);
yrest(650);
keyboardRelease(key.VK_D);
if ( rotatecount>=15 ) then
keyboardHold(key.VK_W);
yrest(1000);
keyboardRelease(key.VK_W);
rotatecount=0;
end
end
function emergency_heal()
keyboardHold(key_hppotion);
yrest(100);
keyboardRelease(key_hppotion);
end
function emergency_mana()
keyboardHold(key_sppotion);
yrest(100);
keyboardRelease(key_sppotion);
end
function regeneration_heal()
if( regen_needed ) then
yrest(800);
keyboardHold(key_regen);
yrest(200);
keyboardRelease(key_regen);
yrest(300);
print("Regen used, 20 sec reloading");
regen_needed = false;
end
end
-- rest untill healed
function sit()
printf( os.date("Resting... %X\n") );
yrest(500);
keyboardHold(sit_key);
yrest(200);
keyboardRelease(sit_key);
local last_hp = HP;
yrest(1000);
while( true ) do
-- sit there looking stupid.
if( class == CLASS_WARRIOR and HP == maxHP ) then break;
elseif (class ~= CLASS_WARRIOR and HP == maxHP and MANA == maxMANA) then break; end;
-- exiting rest disabled for now.
if( HP < last_hp ) then
printf("Exiting! Under attack.");
yrest(2500);
keyboardHold(key.VK_E);
yrest(100);
keyboardRelease(key.VK_E);
yrest(100);
keyboardHold(key.VK_S);
yrest(1500);
keyboardRelease(key.VK_S);
break;
end; -- exit rest if under attack
if ( have_target() ) then
break;
end
while ( have_target() ) do
fight();
end
if ( targetbox() ) then
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
last_hp = HP;
yrest(100);
end
printf( os.date("Exiting rest. %X\n") );
keyboardPress(sit_key);
end
function death()
deathcount = deathcount + 1;
keyboardPress(key.VK_SNAPSHOT);
print("A screen capture has been taken. Open MS Paint and paste it.");
wx,wy = windowRect(win);
detach(); --deatch temporarily
yrest(5000);
print("dHP ", HP);
print("dmaxHP ", maxHP);
printf("You're Dead, reviving and keep on botting\n");
yrest(5000); --wait 10 secs for the revive box pop up
---this mouse click will fix the targeting system bug
mouseSet(60, 60);
yrest(200);
mouseLClick();
yrest(1000);
while ( player()) do
yrest(3000);
keyboardHold(key.VK_ESCAPE);
yrest(100);
keyboardRelease(key.VK_ESCAPE);
yrest(1000);
end
--- click on the resurrect box
mouseSet(500, 190);
yrest(200);
mouseLClick();
yrest(20000); --wait 20 secs for the comp to load
if ( targetbox()) then
---this mouse click will fix the targeting system bug
mouseSet(60, 60);
yrest(200);
mouseLClick();
yrest(1000);
while ( player()) do
yrest(3000);
keyboardHold(key.VK_ESCAPE);
yrest(100);
keyboardRelease(key.VK_ESCAPE);
yrest(1000);
end
end
yrest(45000); --wait 45 secs for the rev weakness to be gone
if (deathcount >=4 ) then
exitgame();
end
attach(win); --re-attach.
end --end of the function
function exitgame()
detach(); --deatch temporarily
yrest(3000);
mouseSet(60, 60);
yrest(1000);
mouseLClick();
yrest(1000);
while ( player()) do
yrest(2000);
keyboardHold(key.VK_ESCAPE);
yrest(100);
keyboardRelease(key.VK_ESCAPE);
yrest(500);
end
yrest(1000);
keyboardHold(key.VK_ESCAPE);
yrest(200);
keyboardRelease(key.VK_ESCAPE);
yrest(1000);
mouseSet(510, 420);
yrest(500);
mouseLClick();
yrest(1000);
mouseSet(445, 175);
yrest(500);
mouseLClick();
yrest(1000);
print("bot is off");
running = 0; -- this turns the macro off!
attach(win); --re-attach.
end
function buff()
if( buff1_needed and have_buff1) then
yrest(500);
keyboardHold(key_buff1);
yrest(100);
keyboardRelease(key_buff1);
buff1_needed = false;
yrest(500);
end
if( buff2_needed and have_buff2) then
yrest(500);
keyboardHold(key_buff2);
yrest(150);
keyboardRelease(key_buff2);
buff2_needed = false;
yrest(500);
end
if( buff3_needed and have_buff3) then
yrest(500);
keyboardHold(key_buff3);
yrest(150);
keyboardRelease(key_buff3);
buff3_needed = false;
yrest(500);
end
end --end of function
function change()
for ci = 1,cii do
yrest(300);
mouseSet(cx, cy);
yrest(150);
mouseRClick();
yrest(200);
cx = cx + 42;
end ---end of the for function
cx = cx1;
end
function changearmor()
detach(); --deatch temporarily
yrest(100);
keyboardHold(key.VK_B);
yrest(100);
keyboardRelease(key.VK_B);
change();
mouseSet(btx1 + 37, bty1);
cii = 1;
mouseLHold();
yrest(250);
mouseLRelease();
change();
cii = 6;
keyboardHold(key.VK_B);
yrest(100);
keyboardRelease(key.VK_B);
attach(win); --re-attach.
end
function changeweapon()
detach(); --deatch temporarily
yrest(100);
keyboardHold(key.VK_B);
yrest(100);
keyboardRelease(key.VK_B);
yrest(300);
mouseSet(sx, sy);
yrest(150);
mouseRClick();
yrest(200);
keyboardHold(key.VK_B);
yrest(100);
keyboardRelease(key.VK_B);
yrest(100);
attach(win); --re-attach.
end
function main()
win = findWindow("Runes of Magic");
hdc = openDC(win);
proc = openProcess( findProcessByExe("Client.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", 60000*buff1_duration, buff1_timer);
registerTimer("buff2_timer", 60000*buff2_duration, buff2_timer);
registerTimer("buff3_timer", 60000*buff3_duration, buff3_timer);
registerTimer("regen_timer", 1000*regen_duration, regen_timer);
while( 1 ) do
--print("HP ", HP);
--print("maxHP ", maxHP);
--print("MANA ", MANA);
--print("maxMANA ", maxMANA);
if( HP == 0 or HP == nil) then death(); end
yrest(100);
if ( have_target() == false ) then
target_monster();
yrest(100);
end
yrest(200);
if ( have_target() ) then
magespell = 1;
priestspell = 1;
monstercount = monstercount + 1;
monstercount2 = monstercount2 + 1;
monsterkilled = monsterkilled + 1;
print(" Monster Killed:\n ", monsterkilled);
print(" Total Death: \n", deathcount);
while ( have_target() ) do
fight();
kcount = kcount +1;
yrest(100);
if ( player()) then
yrest(100);
keyboardHold(key.VK_ESCAPE);
yrest(100);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
end
kcount = 0;
for i = 0,3 do
pickup();
keyboardHold(key_skill3);
yrest(100);
keyboardRelease(key_skill3);
yrest(400);
end
if ( targetbox() or player()) then
yrest(100);
keyboardHold(key.VK_ESCAPE);
yrest(100);
keyboardRelease(key.VK_ESCAPE);
yrest(200);
end
yrest(200);
---- following code to get the character oriented correctly
keyboardPress(key.VK_S);
yrest(50);
keyboardPress(key.VK_D);
yrest(50);
rotatecount=0;
else
rotate_cam();
rotatecount=rotatecount+1;
rest(300);
end ---end for if have_target loop
buff();
if ( player()) then
yrest(1000);
keyboardHold(key.VK_ESCAPE);
yrest(150);
keyboardRelease(key.VK_ESCAPE);
yrest(1000);
end
yrest(200);
if( (HP / maxHP * 100)< HP_sit and (HP / maxHP * 100) > HP_emergency) then sit(); end
if( class ~= CLASS_WARRIOR and (MANA / maxMANA * 100) < MANA_sit and (MANA / maxMANA * 100) > MANA_emergency ) then sit();
end
if( (HP / maxHP * 100) < HP_emergency ) then emergency_heal(); end
if( class ~= CLASS_WARRIOR and (MANA / maxMANA * 100) < MANA_emergency ) then emergency_mana(); end
if (switchinput == true ) then
if (monstercount >= 150 and monstercount <= 160) then
cx = cx1;
changearmor(); ---because current weapon durability is zero
monstercount = 0;
cy = cy + 42;
end
if (monstercount2 >= 125 and monstercount2 <= 130) then
changeweapon(); ---because current weapon durability is zero
monstercount2 = 0;
sx = sx + 42;
end
end ---end for the switchinput
end ---end for while loop
detach();
closeProcess(proc);
closeDC(hdc);
end
startMacro(main);
- Administrator
- Site Admin
- Posts: 5313
- Joined: Sat Jan 05, 2008 4:21 pm
Re: [Help] Runes Of Magic
The player stores a pointer to it's target. The target has the exact same struct as the player. So if you've found the player's HP offset, your target's HP offset will be the same.
As these are pointers and not GUIDs, you cannot create a list of static monsters to cycle between. It will lead to a crash whenever you write the target address of a target that doesn't exist (which will happen 99% of the time because of dynamic memory).
That being said, you can find the array of nearby monsters (which I started doing, but abandoned for a different solution) and read the addresses out of this. It could still, on rare occasions, crash when a monster disappears after the array is read and before you write to the player's target address.
As these are pointers and not GUIDs, you cannot create a list of static monsters to cycle between. It will lead to a crash whenever you write the target address of a target that doesn't exist (which will happen 99% of the time because of dynamic memory).
That being said, you can find the array of nearby monsters (which I started doing, but abandoned for a different solution) and read the addresses out of this. It could still, on rare occasions, crash when a monster disappears after the array is read and before you write to the player's target address.
Who is online
Users browsing this forum: Ahrefs [Bot] and 0 guests