local emergencyHeal=0; ------------------------------------------------ -- HOTKEYS ------------------------------------------------ MOVEMENT_OFFSET = 609; SPEED_OFFSET = 260; startKey = key.VK_INSERT; stopKey = key.VK_DELETE; key_switchtarget = key.VK_TILDE; key_attack = key.VK_1; key_pickup = key.VK_2; key_skill1 = key.VK_3; key_skill2 = key.VK_4; key_skill3 = key.VK_5; key_buff1 = key.VK_6; key_buff2 = key.VK_7; key_hp_potion = key.VK_8; key_mp_potion1 = key.VK_NUMPAD1; key_mp_potion2 = key.VK_NUMPAD2; key_mp_potion3 = key.VK_NUMPAD3; key_mp_potion4 = key.VK_NUMPAD4; key_mp_potion5 = key.VK_NUMPAD5; key_mp_potion6 = key.VK_NUMPAD6; key_mp_potion7 = key.VK_NUMPAD7; key_mp_potion8 = key.VK_NUMPAD8; key_mp_potion9 = key.VK_NUMPAD9; key_mp_potion0 = key.VK_NUMPAD0; key_mp_potion = key.VK_9; key_sp_potion = key.VK_0; key_sit = key.VK_C; myself = key.VK_F1; partner = key.VK_F2 ------------------------------------------------ -- SKILLS secondsToTimer(x); ------------------------------------------------ -- Set to 0 if you don't want to use a skill skill1_time = 0; skill2_time = 0; skill3_time = minutesToTimer(3); ------------------------------------------------ -- BUFFS ------------------------------------------------ -- Set a buff to 0 if you don't want to use it buff1_time = minutesToTimer(9); buff2_time = minutesToTimer(4); ------------------------------------------------ -- POTIONS ------------------------------------------------ -- All potion use values are specified in % -- Set the values to 0 to not use that potion HP_potion_use = 50; MP_potion_use = 50; SP_potion_use = 50; HP_emergency_heal = 70; ------------------------------------------------ -- SITTING ------------------------------------------------ -- All sitting values are specified in % -- We will only sit while out of battle -- Set the values to 0 to not use sitting HP_sit = 25; MP_sit = 10; SP_sit = 10; --[[********************************************************************* ************************************************************************** DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING ************************************************************************** ************************************************************************]] ------------------------------------------------ -- Memory addresses ------------------------------------------------ playerptr_addr = 0x848274; HP_offset = 0x130; MaxHP_offset = 0x134; MP_offset = 0x138; MaxMP_offset = 0x13C; SP_offset = 0x140; MaxSP_offset = 0x144; targetid_addr = 0x6F3BE0;; -- short, 65535 if none selected -- REMOVED -- targettype_addr = 0x00619B1F; -- byte, 0 = player/NPC, 7 = monster sitcheck_addr = 0x00643648; -- byte, 0 = standing, 7 = sitting -------------------------------------------------------------------------------------------------------------- function init_window() win = findWindow("Shaiya"); if(win == nil) then printf(error_init); macro_running = false; end end function init_process() proc = openProcess( findProcessByExe("game.exe") ); if(proc == 0) then printf("error opening process.\n"); macro_running = false; end end function init_hdc() hdc = openDC(get_win()); local wx, wy, ww, wh = windowRect(get_win()); end function get_hdc() return hdc; end function get_win() return win; end function debug_message(msg) if (g_debug) then print(msg); logMessage(msg); end end window_mode = false; g_debug = true; function set_movement() memoryWriteBytePtr(proc, playerptr_addr, MOVEMENT_OFFSET, 3); end function set_attackspeed() memoryWriteIntPtr(proc, playerptr_addr, SPEED_OFFSET, 520); speedatk = memoryReadIntPtr(proc, playerptr_addr, SPEED_OFFSET); printf(speedatk); end -------------------------------------------------------------------------------- -- Memory Addresses. TARGET_POS_X_ADDRESS = 0x1FCFE80; TARGET_POS_Y_ADDRESS = 0x1FCFE84; TARGET_POS_Z_ADDRESS = 0x1FCFE88; TARGET_TYPE_ADDR = 0x0619B1F; -- Field Values. TARGET_UNKNOWN = 0; TARGET_DAMAGED = 1; TARGET_FULL = 2; TARGET_BAR_COLOR = { r_min=150, r_max=180, g_min=10, g_max=40, b_min=50, b_max=80 }; TARGET_HEALTH_BAR_PIXEL_OFFSET_1 = {x=36, y=36}; TARGET_HEALTH_BAR_PIXEL_OFFSET_2 = {x=165, y=36}; TARGET_HEALTH_BAR_PIXEL_OFFSET_3 = {x=100, y=36}; cant = {x=0, y=0}; -- Target Name Color TARGET_NAME_COLOR_SCAN_OFFSET_1 = {x=98, y=15}; TARGET_NAME_COLOR_SCAN_OFFSET_2 = {x=110, y=15}; target_name_color = { unknown=0, white=1, cyan=2, blue=3, green=4, yellow=5, orange=6, red=7, purple=8, grey=9, } --[[TARGET_NAME_COLOR_WHITE = 1; TARGET_NAME_COLOR_CYAN = 2; TARGET_NAME_COLOR_BLUE = 3; TARGET_NAME_COLOR_GREEN = 4; TARGET_NAME_COLOR_YELLOW = 5; TARGET_NAME_COLOR_ORANGE = 6; TARGET_NAME_COLOR_RED = 7; TARGET_NAME_COLOR_PURPLE = 8; TARGET_NAME_COLOR_GREY = 9;]] -- In order of difficulty, from easiest to hardest. target_name_color_rgb = { [target_name_color["white"]] = {r_min=255, r_max=255, g_min=255, g_max=255, b_min=255, b_max=255}, [target_name_color["cyan"]] = {r_min=120, r_max=140, g_min=255, g_max=255, b_min=255, b_max=255}, [target_name_color["blue"]] = {r_min=0, r_max=0, g_min=0, g_max=0, b_min=255, b_max=255}, [target_name_color["green"]] = {r_min=0, r_max=0, g_min=255, g_max=255, b_min=0, b_max=0}, [target_name_color["yellow"]] = {r_min=255, r_max=255, g_min=255, g_max=255, b_min=0, b_max=0}, [target_name_color["orange"]] = {r_min=255, r_max=255, g_min=128, g_max=128, b_min=0, b_max=0}, [target_name_color["red"]] = {r_min=255, r_max=255, g_min=0, g_max=0, b_min=0, b_max=0}, [target_name_color["purple"]] = {r_min=255, r_max=255, g_min=0, g_max=0, b_min=255, b_max=255}, --[target_name_color["grey"]] = {r_min=255, r_max=255, -- g_min=255, g_max=255, -- b_min=255, b_max=255}, } TARGET_TYPE_FRIENDLY = 0; TARGET_TYPE_NOTHING = -1; -- Delays. MONSTER_DIE_DELAY = 500; -- Status Info Bar, offset. STATUSINFOBAR_POS = {x=0, y=0}; -- Target constructor. -- Refreshes the variables of the target from memory. -- @return nothing. -- Looks at pixels in the status info bar in the h/w device context, -- to determine the status of the monster. -- note - this has known errors, changing the colour bit value, or restarting PC -- seems to fix it. -- @return TARGET_UNKNOWN does not have any detectable red bar. -- TARGET_DAMAGED if some red bar exists. -- TARGET_FULL full red bar. function status() local pos_1 = {x=(STATUSINFOBAR_POS["x"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_1["x"]), y=(STATUSINFOBAR_POS["y"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_1["y"])}; local pos_2 = {x=(STATUSINFOBAR_POS["x"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_2["x"]), y=(STATUSINFOBAR_POS["y"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_2["y"])}; local pos_3 = {x=(STATUSINFOBAR_POS["x"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_3["x"]), y=(STATUSINFOBAR_POS["y"] + TARGET_HEALTH_BAR_PIXEL_OFFSET_3["y"])}; local pos_4 = {x=(STATUSINFOBAR_POS["x"] + cant["x"]), y=(STATUSINFOBAR_POS["y"] + cant["y"])}; --printf("x1:%d y1:%d x2:%d y2:%d\n", pos_1["x"], pos_1["y"], pos_2["x"], pos_2["y"]); local l_hdc = get_hdc(); -- s(RGB) begining E(RGB) end M(RGB) middle; local sr,sg,sb; local er,eg,eb; local cr,cg,cb; local mr,mg,mb; if (window_mode) then local wx, wy = windowRect(get_win()); --debug_message(sprintf("win_x: %d, wim_y: %d\n", wx, wy)); sr,sg,sb = getPixel(l_hdc, (wx + pos_1["x"]), (wy + pos_1["y"])); er,eg,eb = getPixel(l_hdc, (wx + pos_2["x"]), (wy + pos_2["y"])); mr,mg,mb = getPixel(l_hdc, (wx + pos_3["x"]), (wy + pos_3["y"])); cr,cg,cb = getPixel(l_hdc, (wx + pos_4["x"]), (wy + pos_4["y"])); else sr,sg,sb = getPixel(l_hdc, pos_1["x"], pos_1["y"]); er,eg,eb = getPixel(l_hdc, pos_2["x"], pos_2["y"]); mr,mg,mb = getPixel(l_hdc, pos_3["x"], pos_3["y"]); cr,cg,cb = getPixel(l_hdc, pos_4["x"], pos_4["y"]); end --closeDC(hdc); --debug_message(sprintf("sr: %d, sg: %d, sb: %d", sr, sg, sb)); --debug_message(sprintf("er: %d, eg: %d, eb: %d", er, eg, eb)); --debug_message(sprintf("mr: %d, mg: %d, mb: %d", mr, mg, mb)); debug_message(sprintf("cr: %d, cg: %d, cb: %d", cr, cg, cb)); if ((sr >= TARGET_BAR_COLOR["r_min"] and sr <= TARGET_BAR_COLOR["r_max"]) and (sg >= TARGET_BAR_COLOR["g_min"] and sg <= TARGET_BAR_COLOR["g_max"]) and (sb >= TARGET_BAR_COLOR["b_min"] and sb <= TARGET_BAR_COLOR["b_max"])) then if((er <= TARGET_BAR_COLOR["r_min"] and er <= TARGET_BAR_COLOR["r_max"]) and (eg <= TARGET_BAR_COLOR["g_min"] and eg <= TARGET_BAR_COLOR["g_max"]) and (eb <= TARGET_BAR_COLOR["b_min"] and eb <= TARGET_BAR_COLOR["b_max"])) then if((mr <= TARGET_BAR_COLOR["r_min"] and mr <= TARGET_BAR_COLOR["r_max"]) and (mg <= TARGET_BAR_COLOR["g_min"] and mg <= TARGET_BAR_COLOR["g_max"]) and (mb <= TARGET_BAR_COLOR["b_min"] and mb <= TARGET_BAR_COLOR["b_max"])) then emergencyHeal=1; end return TARGET_DAMAGED; end return TARGET_FULL; end return TARGET_UNKNOWN; end ----------------------------------------------------------------------------------- ------------------------------------------------ -- Variable setup ------------------------------------------------ HP = 10000; MaxHP = HP; MP = 10000; MaxMP = MP; SP = 10000; MaxSP = SP; skill1_ready = true; skill2_ready = true; skill3_ready = true; buff1_ready = true; buff2_ready = true; ------------------------------------------------ -- Functions ------------------------------------------------ skill1_toggle = function () skill1_ready = true; end; skill2_toggle = function () skill2_ready = true; end; skill3_toggle = function () skill3_ready = true; end; buff1_toggle = function () buff1_ready = true; end; buff2_toggle = function () buff2_ready = true; end; function use_hp_potion() keyboardPress(key_hp_potion); printf("Using HP potion\n"); end function use_mp_potion() keyboardPress(key_mp_potion); keyboardPress(key_mp_potion1); keyboardPress(key_mp_potion2); keyboardPress(key_mp_potion3); keyboardPress(key_mp_potion4); keyboardPress(key_mp_potion5); keyboardPress(key_mp_potion6); keyboardPress(key_mp_potion7); keyboardPress(key_mp_potion8); keyboardPress(key_mp_potion9); keyboardPress(key_mp_potion0); printf("Using MP potion\n"); end function use_sp_potion() keyboardPress(key_sp_potion); printf("Using SP potion\n"); end function sit() if( HP_sit == 0 ) then return; end printf("Sitting.\n"); local sitting = false; while( sitting == false ) do keyboardPress(key_sit); yrest(1000); sitting = memoryReadByte(proc, sitcheck_addr) ~= 0; end local lasthp = HP; while( true ) do if( HP == MaxHP and MP == MaxMP and SP == MaxSP ) then switch_target(); break; end if( HP < (lasthp - 10) ) then printf("Exiting rest...under attack\n"); break; else lasthp = HP; end yrest(100); end sitting = true; while( sitting ) do keyboardPress(key_sit); yrest(1000); sitting = memoryReadByte(proc, sitcheck_addr) ~= 0; end printf("Standing... Resuming bot\n"); yrest(1000); end function pickup() printf("Pickup!\n"); if( key_pickup == 0 ) then return; end local i; for i = 0, 5 do keyboardPress(key_pickup); yrest(500); end yrest(1000); end function update_vars() HP = memoryReadIntPtr(proc, playerptr_addr, HP_offset); MaxHP = memoryReadIntPtr(proc, playerptr_addr, MaxHP_offset); MP = memoryReadIntPtr(proc, playerptr_addr, MP_offset); MaxMP = memoryReadIntPtr(proc, playerptr_addr, MaxMP_offset); SP = memoryReadIntPtr(proc, playerptr_addr, SP_offset); MaxSP = memoryReadIntPtr(proc, playerptr_addr, MaxSP_offset); end function have_target() local readid = memoryReadShort(proc, targetid_addr); return ( readid ~= 0xFFFF ); end function find_target() keyboardPress(key_attack); end function switch_target() keyboardPress(key_switchtarget); end ------------------------------------------------ -- FIGHT ------------------------------------------------ function fight() local beginTime = os.time(); local attack_ready = true; local attack_toggle = function () attack_ready = true; end; registerTimer("attack_timer", secondsToTimer(3), attack_toggle); local targetid = memoryReadByte(proc, targetid_addr); printf("TARGETID: %d\n", targetid); while( have_target() ) do local curtarget = memoryReadByte(proc, targetid_addr); if( targetid ~= curtarget ) then break; end; local currentTime = os.time(); if( os.difftime(currentTime, beginTime) > 60 ) then -- more than 1 minute has passed break; -- exit combat end if( skill1_ready and skill1_time > 0 ) then keyboardPress(key_skill1); skill1_ready = false; yrest(1000); registerTimer("skill1_toggle", skill1_time, skill1_toggle); end; if( skill2_ready and skill2_time > 0) then keyboardPress(key_skill2); skill2_ready = false; yrest(1000); registerTimer("skill2_toggle", skill2_time, skill2_toggle); end; if( skill3_ready and skill3_time > 0) then keyboardPress(key_skill3); skill3_ready = false; yrest(1000); registerTimer("skill3_toggle", skill3_time, skill3_toggle); end; if( attack_ready ) then keyboardPress(key_attack); attack_ready = false; yrest(1000); end; if( (HP/MaxHP*100) < HP_potion_use and HP_potion_use > 0 ) then use_hp_potion(); end if( (MP/MaxMP*100) < MP_potion_use and MP_potion_use > 0 ) then use_mp_potion(); end if( (SP/MaxSP*100) < SP_potion_use and SP_potion_use > 0 ) then use_sp_potion(); end if( buff1_ready and buff1_time > 0 ) then keyboardPress(key_buff1); buff1_ready = false; yrest(2000); end; if( buff2_ready and buff2_time > 0 ) then keyboardPress(key_buff2); buff2_ready = false; yrest(2000); end; yrest(100); end printf("Target lost.\n"); unregisterTimer("attack_timer"); pickup() end ------------------------------------------------ -- MAIN ------------------------------------------------ function main() proc = openProcess(findProcessByExe("game.exe")); win = findWindow("Shaiya"); attach(win); setPriority(PRIORITY_HIGH); init_window(); init_process(); init_hdc(); registerTimer("update_vars", 100, update_vars); if( skill1_time ) then registerTimer("skill1_toggle", skill1_time, skill1_toggle); end if( skill2_time ) then registerTimer("skill2_toggle", skill2_time, skill2_toggle); end if( skill3_time ) then registerTimer("skill3_toggle", skill3_time, skill3_toggle); end if( buff1_time ) then registerTimer("buff1_toggle", buff1_time, buff1_toggle); end; if( buff2_time ) then registerTimer("buff2_toggle", buff2_time, buff2_toggle); end; while( true ) do printf("Status ", status(), "\n");local target_status = status(); --printf("target_color: %d\n", target_color); printf("target_status=%d\n", target_status); logMessage(sprintf("target_status=%d", target_status)); if (target_status == TARGET_DAMAGED) then keyboardPress(key_skill2); printf("Healing: Key 2 \n \n"); yrest(2000); if (emergencyHeal==1) then keyboardPress(key_skill1); printf("Emergency Healing: Key 2 \n \n"); emergencyHeal=0; end end --if( (HP/MaxHP*100) < HP_emergency_heal and HP_emergency_heal > 0 ) then --keyboardPress(myself); --keyboardPress(key_skill1); --yrest(200); --keyboardPress(partner); --end --yrest(500) if( buff1_ready and buff1_time > 0 ) then keyboardPress(key_buff1); buff1_ready = false; yrest(2000); end; if( buff2_ready and buff2_time > 0 ) then keyboardPress(key_buff2); buff2_ready = false; yrest(2000); end; if( skill3_ready and skill3_time > 0) then keyboardPress(key_skill3); skill3_ready = false; yrest(1000); registerTimer("skill3_toggle", skill3_time, skill3_toggle); end; if( (HP/MaxHP*100) < HP_potion_use and HP_potion_use > 0 ) then use_hp_potion(); end if( (MP/MaxMP*100) < MP_potion_use and MP_potion_use > 0 ) then use_mp_potion(); end if( (SP/MaxSP*100) < SP_potion_use and SP_potion_use > 0 ) then use_sp_potion(); end yrest(2000); end end startMacro(main);