Initial MSVC 2008 projects workspace

This commit is contained in:
alexey.min
2012-02-01 05:25:08 +00:00
commit 03de3bdc95
1446 changed files with 476853 additions and 0 deletions

View File

@@ -0,0 +1,563 @@
-----------------------------
-- íàñòðîéêè ñêðèïòà
-----------------------------
script_name = "Alexxia_BP_Pty: ";
-- íàñòðîéêè àâòî-ñîóëøîòîâ
--soulshot_itemID = 1835; -- Soulshot: No Grade
--soulshot_itemID = 1463; -- Soulshot: D Grade
--soulshot_itemID = 1464; -- Soulshot: C Grade
--soulshot_itemID = 1465; -- Soulshot: B Grade
soulshot_itemID = 0; -- Soulshot: A Grade
--soulshot_itemID = 1467; -- Soulshot: S Grade
--spiritshot_itemID = 3947; -- Blessed Spiritshot: No Grade
--spiritshot_itemID = 3948; -- Blessed Spiritshot: D Grade
--spiritshot_itemID = 3949; -- Blessed Spiritshot: C Grade
--spiritshot_itemID = 3950; -- Blessed Spiritshot: B Grade
--spiritshot_itemID = 3951; -- Blessed Spiritshot: A Grade
spiritshot_itemID = 3952; -- Blessed Spiritshot: S Grade
-- íàñòðîéêè ñëåäîâàíèÿ
follow_enable = true;
follow_name = "Semirra";
follow_distance = 120;
follow_rand_time = 3;
-- íàñòðîéêè õèëà
heal_self_enable = true;
heal_party_enable = true;
heal_party_distance = 600;
heal_percent = 85;
--heal_skill = 1011; -- Heal
heal_skill = 1218; -- Major Heal
heal_battle_percent = 1;
--heal_battle_skill = 1015; -- Battle Heal
heal_battle_skill = 1016; -- Greater Battle heal
-- îòæîð Healing Potion
heal_itemID = 1539; -- Greater Healing potion
heal_item_use_hp = 95; -- 80%
heal_item_reuse_secs = 5; -- secs
mana_itemID = 728; -- Mana Potion
mana_item_use_mp = 85; -- 80%
mana_item_reuse_secs = 1; -- secs
-- íàñòðîéêè ðå÷àðæà
recharge_enable = false;
recharge_mp_percent = 70;
recharge_skill = 1013; -- Recharge
-- ñâîè áàôû
self_buffs_auto = true;
self_buffs = {
--3138, -- Item Skill: Heal Empower
--1078, -- Concentration
--1040, -- Shield
--1204, -- Wind Walk
--1035, -- Mental Shield
--1044, -- Regeneration
--1397, -- Clarity
--1062, -- Berserker spirit
--1311, -- Body of Avatar
--1259 -- Resist Shog
1353,
1323
};
party_buff_enable = true;
party_buff_autodetect = true;
party_buff_distance = 400;
party_rebuff_secs = 1170; -- ÷åðåç ñêîêà ñåê ðåáàôàòü ïàòè; íå èñïîëüçóåòñÿ åñëè óñòàíîâëåí àâòîäåòåêò
party_buffs = {
--1068, -- Might
--1040, -- Shield
--1087, -- Agility
--1043, -- Holy Weapon
--1035, -- Mental Shield
--1204, -- Wind Walk
--1044, -- Regeneration
--1397, -- Clarity
--1062, -- Berserker spirit
--1259 -- Resist Shog
1353,
1323
};
--- CARDINAL UNIQUE ---
-- áàëàíñ áóäåò èïîëüçîâàòüñÿ êîãäà:
-- 1) â ïàòè ÌÈÍÈÌÓÌ [balance_life_min_good_players] æèâûõ èãðîêîâ áîëåå ÷åì ñ [balance_life_good_hp] % HP
-- 2) â ïàòè ÌÀÊÑÈÌÓÌ [balance_life_max_bad_players] óìèðàþùèõ èãðîêîâ ñ [balance_life_bad_hp] % HP
-- 3) âàøå ÌÏ áîëåå [balance_life_min_mp_limit] %
balance_life_enable = false;
balance_life_good_hp = 90;
balance_life_bad_hp = 40;
balance_life_min_good_players = 3;
balance_life_max_bad_players = 1;
balance_life_min_mp_limit = 25; -- self mp %
balance_life_skill = 1335; -- Balance Life
group_heal_enable = true;
group_heal_bad_hp = 90;
group_heal_min_bad_players = 3;
group_heal_skill = 1402; -- major group heal
--- CARDINAL UNIQUE ---
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
-- system vars!!! do not edit !!!
-------------------------------------------------------
-------------------------------------------------------
sys_should_exit = false;
sys_last_party_buff_time = 0;
sys_last_heal_item_use_time = 0;
sys_last_mana_item_use_time = 0;
rand_time = 0;
x_rand = 0;
y_rand = 0;
-- ôóíêöèÿ çàêî÷èò ðàáîòó êîãäà þçåð çàêîí÷èò êàñò òåêóùåãî ñêèëëà
function wait_end_of_cast()
while l2c_isCastingNow() do l2h_delay( 50 ) end
end
-- ïûòàåòñÿ çàòàðãåòèòü objectID â òå÷åíèå timeoutSecs ñåêóíä
-- âåðíåò true, åñëè òàðãåò óäàëñÿ
function myTargetObjectTimeout( objectID, timeoutSecs )
local targetStartTime = l2h_time();
l2c_action( objectID );
local targetObjectId = 0;
local timePassed = 0;
repeat
targetObjectId = l2c_getTarget();
l2h_delay( 100 );
if sys_should_exit then return end
local curTime = l2h_time();
timePassed = curTime - targetStartTime;
until (timePassed > timeoutSecs) or (targetObjectId == objectID)
if( targetObjectId ~= objectID ) then
l2h_print( script_name, " ERROR: cannot target [", objectID, "]\n" );
return false
end
return true
end
-- èñïîëüçóåò ñêèëë è äåëàåò çàäåðæêó 100ìñ ëÿ óâåðåííîñòè ÷òî êàñò ñêèëëà íà÷àëñÿ
-- ÷èñòà äëÿ óäîáñòâà. âåëè÷èíà çàäåðæêè çàâèñèò îò ëàãîâ êàíàëà äî ñåðâåðà
function myUseSkill( skillID )
l2c_useSkill( skillID )
l2h_delay( 150 )
end
-- ôóíêöèÿ
-- ñëåäîâàòü çà ÷àðîì [name] íà äèñòàíöèè [distance]
-- åñëè çàäàííûé ÷àð óæå íàõîäèòñÿ â ïðåäåëàõ [distance], follow íå ñóùåñòâëÿåòñÿ
-- randomness - ÷èñëî, â ïðåäåëàõ êîòîðîãî ñëåäîâàíèå îòêëîíÿåòñÿ îò öåëè. ðåêîìåíäóåòñÿ 1-100
function follow( name, distance )
-- ïîëó÷èì objectID ÷àðà
randomness = 60
local objectID = l2c_getCharObjectIdByName( name )
-- à åñòü ëè òàêîé ÷àð âîîáùå?
if objectID == nil then
l2h_print( "Character [", name, "] is not visible!\n" )
return
end
if randomness >= distance then randomness = distance/2 end
local x, y, z -- íàøè êîîðäèíàòû áóäóò òóò
local gox, goy, goz
local c -- èíôî î ÷àðå áóäåò òóò
-- à íàäî ëè íàì ñëåäîâàòü?
if (l2h_time()-rand_time) > follow_rand_time then
rand_time = l2h_time()
x_rand = math.random( (0-randomness), randomness )
y_rand = math.random( (0-randomness), randomness )
end
x,y,z = l2c_getPos() -- ïîëó÷èì íàøè êîîðäèíàòû
c = l2c_getObjectInfoByObjectId( objectID ) -- èíôî î öåëè "ïðåñëåäîâàíèÿ"
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox=c.xDst
goy=c.yDst
goz=c.zDst
else
gox=c.x
goy=c.y
goz=c.z
end
if (math.abs(gox - x) > distance) or (math.abs(goy - y) > distance) then
--if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) and (math.abs(c.xDst - x) > distance) and (math.abs(c.yDst - y) > distance) then
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
else
return -- äà ìû è òàê íåäàëåêî îò öåëè
end
-- öèêë ñëåäîâàíèÿ
repeat
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
-- ïîëó÷èì èíôî î ÷àðå
c = l2c_getObjectInfoByObjectId( objectID )
--l2h_print( "Following [", name, "] to (", c.x, ",", c.y, ",", c.z, ")\n" )
if (l2h_time()-rand_time) > follow_rand_time then
rand_time = l2h_time()
x_rand = math.random( (0-randomness), randomness )
y_rand = math.random( (0-randomness), randomness )
end
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox=c.xDst
goy=c.yDst
goz=c.zDst
else
gox=c.x
goy=c.y
goz=c.z
end
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
l2h_delay( 300 ) -- ïîäîæäåì
x,y,z = l2c_getPos() -- ïîëó÷èì íàøè êîîðäèíàòû
-- ïðîâåðèì ðàçíèöó íàøèõ êîîðäèíàò è êîîðäèíàò ÷àðà.
-- åñëè ðàçíèöà áîëüøå äèñòàíöèè ñëåäîâàíèÿ, öèêë ñëåäîâàíèÿ ïîâòîðèòñÿ
until ((math.abs(gox - x) < distance) or (math.abs(goy - y) < distance) or (math.abs(goz - z) < distance))
end
-- ôóíêöèÿ
-- ïðîâåðêà ÎÄÍÎÃÎ ÷ëåíà ïàòè íà íåîáõîäèìîñòü õèëà èëè ðå÷àðæà
-- âûçûâàåòñÿ èç ôóíêöèè check_party()
function check_member_HP_and_heal( member )
wait_end_of_cast() -- ïîäîæäàòü, ïîêà çàêîí÷èòñÿ êàñò òåêóùåãî ñêèëëà
local hp_percent = 100.0 * member.curHp / member.maxHp; -- âû÷èñëèòü % HP ìåìáåðà
local mp_percent = 100.0 * member.curMp / member.maxMp; -- âû÷èñëèòü % MP ìåìáåðà
if heal_party_enable then -- âêëþ÷åí õèë ïàòè
if hp_percent < heal_battle_percent then -- íàäî ÁÀÒËõèëèòü
l2h_print( script_name, ": ", member.name.." needs BATTLE healing! ", hp_percent, "% HP!\n" );
follow( member.name, heal_party_distance, 50 ); -- âäðóã ìåìáåð äàëåêî?
myTargetObjectTimeout( member.objectID, 5 );
myUseSkill( heal_battle_skill );
wait_end_of_cast()
end
if hp_percent < heal_percent then -- íàäî õèëèòü
l2h_print( script_name, ": ", member.name.." needs healing! ", hp_percent, "% HP!\n" );
follow( member.name, heal_party_distance, 50 ); -- âäðóã ìåìáåð äàëåêî?
myTargetObjectTimeout( member.objectID, 5 );
myUseSkill( heal_skill );
wait_end_of_cast()
end
end
if recharge_enable and (mp_percent < recharge_mp_percent) then
l2h_print( script_name, ": ", member.name.." needs recharge! ", mp_percent, "% MP!\n" );
follow( member.name, heal_party_distance, 50 ); -- âäðóã ìåìáåð äàëåêî?
myTargetObjectTimeout( member.objectID, 5 );
myUseSkill( recharge_skill );
wait_end_of_cast()
end
end
-- ôóíêöèÿ
-- ïðîâåðèòü ïàòè íà íåîáõîäèìîñòü õèëà
function check_party()
local party = l2c_getParty(); -- ïîëó÷èì ïàòè
local nMembers = #party -- ñêîëüêî ó íàñ â ïàòè?
local i
if nMembers == 0 then -- íèêîãî íåò? Î_î
l2h_print( script_name, " No members in party!\n" )
l2h_delay( 1000 )
return -- îòìåíà íàõ!
end
for i=1, nMembers, 1 do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
check_member_HP_and_heal( party[i] ) -- ïðîâåðêà îäíîãî i-ãî ìåìáåðà
end
end
-- ôóíêöèÿ âåðíåò true, åñëè þçåð â ïàòè
function is_in_party()
local party = l2c_getParty()
local nMembers = #party
if nMembers < 1 then return false end -- no party
return true
end
-- âåðíåò true, åñëè áàô skillID ïðèñóòñâóåò â ìàññèâå have_buffs
function buffIsPresent( skillID, have_buffs )
if not have_buffs then return false end
local i
for i=1, #have_buffs do
if have_buffs[i].skillID == skillID then return true end
end
return false
end
--[[ table l2c_getPartyMemberBuffs( int objectID )
Âîçâðàòèò ìàññèâ (òàáëèöó) â ñòèëå lua (íóìåðóþùèéñÿ ñ åäèíèöû), ñîäåðæàùèé èíôîðìàöèþ î áàôàõ îäíîãî ÷ëåíà ïàòè.
Êàæäûé ýëåìåíò ìàññèâà - ñòðóêòóðà (òàáëèöà) ñ ïîëÿìè, òàêèìè æå, êàê è âîçâðàùàåìûå ôóíêöèåé l2c_getBuffs().
Åñëè áàôôîâ íåò, ìàññèâ áóäåò ïóñò.
Êàæäûé ýëåìåíò - ñòðóêòóðà ñ ïîëÿìè: skillName, skillID, skillLvl, durationSecs
Ñòðîêîâîå èìÿ ñêèëëà, ID ñêèëëà, åãî óðîâåíü, îñòàâøååñÿ âðåìÿ â ñåêóíäàõ. ]]--
function rebuff_party_autodetect()
if not party_buff_enable then return end
if not party_buff_autodetect then return end
local party = l2c_getParty(); -- ïîëó÷èì íàøó ïàòè
local nMembers = #party; -- ñêîêà ó íàñ íàðîäà â ïàòè?
if nMembers < 1 then return end -- íèêîãî íåò â ïàòè :(
-- äëÿ êàæäîãî ìåìáåðà ïîëó÷èì åãî ñïèñîê áàôîâ. áàôíåì íåäîñòàþùèå
--l2h_print( script_name, " Rebuff party autodetect!\n" )
local i = 0;
for i=1, nMembers do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
local member_buffs = l2c_getPartyMemberBuffs( party[i].objectID );
local hp_percent = 100.0 * party[i].curHp / party[i].maxHp; -- âû÷èñëèòü % HP ìåìáåðà
-- ïðîéäåìñÿ ïî âñåì ïàòè áàôàì
local ii = 0;
for ii=1, #party_buffs do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
-- èìååòñÿ ëè ii-é áàô íà ìåìáåðå?
if not buffIsPresent( party_buffs[ii], member_buffs ) and hp_percent>1 then
l2h_print( script_name, " Rebuff party auto: member [", party[i].name,
"] is missing buff [", party_buffs[ii], "]\n" );
myTargetObjectTimeout( party[i].objectID, 3 ); -- âçÿòü ìåìáåðà íà öåëü
follow( party[i].name, party_buff_distance, 50 ); -- ïîäáåæàòü ê ìåìáåðó íà ðàññòîÿíèå áàôà
l2h_print( script_name, " Rebuff party auto: use [", party_buffs[ii], "]\n" );
myUseSkill( party_buffs[ii] ); -- êàñòîâàòü î÷åðåäíîé áàô
wait_end_of_cast(); -- äîæäàòüñÿ êîíöà êàñòà ñêèëà
end
end
end
--l2h_print( script_name, " Rebuff party autodetect end.\n" )
end
-- ðåáàôàåò ÷ëåíà ïàòè ïî òàéìåðó. ðàçäàåò âåñü íàáîð ïàòè áàôîâ
-- âûçûâàåòñÿ èç ôóíêöèè rebuff_party_by_timer()
function rebuff_party_member_by_timer( member )
myTargetObjectTimeout( member.objectID, 5 ); -- âçÿòü ìåìáåðà íà öåëü
-- ðàçäàòü áàô
local i
for i=1, #party_buffs do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
follow( member.name, party_buff_distance, 50 ); -- ïîäáåæàòü ê ìåìáåðó íà ðàññòîÿíèå áàôà
l2h_print( script_name, " Rebuff party timer: use [", party_buffs[i], "]\n" );
myUseSkill( party_buffs[i] ); -- êàñòîâàòü î÷åðåäíîé áàô
wait_end_of_cast(); -- äîæäàòüñÿ êîíöà êàñòà ñêèëà
end
end
-- ðåáàôàåò âñþ ïàòè, åñëè íàñòàëî âðåìÿ
-- âûçûâàåòñÿ èç ôóíêöèè rebuff_party()
function rebuff_party_by_timer()
if not party_buff_enable then return end
local party = l2c_getParty();
local nMembers = #party;
if nMembers < 1 then return end -- no party
local curTime = l2h_time(); -- òåêóùåå âðåìÿ â ñåê.
local timePassed = curTime - sys_last_party_buff_time; -- ñêîêà ñåê ïðîøëî ñ ïîñëåäíåãî ðåáàôôà
if timePassed < party_rebuff_secs then return end -- åù¸ íå ïîðà
-- íàäî áàôíóòü
l2h_print( script_name, " Rebuff party by timer!\n" )
sys_last_party_buff_time = curTime; -- çàïîìíèì âðåìÿ áàôà
local i
for i=1, nMembers do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
rebuff_party_member_by_timer( party[i] )
end
l2h_print( script_name, " Rebuff party by timer end.\n" )
end
-- ðåáàôàåò ïàòè, âûçûâàÿ ñîîòâåòñâóþùóþ ôóíêöèþ, çàâèñèò îò íàñòðîåê - àâòîäåòåêò èëè ïî òàéìåðó
function rebuff_party()
if #party_buffs < 1 then
l2h_print( script_name, " party buffs not configured!\n" )
return
end
if party_buff_autodetect then
rebuff_party_autodetect()
else
rebuff_party_by_timer()
end
end
-- ïðîâåðèòü ñâîè áàôû è ðåáàôíóòü íåäîñòàþùèå
function check_self_buffs()
local have_buffs = l2c_getBuffs()
local user = l2c_getStats() -- íàì íóæåí ñâîé objectID ÷òîáû çàòàðãåòèòü
local i
for i=1, #self_buffs do
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
if not buffIsPresent( self_buffs[i], have_buffs ) then
l2h_print( script_name, " Need self rebuff [", self_buffs[i], "]\n" )
myTargetObjectTimeout( user.objectID, 5 )
myUseSkill( self_buffs[i] )
wait_end_of_cast()
end
end
end
-- ïðîâåðèòü íå íàäî ëè íàì ïîëå÷èòüñÿ
-- èñïîëüçóåò èòåì äëÿ ëå÷åíèÿ è ñêèëëû
function heal_self()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local hp_percent = 100.0 * curHp / maxHp
local curTime = l2h_time()
-- use heal item
use_heal_item()
--if heal_item_use_enable then
-- if hp_percent <= heal_item_use_hp then
-- if (curTime - sys_last_heal_item_use_time) > heal_item_reuse_secs then
-- l2h_print( script_name, " Self heal: use item!\n" )
-- l2c_useItem( heal_itemID );
-- sys_last_heal_item_use_time = curTime
-- end
-- end
--end
if heal_self_enable then -- âêëþ÷åíî õèëèòü ñåáÿ
local user = l2c_getStats()
if hp_percent < heal_battle_percent then
l2h_print( script_name, " Self heal: need self BATTLE heal!\n" )
myTargetObjectTimeout( user.objectID, 5 )
myUseSkill( heal_battle_skill )
wait_end_of_cast()
end
if hp_percent < heal_percent then
l2h_print( script_name, " Self heal: need self heal!\n" )
myTargetObjectTimeout( user.objectID, 5 )
myUseSkill( heal_skill )
wait_end_of_cast()
end
end
end
function use_heal_item()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local hp_percent = 100.0 * curHp / maxHp
local mp_percent = 100.0 * curMp / maxMp
local curTime = l2h_time()
-- use heal item
if (heal_itemID>0) then
if hp_percent <= heal_item_use_hp then
if (curTime - sys_last_heal_item_use_time) > heal_item_reuse_secs then
l2h_print( "Self heal: use item!\n" )
l2c_useItem( heal_itemID );
sys_last_heal_item_use_time = curTime;
end
end
end
if (mana_itemID>0) then
if mp_percent <= mana_item_use_mp then
if (curTime - sys_last_mana_item_use_time) > mana_item_reuse_secs then
l2h_print( "Self heal: use item!\n" )
l2c_useItem( mana_itemID );
sys_last_mana_item_use_time = curTime;
end
end
end
end
function CARDINAL_USE_BALANCE_LIFE()
if not balance_life_enable then return end
local party = l2c_getParty();
if not party then return end
local nparty = #party;
if nparty < 1 then return end
local i = 0;
local good_members = 0;
local bad_members = 0;
local curHp, maxHp, curMp, maxMp = l2c_getHPMPCPWeight();
local my_percent = 100.0 * curHp / maxHp;
local my_mp_percent = 100.0 * curMp / maxMp;
if my_mp_percent < balance_life_min_mp_limit then return end
if my_percent >= balance_life_good_hp then good_members = good_members + 1 end
if my_percent <= balance_life_bad_hp then bad_members = bad_members + 1 end
for i=1, nparty do
local percent = 100.0 * party[i].curHp / party[i].maxHp;
if percent >= balance_life_good_hp then good_members = good_members + 1 end
if percent <= balance_life_bad_hp then bad_members = bad_members + 1 end
end
--l2h_print( script_name, " Balance life check: good/bad: ", good_members, " / ", bad_members, "\n" );
if (good_members >= balance_life_min_good_players) and
(bad_members <= balance_life_max_bad_players) and (bad_members > 0) then
l2h_print( script_name, " Balance life activated: good/bad: ", good_members, " / ", bad_members, "\n" );
myUseSkill( balance_life_skill );
wait_end_of_cast();
end
end
function CARDINAL_USE_MAJOR_GROUP_HEAL()
if not group_heal_enable then return end
local party = l2c_getParty();
if not party then return end
local nparty = #party;
if nparty < 1 then return end
local i = 0;
local bad_members = 0;
local curHp, maxHp = l2c_getHPMPCPWeight();
local my_percent = 100.0 * curHp / maxHp;
if my_percent <= group_heal_bad_hp then bad_members = bad_members + 1 end
for i=1, nparty do
local percent = 100.0 * party[i].curHp / party[i].maxHp;
if percent <= group_heal_bad_hp then bad_members = bad_members + 1 end
end
-- l2h_print( script_name, " Group heal check: bad: ", bad_members, "\n" );
if bad_members >= group_heal_min_bad_players then
l2h_print( script_name, " Group heal activated: bad: ", bad_members, "\n" );
myUseSkill( group_heal_skill );
wait_end_of_cast();
end
end
-- ýòî è åñòü âåñü ÈÈ õèëåðà-áàôôåðà
-- ýòîò øàã ïðîâòîðÿåòñÿ ïîñòîÿííî â öèêëå )
function main_AI()
if not l2c_is_INGAME() then return end
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
---- cardinal unique ----
CARDINAL_USE_BALANCE_LIFE();
CARDINAL_USE_MAJOR_GROUP_HEAL();
---- cardinal unique ----
check_party(); -- ïðîâåðèì íå íàäî ëè êîãî èç ïàòè ïîõèëèòü
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
if follow_enable then follow( follow_name, follow_distance, 10 ) end -- ñëåäóåì çà êåì óêàçàíî
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
check_self_buffs(); -- ïðîâåðèì ñâîè áàôû
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
rebuff_party(); -- ïðîâåðèì áàôû ïàòè
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
heal_self(); -- ïîëå÷èìñÿ åñëè íàäî
if sys_should_exit then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
l2h_delay( 500 ); -- çàäåðæêà
end
-- òóò ñêðèïò íà÷èíàåò ðàáîòó
l2h_print( script_name, " script started\n" );
--l2h_registerSysStopVar( "sys_should_exit" );
-- â èãðå ëè ìû?
if not l2c_is_INGAME() then
l2h_print( script_name, " Not in game!\n" );
return;
end
-- âêëþ÷èì ñîñêè
l2c_autoSoulshot( soulshot_itemID )
l2c_autoSoulshot( spiritshot_itemID )
-- áåç ïàòè íå ðàáîòàåì!
while not is_in_party() do l2h_delay( 1000 ); end
-- ñíà÷àëà áàôíåì ñåáÿ ëþáèìîãî
check_self_buffs()
-- òóò áóäåò ïåðâûé ðåáàôô ïàòè
follow( follow_name, heal_party_distance, 10 );
rebuff_party();
-- öèêë
repeat
main_AI(); -- âûçîâåì ÈÈ
if sys_should_exit then break end -- þçåð íàæàë "Ñòîï ñêðèïò"
-- â èãðå ëè ìû âñå åù¸?
if not l2c_is_INGAME() then break end
until true == false -- öèêë áóäåò êðóòèòüñÿ ïîêà true íå ñòàíåò ðàâíûì false
l2h_print( script_name, " script stopped\n" )

