Olá xtibianos,
Faz muito, muito tempo que eu não mexo com programação de scripts, porém, nessa semana bateu uma saudade, e tentei fazer algo de diferente pra passar o tempo, e acabei me empolgando, e fiz um sistema de auras, que é como uma bolha de luz que te rodeia (no meu caso é uma bolha de cura, porém você pode colocar o efeito de distância que quiser), e te cura continuamente enviando clones do efeito, ela só envia bolhas de cura se seu hp não estiver cheio. Você pode conferir como funciona, superficialmente, assistindo o vídeo a seguir :
Para ativar a aura basta escrever "!aura on", e para desligar "!aura off".
Bom, vamos aos códigos.
na pasta data\talkactions\scripts, crie um arquivo chamado aura.lua, e cole o seguinte código nele : (é necessário dois storages disponíveis distintos)
-- CONFIGURAÇÕES
aurastr = 25950 -- storage da aura
estr = 25951 -- storage para o exhaust
porcentagem = 40 -- chance de curar em cada volta da aura, em porcentagem
quantheal = 10 -- porcentagem do hp máximo que cada cura irá curar. (No caso, irá curar 10% do hp máximo cada cura)
tempo = 1180 -- tempo para dar uma volta no player (este tempo foi o que achei mais agradável visualmente, é recomendável não mudar)
tipoaura = 30 -- número do efeito da aura (efeito de distância, pode ser identificado com /x no jogo)
efeitocura = 49 -- número do efeito quando a cura chega ao player (efeito de posição fixa, pode ser identificado com /z no jogo)
-- Função que chama a aura
function efeitosAura(i,tm,cid)
if(isCreature(cid)) then
local atual = getCreaturePosition(cid)
local posaura = {
{x=(atual.x)-1, y=(atual.y)-1, z=atual.z},
{x=atual.x, y=(atual.y)-1, z=atual.z},
{x=(atual.x)+1, y=(atual.y)-1, z=atual.z},
{x=(atual.x)+1, y=atual.y, z=atual.z},
{x=(atual.x)+1, y=(atual.y)+1, z=atual.z},
{x=atual.x, y=(atual.y)+1, z=atual.z},
{x=(atual.x)-1, y=(atual.y)+1, z=atual.z},
{x=(atual.x)-1, y=atual.y, z=atual.z},
}
local chances = math.random(100)
if(chances<=porcentagem/8 and getCreatureHealth(cid)<getCreatureMaxHealth(cid)) then
doCreatureAddHealth(cid, getCreatureMaxHealth(cid)/quantheal)
if(i<=8 and i>1) then
doSendDistanceShoot({x=posaura[i].x, y=posaura[i].y, z=posaura[i].z}, atual, tipoaura)
else
doSendDistanceShoot({x=posaura[1].x, y=posaura[1].y, z=posaura[1].z}, atual, tipoaura)
end
doSendMagicEffect(atual, efeitocura)
end
if(i==8) then
doSendDistanceShoot({x=posaura[i].x, y=posaura[i].y, z=posaura[i].z}, {x=posaura[1].x, y=posaura[1].y, z=posaura[1].z}, tipoaura)
elseif(i<8) then
doSendDistanceShoot({x=posaura[i].x, y=posaura[i].y, z=posaura[i].z}, {x=posaura[i+1].x, y=posaura[i+1].y, z=posaura[i+1].z}, tipoaura)
end
if(i<=8 and getPlayerStorageValue(cid, aurastr)==2) then
i = i+1
tm = tempo/8
return addEvent(efeitosAura,tm,i,tm,cid)
elseif(i>8 and getPlayerStorageValue(cid, aurastr)==2) then
return efeitosAura(1,0,cid)
else
return TRUE
end
else
return TRUE
end
end
-- Função principal
function onSay(cid, words, param, channel)
if(param=="on") then
if getPlayerStorageValue(cid, estr) > os.time() then
doPlayerSendCancel(cid, "Espere "..(getPlayerStorageValue(cid, estr) - os.time()).." segundos para poder habilitar aura novamente.")
else
if(getPlayerStorageValue(cid, aurastr)==2) then
doPlayerSendCancel(cid,"Sua aura já está habilitada.")
elseif(getPlayerStorageValue(cid, aurastr)==-1) then
doPlayerSendCancel(cid,"Aura ligada!")
setPlayerStorageValue(cid, aurastr, 2)
efeitosAura(1,tempo/8,cid)
end
end
elseif(param=="off") then
if(getPlayerStorageValue(cid, aurastr)==2) then
setPlayerStorageValue(cid, estr, os.time()+2)
setPlayerStorageValue(cid, aurastr, -1)
doPlayerSendCancel(cid,"Aura desligada!")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Digite '!aura on' para ligar sua aura, e '!aura off' para desligá-la.")
end
return TRUE
end
Logo após vá na em talkactions.xml, e cole o seguinte trecho :
<talkaction words="!aura" event="script" value="aura.lua"/>
E também, dentro do arquivo login.lua, localizado na pasta creatureevents\scripts, logo abaixo de "function onLogin(cid)", cole o seguinte trecho :
aurastr = 25950 -- storage da aura
setPlayerStorageValue(cid, aurastr, -1)
As configurações estão comentadas, então agora é só colocar suas preferências, aproveitar e usar.
Lembrando que você pode mudar os efeitos da aura, o tempo de cada volta da aura(que é recomendável não mexer, se deixar o efeito padrão do script, que no caso é o efeito de luz), a quantidade de hp que o jogador irá restaurar e a porcentagem de chance que o jogador tem de recuperar hp em cada volta (pode recuperar hp mais de uma vez em uma mesma volta da aura).
Fica ao seu dispor se deseja colocar se apenas vips usam a aura no script ou não, eu não incrementei pois estou meio sem tempo, mas não é algo difícil de se fazer.
Obrigado, e bom proveito!
OBS : Tomem bastante cuidado ao dar reload no talkactions no server enquanto há auras em ação, elas serão desativadas, e todos os players terão que desligá-las, e ligá-las novamente. (!aura off, e em seguida !aura on)