Hola a todos. Este tema es para todos aquellos que quieran aprender como hacer o mejorar un Script de un Healer nivel 85+ escrito en LUA para L2Tower.
Lo primero que vamos a entender es como organizar un Script:
Definimos: variables globales
Definimos funciones(): Incluyen variables locales, toman datos de variables globales, ejecutan condiciones de codigo, devuelven resultados que pueden ser: true | false o una respuesta por ejemplo, un resultado matematico
por ultimo:
usamos el concepto: repetir, hasta que sea falso, nuestras funciones y codigo.
quedaria algo asi:
Ok, comencemos:
--------------
Es comun en todos los Script, informarnos a nosotros mismos que lo hemos ejecutado. Entonces lo primero que vamos a hacer es enviarle la orden del que el cliente nos muestre algo de texto
LUA Programming
ShowToClient("GOD", "HEALER ACTIVE", 3); -- Esto se muestra en mi cliente, de color verde. Sin el [,3] aparece en Rojo igual que un PM
Ahora, utilziando recstart y recstop obtenemos los ids de algunos de los skiils que vamos a utilizar.
Para nuestro ejemplo: Vamos a curar, usar salvation, resucitar, hacer rebirth o Cristalizarnos. A este punto podemos tener nuestro primer script, el cual no hace nada mas que mostrar un mensaje y definir variables globales:
Healer85 v0.1
LUA Programming
ShowToClient("GOD", "HEALER ACTIVE", 3);
--ID's-Healer-----------------------------------------
--Heal------------------------------------------------
RebirthID = 11768; -- Rebirth = 11768
BalanceHealID = 11762; --Balance Heal ID
BrilliantHealID = 11757; --Brilliant Heal ID
--Self Buff-------------------------------------------
SalvationID = 11826; -- Aeore Emblem of Salvation = 11826
--Ultimate--------------------------------------------
CrystalRegenerationID = 11765; -- Crystal Regeneration
--Ress------------------------------------------------
ResSkillAeoreID = 11784; -- Aeore Blessed Resurrection = 11784;
repeat
until false;
Ahora vamos a hacer que nuestro Healer haga algo. Por ejemplo que revise si tiene en si mismo: salvation
Esto lo voy a hacer a traves de una funcion escrita que voy a llamar CheckBuffOnME() y otra llamada CastOnTarget()
LUA Programming
-- CheckBuffOnME(id) [OK] | Verifico si YO tengo o necesito uno de mis buff
-- requiere: CastOnTarget()
------------------------------------------------------
function CheckBuffOnME(id)
local me = GetMe(); -- No Global [defino la variable me = yo en forma local]
if (me ~= nil) and not (me:IsAlikeDeath()) then -- [si "me" no es NULO o No estoy muerto]
if (me:GotBuff(id) == false) then -- [Si "NO" tengo X Buff]
CastOnTarget(id,me); -- Castearme el Buff
end;
end;
end;
------------------------------------------------------
--CastOnTarget() [OK]| Autocast de skills
function CastOnTarget(id,target)
if id then
local MySkills = GetSkills():FindById(id)
if MySkills and (MySkills:CanBeUsed()) then
Target(target)
UseSkillRaw(id,false,false)
Sleep(500)
ClearTarget();
CancelTarget(false);
CancelTarget(false);
CancelTarget(false);
return true
end;
end;
return false
end;
------------------------------------------------------
Ahora, voy a unir las variables que defini y las funciones a un script estructurado y funcional
v.0.2 | Healer + Salvation
LUA Programming
-- L2TOWER: LUA - MainHealer() v0.2 | Script Healer Paso a Paso
----------------------------------------------------------
ShowToClient("GOD", "HEALER ACTIVE", 3); -- Esto se muestra en mi cliente, de color verde. Sin el [,3] aparece en Rojo igual que un PM
--ID's-Healer-----------------------------------------
--Heal------------------------------------------------
RebirthID = 11768; -- Rebirth = 11768
BalanceHealID = 11762; --Balance Heal ID
BrilliantHealID = 11757; --Brilliant Heal ID
--Self Buff-------------------------------------------
SalvationID = 11826; -- Aeore Emblem of Salvation = 11826
--Ultimate--------------------------------------------
CrystalRegenerationID = 11765; -- Crystal Regeneration
--Ress------------------------------------------------
ResSkillAeoreID = 11784; -- Aeore Blessed Resurrection = 11784;
--Funciones-Comunes-----------------------------------
--CastOnTarget() [OK]| Autocast de skills
function CastOnTarget(id,target)
if id then
local MySkills = GetSkills():FindById(id)
if MySkills and (MySkills:CanBeUsed()) then
Target(target)
UseSkillRaw(id,false,false)
Sleep(500)
ClearTarget();
CancelTarget(false);
CancelTarget(false);
CancelTarget(false);
return true
end;
end;
return false
end;
------------------------------------------------------
-- CheckBuffOnME(id) [OK] | Verifico si YO tengo o necesito uno de mis buff
-- requiere: CastOnTarget()
------------------------------------------------------
function CheckBuffOnME(id)
local me = GetMe(); -- No Global
if (me ~= nil) and not (me:IsAlikeDeath()) then
if (me:GotBuff(id) == false) then
CastOnTarget(id,me);
end;
end;
end;
------------------------------------------------------
------------------------------------------------------
--HEALER----------------------------------------------
function MainHealer()
local me = GetMe(); -- No Global
CheckBuffOnME(SalvationID); -- Salvation ID Skill
Sleep(300)
end;
--End-Healer------------------------------------------
repeat
if not IsPaused() then
--Check Clase: | AeoreCardinal" = 179 | AeoreEvasSaint" = 180 | AeoreShillienSaint" = 181
if (GetMe():GetClass() == 179) or (GetMe():GetClass() == 180) or (GetMe():GetClass() == 181) then
if not (GetMe():IsBlocked(true)) then
MainHealer();
end;
end;
end; --not paused
until false;
Ahora que ya nuestro healer se puede dar salvation, cada que este disponible, vamos a Agregarle la posibilidad de resucitar a cualquier miembro de nuestra party que este muerto.
La funcion es la siguiente:
LUA Programming
------------------------------------------------------
-- RessParty | [OK]
------------------------------------------------------
function RessParty()
local party2resslist = GetPartyList(); -- No Global
for member2ress in party2resslist.list do -- partylist: Ress para party - playerlist: ress para cualquiera cerca
if member2ress:IsAlikeDeath() then
CastOnTarget(ResSkillAeoreID, member2ress);
Sleep (300)
end;
end;
end;
------------------------------------------------------
v0.3 | Healer + Salvation + Ress Party
LUA Programming
-- L2TOWER: LUA - MainHealer() | Script Healer Paso a Paso
----------------------------------------------------------
ShowToClient("GOD", "HEALER ACTIVE", 3); -- Esto se muestra en mi cliente, de color verde. Sin el [,3] aparece en Rojo igual que un PM
--ID's-Healer-----------------------------------------
--Heal------------------------------------------------
RebirthID = 11768; -- Rebirth = 11768
BalanceHealID = 11762; --Balance Heal ID
BrilliantHealID = 11757; --Brilliant Heal ID
--Self Buff-------------------------------------------
SalvationID = 11826; -- Aeore Emblem of Salvation = 11826
--Ultimate--------------------------------------------
CrystalRegenerationID = 11765; -- Crystal Regeneration
--Ress------------------------------------------------
ResSkillAeoreID = 11784; -- Aeore Blessed Resurrection = 11784;
--Funciones-Comunes-----------------------------------
--CastOnTarget() [OK]| Autocast de skills
function CastOnTarget(id,target)
if id then
local MySkills = GetSkills():FindById(id)
if MySkills and (MySkills:CanBeUsed()) then
Target(target)
UseSkillRaw(id,false,false)
Sleep(500)
ClearTarget();
CancelTarget(false);
CancelTarget(false);
CancelTarget(false);
return true
end;
end;
return false
end;
------------------------------------------------------
-- CheckBuffOnME(id) [OK] | Verifico si YO tengo o necesito uno de mis buff
-- requiere: CastOnTarget()
------------------------------------------------------
function CheckBuffOnME(id)
local me = GetMe(); -- No Global
if (me ~= nil) and not (me:IsAlikeDeath()) then
if (me:GotBuff(id) == false) then
CastOnTarget(id,me);
end;
end;
end;
------------------------------------------------------
------------------------------------------------------
-- RessParty | [OK]
------------------------------------------------------
function RessParty()
local party2resslist = GetPartyList(); -- No Global
for member2ress in party2resslist.list do -- partylist: Ress para party - playerlist: ress para cualquiera cerca
if member2ress:IsAlikeDeath() then
CastOnTarget(ResSkillAeoreID, member2ress);
Sleep (300)
end;
end;
end;
------------------------------------------------------
------------------------------------------------------
--HEALER----------------------------------------------
function MainHealer()
local me = GetMe(); -- No Global
CheckBuffOnME(SalvationID); -- Salvation ID Skill
Sleep(300)
RessParty(); -- Ress Any dead
Sleep(300)
end;
--End-Healer------------------------------------------
repeat
if not IsPaused() then
--Check Clase: | AeoreCardinal" = 179 | AeoreEvasSaint" = 180 | AeoreShillienSaint" = 181
if (GetMe():GetClass() == 179) or (GetMe():GetClass() == 180) or (GetMe():GetClass() == 181) then
if not (GetMe():IsBlocked(true)) then
MainHealer();
end;
end;
end; --not paused
until false;
Por Ultimo, ahora vamos a darle a nuestro healer, la posibilidad de curarse a si mismo, a los miembros de la party, tanto si baja el CP o el HP y por ultimo de ser necesario, cristalizarce
Para esto, cree una funcion llamada NeedSurvive()
Notas: En party funciona, resucita, helea, etc, ingrese algunos cambios para que tambien responda estando sin party y al menos lo que probe funciona, pero veran que lleva tiempo generar todas las situaciones para verificar si una parte del codigo funciona o no, lo cual se los dejo a ustedes X)
v.0.4 | Healer + Salvation + Ress party + control de CP/HP por porcentaje y Cristalizacion
LUA Programming
-- L2TOWER: LUA - MainHealer() | Script Healer Paso a Paso
----------------------------------------------------------
ShowToClient("GOD", "HEALER ACTIVE", 3); -- Esto se muestra en mi cliente, de color verde. Sin el [,3] aparece en Rojo igual que un PM
--ID's-Healer-----------------------------------------
--Heal------------------------------------------------
RebirthID = 11768; -- Rebirth = 11768
BalanceHealID = 11762; --Balance Heal ID
BrilliantHealID = 11757; --Brilliant Heal ID
--Self Buff-------------------------------------------
SalvationID = 11826; -- Aeore Emblem of Salvation = 11826
--Ultimate--------------------------------------------
CrystalRegenerationID = 11765; -- Crystal Regeneration
--Ress------------------------------------------------
ResSkillAeoreID = 11784; -- Aeore Blessed Resurrection = 11784;
--Funciones-Comunes-----------------------------------
--CastOnTarget() [OK]| Autocast de skills
function CastOnTarget(id,target)
if id then
local MySkills = GetSkills():FindById(id)
if MySkills and (MySkills:CanBeUsed()) then
Target(target)
UseSkillRaw(id,false,false)
Sleep(500)
ClearTarget();
CancelTarget(false);
CancelTarget(false);
CancelTarget(false);
return true
end;
end;
return false
end;
------------------------------------------------------
-- CheckBuffOnME(id) [OK] | Verifico si YO tengo o necesito uno de mis buff
-- requiere: CastOnTarget()
------------------------------------------------------
function CheckBuffOnME(id)
local me = GetMe(); -- No Global
if (me ~= nil) and not (me:IsAlikeDeath()) then
if (me:GotBuff(id) == false) then
CastOnTarget(id,me);
end;
end;
end;
------------------------------------------------------
------------------------------------------------------
-- RessParty | [OK]
------------------------------------------------------
function RessParty()
local party2resslist = GetPartyList(); -- No Global
for member2ress in party2resslist.list do -- partylist: Ress para party - playerlist: ress para cualquiera cerca
if member2ress:IsAlikeDeath() then
CastOnTarget(ResSkillAeoreID, member2ress);
Sleep (300)
end;
end;
end;
------------------------------------------------------
--Survive-Functions-----------------------------------
function NeedSurvive()
local partylist = GetPartyList(); -- No Global
local me = GetMe(); -- No Global
-- me
-- MP/HP
if (me:GetHpPercent() < 20) or (me:GetMpPercent() < 40) then -- Recharge HP/MP Rebirth
CastOnTarget(RebirthID,me);
elseif (me:GetHpPercent() < 20) then
CastOnTarget(CrystalRegenerationID,me);
Sleep (300)
-- CP/HP
elseif (me:GetCpPercent() < 75) or (me:GetHpPercent() < 75) then
CastOnTarget(BalanceHealID,me);
Sleep (300)
CastOnTarget(BrilliantHealID,me);
Sleep (300)
end;
-- Party/me
for member in partylist.list do
-- MP/HP
if (member:GetHpPercent() < 20) or (member:GetMpPercent() < 20) then -- Recharge HP/MP Rebirth
CastOnTarget(RebirthID,member);
elseif (me:GetHpPercent() < 40) then
CastOnTarget(CrystalRegenerationID,member);
Sleep (300)
-- CP/HP
elseif (member:GetCpPercent() < 75) or (member:GetHpPercent() < 75) then
CastOnTarget(BalanceHealID,member);
Sleep (300)
CastOnTarget(BrilliantHealID,member);
Sleep (300)
return true;
else
return false;
end;
end;
end;
------------------------------------------------------
--HEALER----------------------------------------------
function MainHealer()
local me = GetMe(); -- No Global
if not NeedSurvive() then
CheckBuffOnME(SalvationID); -- Salvation ID Skill
Sleep(300)
RessParty(); -- Ress Any dead
Sleep(300)
end;
end;
--End-Healer------------------------------------------
repeat
if not IsPaused() then
--Check Clase: | AeoreCardinal" = 179 | AeoreEvasSaint" = 180 | AeoreShillienSaint" = 181
if (GetMe():GetClass() == 179) or (GetMe():GetClass() == 180) or (GetMe():GetClass() == 181) then
if not (GetMe():IsBlocked(true)) then
MainHealer();
Sleep(1000)
end;
end;
end; --not paused
until false;