------------------------------------------------- --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 = "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_WARRIOR; 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 = 500; 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 = 1; -- 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 = 600000; buff_1 = 1; 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 Ver:1.0.29b"); hdc = openDC(win); proc = openProcess( findProcess("Kungfu Client Ver:1.0.29b") ); 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); -------------------------------------------------