View File

@@ -0,0 +1,771 @@
script_name = "Archer_assist_pvp: ";
-- ñàäèòüñÿ è âñòàâàòü ïðè õï è ìï
sit_below_hp = 0;
stand_above_hp = 0;
sit_below_mp = 0;
stand_above_mp = 0;
-- itemID êàêèõ ñîóë- è ñïèðèòøîòîâ þçàòü íà àâòîþçå
soulshot_item = 1467; -- SSS
spiritshot_item = 0;
heal_itemID = 1539; -- Greater Healing potion
heal_item_use_hp = 95; -- 80%
heal_item_reuse_secs = 5; -- secs
mana_itemID = 728; -- Mana Potion
mana_item_use_mp = 85; -- 80%
mana_item_reuse_secs = 1; -- secs
-- òèï çîíû áîÿ: êâàäðàò èëè êðóã
combat_zone_type = "square"; -- êâàäðàò
--combat_zone_type = "circle"; -- êðóã
-- òèï íà÷àëüíîé òî÷êè áîÿ
-- "auto" ãäå ñêðèïò çàïóùåí, òàì è íà÷àëî
-- "manual" Âðó÷íóþ: òîãäà âðó÷íóþ íàäî çàäàòü combat_start_x, combat_start_y, combat_start_z
combat_start_point = "manual";
combat_range = 3500; -- Ðàäèóñ áîÿ, åñëè êðóã, èëè ïîëîâèíà äëèíû ñòîðîíû êâàäðàòà
-- öåíòð çîíû áîÿ
combat_start_x = 135384;
combat_start_y = 23227;
combat_start_z = -3749;
combat_target_dz = 500; -- îãðàíè÷åíèå òàðãåòà ïî âûñîòå +/- 500
combat_timeout_secs = 15; -- åñëè â òå÷åíèè 15 ñåê õï ìîáà íå óìåíüøèëîñü, îòìåíà öåëè
assist_mode = true;
assist_member = "1110011001";
assist_only_mobs = false; -- if false, can assist in PvP to kill players
assist_dont_kill_party = true;
follow_name = assist_member;
follow_distance = 120;
follow_rand_time = 3;
kite_distance = 900;
kite_range = 400;
follow_snipe = true;
snipe_id = 313;
pickup_range = 400;
pickup_item_timeout = 750;
-- íå àòàêîâàòü ìîáîâ:
not_attack_mobs = { 21801, 21802, 21810 }; -- Treasure Chests
-- èñïîëüçîâàòü ëè òåíåâîå îðóæèå, è êàêîå
-- åñëè âêëþ÷åíî, ñêðèïò áóäåò ïðîâåðÿòü, îäåòî ëè ýòî îðóæèå, è åñëè íåò,
-- áóäåò ïûòàòüñÿ îäåâàòü åãî. Â èíâåíòàðå äîëæåí ëåæàòü çàïàñ îðóæèÿ )
shadow_weapon_use = true;
shadow_weapon_iid = 10445; -- Icarus Bow Focus
skill_1 = 0; --101;--101; -- Stun Shot
skill_1_delay = 3000;
-- ñâîè áàôû
self_buffs = {
131, -- Hawk Eye
99, -- Rapid Shot
--256, -- Accuracy
416,
415,
};
-------------------------------------------------------
-------------------------------------------------------
-------------------------------------------------------
-- system vars!!! do not edit !!!
-------------------------------------------------------
-------------------------------------------------------
sys_ignore_oid = 0;
sys_last_heal_item_use_time = 0;
sys_last_mana_item_use_time = 0;
-------------
sys_skill_1_used = false;
skill1_time = 0;
rand_time = 0;
x_rand = 0;
y_rand = 0;
-- ôóíêöèÿ çàêî÷èò ðàáîòó êîãäà þçåð çàêîí÷èò êàñò òåêóùåãî ñêèëëà
function wait_end_of_cast()
while l2c_isCastingNow() do l2h_delay( 50 ) end
end
-- ïûòàåòñÿ çàòàðãåòèòü objectID â òå÷åíèå timeoutSecs ñåêóíä
-- âåðíåò true, åñëè òàðãåò óäàëñÿ
function myTargetObjectTimeout( objectID, timeoutSecs )
if timeoutSecs == nil then timeoutSecs = 5 end
local targetStartTime = l2h_time();
local targetObjectId = 0;
local timePassed = 0;
targetObjectId = l2c_getTarget();
if targetObjectId == objectID then return true end -- óæå íà òàðãåòå, íè÷î íå íàäî äåëàòü
l2c_action( objectID ); -- ïûòàåìñÿ çàòàðãåòèòü
repeat -- ïðîâåðÿåì â öèêëå, âçÿò ëè îáúåêò íà öåëü
targetObjectId = l2c_getTarget();
l2h_delay( 100 );
if sys_should_exit() then return end
local curTime = l2h_time(); -- çàîäíî ñìîòðèì ïî âðåìåíè
timePassed = curTime - targetStartTime;
until (timePassed > timeoutSecs) or (targetObjectId == objectID) -- Ëèáî òàðãåò óäàëñÿ, ëèáî èñòåê òàéìàóò
if( targetObjectId ~= objectID ) then
l2h_print( script_name, " ERROR: cannot target [", objectID, "]\n" );
return false
end
return true
end
-- èñïîëüçóåò ñêèëë è äåëàåò çàäåðæêó 100ìñ ëÿ óâåðåííîñòè ÷òî êàñò ñêèëëà íà÷àëñÿ
-- ÷èñòà äëÿ óäîáñòâà. âåëè÷èíà çàäåðæêè çàâèñèò îò ëàãîâ êàíàëà äî ñåðâåðà
function myUseSkill( skillID )
l2c_useSkill( skillID, true )
l2h_delay( 150 )
end
function isNotTank( objectId )
local objectInfo = l2c_getObjectInfoByObjectId( objectId );
if objectInfo == nil then return true end
if( objectInfo.type == "pc" ) then
if( objectInfo.classID == 4 ) then return false end
if( objectInfo.classID == 5 ) then return false end
if( objectInfo.classID == 6 ) then return false end
if( objectInfo.classID == 19 ) then return false end
if( objectInfo.classID == 20 ) then return false end
if( objectInfo.classID == 21 ) then return false end
if( objectInfo.classID == 32 ) then return false end
if( objectInfo.classID == 33 ) then return false end
if( objectInfo.classID == 34 ) then return false end
if( objectInfo.classID == 90 ) then return false end
if( objectInfo.classID == 91 ) then return false end
if( objectInfo.classID == 99 ) then return false end
if( objectInfo.classID == 100 ) then return false end
if( objectInfo.classID == 106 ) then return false end
if( objectInfo.classID == 107 ) then return false end
end
return true
end
function isDead( objectId )
local objectInfo = l2c_getObjectInfoByObjectId( objectId );
if objectInfo == nil then return true end
if( objectInfo.type == "pc" ) then
if( objectInfo.isAlikeDead == 1 ) then
return true
end
end
if( objectInfo.type == "npc" ) then
if( objectInfo.isAlikeDead == 1 ) then
return true
end
end
if( objectInfo.type == "mob" ) then
if( objectInfo.isAlikeDead == 1 ) then
return true
end
end
return false
end
function validate_target()
local oid, curHp, maxHp = l2c_getTarget();
if oid == 0 then return false end -- no target? :(
local info = l2c_getObjectInfoByObjectId( oid );
if not info then return false end -- O_o error
if assist_only_mobs then
if info.type == "mob" then return true end -- target must be attackable npc: mob
--l2h_print( "Not mob!\n" );
l2h_delay( 500 );
return false; -- not mob on target
end
-- not assist ONLY mobs
if assist_dont_kill_party then
local party = l2c_getParty();
local nMembers = #party;
local i = 0;
local target_is_party_member = false;
if nMembers > 0 then
for i=1, nMembers do
if party[i].objectID == oid then target_is_party_member = true end
end
end
if target_is_party_member then return false end -- DONT allow to kill party members
end
return true; -- no matter what is on target
end
function isAllowedAttackMob( npcID )
local n = #not_attack_mobs
if n < 1 then return true end
local i
for i=1,n do
if npcID == not_attack_mobs[i] then return false end
end
return true
end
function use_heal_item()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local hp_percent = 100.0 * curHp / maxHp
local mp_percent = 100.0 * curMp / maxMp
local curTime = l2h_time()
-- use heal item
if (heal_itemID>0) then
if hp_percent <= heal_item_use_hp then
if (curTime - sys_last_heal_item_use_time) > heal_item_reuse_secs then
l2h_print( "Self heal: use item!\n" )
l2c_useItem( heal_itemID );
sys_last_heal_item_use_time = curTime;
end
end
end
if (mana_itemID>0) then
if mp_percent <= mana_item_use_mp then
if (curTime - sys_last_mana_item_use_time) > mana_item_reuse_secs then
l2h_print( "Self heal: use item!\n" )
l2c_useItem( mana_itemID );
sys_last_mana_item_use_time = curTime;
end
end
end
end
function check_shadow_weapon()
if not shadow_weapon_use then return end
local rhand_iid, rhand_oid = l2c_getPaperdollItem( 9 ) -- 9 is PAPERDOLL_RHAND
if rhand_iid == shadow_weapon_iid then return end
l2h_print( "Incorrect weapon equipped! Equip shadow!\n" )
l2h_print( "Current: Rhand: itemID [", rhand_iid, "] oid [", rhand_oid, "]\n" )
l2c_useItemByObjectId( rhand_oid ) -- disarm current weapon
l2h_delay( 250 )
local cnt = l2c_getItemCount( shadow_weapon_iid )
if cnt < 1 then
l2h_print( "ERROR: No shadow weapon left!\n" )
l2h_soundAlert()
return
end
l2c_useItem( shadow_weapon_iid ) -- equip weapon
l2h_delay( 250 )
rhand_iid, rhand_oid = l2c_getPaperdollItem( 9 ) -- 9 is PAPERDOLL_RHAND
-- wait until weapon is equipped
while rhand_iid ~= shadow_weapon_iid do
l2h_delay( 100 )
rhand_iid, rhand_oid = l2c_getPaperdollItem( 9 ) -- 9 is PAPERDOLL_RHAND
end
l2h_print( "Equipped!\n" )
end
function kill_target()
local oid, tcurHp, tmaxHp = l2c_getTarget()
local objectInfo = l2c_getObjectInfoByObjectId(oid)
local selfInfo = l2c_getStats()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local hp_percent = 100.0 * curHp / maxHp
local mp_percent = 100.0 * curMp / maxMp
local target_target = 0
if objectInfo ~= nil then
if( objectInfo.type == "pc" ) then
target_target = objectInfo.targetObjectID
end
end
local startHp = curHp -- remember mob start HP
--l2c_action( oid ) -- action to current target
check_shadow_weapon()
--l2h_print(target_target)
-- for sure, request attack current target
-- if (not (isDead( oid ))) and selfInfo.objectID == target_target then
use_heal_item()
if (not (isDead( oid ))) then
if (skill_1 > 0) and (l2c_getSkillReuseLeft(skill_1) == 0) and ((l2h_timeMsec()-skill1_time) > skill_1_delay) and (mp_percent > 20) then
skill1_time = l2h_timeMsec()
myUseSkill( skill_1 )
if not l2c_isCastingNow() then
skill1_time = 0
else
wait_end_of_cast()
end
end
end
l2c_attack()
l2h_delay( 400 )
if (kite_distance > 0) and have_target() then
x,y,z = l2c_getPos() -- ïîëó÷èì íàøè êîîðäèíàòû
c = l2c_getObjectInfoByObjectId( oid ) -- êîîðäèíàòû öåëè
if c == nil then return end
m = l2c_getObjectInfoByObjectId( l2c_getCharObjectIdByName( follow_name ) ) -- êîîðäèíàòû ÌÀ
--if m == nil then return end
local mx = x
local my = y
local mx1 = x
local my1 = y
rand = 0.2
if (calc_dist(c.x-x,c.y-y)+150<kite_distance) or (calc_dist(m.x-x,m.y-y)>kite_range) then
if (x-c.x) ~= 0 then
local angle = math.atan((y-c.y)/(x-c.x))
if x<c.x then angle = angle + math.pi end
mx = x+150 * math.cos(angle + math.random( (0-rand), rand ))
my = y+150 * math.sin(angle + math.random( (0-rand), rand ))
else
if y-c.y > 0 then my = y + 150 else my = y - 150 end
end
mx1 = mx
my1 = my
if m ~= nil then
if calc_dist(m.x-mx,m.y-my)>kite_range then
--l2h_print( mx," ",my," ",m.x," ",m.y, "\n" )
local cx = m.x + kite_range * (mx-m.x) / calc_dist(m.x-mx,m.y-my)
local cy = m.y + kite_range * (my-m.y) / calc_dist(m.x-mx,m.y-my)
mx = x + 150 * (cx-x) / calc_dist(cx-x,cy-y)
my = y + 150 * (cy-y) / calc_dist(cx-x,cy-y)
--l2h_print( mx," ",my," ",x," ",y," ",cx," ",cy," ", "\n" )
else
--l2h_print( "close ", calc_dist(m.x-mx,m.y-my), "\n" )
end
else
--l2h_print( "No MA!\n" )
end
if (calc_dist(c.x-mx,c.y-my)<kite_distance) and (calc_dist(mx1-mx, my1-my) < 240) then
l2c_moveTo( mx, my, z )
else
--l2h_print( "far ", calc_dist(c.x-mx,c.y-my), "\n" )
end
wait_end_of_cast()
end
end
local startSec = l2h_time() -- remember start time
local curSec = 0
--l2h_print( " Killed target!\n" )
-- kill was OK, cancel ignored mob
sys_ignore_oid = 0;
if sys_should_exit() then return end
sys_skill1_1_used = false;
end
function rest()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local prevHp = curHp
local hp_percent = 100.0 * curHp / maxHp
local mp_percent = 100.0 * curMp / maxMp
local isSitting, isRunnig = l2c_getSitRun()
repeat
if sys_should_exit() then return end
curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
if curHp < prevHp then
l2h_print( "Rest interrupted (HP)?\n" )
l2h_soundAlert()
return
end
prevHp = curHp
hp_percent = 100.0 * curHp / maxHp
mp_percent = 100.0 * curMp / maxMp
l2h_delay( 1000 )
isSitting, isRunnig = l2c_getSitRun()
if not isSitting then
l2h_print( "Rest interrupted (stand)?\n" )
l2h_soundAlert()
return
end
l2h_delay( 200 )
local hp_good = false
local mp_good = false
if hp_percent >= stand_above_hp then hp_good = true end
if mp_percent >= stand_above_mp then mp_good = true end
until hp_good and mp_good
l2h_print( "Rest end, HP ok ", hp_percent, "%, MP ok ", mp_percent, "%, standing\n" )
ensurestand()
l2h_delay( 1500 )
end
function check_my_hp_mp()
local curHp, maxHp, curMp, maxMp, curCp, maxCp = l2c_getHPMPCPWeight()
local hp_percent = 100.0 * curHp / maxHp
local mp_percent = 100.0 * curMp / maxMp
local hp_low = false
local mp_low = false
if hp_percent < sit_below_hp then hp_low = true end
if mp_percent < sit_below_mp then mp_low = true end
if hp_low or mp_low then
l2h_print( "We must sit! HP ", hp_percent, "%, MP ", mp_percent, "%\n" )
l2c_sitStand()
l2h_delay( 500 )
rest()
--[[else
l2h_print( "No need to rest...\n" )]]--
end
end
function ensurestand()
local isSitting, isRunnig = l2c_getSitRun()
if isSitting then
l2c_sitStand()
l2h_delay( 1000 )
end
end
function ensuresit()
local isSitting, isRunnig = l2c_getSitRun()
if not isSitting then
l2c_sitStand()
l2h_delay( 1000 )
end
end
function ensurerun()
local isSitting, isRunnig = l2c_getSitRun()
if not isRunnig then
l2c_runWalk()
l2h_delay( 50 )
end
end
function ensurewalk()
local isSitting, isRunnig = l2c_getSitRun()
if isRunnig then
l2c_runWalk()
l2h_delay( 50 )
end
end
function calc_dist( dx, dy )
return math.sqrt( dx*dx + dy*dy )
end
function isPointInFightZone( px, py, pz )
-- first check z-delta
local dz = math.abs( pz - combat_start_z )
if dz > combat_target_dz then return false end
local dx = math.abs( px - combat_start_x )
local dy = math.abs( py - combat_start_y )
-- for square zone
if combat_zone_type == "square" then
if (dx < combat_range) and (dy < combat_range) then return true end
--l2h_print( "isPointInFightZone(): no (square)\n" )
return false
end
-- for circle zone
if combat_zone_type == "circle" then
local r = calc_dist( dx, dy )
if r < combat_range then return true end
--l2h_print( "isPointInFightZone(): no (circle)\n" )
return false
end
l2h_print( "ERROR: unknown combat zone type!\n" )
return false
end
function target_nearest_attackable()
local x, y, z = l2c_getPos()
local mobs = l2c_getVisibleMobs()
local nmobs = #mobs
local i = 0
local dist = 0
local min_dist = 20000
local min_objectID = 0
local min_name = ""
if nmobs == 0 then
l2h_print( "No mobs?\n" );
l2h_delay( 200 );
return
end
for i=1, nmobs do
local mobinfo = l2c_getObjectInfoByObjectId( mobs[i] )
-- only valid mobs and which are not ignored
if (mobinfo ~= nil) and (mobs[i] ~= sys_ignore_oid) then
-- check if mob is in fight range
local isInRange = isPointInFightZone( mobinfo.x, mobinfo.y, mobinfo.z )
-- check if we are allowed to attack this mob
local isAllowed = isAllowedAttackMob( mobinfo.templateID )
local isAlive = false
if mobinfo.isAlikeDead == 0 then isAlive = true end
-- only count alive mobs, that are in fight range and allowed to attack
if ( isAlive and isInRange and isAllowed ) then
local dx = mobinfo.x - x
local dy = mobinfo.y - y
dist = calc_dist( dx, dy )
if dist < min_dist then
min_dist = dist
min_objectID = mobinfo.objectID
min_name = mobinfo.name
end
end
end
end
if min_objectID == 0 then
l2h_print( "Error: cannot target: min_objectID = 0!, no mons in range?\n" )
l2h_delay( 1000 )
-- begin move to combat start point
l2c_moveTo( combat_start_x, combat_start_y, combat_start_z )
return
end
l2h_print( "Target: [", min_name, "] " )
l2c_action( min_objectID )
l2h_delay( 250 )
end
function targetByAssist()
if not assist_mode then return end
local party = l2c_getParty();
if #party == 0 then
l2h_print( "Cannot assist, no party!\n" );
l2h_delay( 200 );
return
end
local i = 0;
local targetObjectID = 0;
for i=1, #party do
if party[i].name == assist_member then
targetObjectID = party[i].targetObjectID;
end
end
local oid, curHp, maxHp = l2c_getTarget();
if not ( targetObjectID == 0 ) then
if targetObjectID == l2c_getCharObjectIdByName( follow_name ) then
--l2c_targetCancel()
follow( follow_name, 120 )
end
if oid == 0 then
myTargetObjectTimeout( targetObjectID, 1 );
else if isDead( oid ) then
--l2h_print( "DEAD\n" )
myTargetObjectTimeout( targetObjectID, 1 );
else if isNotTank( targetObjectID ) then
myTargetObjectTimeout( targetObjectID, 1 );
end
--l2h_print( "LIVE\n" )
end
end
end
end
function have_target()
local oid, curHp, maxHp = l2c_getTarget();
if oid == 0 then return false end -- no target? :(
local info = l2c_getObjectInfoByObjectId( oid );
if not info then return false end -- O_o error
local selfInfo = l2c_getStats()
if assist_only_mobs then
if info.type == "mob" then return true end -- target must be attackable npc: mob
return false; -- not mob on target
end
if selfInfo.objectID == oid then return false end
if isDead(oid) then return false end
-- not assist ONLY mobs
if assist_dont_kill_party then
local party = l2c_getParty();
local nMembers = #party;
local i = 0;
local target_is_party_member = false;
if nMembers > 0 then
for i=1, nMembers do
if party[i].objectID == oid then target_is_party_member = true end
end
end
if target_is_party_member then return false end -- DONT allow to kill party members
end
return true; -- no matter what is on target
end
function target_mob()
if assist_mode then
targetByAssist()
else
target_nearest_attackable()
end
end
function pickup_nearest_items( pickup_dist )
local x, y, z = l2c_getPos()
local items = l2c_getVisibleItems()
local nitems = #items
local dist = 0
local i = 0
if nitems == 0 then return end
l2c_targetCancel()
l2h_delay( 50 )
l2h_print( "Pick: " )
for i=1, nitems do
if sys_should_exit() then return end
local iteminfo = l2c_getObjectInfoByObjectId( items[i] )
if iteminfo ~= nil then
local dx = iteminfo.x - x;
local dy = iteminfo.y - y;
dist = calc_dist( dx, dy )
if dist < pickup_dist then
--l2h_print( "[", iteminfo.name, "] ", iteminfo.count, ", " )
--l2c_moveTo( iteminfo.x, iteminfo.y, iteminfo.z )
l2c_action( items[i] )
--l2c_action( items[i] )
l2h_delay( pickup_item_timeout )
end
end
end
l2h_print( " Pick end\n" )
end
function follow( name, distance )
-- ïîëó÷èì objectID ÷àðà
randomness = 60
local objectID = l2c_getCharObjectIdByName( name )
-- à åñòü ëè òàêîé ÷àð âîîáùå?
if objectID == nil then
l2h_print( "Character [", name, "] is not visible!\n" )
return
end
if randomness >= distance then randomness = distance/2 end
local x, y, z -- íàøè êîîðäèíàòû áóäóò òóò
local gox, goy, goz
local c -- èíôî î ÷àðå áóäåò òóò
-- à íàäî ëè íàì ñëåäîâàòü?
if (l2h_time()-rand_time) > follow_rand_time then
rand_time = l2h_time()
x_rand = math.random( (0-randomness), randomness )
y_rand = math.random( (0-randomness), randomness )
end
x,y,z = l2c_getPos() -- ïîëó÷èì íàøè êîîðäèíàòû
c = l2c_getObjectInfoByObjectId( objectID ) -- èíôî î öåëè "ïðåñëåäîâàíèÿ"
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox=c.xDst
goy=c.yDst
goz=c.zDst
else
gox=c.x
goy=c.y
goz=c.z
end
if (math.abs(gox - x) > distance) or (math.abs(goy - y) > distance) then
--if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) and (math.abs(c.xDst - x) > distance) and (math.abs(c.yDst - y) > distance) then
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
else
return -- äà ìû è òàê íåäàëåêî îò öåëè
end
-- öèêë ñëåäîâàíèÿ
repeat
if sys_should_exit() then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
-- ïîëó÷èì èíôî î ÷àðå
c = l2c_getObjectInfoByObjectId( objectID )
--l2h_print( "Following [", name, "] to (", c.x, ",", c.y, ",", c.z, ")\n" )
if (l2h_time()-rand_time) > follow_rand_time then
rand_time = l2h_time()
x_rand = math.random( (0-randomness), randomness )
y_rand = math.random( (0-randomness), randomness )
end
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox=c.xDst
goy=c.yDst
goz=c.zDst
else
gox=c.x
goy=c.y
goz=c.z
end
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
l2h_delay( 300 ) -- ïîäîæäåì
x,y,z = l2c_getPos() -- ïîëó÷èì íàøè êîîðäèíàòû
-- ïðîâåðèì ðàçíèöó íàøèõ êîîðäèíàò è êîîðäèíàò ÷àðà.
-- åñëè ðàçíèöà áîëüøå äèñòàíöèè ñëåäîâàíèÿ, öèêë ñëåäîâàíèÿ ïîâòîðèòñÿ
until ((math.abs(gox - x) < distance) or (math.abs(goy - y) < distance) or (math.abs(goz - z) < distance))
end
-- âåðíåò true, åñëè áàô skillID ïðèñóòñâóåò â ìàññèâå have_buffs
function buffIsPresent( skillID, have_buffs )
if not have_buffs then return false end
local i
for i=1, #have_buffs do
if have_buffs[i].skillID == skillID then return true end
end
return false
end
-- ïðîâåðèòü ñâîè áàôû è ðåáàôíóòü íåäîñòàþùèå
function check_self_buffs()
local have_buffs = l2c_getBuffs()
local ma_buffs = l2c_getPartyMemberBuffs(l2c_getCharObjectIdByName(follow_name))
local j
local have_snipe = false
for j=1, #ma_buffs do
if ma_buffs[j].skillID == snipe_id then
have_snipe = true
end
--if
end
local user = l2c_getStats() -- íàì íóæåí ñâîé objectID ÷òîáû çàòàðãåòèòü
local i
if follow_snipe then
if (not have_snipe) and ( buffIsPresent( snipe_id, have_buffs )) then
l2c_buffCancel( snipe_id )
--l2h_print("Cancel!\n")
end
if have_snipe and (not buffIsPresent( snipe_id, have_buffs )) then
--myTargetObjectTimeout( user.objectID, 5 )
--l2h_print("Snipe!\n")
myUseSkill( snipe_id )
wait_end_of_cast()
end
end
for i=1, #self_buffs do
if sys_should_exit() then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
if not buffIsPresent( self_buffs[i], have_buffs ) then
l2h_print( script_name, " Need self rebuff [", self_buffs[i], "]\n" )
myTargetObjectTimeout( user.objectID, 5 )
myUseSkill( self_buffs[i] )
wait_end_of_cast()
end
--if
end
end
function fight()
target_mob()
if validate_target() then
if sys_should_exit() then return end
kill_target()
if sys_should_exit() then return end
--pickup_nearest_items( 400 )
--pickup_nearest_items( pickup_range )
--if sys_should_exit() then return end
--check_my_hp_mp()
--if sys_should_exit() then return end
end
end
function setup_soulshots()
if soulshot_item > 0 then l2c_autoSoulshot( soulshot_item, true ) end
if spiritshot_item > 0 then l2c_autoSoulshot( spiritshot_item, true ) end
end
function setup_fight_zone()
if assist_mode then
l2h_print( "Combat mode: assist\n" );
return
end
l2h_print( "Combat mode: leader\n" )
if combat_start_point == "auto" then
combat_start_x, combat_start_y, combat_start_z = l2c_getPos()
end
l2h_print( "Combat start point type: ", combat_start_point, "\n" );
l2h_print( "Combat start at: (", combat_start_x, ", ", combat_start_y, ", ", combat_start_z, "\n" );
l2h_print( "Combat zone type: ", combat_zone_type, "\n" );
end
-- script start
ensurestand()
ensurerun()
check_shadow_weapon() -- equip weapon before using soulshots/spiritshots
setup_soulshots()
setup_fight_zone()
while true do
check_self_buffs()
if assist_mode then
if (kite_distance == 0) or (not (have_target())) then
follow( follow_name, follow_distance )
end
end
fight()
if sys_should_exit() then break end
if not l2c_is_INGAME() then break end
end
l2h_print( "Script assist stopped\n" )

View File

@@ -0,0 +1,2 @@
luac -o stdlib.luac stdlib.lua
pause

View File

@@ -0,0 +1,393 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ru">
<head>
<title>L2OOGHelper LUA script API</title>
<meta http-equiv="Content-type" content="text/html; charset=windows-1251" />
<style type="text/css">
body, td { font-family: Tahoma, Verdana, Sans }
</style>
</head>
<body bgcolor="white" text="black">
<font size="2">
<p><blockquote>
<b>l2h_console_enable( <font color="blue">boolean</font> enable )</b><br />
Âêëþ÷èòü èëè âûêëþ÷èòü îòëàäî÷íóþ êîíñîëü êëèåíòà.
</blockquote></p>
<p><blockquote>
<b>l2h_print(...)</b><br />
Âûâîä ðÿäà ïàðàìåòðîâ ðàçíûõ òèïîâ â îòëàäî÷íóþ êîíñîëü êëèåíòà.
</blockquote></p>
<p><blockquote>
<b>l2h_delay( <font color="blue">int</font> milliseconds )</b><br />
Çàäåðæàòü âûïîëíåíèå ñêðèïòà íà <b>milliseconds</b> ìèëëèñåêóíä.
</blockquote></p>
<p><blockquote>
<b>l2h_soundAlert()</b><br />
Çâîíîê!
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2h_time()</b><br />
Âåðíåò âðåìÿ Unix (ê-âî ñåêóíä, ïðîøåäøèõ ñ 1 ÿíâàðÿ 1970)
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2h_timeMsec()</b><br />
Âåðíåò ê-âî ìèëëèñåêóíä, ïðîøåäøèõ ñ ìîìåíòà çàïóñêà Windows
(<a href="http://msdn.microsoft.com/en-us/library/ms724408%28VS.85%29.aspx">GetTickCount()</a>)
</blockquote></p>
<p><blockquote>
<b><font color="blue">boolean</font> sys_should_exit()</b><br />
Âåðíåò çíà÷åíèå <b>true</b>, åñëè
ïîëüçîâàòåëüñêèé èíòåðôåéñ âûäàë êîìàíäó íà îñòàíîâêó ñêðèïòà. Ñêðèïò äîëæåí âðåìÿ îò âðåìåíè
âûçûâàòü ýòó ôóíêöèþ, è çàâåðøàòü ðàáîòó, åñëè îíà âåðíóëà <b>true</b>. Íà îñòàíîâêó ñêðèïòà äàåòñÿ 5 ñåêóíä,
èíà÷å ñêðèïò áóäåò ãðóáî ïðåðâàí, à ýòî ìîæåò âûçâàòü ãëþêè â áóäóùåì. :(
</blockquote></p>
<p><blockquote>
<b><font color="blue">boolean</font> l2c_is_IN_GAME()</b><br />
Âåðíåò true, åñëè êëèåíò â èãðå (àâòîðèçîâàëñÿ è çàøåë â ìèð).
</blockquote></p>
<p><blockquote>
<b>
<font color="blue">int</font>, <font color="blue">int</font>,
<font color="blue">int</font>, <font color="blue">int</font>,
<font color="blue">int</font>, <font color="blue">int</font>,
<font color="blue">int</font>, <font color="blue">int</font>
l2c_getHPMPCPWeight()</b><br />
Âåðíåò curHp,maxHp, curMp,maxMp, curCp,maxCp, curLoad,maxLoad.<br />
</blockquote></p>
<p><blockquote>
<b>
<font color="blue">int</font>, <font color="blue">int</font>,
<font color="blue">int</font> l2c_getPos()</b><br />
Âåðíåò x,y,z - òåêóùèå êîîðäèíàòû êëèåíòà.<br />
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getStats()</b><br />
Âåðíåò ñòðóêòóðó ñ ïîëÿìè, îòðàæàþùèìè òåêóùèå ñòàòû êëèåíòà:<br>
<ul>
<li><b><font color="blue">int</font> objectID</b></li>
<li><b><font color="blue">string</font> name</b></li>
<li><b><font color="blue">int</font> heading</b></li>
<li><b><font color="blue">int</font> pAtk</b></li>
<li><b><font color="blue">int</font> mAtk</b></li>
<li><b><font color="blue">int</font> pDef</b></li>
<li><b><font color="blue">int</font> mDef</b></li>
<li><b><font color="blue">int</font> pAtkApd</b></li>
<li><b><font color="blue">int</font> mAtkSpd</b></li>
</ul>
</blockquote></p>
<p><blockquote>
<b><font color="blue">boolean</font>, <font color="blue">boolean</font> l2c_getSitRun()</b><br />
local isSitting, isRunning = l2c_getSitRun()<br />
isSitting: true, åñëè êëèåíò ñèäèò.<br />
isRunning: true, åñëè êëèåíò â ðåæèìå áåãà.<br />
</blockquote></p>
<p><blockquote>
<b>l2c_sitStand()</b><br />
Ïåðåêëþ÷èòü ïîëüçîâàòåëÿ ìåæäó ñîñòîÿíèìè ñèäåòü/ñòîÿòü (àíàëîãè÷íî êíîïêå sit/stand êëèåíòà, èëè êîìàíäå /sitstand)
</blockquote></p>
<p><blockquote>
<b>l2c_runWalk()</b><br />
Ïåðåêëþ÷èòü ïîëüçîâàòåëÿ ìåæäó ñîñòîÿíèìè áåãîì/øàãîì (àíàëîãè÷íî êíîïêå run/walk êëèåíòà)
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2c_getSkillLevel( <font color="blue">int</font> skillID )</b><br />
Ïîëó÷èòü óðîâåíü ñêèëëà ñ ID skillID, Ðåçóëüòàò áóäåò 0, åñëè òàêîãî ñêèëëà íåò â ñïèñêå ñêèëëîâ êëèåíòà.
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2c_getSkillReuseLeft( <font color="blue">int</font> skillID )</b><br />
Óçíàòü, ñêîëüêî ìèëëèñåêóíä îñòàëîñü äî òîãî, êàê ñêèëë ñíîâà ìîæíî áóäåò èñïîëüçîâàòü.
</blockquote></p>
<p><blockquote>
<b><font color="blue">boolean</font> l2c_isCastingNow()</b><br />
Óçíàòü, êàñòóåò ëè ÷àð ñêèëë â äàííûé ìîìåíò.
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2c_getItemCount( <font color="blue">int</font> itemID )</b><br />
Ïîëó÷èòü ê-âî ïðåäìåòîâ ñ ID itemID â èíâåíòàðå êëèåíòà. 0, åñëè òàêèõ ïðåäìåòîâ íåò.
</blockquote></p>
<p><blockquote>
<b>l2c_useItem( <font color="blue">int</font> itemID )</b><br />
Èñïîëüçîâàòü ïðåäìåò itemID (åñëè òàêîé åñòü â èíâåíòàðå)
</blockquote></p>
<p><blockquote>
<b>l2c_useItemByObjectId( <font color="blue">int</font> objectID )</b><br />
Èñïîëüçîâàòü ïðåäìåò, íî íå ïî itemID, à ïî åãî objectID
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font>, <font color="blue">int</font>
l2c_getPaperdollItem( <font color="blue">int</font> slot )</b><br />
Ïîëó÷èòü itemID, objectID íàäåòîãî â ñëîò <b>slot</b> ïðåäìåòà. <b>slot</b> ìîæåò áûòü <b>÷èñëîì</b> èç ñïèñêà: <br />
<ul>
<li>L2_PAPERDOLL_UNDER 0</li>
<li>L2_PAPERDOLL_REAR 1</li>
<li>L2_PAPERDOLL_LEAR 2</li>
<li>L2_PAPERDOLL_LREAR 3</li>
<li>L2_PAPERDOLL_NECK 4</li>
<li>L2_PAPERDOLL_LFINGER 5</li>
<li>L2_PAPERDOLL_RFINGER 6</li>
<li>L2_PAPERDOLL_LRFINGER 7</li>
<li>L2_PAPERDOLL_HEAD 8</li>
<li>L2_PAPERDOLL_RHAND 9</li>
<li>L2_PAPERDOLL_LHAND 10</li>
<li>L2_PAPERDOLL_GLOVES 11</li>
<li>L2_PAPERDOLL_CHEST 12</li>
<li>L2_PAPERDOLL_LEGS 13</li>
<li>L2_PAPERDOLL_FEET 14</li>
<li>L2_PAPERDOLL_BACK 15</li>
<li>L2_PAPERDOLL_LRHAND 16</li>
<li>L2_PAPERDOLL_FULLARMOR 17</li>
<li>L2_PAPERDOLL_HAIR 18</li>
<li>L2_PAPERDOLL_ALLDRESS 19</li>
<li>L2_PAPERDOLL_HAIR2 20</li>
<li>L2_PAPERDOLL_HAIRALL 21</li>
<li>L2_PAPERDOLL_RBRACELET 22</li>
<li>L2_PAPERDOLL_LBRACELET 23</li>
<li>L2_PAPERDOLL_DECO1 24</li>
<li>L2_PAPERDOLL_DECO2 25</li>
<li>L2_PAPERDOLL_DECO3 26</li>
<li>L2_PAPERDOLL_DECO4 27</li>
<li>L2_PAPERDOLL_DECO5 28</li>
<li>L2_PAPERDOLL_DECO6 29</li>
</ul>
</blockquote></p>
<p><blockquote>
<b>l2c_say( <font color="blue">int</font> channel, <font color="blue">string</font> text )</b><br />
Ñêàçàòü <b>text</b> â êàíàë <b>channel</b>. channel ìîæåò áûòü <b>÷èñëîì</b> èç ñïèñêà:
<ul>
<li>ALL = 0</li>
<li>SHOUT = 1</li>
<li>TELL = 2</li>
<li>PARTY = 3</li>
<li>CLAN = 4</li>
<li>GM = 5</li>
<li>PETITION_PLAYER = 6</li>
<li>PETITION_GM = 7</li>
<li>TRADE = 8</li>
<li>ALLIANCE = 9</li>
<li>ANNOUNCEMENT = 10</li>
<li>PARTYROOM_ALL = 16</li>
<li>PARTYROOM_COMMANDER = 15</li>
<li>HERO_VOICE = 17</li>
</ul>
</blockquote></p>
<p><blockquote>
<b>l2c_sayPm( <font color="blue">string</font> text, <font color="blue">string</font> to )</b><br />
Ñêàçàòü <b>text</b> â ÏÌ èãðîêó <b>to</b>
</blockquote></p>
<p><blockquote>
<b>l2c_npcDlg( <font color="blue">string</font> strInDlg )</b><br />
Âûáðàòü ñòðî÷êó <b>strInDlg</b> â äèàëîãå ñ ÍÏÖ (äèàëîã ñ ÍÏÖ äîëæåí áûòü îòêðûò è ÍÏÖ äîëæåí áûòü íà òàðãåòå).
</blockquote></p>
<p><blockquote>
<b>l2c_moveTo( <font color="blue">int</font> x, <font color="blue">int</font> y, [<font color="blue">int</font> z] )</b><br />
Äâèãàòüñÿ â òî÷êó x,y,z.<br />
Åñëè ïîñëåäíèé ïàðàìåòð íå çàäàí, îí ïðèðàâíèâàåòñÿ òåêóùåìó z.
</blockquote></p>
<p><blockquote>
<b>l2c_moveToDelta( <font color="blue">int</font> dx, <font color="blue">int</font> dy, [<font color="blue">int</font> dz] )</b><br />
Ñäâèíóòüñÿ íà dx,dy,dz îòíîñèòåëüíî òåêóùåé ïîçèöèè. <br />
Åñëè ïîñëåäíèé ïàðàìåòð íå çàäàí, ñäâèãà ïî âûñîòå íå áóäåò.
</blockquote></p>
<p><blockquote>
<b>l2c_action( <font color="blue">int</font> objectID )</b><br />
Äåéñòâèå ïî óìîë÷àíèþ, íàïðàâëåííîå íà <b>objectID</b>. <br />
Åñëè íåò öåëè, òî öåëü áóäåò âûáðàíà; èíà÷å: ñ ÍÏÖ áóäåò íà÷àò ðàçãîâîð, ìîá áóäåò àòàêîâàí,
ïðåäìåò ñ çåìëè áóäåò ïîäíÿò.<br />
</blockquote></p>
<p><blockquote>
<b>l2c_attack()</b><br />
Àòàêîâàòü òåêóùóþ öåëü. Åñëè öåëè íåò, äåéñòâèå èãíîðèðóåòñÿ.
</blockquote></p>
<p><blockquote>
<b>l2c_useSkill( <font color="blue">int</font> skillID, [<font color="blue">boolean</font> force] )</b><br />
Èñïîëüçîâàòü ñêèëë <b>skillID</b> íà òåêóùóþ âûáðàííóþ öåëü. <br />
<b>force</b> - "íàæàòü" ïðè ýòîì Ctrl.<br />
Åñëè ïîñëåäíèé ïàðàìåòð íå çàäàí, Ctrl íå "íàæèìàåòñÿ".<br />
<b><font color="red">Âàæíî:</font></b> <font color="gray">âûçîâ ýòîé ôóíêöèè òîëüêî îòñûëàåò ïàêåò
<b><font color="purple">RequstMagicSkilluse</font></b>,
÷òî íèêîèì îáðàçîì íå îçíà÷àåò, ÷òî ÷àð ñðàçó æå íà÷àë êàñò ñêèëëà (ïîêà îò ñåðâåðà íå ïðèäåò ïàêåò
<b><font color="purple">MagicSkilluse</font></b>,
÷àð ôàêòè÷åñêè êàñò ñêèëëà íå íà÷àë); ëèáî ïî ïðè÷èíå Abnormal State, êîòîðîå íå ïîçâîëÿåò èñïîëüçîâàòü ñêèëë â äàííûé ìîìåíò (Stun/Silence);
ëèáî ïî ïðè÷èíå îòñóòñòâèÿ äàííîãî ñêèëëà ó ÷àðà; ëèáî ïèíã äî ñåðâåðà íå ìãíîâåííûé è ôàêòè÷åñêè êàñò ñêèëëà íà÷íåòñÿ íåñêîëüêèìè
ìèëëèñåêóíäàìè ïîçæå.</font>
</blockquote></p>
<p><blockquote>
<b>l2c_autoSoulshot( <font color="blue">int</font> itemID, [<font color="blue">boolean</font> enable = true] )</b><br />
Âêëþ÷èòü èëè âûêëþ÷èòü àâòî-ñîóëøîò <b>itemID</b>
</blockquote></p>
<p><blockquote>
<b>l2c_targetByName( <font color="blue">string</font> charName )</b><br />
Âçÿòü íà öåëü ÷àðà ñ íèêîì <b>charName</b>.<br />
</blockquote></p>
<p><blockquote>
<b>l2c_targetCancel()</b><br />
Îòìåíèòü òåêóùóþ öåëü.<br />
</blockquote></p>
<p><blockquote>
<b><font color="blue">int, double, double</font> l2c_getTarget()</b><br />
objectID, curHp, maxHp òåêóùåé öåëè.<br />
objectID = 0, åñëè íå âûáðàíà öåëü.<br />
curHp, maxHp = 0 åñëè ÕÏ öåëè íåèçâåñòíî.<br />
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getBuffs()</b><br />
Âåðíåò ìàññèâ (â ñòèëå ëóà, íóìåðóþùèéñÿ ñ åäèíèöû), êàæäûé ýëåìåíò êîòîðîãî ñîäåðæèò èíôîðìàöèþ îá îäíîì áàôôå.<br />
Åñëè áàôôîâ íåò, ìàññèâ áóäåò ïóñò.<br />
Êàæäûé ýëåìåíò - ñòðóêòóðà ñ ïîëÿìè: <b>skillName, skillID, skillLvl, durationSecs</b><br />
Ñòðîêîâîå èìÿ ñêèëëà, ID ñêèëëà, åãî óðîâåíü, îñòàâøååñÿ âðåìÿ â ñåêóíäàõ.
</blockquote></p>
<p><blockquote>
<b>l2c_buffCancel( <font color="blue">int</font> skillID )</b><br />
Çàïðîñ íà îòìåíó áàôôà <b>skillID</b>. Äîñòóïíî òîëüêî â Ãðàöèè.<br />
Åñëè òàêãî áàôà íåò, äåéñòâèå èãíîðèðóåòñÿ.
</blockquote></p>
<p><blockquote>
<b><font color="blue">int</font> l2c_getCharObjectIdByName( <font color="blue">string</font> charName )</b><br />
<b><font color="blue">int</font> l2c_getNpcObjectIdByName( <font color="blue">string</font> charName )</b><br />
Ïîëó÷èòü objectID ÷àðà/NPC ñ íèêîì <b>charName</b>.<br />
Åëñè òàêîãî ÷àðà íåò â çîíå âèäèìîñòè, âåðíåò <b>nil</b>.
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getObjectInfoByObjectId( <font color="blue">int</font> objectID )</b><br />
Ïîëó÷èòü èíôîðìàöèþ îá îáúåêòå ñ <b>objectID</b>.<br />
Åñëè òàêîãî îáúåêòà íåò â çîíå âèäèìîñòè, âåðíåò <b>nil</b>.
Åñëè îáúåêò íàéäåò, âåðíåò ñòðóêòóðó ñ ïîëÿìè: <b>objectID, type, x, y, z, <font color="blue">string</font> name</b><br />
<b>type</b>: ñòðîêà, "pc", "npc", "mob", "item"<br />
Äëÿ ïåðåäâèãàþùèõñÿ îáúåêòîâ (pc,npc,mob) òàêæå áóäóò äîñòóïíû ïîëÿ:
<b>xDst, yDst, zDst, heading, curHp, maxHp, isAlikeDead</b>.
HP,MP ìîæåò áûòü íåèçâåñòíî (ðàâíî íóëþ).<br />
Äëÿ èãðîêà (type = pc): <b>classID</b><br />
Äëÿ ìîáà/íïö (type = mob/npc): <b>templateID</b><br />
Äëÿ ïðåäìåòà, ëåæàùåãî íà çåìëå (type = item): <b>itemID</b>, <font color="blue">boolean</font> <b>stackable, count</b><br />
</blockquote></p>
<p><blockquote>
<b><font color="blue">boolean</font> l2c_isCharDead( <font color="blue">int</font> objectID )</b><br />
Ïðîâåðÿåò, ÿâëÿåòñÿ ëè îáúåêò òðóïîì.<br />
Åñëè <b>objectID</b> ÿâëÿåòñÿ ÷àðîì/ÍÏÖ/ìîáîì, âîçâðàùàåò <b>false</b>, åñëè ÷àð æèâîé (çíà÷åíèå isAlikeDead).<br />
Âî âñåõ îñòàëüíûõ ñëó÷àÿõ âîçâðàùàåò <b>true</b> (äëÿ èòåìîâ, è ìåðòâûõ ÷àðîâ).
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getVisibleChars()</b><br />
<b><font color="blue">table</font> l2c_getVisibleMobs()</b><br />
<b><font color="blue">table</font> l2c_getVisibleNpcs()</b><br />
<b><font color="blue">table</font> l2c_getVisibleItems()</b><br />
Ïîëó÷èòü èíôîðìàöèþ îá îêðóæàþùåì ìèðå: ÷àðû, íïö, ìîáû, ïðåäìåòû, ëåæàùèå íà çåìëå.</b>.<br />
Ôóíêöèÿ âîçâðàùàåò òàáëèöó, ïðîíóìåðîâàííóþ, íà÷èíàÿ ñ íîìåðà 1, êàæäûé ýëåìåíò êîòîðîé - objectID.<br />
Íàïðèìåð<br />
chars = l2c_getVisibleChars()<br />
nChars = #chars<br />
chars[1] == 23456765<br />
Äëÿ òîãî, ÷òîáû ïîëó÷èòü óæå áîëåå ïîäðîáíóþ èíôîðìàöèþ îá îáúåêòå, íàäî èñïîëüçîâàòü ôóíêöèþ <b>l2c_getObjectInfoByObjectId</b>.<br />
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getParty()</b><br />
Âîçâðàòèò ìàññèâ (òàáëèöó) â ñòèëå lua (íóìåðóþùèéñÿ ñ åäèíèöû), ñîäåðæàùèé èíôîðìàöèþ î ÷ëåíàõ ïàòè.<br />
Åñëè âû íå â ïàòè, â ìàññèâå áóäåò 0 ýëåìåíòîâ.<br />
Åñëè âû â ïàòè, òî êàæäûé ýëåìåíò ìàññèâà áóäåò ñòðóêòóðîé ñî ñëåäóþùèìè ïîëÿìè:<br />
<ul>
<li><b><font color="blue">int</font> objectID</b></li>
<li><b><font color="blue">int</font> targetObjectID</b> - ObjectID òàðãåòà ïàòè ìåìáåðà, èëè 0, åñëè òàðãåòà íåò</li>
<li><b><font color="blue">string</font> name</b></li>
<li><b><font color="blue">int</font> level</b></li>
<li><b><font color="blue">int</font> classID</b></li>
<li><b><font color="blue">double</font> curHp</b></li>
<li><b><font color="blue">double</font> maxHp</b></li>
<li><b><font color="blue">double</font> curMp</b></li>
<li><b><font color="blue">double</font> maxMp</b></li>
<li><b><font color="blue">double</font> curCp</b></li>
<li><b><font color="blue">double</font> maxCp</b></li>
</ul>
</blockquote></p>
<p><blockquote>
<b><font color="blue">table</font> l2c_getPartyMemberBuffs( <font color="blue">int</font> objectID )</b><br />
Âîçâðàòèò ìàññèâ (òàáëèöó) â ñòèëå lua (íóìåðóþùèéñÿ ñ åäèíèöû), ñîäåðæàùèé èíôîðìàöèþ î áàôàõ îäíîãî ÷ëåíà ïàòè.<br />
Êàæäûé ýëåìåíò ìàññèâà - ñòðóêòóðà (òàáëèöà) ñ ïîëÿìè, òàêèìè æå, êàê è âîçâðàùàåìûå ôóíêöèåé <b>l2c_getBuffs()</b>.<br />
Åñëè áàôôîâ íåò, ìàññèâ áóäåò ïóñò.<br />
Êàæäûé ýëåìåíò - ñòðóêòóðà ñ ïîëÿìè: <b>skillName, skillID, skillLvl, durationSecs</b><br />
Ñòðîêîâîå èìÿ ñêèëëà, ID ñêèëëà, åãî óðîâåíü, îñòàâøååñÿ âðåìÿ â ñåêóíäàõ.
</blockquote></p>
<p><blockquote><b>l2c_partySendInvite( <font color="blue">string</font> name, <font color="blue">int</font> loot )</b><br />
Îòñûëàåò óêàçàííîìó èãðîêó ñ èìåíåì <b>name</b> èíâàéò â ïàòè ñ ðàñïðåäåëåíèåì èòåìîâ, îáîçíà÷åííûì ÷èñëîì <b>loot</b>:<br />
<ul>
<li>0 - Finders Keepers</li>
<li>1 - Random</li>
<li>2 - Random including spoil</li>
<li>3 - By turn</li>
<li>4 - By turn including spoil</li>
</ul>
</blockquote></p>
<p><blockquote><b>l2c_partyLeave()</b><br />
Âûéòè èç ïàòè.
</blockquote></p>
<p><blockquote><b>l2c_partyKickMember( <font color="blue">string</font> name )</b><br />
Êèêíóòü èç ïàòè ìåìáåðà ñ íèêîì <b>name</b>.
</blockquote></p>
<p><blockquote><b>l2c_partyChangeLeader( <font color="blue">string</font> name )</b><br />
Ñìåíèòü ëèäåðà ïàòè íà ìåìáåðà ñ íèêîì <b>name</b>
</blockquote></p>
<!-- ============================================== -->
<h3>Undocumented:</h3>
<p><blockquote><b><font color="blue">table</font> l2ccfg_getAllConfig()</b><br />
</blockquote></p>
<p><blockquote><b><font color="blue">table</font> l2c_sendPacketHex( <font color="blue">string</font> hexChars )</b><br />
</blockquote></p>
</font>
</body>
</html>

View File

@@ -0,0 +1,33 @@
-- Демонстрация чат-хендлера
-- главная программа крутится в бесконечном цикле, рисуя точку раз в секунду,
-- как бы сигнализируя о том что основной цикл живой;
-- в это вреемя (по идее параллельно основному циклу),
-- при получении чат сообщения должна вызываться функция onChat_handler(),
-- имеющая доступ к глобальным переменным всей программы (тестируем на переменной num_calls)
-- реально на время вызова onChat основной поток ставится на паузу,
-- иначе возможны дикие проблемы синхронизации! вплоть до вылета с критом ООГ
-- по всем идеям хендлер onChat должен максимально БЫСТРО отработать
-- дабы не замедлять оснвной цикл АИ - типа что-то поменять в глобальных переменных
-- или другое, быстрое действие
num_calls = 0; -- сколько раз был вызван onChat_handler()
function onChat_handler( senderID, channelID, msg, from )
num_calls = num_calls + 1;
l2h_print( "onChat: OID [", senderID, "] ", channelID, ": [", msg, "] from [", from, "]\n" );
end
l2h_print( "onChat test started!\n" );
-- зарегаемся в ScriptEngine чтобы onChat_handler() вызывалась при каждом чат-сообщении
sys_register_onChat( "onChat_handler" );
while( true ) do
l2h_print( ".\n" );
if( sys_should_exit() ) then break end -- выход из бесконечного цикла когда нажали "стоп скрипт"
l2h_delay( 1000 );
end
l2h_print( "onChat was called ", num_calls, " times.\n" );
l2h_print( "onChat test end.\n" );

View File

@@ -0,0 +1,257 @@
-- File with most standard functions used in scripts
-- include it in your script:
-- dofile( "stdlib.lua" );
--
-- Ôàéë ñî ñòàíäàðòíûìè ôóíêöèÿìè äëÿ áîëüøèíñòâà ñêðèïòîâ
-- Ïîäêëþ÷àòü ýòè ôóíêöèè ê ñâîåìó ñêðèïòó òàê:
-- dofile( "stdlib.lua" );
-- âû÷èñëÿåò äèñòàíöèþ ïî dx, dy, dz: êîðåíü( dx*dx + dy*dy + dz*dz )
-- ïàðàìåòð dz ìîæåò áûòü ïðîïóùåí (íå çàäàí)
function calc_dist( dx, dy, dz )
if dz == nil then
return math.sqrt( dx*dx + dy*dy )
else
return math.sqrt( dx*dx + dy*dy + dz*dz )
end
end
function ensurestand()
local isSitting, isRunnig = l2c_getSitRun()
if isSitting then
l2c_sitStand();
l2h_delay( 1000 );
end
end
function ensuresit()
local isSitting, isRunnig = l2c_getSitRun()
if not isSitting then
l2c_sitStand();
l2h_delay( 1000 );
end
end
function ensurerun()
local isSitting, isRunnig = l2c_getSitRun()
if not isRunnig then
l2c_runWalk();
l2h_delay( 50 );
end
end
function ensurewalk()
local isSitting, isRunnig = l2c_getSitRun()
if isRunnig then
l2c_runWalk();
l2h_delay( 50 );
end
end
-- ôóíêöèÿ âåðíåò true, åñëè þçåð â ïàòè
function is_in_party()
local party = l2c_getParty();
local nMembers = #party;
if nMembers < 1 then return false end -- no party
return true
end
-- Ôóíêöèÿ ïûòàåòñÿ çàòàðãåòèòü objectID â òå÷åíèå timeoutSecs ñåêóíä
-- âåðíåò true, åñëè òàðãåò óäàëñÿ, èíà÷å false
function targetObject( objectID, timeoutSecs )
if timeoutSecs == nil then timeoutSecs = 2 end
local targetStartTime = l2h_time();
local targetObjectId = 0;
local timePassed = 0;
targetObjectId = l2c_getTarget();
if targetObjectId == objectID then return true end -- óæå íà òàðãåòå, íè÷î íå íàäî äåëàòü
l2c_action( objectID ); -- ïûòàåìñÿ çàòàðãåòèòü
l2h_delay( 100 );
repeat -- ïðîâåðÿåì â öèêëå, âçÿò ëè îáúåêò íà öåëü
targetObjectId = l2c_getTarget();
if sys_should_exit() then return end
local curTime = l2h_time(); -- çàîäíî ñìîòðèì ïî âðåìåíè
timePassed = curTime - targetStartTime;
l2h_delay( 100 );
if targetObjectId ~= objectID then l2c_action( objectID ); l2h_delay( 100 ); end
until (timePassed > timeoutSecs) or (targetObjectId == objectID) -- Ëèáî òàðãåò óäàëñÿ, ëèáî èñòåê òàéìàóò
if( targetObjectId ~= objectID ) then
return false
end
return true
end
-- äâèãàòüñÿ â êîîðäèíàòû (x,y,z), îæèäàÿ äñòèæåíèÿ öåëè â òå÷åíèå timeout ñåêóíä
-- * tolerance - òî÷íîñòü äîñòèæåíèÿ öåëåâûõ êîîðäèíàò, àáñ. âåëè÷èíà, ïèêñåëè
-- * randomness - ñëó÷àéíîå îòêëîíåíèå îò öåëåâûõ êîîðäèíàò, ïèêñåëè
-- âåðíåò true, åñëè öåëü äîñòèãíóòà óñïåøíî, èíà÷å false
function moveTo( x, y, z, timeout, tolerance, randomness )
if timeout == nil then timeout = 30 end
if tolerance == nil then tolerance = 50 end
if randomness == nil then randomness = 0 end
local start_time = l2h_time();
repeat
if sys_should_exit() then return false end -- stop script
local cx, cy, cz = l2c_getPos(); -- get cur pos
-- target pos reached?
if (math.abs(cx - x) <= tolerance) and (math.abs(cy - y) <= tolerance) and (math.abs(cz - z) <= tolerance) then
return true
end
-- target not reached, try to move there
-- random XY offset (not exact move)
local x_rand = math.random( (0-randomness), randomness );
local y_rand = math.random( (0-randomness), randomness );
l2c_moveTo( x + x_rand, y + y_rand, z );
--- timeout expired?
local cur_time = l2h_time();
if (cur_time - start_time) > timeout then
l2h_print( "MOVETO: (",x,",",y,",",z,") ERROR: move timeout!\n" );
return false
end
l2h_delay( 300 ); -- delay 300 ms
until false
return false
end
-- âûáèðàåò íà öåëü NPC ñ íèêîì npcName;
-- âåðíåò true åñëè óñïåøíî, èíà÷å false
function npcSel( npcName )
if sys_should_exit() then return end
local oid = l2c_getNpcObjectIdByName( npcName );
if oid == nil then return false end
local ret = targetObject( oid, 5 );
if ret == false then l2h_print( "NPCSEL: cannot target [", npcName, "]!\n" ); end
return ret
end
-- îòêðûâàåò äèàëîã ñ ÍÏÖ êîòîðûé â äàííûé ìîìåíò íà òàðãåòå;
-- Íà òàðãåòå äîëæåí áûòü èìåííî ÍÏÖ! Ïðè íåîáõîäèìîñòè ôóíêöèÿ ïðèáëèæàåòñÿ ê ÍÏÖ íà ðàññòîÿíèå 50
-- * timeoutSecs - òàéìàóò îæèäàíèÿ îòêðûòèÿ äèàëîãà ñ ÍÏÖ, ñåê
function npcDlg( timeoutSecs )
if sys_should_exit() then return end
if timeoutSecs == nil then timeoutSecs = 5 end
local toid = l2c_getTarget();
if toid == 0 then -- no target :(
l2h_print( "NPCDLG: ERROR: No targeted NPC?\n" );
return false
end
local info = l2c_getObjectInfoByObjectId( toid );
if info == nil then
l2h_print( "NPCDLG: cannot get info about objectID [", toid, "]! Target disappeared??\n" );
return false
end
if info.type ~= "npc" then
l2h_print( "NPCDLG: ERROR: target [", toid, "] is not npc!..\n" );
return false
end
moveTo( info.x, info.y, info.z, 20, 50, 20 );
l2c_npcDlgClear(); -- î÷èñòèì èíôîðìàöèþ î ïîñëåäíåì îòêðûòîì äèàëîãå ñ ÍÏÖ
l2c_action( toid ); -- "êëèêíåì" ïî ÍÏÖ
-- òåïåðü æäåì êîãäà îòêðîåòñÿ äèàëîã (NpcHtmlMessage)
local st_time = l2h_time(); -- çàïîìíèì âðåìÿ íà÷àëà îæèäàíèÿ
while true do
l2h_delay( 50 );
local ok = l2c_npcDlgExists(); -- ñóùåñòâóåò ëè äèàëîã?)
if ok then return true end -- äà, îê
local nowTime = l2h_time(); -- íåò, òîãäà ïðîâåðèì ñêîëüêî âðåìåíè ïðîøëî
if (nowTime - st_time) > timeoutSecs then
l2h_print( "NPCDLG: ERROR: timeout waiting for NpcHtmlMessage!\n" );
return false -- òàéìàóò èñòåê
end
end
end
-- âûáèðàåò ñòðî÷êó èç äèàëîãà ñ ÍÏÖ
-- * talk_delay_ms - ñêîëüêî ìèëëèñåê æäàòü ïîñëå "êëèêà" ïî ññûëêå
function npcDlgSel( str, talk_delay_ms )
if talk_delay_ms == nil then talk_delay_ms = 500 end
l2c_npcDlg( str );
l2h_delay( talk_delay_ms );
end
-- ôóíêöèÿ çàêî÷èò ðàáîòó êîãäà þçåð çàêîí÷èò êàñò òåêóùåãî ñêèëëà
-- íè÷åãî íå âîçâðàùàåò
function waitEndOfCast()
while l2c_isCastingNow() do l2h_delay( 50 ) end
end
-- èñïîëüçóåò ñêèëë è äåëàåò çàäåðæêó 100ìñ ëÿ óâåðåííîñòè ÷òî êàñò ñêèëëà íà÷àëñÿ
-- ÷èñòà äëÿ óäîáñòâà. âåëè÷èíà çàäåðæêè çàâèñèò îò ëàãîâ êàíàëà äî ñåðâåðà
-- íè÷åãî íå âîçâðàùàåò
function useSkill( skillID, delay_ms )
if delay_ms == nil then delay_ms = 100 end
l2c_useSkill( skillID, true );
l2h_delay( delay_ms )
end
-- âåðíåò true, åñëè áàô skillID ïðèñóòñâóåò â ìàññèâå have_buffs
function buffIsPresent( skillID, have_buffs )
if not have_buffs then return false end
local i
for i=1, #have_buffs do
if have_buffs[i].skillID == skillID then return true end
end
return false
end
-- ïðèáëèæàåòñÿ ê ÷àðó ñ íèêîì name êàê ìèíèìóì íà ðàññòîÿíèå distance
function follow( name, distance )
-- ïîëó÷èì objectID ÷àðà
local randomness = 60;
local objectID = l2c_getCharObjectIdByName( name );
-- à åñòü ëè òàêîé ÷àð âîîáùå?
if objectID == nil then
l2h_print( "FOLLOW: Character [", name, "] is not visible!\n" );
return
end
-- âû÷èñëèì ñëó÷àéíîå îòêëîíåíèå îò öåëè
if randomness >= distance then randomness = distance/2 end -- îòêëîíåíèå íèêàê íå ìîæåò áûòü áîëüøå ðàññòîÿíèÿ äî öåëè
local x_rand = math.random( (0-randomness), randomness )
local y_rand = math.random( (0-randomness), randomness )
local x, y, z -- íàøè êîîðäèíàòû áóäóò òóò
local gox, goy, goz -- äâèãàòüñÿ áóäåì òóäà
local c -- èíôî î ÷àðå (öåëè) áóäåò òóò
-- à íàäî ëè íàì ñëåäîâàòü âîîáùå?
x,y,z = l2c_getPos(); -- ïîëó÷èì íàøè êîîðäèíàòû
c = l2c_getObjectInfoByObjectId( objectID ); -- èíôî î öåëè "ïðåñëåäîâàíèÿ"
if c == nil then
l2h_print( "FOLLOW: char [", name, "] suddenly disappeared!\n" );
return false
end
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox = c.xDst;
goy = c.yDst;
if c.zDst ~= 0x7FFFFFFF then goz = c.zDst else goz = c.z end
else
gox = c.x;
goy = c.y;
goz = c.z;
end
if (math.abs(gox - x) > distance) or (math.abs(goy - y) > distance) then
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
else
return -- äà ìû è òàê íåäàëåêî îò öåëè
end
-- öèêë ñëåäîâàíèÿ
repeat
if sys_should_exit() then return end -- þçåð íàæàë "Ñòîï ñêðèïò"
-- ïîëó÷èì èíôî î ÷àðå
c = l2c_getObjectInfoByObjectId( objectID )
--l2h_print( "Following [", name, "] to (", c.x, ",", c.y, ",", c.z, ")\n" )
if (c.xDst ~= 0x7FFFFFFF) and (c.yDst ~= 0x7FFFFFFF) then
gox = c.xDst;
goy = c.yDst;
if c.zDst ~= 0x7FFFFFFF then goz = c.zDst else goz = c.z end
else
gox = c.x;
goy = c.y;
goz = c.z;
end
l2c_moveTo( gox + x_rand, goy + y_rand, goz ) -- äâèíåìñÿ ê íåìó
l2h_delay( 300 ); -- ïîäîæäåì 300 ms
x,y,z = l2c_getPos(); -- ïîëó÷èì ñíîâà íàøè êîîðäèíàòû
-- ïðîâåðèì ðàçíèöó íàøèõ êîîðäèíàò è êîîðäèíàò ÷àðà.
-- åñëè ðàçíèöà áîëüøå äèñòàíöèè ñëåäîâàíèÿ, öèêë ñëåäîâàíèÿ ïîâòîðèòñÿ
until ((math.abs(gox - x) < distance) and (math.abs(goy - y) < distance) and (math.abs(goz - z) < distance))
end

Binary file not shown.