Your problem was that you didn't properly close your if and if-else statements in move_forward(), which caused function main() to be inside of move_forward(). I'm guessing you then received an error about not having an end in there, and then threw an "end" in randomly near the end of the script, causing it to be legal Lua, but a sever logical error. Since main would have then been nil (as it hasn't been declared, as move_forward() wasn't called), it would, therefor, throw an error. I've fixed it for you.
Code: Select all
-- Credits:
-- A. M. "MystikFox"
-- "Mangler"
version = getVersion();
if( version < 96 ) then
printf("ERROR! You are using an old version of MicroMacro that is not compatable with this script.\n");
printf("Please download a newer version from http://solarimpact.servegame.com\n");
return;
end;
-------------------------
-- do NOT edit these!!
CLASS_KNIGHT = 0;
CLASS_CLERIC = 1;
CLASS_MAGE = 2;
CLASS_ARCHER = 3;
-- EDIT THESE!
-------------------------
class = CLASS_CLERIC; -- class determins the logic to take
HP_restamt = 10; -- HP to rest at (not used for cleric's)
HP_potion = 500; -- Use a HP potion (or HEAL SKILL FOR CLERIC)
HP_stone = 350; -- Use a HP stone
SP_restamt = 10; -- SP to rest home at this SP value
SP_potion = 300; -- Use a SP potion
SP_stone = 400; -- Usa a SP stone
key_attack = key.VK_1; -- melee attack
key_attack2 = key.vK_SHIFT -- trip attack -- normal melee attack
key_pickup = key.VK_2; -- pickup items
key_skill1 = key.VK_5; -- offensive and defensive spells... This is my bash
key_skill2 = key.VK_6; -- check your class's fight function
key_skill3 = key.VK_7; -- for documentation on what each skill
key_skill4 = key.VK_8; -- will be used for
key_skill5 = key.VK_RIGHT -- buff right now for time healign -- for more skills?
key_scroll1 = key.VK_9; -- offensive and defensive spells...
key_scroll2 = key.VK_0; -- check your class's fight function
key_scroll3 = key.VK_DASH; -- for documentation on what each skill
key_scroll4 = key.VK_EQUAL;-- will be used for
key_scroll5 = key.VK_ALT;
key_scroll6 = key.VK_U;
key_hppotion = key.VK_3; -- CLERICS: this is my heal skill
key_hpstone = key.VK_Q; -- this is my HP stone
key_sppotion = key.VK_4; -- this is my SP potion
key_spstone = key.VK_E; -- this is my SP stone
-- NOTE: if SP_potion is higher than SP_restatm, you will use SP potions
-- instead of resting, unless you do not have any left. same goes for HP potions.
-- you will always use potions while fighting if the values fall below
-- the emergency amount.
-------------------------
-- Scroll settings (read instructions below Buff settings first)
-------------------------
scroll1_duration = 3500000;
scroll_1 = 1;
scroll2_duration = 3500000;
scroll_2 = 1;
scroll3_duration = 3500000;
scroll_3 = 1;
scroll4_duration = 3500000;
scroll_4 = 1;
scroll5_duration = 3500000;
scroll_5 = 1;
scroll6_duration = 3500000;
scroll_6 = 1;
-------------------------
-- Buff settings (only for clerics)
-------------------------
buff1_duration = 3500000;
buff_1 = 1;
buff2_duration = 3500000;
buff_2 = 1;
buff3_duration = 3500000;
buff_3 = 1;
buff4_duration = 3500000;
buff_4 = 1;
buff5_duration = 3500000;
buff_5 = 1;
-- NOTE: set on 59 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
-------------------------
-- should not need to be changed, except for HP_addr/SP_addr when
-- a patch makes them no longer work
proc = 0;
win = 0;
HP_addr = "00758FE7";
HPmax_addr = "007590B8";
SP_addr = "00758FEB";
SPmax_addr = "007590BC";
restcheck_addr = "01F66B04";
HP = 10000; -- default, this corrects itself (don't change it!)
HPmax = HP; -- default, this corrects itself (don't change it!)
SP = 10000; -- default, this corrects itself (don't change it!)
SPmax = SP; -- default, this corrects itself (don't change it!)
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
buff4_needed = true;
buff5_needed = true;
scroll1_needed = true;
scroll2_needed = true;
scroll3_needed = true;
scroll4_needed = true;
scroll5_needed = true;
scroll6_needed = true;
need_heal = false;
can_rest = true;
-----------------------------------------------------
-----------------------------------------------------
function fight_timer()
keyboardHold(key_attack);
yrest(100);
keyboardRelease(key_attack);
yrest(100);
keyboardHold(key_attack2);
yrest(100);
keyboardRelease(ke_attack2);
end
-----------------------------------------------------
-- fighting functions
-----------------------------------------------------
-----------------------------------------------------
-- FIGHTING AS A KNIGHT
-----------------------------------------------------
function knight_fight()
-- skill1 : offensive skill
-- skill2 : offensive skill
-- skill3 : offensive skill
-- skill4 : offensive skill
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
registerTimer("fight_timer", 3000, fight_timer);
while(have_target()) do
if( HP < HP_potion) then hp_potion(); end
if( HP < HP_stone) then hp_stone(); end
if( SP < SP_potion) then sp_potion(); end
if( SP < SP_stone) then hp_stone(); end
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
if( math.random(100) > 92 ) then
if( math.random(100) >= 50 ) then
keyboardHold(key_skill1);
yrest(50);
keyboardRelease(key_skill1);
else
keyboardHold(key_skill2);
yrest(50);
keyboardRelease(key_skill2);
end
end
yrest(50);
end
unregisterTimer("fight_timer");
for i = 0,8 do
pickup();
yrest(50);
end
can_rest = false;
registerTimer("can_rest_timer", 3000, can_rest_timer);
end
----------------------------------------------------------
-- fight function for cleric
----------------------------------------------------------
function cleric_fight()
-- skill1 : buff 1
-- skill2 : buff 2
-- skill3 : buff 3
-- skill4 : buff 4
keyboardHold(key_attack);
yrest(100);
keyboardRelease(key_attack);
yrest(100);
keyboardHold(key_attack2);
yrest(100);
keyboarRelease(key_attack2);
registerTimer("fight_timer", 3000, fight_timer);
while(have_target()) do
if( HP < HP_potion) then hp_potion(); end
if( HP < HP_stone) then hp_stone(); end
if( SP < SP_potion) then sp_potion(); end
if( SP < SP_stone) then sp_stone(); end
yrest(100);
end
unregisterTimer("fight_timer");
for i = 0,8 do
pickup();
yrest(50);
end
can_rest = false;
registerTimer("can_rest_timer", 3000, can_rest_timer);
end
--------------------------------------------------------
-- FIGTHING AS A MAGE
--------------------------------------------------------
function mage_fight()
-- skill1 : offensive spell
-- skill2 : offensive spell
-- skill3 : offensive spell
-- skill4 : offensive spell
while(have_target()) do
if( HP < HP_potion) then hp_potion(); end
if( HP < HP_stone) then hp_stone(); end
if( SP < SP_potion) then sp_potion(); end
if( SP < SP_stone) then hp_stone(); end
keyboardHold(key_skill1);
yrest(200);
keyboardRelease(key_skill1);
yrest(100);
keyboardHold(key_skill2);
yrest(200);
keyboardRelease(key_skill2);
yrest(100);
keyboardHold(key_skill3);
yrest(200);
keyboardRelease(key_skill3);
yrest(100);
keyboardHold(key_skill4);
yrest(200);
keyboardRelease(key_skill4);
yrest(100);
keyboardHold(key_skill5);
yrest(200);
keyboardRelease(key_skill5);
yrest(100);
end
for i = 0,8 do
pickup();
yrest(50);
end
can_rest = false;
registerTimer("can_rest_timer", 3000, can_rest_timer);
end
--------------------------------------------------------
-- FIGHT AS AN ARCHER
--------------------------------------------------------
function archer_fight()
-- skill1 : DOT / offensive skill (entry attack)
-- skill2 : DOT / offensive skill (entry attack)
-- skill3 : offensive skill
-- skill4 : offensive skill
-- entry skill
if( math.random(100) >= 50 ) then
keyboardHold(key_skill1);
yrest(50);
keyboardRelease(key_skill1);
else
keyboardHold(key_skill2);
yrest(50);
keyboardRelease(key_skill2);
end
yrest(500);
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
registerTimer("fight_timer", 3000, fight_timer);
while(have_target()) do
if( HP < HP_potion) then hp_potion(); end
if( HP < HP_stone) then hp_stone(); end
if( SP < SP_potion) then sp_potion(); end
if( SP < SP_stone) then hp_stone(); end
--keyboardHold(key_attack);
--yrest(50);
--keyboardRelease(key_attack);
if( math.random(100) > 80 ) then
if( math.random(100) >= 50 ) then
keyboardHold(key_skill2);
yrest(50);
keyboardRelease(key_skill2);
else
keyboardHold(key_skill3);
yrest(50);
keyboardRelease(key_skill3);
end
yrest(200);
end
yrest(200);
end
unregisterTimer("fight_timer");
for i = 0,8 do
pickup();
yrest(100);
end
can_rest = false;
registerTimer("can_rest_timer", 3000, can_rest_timer);
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
----------------------------------------------------
-- toggle cast needed for buff3
----------------------------------------------------
function buff3_timer()
buff3_needed = true;
end
----------------------------------------------------
-- toggle cast needed for buff4
----------------------------------------------------
function buff4_timer()
buff4_needed = true;
end
----------------------------------------------------
-- toggle cast needed for buff5
----------------------------------------------------
function buff5_timer()
buff5_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll1
----------------------------------------------------
function scroll1_timer()
scroll1_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll2
----------------------------------------------------
function scroll2_timer()
scroll2_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll3
----------------------------------------------------
function scroll3_timer()
scroll3_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll4
----------------------------------------------------
function scroll4_timer()
scroll4_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll5
----------------------------------------------------
function scroll5_timer()
scroll5_needed = true;
end
----------------------------------------------------
-- toggle cast needed for scroll6
----------------------------------------------------
function scroll6_timer()
scroll6_needed = true;
end
-------------------------------------------------------------------------
-- you have died!? oh noOOOes!
-------------------------------------------------------------------------
function death_return()
keyboardPress(key.VK_SNAPSHOT);
print(os.date("Alguien te mato. %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
--------------------------------------------------------------------------
-- moves forward a bit...makes you seem less bot-like.
-- allows you to cover more ground
--------------------------------------------------------------------------
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);
keyboardRelease(key.VK_SPACE);
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
--------------------------------------------------------------------------
-- pickup nearby items
--------------------------------------------------------------------------
function pickup()
keyboardHold(key_pickup);
yrest(50);
keyboardRelease(key_pickup);
yrest(50);
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()
local r,g,b = getPixel(hdc, 540, 1);
-- check for the gray in the monster's HP window
if( r >= 229 and r <= 240 and g >= 245 and g <= 255 and b >= 250 ) then
return true;
else
return false;
end
end
-------------------------------------------------------------------------
-- updates variables from client
-------------------------------------------------------------------------
function update_vars()
HP = memoryReadInt(proc, HP_addr);
HPmax = memoryReadInt(proc, HPmax_addr);
SP = memoryReadInt(proc, SP_addr);
SPmax = memoryReadInt(proc, SPmax_addr);
end
------------------------------------------------------------------------
-- toggle can_heal to true, disable timer
------------------------------------------------------------------------
function can_rest_timer()
unregisterTimer("can_rest_timer");
can_rest = true;
end
-----------------------------------------------------------------------
-- rest untill healed
-----------------------------------------------------------------------
function rest_heal()
if( can_rest == false ) then return; end
printf("Entering rest state\t%s\n", os.date("%X"));
keyboardHold(key.VK_HOME);
yrest(500);
keyboardRelease(key.VK_HOME);
need_heal = true;
last_hp = HP;
while( need_heal ) do
yrest(100);
if( HP == HPmax and SP == SPmax ) then
need_heal = false;
end;
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
printf("Exiting rest state\t%s\n", os.date("%X"));
end
------------------------------------------------------------------
-- use a hp potion!
------------------------------------------------------------------
function hp_potion()
keyboardHold(key_hppotion);
yrest(100);
keyboardRelease(key_hppotion);
yrest(500);
end
------------------------------------------------------------------
-- use a hp stone!
------------------------------------------------------------------
function hp_stone()
keyboardHold(key_hpstone);
yrest(100);
keyboardRelease(key_hpstone);
print("HP stone used.")
yrest(500);
end
------------------------------------------------------------------
-- use a sp potion!
------------------------------------------------------------------
function sp_potion()
keyboardHold(key_sppotion);
yrest(100);
keyboardRelease(key_sppotion);
yrest(500);
end
------------------------------------------------------------------
-- use a sp stone!
------------------------------------------------------------------
function sp_stone()
keyboardHold(key_spstone);
yrest(100);
keyboardRelease(key_spstone);
print("SP stone used.")
yrest(500);
end
------------------------------------------------------------------
-- the configuration of the window
------------------------------------------------------------------
function main()
win = findWindow("FiestaOnline");
local wx,wy,ww,wh = windowRect(win);
if( ww ~= 1024 or wh ~= 768 ) then
printf("Error! You must run Fiesta in 1024*768 resolution.\n");
return;
end;
if( win == 0 ) then printf("Error! Could not locate Fiesta window!\n"); return; end;
hdc = openDC(win);
proc = openProcess( findProcess("FiestaOnline") );
attach(win);
registerTimer("update_vars", 100, update_vars);
-------------------------------------------------------------------
--CLeric logic only
-------------------------------------------------------------------
if( class == CLASS_CLERIC ) then
registerTimer("buff1_timer", buff1_duration, buff1_timer);
registerTimer("buff2_timer", buff2_duration, buff2_timer);
registerTimer("buff3_timer", buff3_duration, buff3_timer);
registerTimer("buff4_timer", buff4_duration, buff4_timer);
registerTimer("buff5_timer", buff5_duration, buff5_timer);
end
registerTimer("scroll1_timer", scroll1_duration, scroll1_timer);
registerTimer("scroll2_timer", scroll2_duration, scroll2_timer);
registerTimer("scroll3_timer", scroll3_duration, scroll3_timer);
registerTimer("scroll4_timer", scroll4_duration, scroll4_timer);
registerTimer("scroll5_timer", scroll5_duration, scroll5_timer);
registerTimer("scroll6_timer", scroll6_duration, scroll6_timer);
while( 1 ) do
if( HP == 0 ) then death_return(); end
if( HP < HP_potion ) then hp_potion(); end
if( HP < HP_stone ) then hp_stone(); end
if( SP < SP_potion ) then sp_potion(); end
if( SP < SP_stone ) then sp_stone(); end
if( HP < HP_restamt and can_rest == true ) then rest_heal(); end
if( SP < SP_restamt 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_KNIGHT ) then knight_fight(); end
if( class == CLASS_CLERIC ) then cleric_fight(); end
if( class == CLASS_MAGE ) then mage_fight(); end
if( class == CLASS_ARCHER ) then archer_fight(); end
can_rest = true;
else
-----------------------------------------------------------------------
-- cleric only logic
-----------------------------------------------------------------------
if( class == CLASS_CLERIC ) then
if( buff_1 == 1 ) then
if( buff1_needed ) then
keyboardHold(key_skill1);
yrest(100);
keyboardRelease(key_skill1);
print(os.date("buff 1 casted %X"))
buff1_needed = false;
yrest(2000);
end
end
if( buff_2 == 1 ) then
if( buff2_needed ) then
keyboardHold(key_skill2);
yrest(100);
keyboardRelease(key_skill2);
print(os.date("buff 2 casted %X"))
buff2_needed = false;
yrest(2000);
end
end
if( buff_3 == 1 ) then
if( buff3_needed ) then
keyboardHold(key_skill3);
yrest(100);
keyboardRelease(key_skill3);
print(os.date("buff 3 casted %X"))
buff3_needed = false;
yrest(2000);
end
end
if( buff_4 == 1 ) then
if( buff4_needed ) then
keyboardHold(key_skill4);
yrest(100);
keyboardRelease(key_skill4);
print(os.date("buff 4 casted %X"))
buff4_needed = false;
yrest(2000);
end
end
if( buff_5 == 1 ) then
if( buff5_needed ) then
keyboardHold(key_skill5);
yrest(100);
keyboardRelease(key_skill5);
print(os.date("buff 5 casted %X"))
buff5_needed = false;
yrest(2000);
end
end
end
if( scroll_1 == 1 ) then
if( scroll1_needed ) then
keyboardHold(key_scroll1);
yrest(100);
keyboardRelease(key_scroll1);
print(os.date("scroll 1 used %X"))
scroll1_needed = false;
yrest(4000);
end
end
if( scroll_2 == 1 ) then
if( scroll2_needed ) then
keyboardHold(key_scroll2);
yrest(100);
keyboardRelease(key_scroll2);
print(os.date("scroll 2 used %X"))
scroll2_needed = false;
yrest(4000);
end
end
if( scroll_3 == 1 ) then
if( scroll3_needed ) then
keyboardHold(key_scroll3);
yrest(100);
keyboardRelease(key_scroll3);
print(os.date("scroll 3 used %X"))
scroll3_needed = false;
yrest(4000);
end
end
if( scroll_4 == 1 ) then
if( scroll4_needed ) then
keyboardHold(key_scroll4);
yrest(100);
keyboardRelease(key_scroll4);
print(os.date("scroll 4 used %X"))
scroll4_needed = false;
yrest(4000);
end
end
if( scroll_5 == 1 ) then
if( scroll5_needed ) then
keyboardHold(key_scroll5);
yrest(100);
keyboardRelease(key_scroll5);
print(os.date("scroll 5 used %X"))
scroll5_needed = false;
yrest(4000);
end
end
if( scroll_6 == 1 ) then
if( scroll6_needed ) then
keyboardHold(key_scroll6);
yrest(100);
keyboardRelease(key_scroll6);
print(os.date("scroll 6 used %X"))
scroll5_needed = false;
yrest(4000);
end
end
--------------------------------------------------------------------
-- Rotate the camera
--------------------------------------------------------------------
rotate_cam();
if( math.random(100) > 90 ) then
move_forward(); end
end
pickup();
end
detach();
closeProcess(proc);
end
startMacro(main);