Page 4 of 4
Re: World of Kungfu Bot (Updated)
Posted: Wed Jul 30, 2008 11:48 pm
by felix_fx2
new offsets
Code: Select all
HP_ptr = "005FE608";
HP_offset = 192;
MP_ptr = "005FE608";
MP_offset = 200;
credits
victor_leong
gr8_viruz
Someone please verify
Re: World of Kungfu Bot (Updated)
Posted: Thu Aug 28, 2008 1:46 am
by listairee
I am using a bow and I am using the script from earlier post, kungfubow.lua. I seem to be getting this error, kungfubow.lua:310: bad argument #2 to 'memoryReadIntPtr' <<null>>. I am hoping someone would be able to help me. The coding is as follows:
Code: Select all
-------------------------------------------------
--World of Kung Fu Bot
--Mystikfox
--Hackbar
--Mangler
-------------------------------------------------
-- Variable declaration -- do not edit
-------------------------------------------------
CLASS_WARRIOR = 0;
CLASS_MAGE = 1;
CLASS_BOW = 3;
HP = 10000;
MP = 10000;
SP = 10000;
HP_ptr = "005EE608";
HP_offset = 192;
MP_ptr = "005EE608";
MP_offset = 200;
SP_ptr = "020F2910";
SP_offset = 312;
-------------------------------------------------
-------------------------------------------------
-- character configuration YOU HAVE TO CHANGE THIS STUFF FOR THE BOT TO WORK RIGHT
-------------------------------------------------
class = CLASS_BOW;
key_attack = key.VK_1;
key_pickup = key.VK_TILDE;
key_sit = key.VK_Z;
key_skill1 = key.VK_2;
key_skill2 = key.VK_3;
key_skill3 = key.VK_4;
key_hppotion = key.VK_F1;
key_mppotion = key.VK_F2;
key_sppotion = key.VK_F3;
-- rest or use potions when low on HP/MP/SP
HP_potion = 250;
MP_potion = 80;
SP_potion = 0;
HP_sit = 300;
MP_sit = 100;
SP_sit = 0;
-- chance to cast
skill1_chance = 100;
skill2_chance = 80;
skill3_chance = 50;
-- MP cost
skill1_cost = 10;
skill2_cost = 5;
skill3_cost = 6;
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 = 300000;
buff_1 = 0;
buff_key1 = key.VK_6;
buff2_duration = 600000;
buff_2 = 0;
buff_key2 = key.VK_7;
--dont change these
buff1_needed = true;
buff2_needed = true;
-- cast times in milliseconds
skill1_casttime = 2000;
skill2_casttime = 2000;
skill3_casttime = 3000;
-- skill cool downs in milliseconds (not working)
skill1_cooldown = 3000;
skill2_cooldown = 1000;
skill3_cooldown = 5000;
-------------------------------------------------
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
keyboardPress(key_skill1);
yrest(120);
keyboardPress(key_skill2);
yrest(120);
keyboardPress(key_skill3);
yrest(120);
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
function fight_bow()
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
keyboardPress(key_skill1);
yrest(120);
keyboardPress(key_skill2);
yrest(120);
keyboardPress(key_skill3);
yrest(120);
coroutine.yield();
end
unregisterTimer("attack_timer");
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 enhanced
function pickup()
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
yrest(775)
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(2000) );
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);
end
-- rotate camera
function rotate_cam()
wx,wy = windowRect(win);
mouseSet(wx+512, wy+384);
yrest(100);
mouseRHold();
yrest(100);
mouseSet(wx+514, wy+384);
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, 506, 31);
--print(r,g,b); unneeded testcode
-- check for the goldish color in the monster's HP window
if( r >= 205 and r <= 225 and g >= 205 and g <= 230 and b >= 185 and b<= 200 ) then
return true;
else
return false;
end
end
-------------------------------------------------
-- FUNCTION MAIN
-------------------------------------------------
function main()
win = findWindow("Kungfu Client");
hdc = openDC(win);
proc = openProcess( findProcessByExe("GongfuClient.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", buff1_duration, buff1_timer);
registerTimer("buff2_timer", buff2_duration, buff2_timer);
--pixeltest(); commented test code
while( 1 ) do
if( HP == 0 ) then death_return(); end
if( HP < HP_potion ) then hp_potion(); end
if( MP < MP_potion ) then mp_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
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
if( class == CLASS_BOW) then fight_bow(); 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( 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 1 casted %X"))
buff1_needed = false;
yrest(1000);
end
end
end
detach();
closeProcess(proc);
end
startMacro(main);
-------------------------------------------------
Any help would be appreciated. Thanks in advance.
Re: World of Kungfu Bot (Updated)
Posted: Wed Oct 08, 2008 12:39 pm
by DarkP
Wouldn't it be better to just read the HP/MP/SP bar using pixels? I know it won't be as accurate but it saves the hassle of getting the address each time a patch is out...hmm?
Re: World of Kungfu Bot (Updated)
Posted: Wed Oct 08, 2008 5:07 pm
by Administrator
Yes, DarkP, that is an option. However, due to it's lack of accuracy and reliability, it's usually a last resort. Also, you can only read pixels from the window if it is showing (not minimized) and the area you are trying to read from is not covered by a window. This makes it less than desirable for those people who would like to have the bot work full-auto while they check their e-mail or browse the web.
The #1 problem with pixel reading is that the results differ greatly depending on each user's graphics card and video settings. So what might show up as pure read (255, 0, 0) to me could be slightly different for you (254, 5, 2). Although they are similar (and there is a function to help check if two colors match close enough) it doesn't always want to work. And alpha transparency is a nightmare...
Looking up addresses is fairly easy to do once you know how. The Cheat Engine tutorial on looking up pointers and offsets in the memory editing section of this forum is very useful. It is the method I use most of the time, and have had great success with it. Offsets rarely change, and pointers are typically shared, so once you've found the pointer to, say, your HP, again, you've also already got all the information you need for MP, SP, and other information.
HP_ptr = "005EE608";
HP_offset = 192;
Addresses as a string have been deprecated for a long time. They would need to follow the form 0x005EE608, however, that won't work either as the address has still changed.
Re: World of Kungfu Bot (Updated)
Posted: Wed Oct 08, 2008 8:24 pm
by DarkP
Interesting... but I used pixel reading with some success right now, using 2-3 pixel matches. I *think* it works as it is right now because HP bars are either reddish color or blackish color, and not some other colors, same with MP/SP bars. However, I do have to avoid the numbers because it screws up detection, so my script can only detect whether it's 0, "almost empty", "almost full", "full"...
Anyway, can't really do a full auto bot on this game as the 4 numbers of death (or free healing, depends on your perspective) shows up randomly.
Re: World of Kungfu Bot (Updated)
Posted: Tue Nov 25, 2008 10:16 am
by KamikaZ
So i guess this is not working anymore, Right?
Here is my log, some1 knows how to fix this?
pl0x lvling gets realy slow after 40+
Greetz,
KamikaZ
Code: Select all
Tue Nov 25 16:23:46 2008 : MicroMacro v0.99
Tue Nov 25 16:23:46 2008 : Processor Type: 586, OS: Windows XP Service Pack 3
Tue Nov 25 16:23:46 2008 : Lua initialized successfully.
Tue Nov 25 16:23:46 2008 : Lua libs opened successfully.
Tue Nov 25 16:23:46 2008 : LuaCoco is available.
Tue Nov 25 16:23:46 2008 : Lua glues exported.
Tue Nov 25 16:23:46 2008 : Keyboard layout: US English
Tue Nov 25 16:23:46 2008 : Configurations run.
Tue Nov 25 16:23:55 2008 : Executing script "kungfubow1.lua".
==================================================
stack traceback:
.\Bureaublad\wokf\micromacro\lib\lib.lua:476: in function 'startMacro'
..\Bureaublad\wokf\micromacro\scripts\kungfubow1.lua:427: in main chunk
----------TRACEBACK END----------
Tue Nov 25 16:24:09 2008 ...\Bureaublad\wokf\micromacro\scripts\kungfubow1.lua:310: bad argument #2 to 'memoryReadIntPtr' ((null))
Tue Nov 25 16:24:09 2008 : Execution of kungfubow1.lua complete.
Tue Nov 25 16:24:09 2008 : Execution error: Runtime error
Tue Nov 25 16:24:09 2008 : Collecting garbage...
Tue Nov 25 16:24:09 2008 : 54KB freed.
Re: World of Kungfu Bot (Updated)
Posted: Tue Nov 25, 2008 10:52 am
by Administrator
String-style addresses were deprecated a long time ago, which is what that script uses. Just open it in notepad and fix them. It's pretty simple. You'll see a line that looks like this:
Just change "005EE608" to 0x005EE608 (remove the quotes, too!), then save it. Do the same thing for the MP_ptr and SP_ptr.
Re: World of Kungfu Bot (Updated)
Posted: Sat Dec 13, 2008 7:01 pm
by Blackmusky
I dont know if this still works with 1.0.40 but when I run it I get this: Looks like somebody got you killed.
Ascreen capture has been taken. blah blah... No errors in log. Any ideas?
Code: Select all
-------------------------------------------------
--World of Kung Fu Bot
--Mystikfox
--Hackbar
--Mangler
-------------------------------------------------
-- Variable declaration -- do not edit
-------------------------------------------------
CLASS_WARRIOR = 0;
CLASS_MAGE = 1;
HP = 10000;
MP = 10000;
SP = 10000;
HP_ptr = 0x005EE608;
HP_offset = 192;
MP_ptr = 0x005EE608;
MP_offset = 200;
SP_ptr = 0x020F2910;
SP_offset = 312;
-------------------------------------------------
-------------------------------------------------
-- character configuration YOU HAVE TO CHANGE THIS STUFF FOR THE
BOT TO WORK RIGHT
-------------------------------------------------
class = CLASS_Spear;
key_attack = key.VK_1;
key_pickup = key.VK_TILDE;
key_sit = key.VK_Z;
key_skill1 = key.VK_2;
key_skill2 = key.VK_3;
key_skill3 = key.VK_4;
key_hppotion = key.VK_F1;
key_mppotion = key.VK_F2;
key_sppotion = key.VK_F3;
-- rest or use potions when low on HP/MP/SP
HP_potion = 40;
MP_potion = 0;
SP_potion = 0;
HP_sit = 40;
MP_sit = 0;
SP_sit = 0;
-- chance to cast
skill1_chance = 100;
skill2_chance = 80;
skill3_chance = 0;
-- MP cost
skill1_cost = 38;
skill2_cost = 20;
skill3_cost = 80;
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 "1" with "1"
-- scrolls can be used too as buff
-------------------------
buff1_duration = 600000;
buff_1 = 0;
buff_key1 = key.VK_8;
buff2_duration = 600000;
buff_2 = 0;
buff_key2 = key.VK_9;
--dont change these
buff1_needed = true;
buff2_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
keyboardPress(key_skill1);
yrest(120);
keyboardPress(key_skill2);
yrest(120);
keyboardPress(key_skill3);
yrest(120);
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(2000) );
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);
end
-- rotate camera
function rotate_cam()
wx,wy = windowRect(win);
mouseSet(wx+512, wy+384);
yrest(100);
mouseRHold();
yrest(100);
mouseSet(wx+514, wy+384);
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, 506, 31);
--print(r,g,b); unneeded testcode
-- check for the goldish color in the monster's HP window
if( r >= 205 and r <= 225 and g >= 205 and g <= 230 and b >= 185
and b<= 200 ) then
return true;
else
return false;
end
end
-------------------------------------------------
-- FUNCTION MAIN
-------------------------------------------------
function main()
win = findWindow("Kungfu Client");
hdc = openDC(win);
proc = openProcess( findProcessByExe("GongfuClient.exe") );
attach(win);
registerTimer("update_vars", 100, update_vars);
registerTimer("buff1_timer", buff1_duration, buff1_timer);
registerTimer("buff2_timer", buff2_duration, buff2_timer);
--pixeltest(); commented test code
while( 1 ) do
if( HP == 0 ) then death_return(); end
if( HP < HP_potion ) then hp_potion(); end
if( MP < MP_potion ) then mp_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
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( 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 1 casted %X"))
buff1_needed = false;
yrest(1000);
end
end
end
detach();
closeProcess(proc);
end
startMacro(main);
-------------------------------------------------
Re: World of Kungfu Bot (Updated)
Posted: Mon Dec 15, 2008 8:14 pm
by Blackmusky
Anybody ???
Re: World of Kungfu Bot (Updated)
Posted: Sat Feb 21, 2009 3:21 pm
by SinSxi
Can someone update this, it would be much appreciated!
Re: World of Kungfu Bot (Updated)
Posted: Fri May 22, 2009 2:12 am
by longnt
New pointer
HP_ptr = 0x00621608;
HP_offset = 192;
MP_ptr = 0x00621608;
MP_offset = 200;
Re: World of Kungfu Bot (Updated)
Posted: Thu Oct 02, 2014 3:20 am
by redemption94
Why doesn't the rotate camera function not working? I have to stay in front of the pc to rotate the camera manually.