-- Credits:
-- A. M. "MystikFox"
-- "Mangler"
-------------------------
-- do NOT edit these!!
CLASS_KNIGHT = 0;
CLASS_CLERIC = 1;
CLASS_MAGE = 2;
CLASS_ARCHER = 3;
-- EDIT THESE!
-------------------------
class = CLASS_KNIGHT; -- class determins the logic to take
HP_restamt = 750; -- HP to rest at (not used for cleric's)
HP_potion = 750; -- Use a HP potion (or heal skill for cleric)
HP_stone = 1750; -- Use a HP stone
SP_restamt = 100; -- SP to rest at
SP_potion = 150; -- Use a SP potion
SP_stone = 750; -- Usa a SP stone
key_attack = key.VK_1; -- normal melee attack
key_pickup = key.VK_R; -- pickup items
key_skill1 = key.VK_2; -- offensive and defensive spells...
key_skill2 = key.VK_3; -- check your class's fight function
key_skill3 = key.VK_4; -- for documentation on what each skill
key_skill4 = key.VK_5; -- will be used for
key_scroll1 = key.VK_0; -- offensive and defensive spells...
key_scroll2 = key.VK_6; -- 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_hppotion = key.VK_W; -- CLERICS: map this to your heal spell
key_hpstone = key.VK_Q;
key_sppotion = key.VK_D;
key_spstone = key.VK_E;
-- 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 = 0;
scroll2_duration = 3500000;
scroll_2 = 0;
scroll3_duration = 3500000;
scroll_3 = 0;
scroll4_duration = 3500000;
scroll_4 = 0;
-------------------------
-- 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 = "0x0089D224";
SP_addr = "0x0089d228";
HP = 10000; -- default, this corrects itself (don't change it!)
SP = 10000; -- default, this corrects itself (don't change it!)
buff1_needed = true;
buff2_needed = true;
buff3_needed = true;
buff4_needed = true;
scroll1_needed = false;
scroll2_needed = false;
scroll3_needed = false;
scroll4_needed = false;
need_heal = false;
can_rest = true;
-------------------------
function fight_skill1()
keyboardHold(key_skill1);
yrest(50);
keyboardRelease(key_skill1);
yrest(100);
end
function fight_skill2()
keyboardHold(key_skill2);
yrest(50);
keyboardRelease(key_skill2);
yrest(100);
end
function fight_skill3()
keyboardHold(key_skill3);
yrest(50);
keyboardRelease(key_skill3);
yrest(100);
end
function fight_skill4()
keyboardHold(key_skill4);
yrest(50);
keyboardRelease(key_skill4);
yrest(100);
end
-- fighting functions
-----------------------------------------------------
-- fight 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_skill1", 7000, fight_skill1);
registerTimer("fight_skill2", 9000, fight_skill2);
registerTimer("fight_skill3", 16000, fight_skill3);
registerTimer("fight_skill4", 16000, fight_skill4);
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
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
yrest(200);
end
unregisterTimer("fight_skill1");
unregisterTimer("fight_skill2");
unregisterTimer("fight_skill3");
unregisterTimer("fight_skill4");
for i = 0,10 do
pickup();
yrest(50);
end
end
-- fight function for cleric
function cleric_fight()
-- skill1 : buff 1
-- skill2 : buff 2
-- skill3 : buff 3
-- skill4 : buff 4
keyboardHold(key_attack);
yrest(50);
keyboardRelease(key_attack);
if( math.random(100) > 50 ) then
keyboardHold(key_skill1);
yrest(50);
keyboardRelease(key_skill1);
end
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,15 do -- too many items drop at abyss

pickup();
yrest(50);
end
end
-- fight 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 sp_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);
end
for i = 0,8 do
pickup();
yrest(50);
end
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 sp_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
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 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
-- 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
-- moves forward a bit...makes you seem less bot-like.
-- allows you to cover more ground
function move_forward()
keyboardHold(key.VK_S);
if( math.random(100) >= 80 )
then keyboardHold(key.VK_Z);
else if( math.random(100) >= 80 )
then keyboardHold(key.VK_X); end
end
yrest( math.random(2000) );
keyboardRelease(key.VK_S);
keyboardRelease(key.VK_Z);
keyboardRelease(key.VK_X);
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);
end
-- selects a nearby monster
function target_monster()
--keyboardHold(key.VK_TAB);
--yrest(50);
--keyboardRelease(key.VK_TAB);
keyboardPress( key.VK_TAB );
end
-- checks if you have a target
function have_target()
r,g,b = getPixel(hdc, 540, 1);
-- io.write("R: ", r, ", G: ", g, ", B: ", b, "\n");
-- 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);
SP = memoryReadInt(proc, SP_addr);
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
-- rest untill healed
function rest_heal()
if( can_rest == false ) then return; end
keyboardHold(key.VK_HOME);
yrest(500);
keyboardRelease(key.VK_HOME);
-- 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.VK_HOME);
yrest(500);
keyboardRelease(key.VK_HOME);
yrest(200);
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
function main()
win = findWindow("FiestaOnline");
proc = openProcess( findProcess("FiestaOnline") );
-- attach(win);
hdc = openDC( win );
registerTimer("update_vars", 100, update_vars);
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);
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);
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
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(3200);
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(3200);
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(3200);
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(3200);
end
end
rotate_cam();
if( math.random(100) > 90 ) then
move_forward(); end
end
pickup();
end
-- detach();
closeProcess(proc);
end
startMacro(main);