Started.
...\micromacro\scripts\fighter.lua:587: bad argument #1 to 'memoryReadIntPtr' <<null>>
The bot casts 1 buff and shuts down. That's the error message up there.
I am running "no gg" also and tried this in "windowed mode".
Code: Select all
on = true;
off = false;
------------------------------------------------
-- HOTKEYS
------------------------------------------------
macro_running = on; -- leave this ON!
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_hp_potion1 = key.VK_NUMPAD1;
key_hp_potion2 = key.VK_NUMPAD2;
key_hp_potion3 = key.VK_NUMPAD3;
key_hp_potion4 = key.VK_NUMPAD4;
key_hp_potion5 = key.VK_NUMPAD5;
key_hp_potion6 = key.VK_NUMPAD6;
key_hp_potion7 = key.VK_NUMPAD7;
key_hp_potion8 = key.VK_NUMPAD8;
key_hp_potion9 = key.VK_NUMPAD9;
key_hp_potion0 = key.VK_NUMPAD0;
key_mp_potion = key.VK_9;
key_sp_potion = key.VK_0;
key_sit = key.VK_C;
key_move_down = key.VK_S;
key_move_right= key.VK_E;
key_myself = key.VK_F1;
key_jump = key.VK_SPACE;
key_home = key.VK_HOME;
key_right = key.VK_RIGHT;
do_jump = 0;
--- Don't touch the code above or the program will act differently/not work unless you kknow how to-----------------------
--------------------------------------------------------
-- If the target's hp is not full how many time you want it to scan for targets with full hp.
-- Note: Lag issue will happen. if the target's Hp is still loading it will switch targets.
-- This code prevents it from ksing other people's damaged mobs
-- Default is 4 but adjust it to your mobs zone
--------------------------------------------------------
how_many_scanTarget = 4;
--------------------------------------------------------
-- How many seconds you want to keep locking on the target. If the target's Hp is full for more than 15
-- seconds then that means you are stuck behind a wall, So the macro will change target.
-- Default is 15, if the mob is more spread apart adjust it with a higher number.
--------------------------------------------------------
how_many_seconds = 15;
--------------------------------------------------------
--How many time you want to pick up items after mob is dead.
--Default is 3. In some cases 4 should pick up every drop.
--------------------------------------------------------
how_many_pickup = 3;
--------------------------------------------------------
-- Choose what range of Colored Mob you would want your Fighter
-- To kill. This way your fighter does not run all over the map.
-- Default is min 3 max 3. Which means the micro will only target blue mobs.
--------------------------------------------------------
target_difficulty_color_min= 3;
target_difficulty_color_max= 5;
--white = 1
--cyan = 2
--blue = 3
--green = 4
--yellow = 5
--orange = 6
--red = 7
--purple = 8
--grey = 9
------------------------------------------------
-- SKILLS secondsToTimer(x);
------------------------------------------------
-- Set to 0 if you don't want to use a skill
skill1_time = secondsToTimer(60);
skill2_time = secondsToTimer(0);
skill3_time = secondsToTimer(0);
------------------------------------------------
-- BUFFS
------------------------------------------------
-- Set a buff to 0 if you don't want to use it
buff1_time = minutesToTimer(5);
buff2_time = minutesToTimer(5);
------------------------------------------------
-- 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 = 15;
SP_potion_use = 15;
------------------------------------------------
-- 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 = 60;
MP_sit = 10;
SP_sit = 10;
--[[*********************************************************************
**************************************************************************
DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING
**************************************************************************
************************************************************************]]
------------------------------------------------
-- Memory addresses
------------------------------------------------
playerptr_addr = 0x007835B4;
HP_offset = 296;
MaxHP_offset = 300;
MP_offset = 304;
MaxMP_offset = 308;
SP_offset = 312;
MaxSP_offset = 316;
targetid_addr = 0x0062FAD4; -- 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 target()
keyboardPress(key_switchtarget);
yrest(200);
end
function moveBreak()
keyboardHold(key_move_down);
yrest(500);
keyboardRelease(key_move_down);
end
function pickup()
printf("Pickup!\n");
if( key_pickup == 0 ) then return; end
local i;
for i = 0, how_many_pickup do
keyboardPress(key_pickup);
yrest(500);
end
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_DEAD = 3;
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};
-- 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=253, b_max=255},
[target_name_color["green"]] = {r_min=0, r_max=0,
g_min=1, g_max=255,
b_min=0, b_max=0},
[target_name_color["yellow"]] = {r_min=253, r_max=255,
g_min=253, 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;
-- Status Info Bar, offset.
STATUSINFOBAR_POS = {x=0, y=0};
-- 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"])};
--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 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"]));
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"]);
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));
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
-- Gets the monster difficulty color, by reading each pixel in a small fixed
-- line in the middle through the top of the lower case letters,
-- in the monster name label.
-- @return The color index of the name text on success, 0 on failure.
function get_difficulty_color()
local pos_1 = {x=(STATUSINFOBAR_POS["x"] + TARGET_NAME_COLOR_SCAN_OFFSET_1["x"]),
y=(STATUSINFOBAR_POS["y"] + TARGET_NAME_COLOR_SCAN_OFFSET_1["y"])};
local pos_2 = {x=(STATUSINFOBAR_POS["x"] + TARGET_NAME_COLOR_SCAN_OFFSET_2["x"]),
y=(STATUSINFOBAR_POS["y"] + TARGET_NAME_COLOR_SCAN_OFFSET_2["y"])};
local pr, pg, pb;
--local l_color = TARGET_NAME_COLOR_UNKNOWN;
--local hdc = openDC(shaiya_win);
local l_hdc = get_hdc();
for i=pos_1["x"], pos_2["x"] do
for j=pos_1["y"], pos_2["y"] do
if (window_mode) then
local wx, wy = windowRect(get_win());
printf("win_x: %d, wim_y: %d\n", wx, wy);
pr, pg, pb = getPixel(l_hdc, wx + i, wy + j);
else
pr, pg, pb = getPixel(l_hdc, i, j);
end
debug_message(sprintf("pr: %d, pg: %d, pb: %d", pr, pg, pb));
for k,v in pairs(target_name_color_rgb) do
--printf("v[r]: %d, v[g]: %d, v[b]: %d\n", v["r"], v["g"], v["b"]);
if(pr >= v["r_min"] and pr <= v["r_max"] and
pg >= v["g_min"] and pg <= v["g_max"] and
pb >= v["b_min"] and pb <= v["b_max"]) then
printf("target_difficulty_color: %s\n", k);
return k;
end
end
end
end
--closeDC(hdc);
return target_name_color["unknown"];
end
-------------------------------------------------------------------
-- Modification to see if Target is Dead or FULL HP
function targetstatus()
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"])};
--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;
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"]));
else
sr,sg,sb = getPixel(l_hdc, pos_1["x"], pos_1["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));
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
return TARGET_DEAD;
end
return TARGET_FULL;
end
------------------------------------------------------------------------
-----------------------------------------------------------------------------------
--*******Cycle Target to see if It matches your minimum and maximum color monster ********
function cycle_target()
--printf("self.switched_targets: %d\n", self.switched_targets);
--printf("self.max_switch_targets: %d\n", self.max_switch_targets);
--debug_message("new_target");
target();
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_FULL) then
local l_color = get_difficulty_color();
local l_color_min = target_difficulty_color_min;
local l_color_max = target_difficulty_color_max;
--printf("target_color_min: %s\n", l_color_min);
-- printf("target_color_max: %s\n", l_color_max);
printf("getting difficulty Color \n");
--printf("l_color: %s\n", l_color);
if (l_color >= l_color_min and l_color <= l_color_max) then
return true;
end
end
return false;
end
-----------------------------------------------------------------------------------
function cycle_target2()
if (target_status == TARGET_FULL) then
local l_color = get_difficulty_color();
local l_color_min = target_difficulty_color_min;
local l_color_max = target_difficulty_color_max;
if (l_color >= l_color_min and l_color <= l_color_max) then
return true;
end
end
return false;
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);
keyboardPress(key_hp_potion1);
keyboardPress(key_hp_potion2);
keyboardPress(key_hp_potion3);
keyboardPress(key_hp_potion4);
keyboardPress(key_hp_potion5);
keyboardPress(key_hp_potion6);
keyboardPress(key_hp_potion7);
keyboardPress(key_hp_potion8);
keyboardPress(key_hp_potion9);
keyboardPress(key_hp_potion0);
printf("Using HP potion\n");
end
function use_mp_potion()
keyboardPress(key_mp_potion);
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 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
------------------------------------------------
-- FIGHT2
------------------------------------------------
function fight2()
local beginTime = os.time();
local attackLoop = true;
local skillsonetime = 0;
keyboardPress(key_attack);
yrest(200);
printf("Attacking Target \n");
while (attackLoop) do
local targetStatus = targetstatus();
local Tstatus = status();
if(targetStatus == TARGET_DEAD) then
printf("Target Dead \n\n");
pickup();
attackLoop = false;
moveBreak();
else
local currentTime = os.time();
if( os.difftime(currentTime, beginTime) > how_many_seconds ) then
moveBreak();
beginTime = os.time();
if(Tstatus == TARGET_FULL) then
do_jump = do_jump+1;
printf("Changing Targets: Obsticle \n\n");
attackLoop = false;
end
else
if(skillsonetime == 0 and Tstatus == TARGET_DAMAGED) then
skillsonetime = 1+skillsonetime;
keyboardPress(key_skill1);
end;
keyboardPress(key_attack);
yrest(2000);
end
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
end
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;
local reAttack = 0;
while( macro_running ) do
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(cycle_target()) then
fight2();
if(do_jump == 1) then
keyboardHold(key_move_down);
keyboardPress(key_jump);
yrest(1000);
keyboardPress(key_jump);
yrest(1000);
keyboardRelease(key_move_down);
keyboardHold(key_move_right);
yrest(2000);
keyboardRelease(key_move_right);
do_jump = 0;
end
reAttack = 0;
else
reAttack = 1 + reAttack;
end
--printf(reAttack);
if ( reAttack == how_many_scanTarget ) then
reAttack = 0;
keyboardPress(key_myself);
yrest(500);
keyboardHold(key_right);
yrest(500);
keyboardRelease(key_right);
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( (HP/MaxHP*100) < HP_sit and (HP_sit > 0) ) then sit(); end
if( (MP/MaxMP*100) < MP_sit and (MP_sit > 0) ) then sit(); end
if( (SP/MaxSP*100) < SP_sit and (SP_sit > 0) ) then sit(); end
if ((HP/MaxHP*100) <= 0) then
--user_alive = false;
printf("\n\nPlayer is DEAD");
keyboardPress(key.VK_DELETE);
--force_close();
end
end
end
startMacro(main);