NPC Sistema de Clima
Créditos: Nahruto (OTFans) & Colandus - OpenLua
Se já tiver aqui me descupem eu procurei e não achei!
Este é um npc criado pelo Nahruto, pelo o que eu entendi o NPC funciona assim:
É um NPC que durante um certo intervalo de tempo que nós programamos no script e a chance de efeitos ele envia uma tempestade para o server
Então agora vamos aos scripts.
Versão 1.0
vá em data/npc/scripts e crie um arquivo chamado de stormer.lua e coloque isto dentro:
local check_interval = 60*10local mindamage = 30
local maxdamage = 100
---------------------------------End Configuration----------------------------------
local check_clock = os.clock()
local focus = 0
function getplayersfromArea(areapos)
local players = { }
for areax = 990, 1010 do
for areay = 990, 1007 do
areapos = {x=areax, y=areay, z=7, stackpos=253}
creature = getThingfromPos(areapos)
if creature.itemid > 0 then
if isPlayer(creature.uid) == TRUE then
table.insert (players, creature.uid)
end
end
end
end
return players
end
function onThink()
local chance = math.random(1,10)
if (os.clock() - check_clock) > check_interval and chance >=5 then
players_table = getplayersfromArea(areapos)
if #players_table >= 1 then
for i = 1, #players_table do
doNpcSetCreatureFocus(players_table)
formdamage = math.random(mindamage, maxdamage)
doCreatureAddHealth(players_table,-formdamage)
stormefects = math.random(40, 43)
doSendMagicEffect(getThingPos(players_table),stormefects)
doSendAnimatedText(getThingPos(players_table),formdamage,179)
doPlayerSendTextMessage(players_table,22,'You were beaten by a storm.')
check_clock = os.clock()
focus = 0
end
elseif table.getn(players_table) < 1 then
focus = 0
check_clock = os.clock()
end
end
focus = 0
end
Explicando
em vermelho é intervalo entre as tempestades.(60*10 = 10 minutos)
em azul é o menor dano causado pela tempestade
em rosa é o maior dano causado pela tempestade
Agóra vá na pasta data/npc e crie um arquivo chamado Stormer.xml e cole isto dentro:
<?xml version="1.0"?><npc name="Stormer" script="data/npc/scripts/stormer.lua" access="5" lookdir="2" autowalk="25">
<mana now="800" max="800"/>
<health now="200" max="200"/>
<look type="275" />
</npc>
Lembrete:
1 - você deve coloca o npc aonde os player não o vejam, afinal onde já se viu tempestade por npc?
2 - Ele está configurado para o templo do mapa Evolutions, para mudar para o seu server mude isto:
for areax = 990, 1010 dofor areay = 990, 1007 do
areapos = {x=areax, y=areay, z=7, stackpos=253}
Pronto a versão 1.0 está pronta agora vamos a versão 2.0.
Versão 2.0
* É uma versão avançada da anterior
* Nesta versão o npc tem uma visão de raio* Tem mais configurações* Mais fácil de se configurar
* Adicionado um pouco de brilho para tornar o golpe, de cor configurável.
* Ele acrescentou efeitos, e deixar a possibilidade de que o usuário facilmente adicionar efeitos.
Então agora vamos começar.
1 - adicione isto no global.lua
-- Area iterator by Colandus @ OpenLua.comfunction mapArea(fromPos, toPos)
local x, y, z = fromPos.x, fromPos.y, fromPos.z
return function()
if (y < toPos.y) then
y = y+1
elseif (x < toPos.x) then
y = fromPos.y
x = x+1
else
x = fromPos.x
y = fromPos.y
z = z+1
end
if (x < toPos.x and y <= toPos.y or z < toPos.z) then
return x, y, z
end
end
end
-- Function by Colandus @ OpenLua.comfunction getThingsfromArea(pos, radius, stackpos)
local things, thing = {}
local fromPos = {x=pos.x-radius, y=pos.y-radius, z=pos.z}
local toPos = {x=pos.x+radius, y=pos.y+radius, z=pos.z}
for x, y, z in mapArea(fromPos, toPos) do
if (getThingfromPos({x=x, y=y, z=z, stackpos=0}).itemid > 0) then
thing = getThingfromPos({x=x, y=y, z=z, stackpos=stackpos}).uid
if (isPlayer(thing) == 1) then
table.insert(things, thing)
end
end
end
return things
end
2 - Vá em data/npc/scripts e crie um arquivo chamado de climate.lua e cole isto dentro:
-- Script by Nahruto and Colandus --
-- Config --
local storm = {
interval = 60*10,
radius = 25,
damage = {min=30, max=100, color=179},
light = {color=210, duration=2},
message = "You were beaten by a storm.",
effects = {40, 41, 42, 43, 53}
}
-- Config --
local check_clock = os.clock()
function onThink()
local damage = 0
if (os.clock() - check_clock) > storm.interval then
screenPlayers = getThingsfromArea(getCreaturePosition(getNpcCid()), storm.radius, 253)
for _, player in pairs(screenPlayers) do
doNpcSetCreatureFocus(player)
damage = math.random(storm.damage.min, storm.damage.max)
doCreatureAddHealth(player, -damage)
doSetCreatureLight(player, 7, storm.light.color, storm.light.duration*1000)
doSendMagicEffect(getThingPos(player), storm.effects[math.random(1, #storm.effects)])
doSendAnimatedText(getThingPos(player), damage, storm.damage.color)
doPlayerSendTextMessage(player, 22, storm.message)
end
check_clock = os.clock()
end
end
Explicando
em vermelho é intervalo entre as tempestades.(60*10 = 10 minutos)
em rosa é os raios que o npc pega ( acho que são os SQM )
em laranja são os danos que a trovoada vai provocar e a cor do efeito do dano
em roxo é a cor e o tamanho do flash
em rosa claro é a mensagem que será enviada quando der o for atingido pela tempestade não intendi direito isso
em azul escuro os efeitos usados na tempestade
3 - agora vá em data/npc e crie um arquivo com nome de climate.xml e coloque isto dentro:
<?xml version="1.0"?><npc name="Climate" script="data/npc/scripts/climate.lua" access="5" lookdir="2" autowalk="25">
<mana now="800" max="800"/>
<health now="200" max="200"/>
<look type="275" />
</npc>
4 - Coloque o npc em seu mapa .
Lembrete:
-- Se o raio do npc está perto de uma zona sem um mapa, muitos erros no console, certifique-se de colocar o rádio, mesmo que a área tem mapa completo.
E aqui acaba meu primeiro tutorial
Espero que gostem
A versão 1.0 eu testei mais e 2.0 não
Tchau e até mais.