Page 1 of 2
Introducing Holic Online
Posted: Thu Jan 17, 2008 1:57 pm
by hackbar
Netgames new mmorpg Holic Online enters open beta tommorow. Technically its in free technical test or whatever right now but theres no char wipe.
http://holic.netgame.com/
Heres the typical bot needs a lot of cleaning up and whatnot but its working for warriors...
Re: Introducing Holic Online
Posted: Fri Jan 18, 2008 12:48 am
by Administrator
Looks like a pretty cool game. Thanks for the info. Maybe I'll try this game when I get bored of DOMO. Is it any fun? Is it another game where all you do is grind all day and night? Is there PVP/PK?
Re: Introducing Holic Online
Posted: Sat Jan 19, 2008 4:31 pm
by Guest
cant remember my damn password in any case its a fairly typical kiddy graphic grinder with some interesting twists like multi classing and the option to add your own quests somehow...
I only made this bot cause it looks better than fiesta and all the mpc guys seem to love that game and its bot....
Um whats the difference between pointers and pure addresses cause Holic wont let me use the pointer system which i thought was superior... Hopefully these addresses dont change as the pointers constantly change which i thought was backwards....
Re: Introducing Holic Online
Posted: Sat Jan 19, 2008 4:44 pm
by Administrator
Can't remember your password for what? Are you hackbar? If so, send me a PM on MPC (security reasons--since there is an IP mismatch) with a temp password, and I'll reset it for you. You can then log in and change it to whatever you want.
Re: Introducing Holic Online
Posted: Sat Jan 19, 2008 5:11 pm
by Guest
yeah im hackbar im visiting my parents for the weekend dont worry ill get my password back when i get home... In any case i figured out the problem there were multiple pointers for the hp/mp just had to find the right one...
Re: Introducing Holic Online
Posted: Sat Jan 19, 2008 6:00 pm
by Guest
updated and working
Code: Select all
-------------------------------------------------
--Holic Online Bot
--Mystikfox
--Hackbar
--Mangler
-------------------------------------------------
-- Variable declaration -- do not edit
-------------------------------------------------
CLASS_WARRIOR = 0;
CLASS_MAGE = 1;
HP = 10000;
MP = 10000;
SP = 10000;
HP_ptr = "009127F8";
HP_offset = 556;
MP_ptr = "009127F8";
MP_offset = 552;
-------------------------------------------------
-------------------------------------------------
-- character configuration YOU HAVE TO CHANGE THIS STUFF FOR THE BOT TO WORK RIGHT
-------------------------------------------------
class = CLASS_WARRIOR;
key_attack = key.VK_1;
key_pickup = key.VK_TILDE;
key_sit = key.VK_F2;
key_skill1 = key.VK_2;
key_skill2 = key.VK_3;
key_skill3 = key.VK_4;
key_hppotion = key.VK_7;
key_mppotion = key.VK_F4;
key_sppotion = key.VK_F3;
-- rest or use potions when low on HP/MP/SP
HP_potion = 600;
MP_potion = 40;
SP_potion = 0;
HP_sit = 40;
MP_sit = 0;
SP_sit = 0;
-- chance to cast
skill1_chance = 80;
skill2_chance = 80;
skill3_chance = 0;
-- MP cost
skill1_cost = 15;
skill2_cost = 20;
skill3_cost = 25;
have_pig = 0; -- set to 1 if you have a fortune pig and want to
-- skip the manual pickup function
-- buff stuff
-- NOTE: set on 10 minutes
-- buff / scroll durations in msec time = minutes x 60000
-- to de- activate non used buffs / scrolls replace "1" with "0"
-- to activate buff / scroll replace "0" with "1"
-- scrolls can be used too as buff
-------------------------
buff1_duration = 1800000;
buff_1 = 1;
buff_key1 = key.VK_8;
buff2_duration = 1800000;
buff_2 = 1;
buff_key2 = key.VK_9;
buff3_duration = 1800000;
buff_3 = 1;
buff_key3 = key.VK_0;
--dont change these
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
-- cast times in milliseconds
skill1_casttime = 2000;
skill2_casttime = 1000;
skill3_casttime = 3000;
-- skill cool downs in milliseconds (not working)
skill1_cooldown = 3000;
skill2_cooldown = 8000;
skill3_cooldown = 9000;
-------------------------------------------------
function hp_potion()
keyboardPress(key_hppotion);
end
function mp_potion()
keyboardPress(key_mppotion);
end
function sp_potion()
keyboardPress(key_sppotion);
end
-- so we aren't spamming the attack key...
-- we will use a timer to press it once
-- every 3 seconds.
function attack_timer()
keyboardPress(key_attack);
end
function fight_warrior()
registerTimer("attack_timer", 3000, attack_timer);
while( have_target() ) do
if( HP < HP_potion ) then
hp_potion(); end
if( MP < MP_potion ) then
mp_potion(); end
if( SP < SP_potion ) then
sp_potion(); end
local roll = math.random(100);
if( roll <= skill1_chance and SP >= skill1_cost ) then
keyboardPress(key_skill1);
yrest(120);
elseif( roll <= skill2_chance and SP >= skill2_cost ) then
keyboardPress(key_skill2);
yrest(120);
elseif( roll <= skill3_chance and SP >= skill3_cost ) then
keyboardPress(key_skill3);
yrest(120);
else
keyboardPress(key_attack);
yrest(500);
end
yrest(250);
coroutine.yield();
end
unregisterTimer("attack_timer");
yrest(1000);
end
function fight_mage()
while( have_target() ) do
if( HP < HP_potion ) then
hp_potion(); end
if( MP < MP_potion ) then
mp_potion(); end
local roll = math.random(100);
if( roll <= skill1_chance and MP >= skill1_cost ) then
-- cast skill 1
keyboardPress(key_skill1);
yrest(skill1_casttime);
else
keyboardPress(key_attack);
end
if( roll <= skill2_chance and MP >= skill2_cost ) then
-- cast skill 1
keyboardPress(key_skill2);
yrest(skill2_casttime);
else
keyboardPress(key_attack);
end
yrest(100);
coroutine.yield();
end
yrest(1000);
end
-- heal until full HP & MP
function rest_heal()
if( can_rest == false ) then return; end
keyboardHold(key_sit);
yrest(50);
keyboardRelease(key_sit);
-- set a timer to toggle healing in 30 seconds
registerTimer("heal_rest_timer", 30000, heal_rest_timer);
need_heal = true;
last_hp = HP;
while( need_heal ) do
yrest(100);
if (HP < last_hp) then
print("Under attack! Exiting rest.");
can_rest = false;
registerTimer("can_rest_timer", 3000, can_rest_timer);
break;
else
last_hp = HP;
end
end
keyboardHold(key_sit);
yrest(50);
keyboardRelease(key_sit);
yrest(200);
end
-- toggle can_heal to true, disable timer
function can_rest_timer()
unregisterTimer("can_rest_timer");
can_rest = true;
print("Can rest again.");
end
-- tell heal_rest we no longer need rest
function heal_rest_timer()
need_heal = false;
end
-- toggle cast needed for buff1
function buff1_timer()
buff1_needed = true;
end
-- toggle cast needed for buff2
function buff2_timer()
buff2_needed = true;
end
-- pickup nearby items
function pickup()
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
yrest(775)
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
end
-- you have died! oh noes!
function death_return()
keyboardPress(key.VK_SNAPSHOT);
print(os.date("Looks like somebody got you killed. %X"))
print("A screen capture has been taken. Open MS Paint and paste it.");
stopPE(); -- this turns the macro off!
coroutine.yield(); -- yield to make sure the protected environment stops
end
function move_forward()
keyboardHold(key.VK_W);
if( math.random(100) >= 80 )
then keyboardHold(key.VK_A);
else if( math.random(100) >= 80 )
then keyboardHold(key.VK_D); end
end
yrest( math.random(200) );
keyboardRelease(key.VK_W);
keyboardRelease(key.VK_A);
keyboardRelease(key.VK_D);
end
-- update client variables by reading from it's memory
function update_vars()
HP = memoryReadIntPtr(proc, HP_ptr, HP_offset);
MP = memoryReadIntPtr(proc, MP_ptr, MP_offset);
-- SP = memoryReadIntPtr(proc, SP_ptr, SP_offset);
-- X_coord = memoryReadIntPtr(proc, X_ptr, X_offset);
-- Y_coord = memoryReadIntPtr(proc, Y_ptr, Y_offset);
end
-- rotate camera
function rotate_cam()
wx,wy = windowRect(win);
mouseSet(wx+512, wy+412);
yrest(100);
mouseRHold();
yrest(200);
mouseSet(wx+526, wy+412);
yrest(100);
mouseRRelease();
yrest(100);
end
-- selects a nearby monster
function target_monster()
keyboardHold(key.VK_TAB);
yrest(50);
keyboardRelease(key.VK_TAB);
end
-- checks if you have a target
function have_target()
r,g,b = getPixel(hdc, 579, 79);
print(r,g,b);
-- check for the blueish color in the monster's HP window
if( r >= 18 and r <= 36 and g >= 34 and g <= 49 and b >= 93 and b<= 109 ) then
return true;
else
return false;
end
end
--function used to test the position and colour of the current pixel under the mouse
function pixeltest()
x,y = mouseGetPos();
print("mouse_x: ", x, "; mouse_y: ", y); -- display the coordinates of the mouse
r,g,b = getPixel(hdc, x, y);
print("R : ", r, "; G : ", g, "; B : ", b);
end
-------------------------------------------------
-- FUNCTION MAIN
-------------------------------------------------
function main()
win = findWindow("HoLic Online");
hdc = openDC(win);
proc = openProcess( findProcessByExe("HolicUSA.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", buff1_duration, buff1_timer);
registerTimer("buff2_timer", buff2_duration, buff2_timer);
--pixeltest();
while( 1 ) do
--pixeltest();
if( HP == 0 ) then death_return(); end
if( HP < HP_potion ) then hp_potion(); end
if( MP < MP_potion ) then mp_potion(); end
if( SP < SP_potion ) then sp_potion(); end
if( HP < HP_sit and can_rest == true ) then rest_heal(); end
if( MP < MP_sit and can_rest == true ) then rest_heal(); end
print(X_coord, Y_coord);
yrest(100);
target_monster();
yrest(200);
if( have_target() ) then
can_rest = false; -- prevent resting during battle
-- for the few that have this bug
if( class == CLASS_WARRIOR) then fight_warrior(); end
if( class == CLASS_MAGE) then fight_mage(); end
can_rest = true;
else
rotate_cam();
if( math.random(100) > 90 ) then
move_forward(); end
end
if(have_pig == 0) then
pickup();
end
-------- if you want more than 2 buffs you gotta duplicate and change one of these if statements
if( buff_1 == 1 ) then
if( buff1_needed ) then
keyboardPress(buff_key1);
print(os.date("buff 1 casted %X"))
buff1_needed = false;
yrest(1000);
end
end
if( buff_2 == 1 ) then
if( buff2_needed ) then
keyboardPress(buff_key2);
print(os.date("buff 2 casted %X"))
buff2_needed = false;
yrest(1000);
end
end
if( buff_3 == 1 ) then
if( buff3_needed ) then
keyboardPress(buff_key3);
print(os.date("buff 3 casted %X"))
buff3_needed = false;
yrest(1000);
end
end
end
detach();
closeProcess(proc);
end
startMacro(main);
-------------------------------------------------
Re: Introducing Holic Online
Posted: Thu Jan 24, 2008 10:56 am
by Reiiko
He this is a Shaiya Question
What do i need to change here i'm new to this
-- character configuration
-------------------------------------------------
class = CLASS_WARRIOR;
key_attack = key.VK_1;
key_pickup = key.VK_2;
key_sit = key.VK_C;
key_skill1 = key.VK_3;
key_skill2 = key.VK_4;
key_skill3 = key.VK_5;
key_hppotion = key.VK_8;
key_mppotion = key.VK_9;
key_sppotion = key.VK_9;
-- rest or use potions when low on HP/MP/SP
HP_usepotion = 350;
MP_usepotion = 0;
SP_usepotion = 0;
HP_sit = 180;
MP_sit = 0;
SP_sit = 20;
-- chance to cast
skill1_chance = 100;
skill2_chance = 0;
skill3_chance = 0;
-- MP cost
skill1_cost = 38;
skill2_cost = 20;
skill3_cost = 80;
casttime = 2000;
Re: Introducing Holic Online
Posted: Thu Jan 24, 2008 12:05 pm
by Administrator
Holic is not Shaiya. I'm not sure why you posted a Shaiya question here. Anyways, change whatever you want.
Re: Introducing Holic Online
Posted: Tue May 13, 2008 6:13 am
by SoftCloth
Hi, I was using the Holic.lua script yesterday and it worked for about 5 minutes, then I kept getting an error:
WARNING: Failure reading memory from 0x11B31A8 at 0x9127f8 in memoryReadIntPtr<>. Error code 299 (Only part of a ReadProcessMemory or WriteProcessMemory request was completed.)
Looks like somebody got you killed.
A screen capture has been taken. Open MS Paint and paste it.
Only when I get this error I'd be at full health, also I'd just randomly use potions even though I have it set to use them at 200 health.

You guys think you could help me out?
Re: Introducing Holic Online
Posted: Tue May 13, 2008 1:20 pm
by Administrator
So it happened in the middle of botting? After closing and reopening MicroMacro, did you still have the error message coming up? After restarting the game client? Your computer?
Re: Introducing Holic Online
Posted: Wed Sep 10, 2008 3:39 am
by tgbhgf
please help it's not working. the 1st one works but the edited one doesn't. the pic is the error of the 2nd one he posted and the 1st i have no idea -.-
Re: Introducing Holic Online
Posted: Thu Sep 11, 2008 1:00 am
by Administrator
Holic has XTrap protection, doesn't it? You'll need to remove that before it'll work.
Re: Introducing Holic Online
Posted: Thu Sep 11, 2008 2:09 am
by tgbhgf
can you help me remove it =( i can't do it -.-
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 12:08 am
by Impala
This works, but it looks like the memory addresses are wrong...there is no in game protection so if someone could update the script, it would be greatly appreciated
*EDIT* I edited the script to make it work without any type of healing all it needs to have healing is for someone to edit the script above for new addresses
Code: Select all
-------------------------------------------------
--Holic Online Bot
--Mystikfox
--Hackbar
--Mangler
-------------------------------------------------
-- Variable declaration -- do not edit
-------------------------------------------------
CLASS_WARRIOR = 0;
CLASS_MAGE = 1;
HP = 10000;
MP = 10000;
SP = 10000;
-------------------------------------------------
-------------------------------------------------
-- character configuration YOU HAVE TO CHANGE THIS STUFF FOR THE BOT TO WORK RIGHT
-------------------------------------------------
class = CLASS_WARRIOR;
key_attack = key.VK_1;
key_pickup = key.VK_TILDE;
key_sit = key.VK_F2;
key_skill1 = key.VK_2;
key_skill2 = key.VK_3;
key_skill3 = key.VK_4;
key_hppotion = key.VK_7;
key_mppotion = key.VK_F4;
key_sppotion = key.VK_F3;
-- rest or use potions when low on HP/MP/SP
HP_potion = 600;
MP_potion = 40;
SP_potion = 0;
HP_sit = 40;
MP_sit = 0;
SP_sit = 0;
-- chance to cast
skill1_chance = 80;
skill2_chance = 80;
skill3_chance = 0;
-- MP cost
skill1_cost = 15;
skill2_cost = 20;
skill3_cost = 25;
have_pig = 0; -- set to 1 if you have a fortune pig and want to
-- skip the manual pickup function
-- buff stuff
-- NOTE: set on 10 minutes
-- buff / scroll durations in msec time = minutes x 60000
-- to de- activate non used buffs / scrolls replace "1" with "0"
-- to activate buff / scroll replace "0" with "1"
-- scrolls can be used too as buff
-------------------------
buff1_duration = 1800000;
buff_1 = 1;
buff_key1 = key.VK_8;
buff2_duration = 1800000;
buff_2 = 1;
buff_key2 = key.VK_9;
buff3_duration = 1800000;
buff_3 = 1;
buff_key3 = key.VK_0;
--dont change these
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
-- cast times in milliseconds
skill1_casttime = 2000;
skill2_casttime = 1000;
skill3_casttime = 3000;
-- skill cool downs in milliseconds (not working)
skill1_cooldown = 3000;
skill2_cooldown = 8000;
skill3_cooldown = 9000;
-------------------------------------------------
function hp_potion()
keyboardPress(key_hppotion);
end
function mp_potion()
keyboardPress(key_mppotion);
end
function sp_potion()
keyboardPress(key_sppotion);
end
-- so we aren't spamming the attack key...
-- we will use a timer to press it once
-- every 3 seconds.
function attack_timer()
keyboardPress(key_attack);
end
function fight_warrior()
registerTimer("attack_timer", 3000, attack_timer);
while( have_target() ) do
local roll = math.random(100);
if( roll <= skill1_chance and SP >= skill1_cost ) then
keyboardPress(key_skill1);
yrest(120);
elseif( roll <= skill2_chance and SP >= skill2_cost ) then
keyboardPress(key_skill2);
yrest(120);
elseif( roll <= skill3_chance and SP >= skill3_cost ) then
keyboardPress(key_skill3);
yrest(120);
else
keyboardPress(key_attack);
yrest(500);
end
yrest(250);
coroutine.yield();
end
unregisterTimer("attack_timer");
yrest(1000);
end
function fight_mage()
while( have_target() ) do
local roll = math.random(100);
if( roll <= skill1_chance and MP >= skill1_cost ) then
-- cast skill 1
keyboardPress(key_skill1);
yrest(skill1_casttime);
else
keyboardPress(key_attack);
end
if( roll <= skill2_chance and MP >= skill2_cost ) then
-- cast skill 1
keyboardPress(key_skill2);
yrest(skill2_casttime);
else
keyboardPress(key_attack);
end
yrest(100);
coroutine.yield();
end
yrest(1000);
end
-- toggle can_heal to true, disable timer
function can_rest_timer()
unregisterTimer("can_rest_timer");
can_rest = true;
print("Can rest again.");
end
-- tell heal_rest we no longer need rest
function heal_rest_timer()
need_heal = false;
end
-- toggle cast needed for buff1
function buff1_timer()
buff1_needed = true;
end
-- toggle cast needed for buff2
function buff2_timer()
buff2_needed = true;
end
-- pickup nearby items
function pickup()
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
yrest(775)
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
end
-- you have died! oh noes!
function death_return()
keyboardPress(key.VK_SNAPSHOT);
print(os.date("Looks like somebody got you killed. %X"))
print("A screen capture has been taken. Open MS Paint and paste it.");
stopPE(); -- this turns the macro off!
coroutine.yield(); -- yield to make sure the protected environment stops
end
function move_forward()
keyboardHold(key.VK_W);
if( math.random(100) >= 80 )
then keyboardHold(key.VK_A);
else if( math.random(100) >= 80 )
then keyboardHold(key.VK_D); end
end
yrest( math.random(200) );
keyboardRelease(key.VK_W);
keyboardRelease(key.VK_A);
keyboardRelease(key.VK_D);
end
-- update client variables by reading from it's memory
function update_vars()
-- SP = memoryReadIntPtr(proc, SP_ptr, SP_offset);
-- X_coord = memoryReadIntPtr(proc, X_ptr, X_offset);
-- Y_coord = memoryReadIntPtr(proc, Y_ptr, Y_offset);
end
-- rotate camera
function rotate_cam()
wx,wy = windowRect(win);
mouseSet(wx+512, wy+412);
yrest(100);
mouseRHold();
yrest(200);
mouseSet(wx+526, wy+412);
yrest(100);
mouseRRelease();
yrest(100);
end
-- selects a nearby monster
function target_monster()
keyboardHold(key.VK_TAB);
yrest(50);
keyboardRelease(key.VK_TAB);
end
-- checks if you have a target
function have_target()
r,g,b = getPixel(hdc, 579, 79);
print(r,g,b);
-- check for the blueish color in the monster's HP window
if( r >= 18 and r <= 36 and g >= 34 and g <= 49 and b >= 93 and b<= 109 ) then
return true;
else
return false;
end
end
--function used to test the position and colour of the current pixel under the mouse
function pixeltest()
x,y = mouseGetPos();
print("mouse_x: ", x, "; mouse_y: ", y); -- display the coordinates of the mouse
r,g,b = getPixel(hdc, x, y);
print("R : ", r, "; G : ", g, "; B : ", b);
end
-------------------------------------------------
-- FUNCTION MAIN
-------------------------------------------------
function main()
win = findWindow("HoLic Online");
hdc = openDC(win);
proc = openProcess( findProcessByExe("HolicUSA.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", buff1_duration, buff1_timer);
registerTimer("buff2_timer", buff2_duration, buff2_timer);
--pixeltest();
while( 1 ) do
--pixeltest();
print(X_coord, Y_coord);
yrest(100);
target_monster();
yrest(200);
if( have_target() ) then
can_rest = false; -- prevent resting during battle
-- for the few that have this bug
if( class == CLASS_WARRIOR) then fight_warrior(); end
if( class == CLASS_MAGE) then fight_mage(); end
can_rest = true;
else
rotate_cam();
if( math.random(100) > 90 ) then
move_forward(); end
end
if(have_pig == 0) then
pickup();
end
-------- if you want more than 2 buffs you gotta duplicate and change one of these if statements
if( buff_1 == 1 ) then
if( buff1_needed ) then
keyboardPress(buff_key1);
print(os.date("buff 1 casted %X"))
buff1_needed = false;
yrest(1000);
end
end
if( buff_2 == 1 ) then
if( buff2_needed ) then
keyboardPress(buff_key2);
print(os.date("buff 2 casted %X"))
buff2_needed = false;
yrest(1000);
end
end
if( buff_3 == 1 ) then
if( buff3_needed ) then
keyboardPress(buff_key3);
print(os.date("buff 3 casted %X"))
buff3_needed = false;
yrest(1000);
end
end
end
detach();
closeProcess(proc);
end
startMacro(main);
-------------------------------------------------
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 3:53 am
by tgbhgf
wow thanks but will it work with out removing xtrap in holic?
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 4:00 am
by Administrator
Holic doesn't have XTrap? Maybe you're right. I must have been confusing it with some other game.
tgbhgf: You'll have to get Cheat Engine and look up the new addresses. That is, these:
HP_ptr = "009127F8";
HP_offset = 556;
MP_ptr = "009127F8";
MP_offset = 552;
Once updated, it should work.
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 5:06 am
by tgbhgf
im confused T_T so you don't need to remove xtrap from holic be4 you use this?
and about Cheat Engine i have no clue...how to even get it

Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 7:30 am
by Administrator
Apparently it doesn't have XTrap, so no. I've never played the game, so I couldn't tell you.
Google for Cheat Engine. Then follow the tutorial in the memory editing section of this forum that shows how to look up pointers.
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 2:51 pm
by Impala
Ok, don't say I didn't do anything for anyone
*EDIT* Might be the wrong pointers...someone test
Re: Introducing Holic Online
Posted: Thu Sep 18, 2008 4:29 pm
by tgbhgf
o.O Holic doesn't have xTrap? wow cool ^^
edited: omg whenever i attack a monster it says "You have been killed" and the thing stops T_T please help