Ir para conteúdo
Entre para seguir isso  
Pivizz

Sistema de incêndio

Recommended Posts

Pivizz    1
Pivizz

POR FAVOR, NÃO COMENTE FRASES COMO 'OBRIGADO', 'VALEU' OU ALGO DO TIPO. APENAS POSTE SUAS DÚVIDAS E SUAS MENSAGENS DE ERRO.

OBRIGADO

 

 

Sistema de Incêndio desenvolvido por Pivigu - Pivigu World OTServ, em breve!

 

Nome: Sistema de Incêndio

Versão: 8.4x

Tipo do script: Creature script, Global Script, Monster

Servidor Testado: The Forgotten Server 0.3 b3

Autor: Pivigu (Eu)

 

Descrição

 

Quando o incêndio é iniciado, monstros como Fire Devils e Fire Elementals são sumonados de tempos em tempos. Após a quarta invocação, um boss é sumonado. Esse boss é o The Incendier. Em seguida, a floresta toda começa a pegar fogo, ou seja, são criados itens como Fire Fields e paredes de fogo nas árvores.

Durante o incêndio são mandadas mensagens como se fosse uma invasão.

Quando o boss The Incendier é morto, há um random de 5 a 15 segundos para que todo o fogo da invasão se apague.

 

Os monstros e os itens são configuráveis, assim como o tempo da invasão.

 

 

Scripts

[spoiler=incendio.lua]

incendio.lua

-- Incêndio script by Pivigu - Pivigu World OTServ, em breve!

function onThink(interval, lastExecution)

-- Configuração
 local fromArea = {x = 58, y = 56, z = 7} -- Área que o incêndio vai acontecer.
 local toArea = {x = 88, y = 82, z = 7} -- Área que o incêndio vai acontecer.
 local chanceRaid = 30 -- Chance do incêndio acontecer, em porcentagem.
 local intervaloExe = 60*24*7 -- Intervalo de execução, em minutos. No exemplo, ela só poderá ocorrer 7 dias após a última execucao.

 -- Monstros
   local bossName = "The Incendier" -- Nome do Boss a ser sumonado.
   local monsterMinions = {"Fire Elemental", "Fire Devil"} -- Monstros que também serão sumonados.
   local monsterAmount = 28 -- Quantidade de monstros a serem sumonados (Múltiplos de 4, de preferência).
   local florestaName = "Pens" -- Nome da floresta ou da cidade onde a floresta se localiza.

 -- M = Mensagem, T = Tempo em segundos
   local BroadCast1M = ("A temperatura está muito quente na floresta de " .. florestaName .. ".")
   local BroadCast1T = 1
   local BroadCast2M = ("Um incêndio está começando em " .. florestaName .. "!")
   local BroadCast2T = 3
   local BroadCast3M = ("Parece que um monstro muito quente está botando fogo em tudo o que vê!")
   local BroadCast3T = 6
   local BroadCast4M = (bossName .. " foi visto em " .. florestaName .. ". Não se aproxime da floresta. Tudo está pegando fogo!")
   local BroadCast4T = 9

 -- Incêndio
   local idArvoresG = {2700, 2708, 2701, 2702, 2707} -- ID de árvores grandes para FireWall.
   local idArvoresP = {2767, 2703, 2768} -- ID de árvores pequenas para FireField. (2703 considerada pequena)
   local FFID = {1487,1488,1489} -- ID dos Fire Fields.
   local FWID = {5063} -- ID dos FireWalls.

   local fogoNoChao = TRUE -- Adicionar fogo no chão? TRUE = Verdadeiro, FALSE = Falso
   local terraID = {103} -- ID dos chãos a pegar fogo

   for iid = 4526, 4541 do -- Adicionando as gramas ao terraID
     terraID[table.maxn(terraID) + 1] = iid
   end

   local chanceFogo = 65 -- Chance de pegar fogo.
-- Fim de Configuracao

-- Verificar Erros
 if math.random(1, 100) > chanceRaid then
   return TRUE
 end

 if os.time(t) - getGlobalStorageValue(5001) < intervaloExe*60 then
--    debugPrint("doIncendio: Execução cancelada pelo intervalo de execuções.")
   return TRUE
 end

 if toArea.x <= fromArea.x or toArea.y <= fromArea.y or toArea.z < fromArea.z then
   debugPrint("doIncendio: Erro na Area.")
   return FALSE
 end

 if BroadCast4T <= BroadCast3T or BroadCast3T <= BroadCast2T or BroadCast2T <= BroadCast1T then
   debugPrint("doIncendio: Erro no tempo dos Broadcasts.")
   return FALSE
 end

 if chanceFogo < 1 then
   chanceFogo = 0
 end

 local summonArea = 0
 local allArea = {}
 local getChao = 0
 local getItem = 0

 for xx = fromArea.x, toArea.x do
   for yy = fromArea.y, toArea.y do
     for zz = fromArea.z, toArea.z do

       getChao = getThingFromPos({x = xx, y = yy, z = zz, stackpos = STACKPOS_GROUND})
       getItem = getThingFromPos({x = xx, y = yy, z = zz, stackpos = 1})
       for ch = 1, table.maxn(terraID) do
         if terraID[ch] == getChao.itemid and (getItem.itemid == 0 or getItem.itemid == 6216 or getItem.itemid == 6217 or getItem.itemid == 6218 or getItem.itemid == 6219) then
           allArea[table.maxn(allArea) + 1] = {x = xx, y = yy, z = zz}
         end
       end

     end
   end
 end


-- Fim de verificar erros

-- Adicionando eventos
 addEvent(BroadCast, BroadCast1T*1000, BroadCast1M, monsterAmount, monsterMinions, allArea)
 addEvent(BroadCast, BroadCast2T*1000, BroadCast2M, monsterAmount, monsterMinions, allArea)
 addEvent(BroadCast, BroadCast3T*1000, BroadCast3M, monsterAmount, monsterMinions, allArea)
 addEvent(BroadCastBoss, BroadCast4T*1000, BroadCast4M, monsterAmount, monsterMinions, bossName, allArea)

 addEvent(doIncendio, BroadCast4T*1002, fromArea, toArea, idArvoresG, idArvoresP, fogoNoChao, chanceFogo, FFID, FWID, terraID)
-- Fim de Adicionando eventos
 debugPrint("doIncendio: Incendio iniciado.")

 setGlobalStorageValue(5001, lastExecution)
 return TRUE
end




function BroadCast(BroadCastM, Amount, Monsters, allArea)
 doBroadcastMessage(BroadCastM,22)
 local summonPos = {x = 0, y = 0, z = 0}
 local monsterName = 0

 for i = 1, Amount / 4 do
   monsterName = Monsters[math.random(1, table.maxn(Monsters))]
   summonPos = allArea[math.random(1, table.maxn(allArea))]
     doSummonCreature(monsterName, summonPos)
 end

return TRUE
end

function BroadCastBoss(BroadCastM, Amount, Monsters, BossName, allArea)
 doBroadcastMessage(BroadCastM,22)
 local summonPos = {x = 0, y = 0, z = 0}
 local monsterName = 0

 for i = 1, Amount / 4 do
   monsterName = Monsters[math.random(1, table.maxn(Monsters))]
   summonPos = allArea[math.random(1, table.maxn(allArea))]
     doSummonCreature(monsterName, summonPos)
 end

   monsterName = Monsters[math.random(1, table.maxn(Monsters))]
   summonPos = allArea[math.random(1, table.maxn(allArea))]
 doSummonCreature(BossName, summonPos)


 return TRUE
end


-- Incendios
function doIncendio(fromArea, toArea, agID, apID, FChao, Chance, FireFieldID, FireWallsID, chaoLib)
 local arvoreID = 0
 local posNow = {x = 0, y = 0, z = 0}
 local randomFF = math.random(1, table.maxn(FireFieldID))
 local chaoID = 0

 for t = fromArea.z, toArea.z do -- Área
   for n = fromArea.y, toArea.y do
     for i = fromArea.x, toArea.x do
       posNow = {x = i, y = n, z = t}


       for ar = 1, table.maxn(apID) do -- Nas árvores pequenas FF
         arvoreID = getThingFromPos({x = i, y = n, z = t, stackpos = 1})
         if arvoreID.itemid == apID[ar] then
           if Chance >= math.random(1,100) then  
             randomFF = math.random(1, table.maxn(FireFieldID))
             doCreateItem(FireFieldID[randomFF], 1, posNow)
           end
         end
       end

       for ar = 1, table.maxn(agID) do -- Nas árvores grandes FireWall
         arvoreID = getThingFromPos({x = i, y = n, z = t, stackpos = 1})
         if arvoreID.itemid == agID[ar] then
           if Chance / 4 >= math.random(1,100) then  
             randomFF = math.random(1, table.maxn(FireFieldID))
             doCreateItem(FireFieldID[randomFF], 1, posNow)
           end

           if Chance >= math.random(1,100) then  
             posNow = {x = i, y = n, z = t}
             randomFF = math.random(1, table.maxn(FireWallsID))
             doCreateItem(FireWallsID[randomFF], 1, posNow)
           end
         end
       end

       if FChao == TRUE then -- FF no Chão
         arvoreID = getThingFromPos({x = i, y = n, z = t, stackpos = 1})
         chaoID = getThingFromPos({x = i, y = n, z = t, stackpos = STACKPOS_GROUND})

         if arvoreID.itemid == 0 then
           if Chance >= math.random(1,100) then
             for ch = 1, table.maxn(chaoLib) do                
               if chaoID.itemid == chaoLib[ch] then
                 posNow = {x = i, y = n, z = t}
                 randomFF = math.random(1, table.maxn(FireFieldID))
                 doCreateItem(FireFieldID[randomFF], 1, posNow)
               end
             end
           end
         end
       end


     end -- Área
   end
 end

 return TRUE
end

 

[spoiler=incendioMonster.lua]

incendioMonster.lua

function onDeath(killer, monster, corpse, damage, totaldamage) 
-- Configuracao
 local fromArea = {x = 58, y = 56, z = 7} -- Area que o incendio aconteceu
 local toArea =  {x = 88, y = 82, z = 7}-- Area que o incendio aconteceu
 local FFID = {1487,1488,1489} -- ID dos Fire Fields
 local FWID = {5063} -- ID dos FireWalls
-- Fim de Configuracao

addEvent(doRemoveIncendio, math.random(5,15)*1000, fromArea, toArea, FFID, FWID)
return TRUE
end 

function doRemoveIncendio(fromArea, toArea, FFID, FWID)
 local posNow = {x = 0, y = 0, z = 0, stackpos = 2}
 local itemRemover = 0

 for t = fromArea.z, toArea.z do -- Area
   for n = fromArea.y, toArea.y do
     for i = fromArea.x, toArea.x do

       for it = 1, table.maxn(FFID) do
         for st = 1, 3 do
           posNow = {x = i, y = n, z = t, stackpos = st}
           itemRemover = getThingFromPos(posNow)
           if itemRemover.itemid == FFID[it] then
             doRemoveItem(itemRemover.uid)
           end
         end
       end
       for it = 1, table.maxn(FWID) do
         for st = 1, 3 do
           posNow = {x = i, y = n, z = t, stackpos = st}
           itemRemover = getThingFromPos(posNow)
           if itemRemover.itemid == FWID[it] then
             doRemoveItem(itemRemover.uid)
           end
         end
       end

     end
   end
 end

return TRUE
end

 

[spoiler=The Incendier.xml]

The Incendier.xml

<?xml version="1.0" encoding="UTF-8"?>
<monster name="The Incendier" nameDescription="the Incendier" race="fire" experience="2900" speed="300" manacost="0" script="incendio.lua">
 <health now="2560" max="2560"/>
 <look type="243" corpse="6324"/>
 <targetchange interval="5000" chance="8"/>
 <strategy attack="100" defense="0"/>
 <flags>
   <flag summonable="0"/>
   <flag attackable="1"/>
   <flag hostile="1"/>
   <flag illusionable="0"/>
   <flag convinceable="0"/>
   <flag pushable="0"/>
   <flag canpushitems="1"/>
   <flag canpushcreatures="1"/>
   <flag targetdistance="4"/>
   <flag staticattack="90"/>
   <flag runonhealth="0"/>
 </flags>
 <attacks>
   <attack name="melee" interval="2000" min="-30" max="-100"/>
   <attack name="firefield" interval="3000" chance="80" range="7" radius="4" target="0">
     <attribute key="shootEffect" value="fire"/>
   </attack>
   <attack name="fire" interval="1000" chance="65" range="7" radius="4" target="1" min="-80" max="-885">

     <attribute key="shootEffect" value="fire"/>
     <attribute key="areaEffect" value="firearea"/>
   </attack>
 </attacks>
 <defenses armor="35" defense="40">
 </defenses>
 <elements>
   <element firePercent="100"/>
   <element energyPercent="40"/>
   <element physicalPercent="24"/>
   <element deathPercent="22"/>
   <element icePercent="-20"/>
 </elements>
 <immunities>
   <immunity paralyze="1"/>
   <immunity invisible="1"/>
 </immunities>
 <voices interval="5000" chance="10">
 </voices>
 <loot>
  <item id="2148" countmax="100" chance1="100000" chancemax="0"/> --Gold Coin
  <item id="2147" countmax="4" chance1="8888" chancemax="0"/> --Small Ruby
  <item id="7894" chance="8000"/> --magma legs
  <item id="7899" chance="5000"/> --magma coat
  <item id="5944" chance="4222"/> --Soul Orb
  <item id="2239" chance="20000"/> --Burnt Scroll
  <item id="2136" chance="7666"/> --Demonbone Amulet
  <item id="2187" chance="40111"/> -- wand of Inferno
  <item id="2187" chance="20111"/> -- wand of Inferno
  <item id="1987" chance="100000"> --Bag
        <inside>
           <item id="2432" chance="9800"/> --Fire Axe
           <item id="2145" countmax="8" chance1="15000" chancemax="0"/> --Small Diamond
           <item id="2392" chance="13550"/> --Fire Sword
        </inside>
     </item>
  </loot>
  <script>
<event name="incendio"/>
</script> 
</monster>

 

 

Instalando

[spoiler=Instalando scripts]

Cole os arquivos em suas respectivas pastas:

incendioMonster.lua: data\creaturescripts\scripts

incendio.lua: data\globalevents\scripts

The Incendier.xml: data\monster\Custom

 

Adicione em creaturescripts.xml

 

<event type="death" name="incendio" script="incendioMonster.lua"/>

Adicione em globalevents.xml

<globalevent name="incendio" interval="1500" script="incendio.lua"/>

Adicione em monsters.xml

<monster name="The Incendier" file="custom/The Incendier.xml"/>

 

 

Configurando

[spoiler=Configurando]

Toda a configuração do incêndio está nos dois scripts .lua. Você pode modificar todas as variáveis que estão entre os comentários '-- Configuração' e '-- Fim de Configuração'

O intervalo de tentativas para que aconteça o incêndio está no globalevents.xml. Lembrando que o interval="1500" é contado em segundos, ou seja, 1500 segundos são 25 minutos.

 

 

 

Downloads

 

 

Vídeo

Este script foi o ganhador do Script tournament #4.

Sim, havia apenas um script concorrendo, o meu.

 

Direitos

Todo o conteúdo foi desenvolvido por Pivigu (neste fórum com o nick de Pivizz) e deverá, sempre, continuar com seus respectivos créditos.

Você pode editar o script do modo que desejar, desde que não remova os créditos.

Gostaria que este script não fosse publicado em outro fórum. Desejo que seje exclusivo do OTNET.

Obrigado

 

Bugs

Este sistema foi testado no servidor The Forgotten Server 0.3 b3 e não apresentou nenhuma mensagem de erro. Caso você receba alguma, poste neste tópico que usarei todo o meu conhecimento para lhe ajudar.

Não há nenhum bug conhecido até agora.

 

 

Prêmios

Editado por Black Ice
Formatação

Compartilhar este post


Link para o post
Mock    32
Mock

Comentario: Nova regra. scripts feitos em concursos caso sejem movidos para seção de exclusivo a pessoa nao recebra SC€ pois ja recebeu do concurso :P mls mais vo mover pra lá

Porfav-r sem comentario inuteis no topico x.x'

Aprovadoico_aprovado.png & Movidoicon_movido.giffechado22xnux7.gif

Compartilhar este post


Link para o post
Eventide    7
Eventide

conseguiu fazer um script bom em um concurso de tema horrivel.. parabéns veio! xD

 

obs:

posta umas SSs, faz um video ou coloca uma explicação aewz pra noisis ver como tá.. :D

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

@Eventide

Beleza, quando eu chegar em casa eu faço e edito. Agora to no trabalho e fica difícil fazer algo aqui :x

 

@Mock

Bah, segunda vez que tenho o azar de não ganhar Script Points, hehe. Mas tranquilão :)

Obrigado por aceitar e mover para os scripts exclusivos da OTNET.

Já editei o tópico, colocando uma mensagem para que não haja muitos tópicos inúteis.

 

Obrigado

Compartilhar este post


Link para o post
difernandes    0
difernandes

12385961228.JPG

 

Da isso aew ake

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

@difernandes

Você configurou a área corretamente?

 

@topic

Adicionado vídeo e mapa usado para o teste

Compartilhar este post


Link para o post
Gpwjhlkdcf    21
Gpwjhlkdcf

Pivigu World OTServ, em breve!

/\ PROPAGANDA DE OT!!!! \o/

 

Meus parabéns por ter sido o único que conseguiu pensar em algo com o tema Natureza.

Temo que o próximo concurso que o Mock colocar seja Tibia 3D. ¬¬

 

Ferreyra, vc sabe ler?

Nas regras da seção está bem claro que são proibidos posts como o seu. Além disso, no cabeçalho do tópico ta escrito bem destacado que são só sugestões, duvidas ou erros.

Pivizz, remove aquele monte de quotes. Fica ruim ler o tópico. E coloca CODE=LUA e /CODE entre [] pros scripts LUA e para os XML coloca PHP e /PHP entre []. O CODE="LUA". Fica melhor pra ler. Tira os SPOILER também.

 

function testCode()

code = "Teste"

 if code == "Teste" then

  return

 end

end

 

<testevent name="Teste" script="testCode.lua">

 

Sacou? :)

Editado por Skyen Hasus
Não importa, eu edito porque eu quero. ¬¬

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

O code=lua não fica, eu não consigo por :S

 

teste

 

Edited

Na visualização não dava, desculpa por este post inútil :x

Que estranho.. u.u

 

Bom, editado com uma formatação melhor

Editado por Pivizz

Compartilhar este post


Link para o post
♪ ♫SpydaDiego®    0
♪ ♫SpydaDiego®

foda pra caralho adorei õ/ mto rox mas nao tem como faze cm comando??

Compartilhar este post


Link para o post
J3@n    0
J3@n

uma duvida, qnd terminar esse incendio, as arvores vao estar destruidas ou vai continuar como se nao tivesse pegado fogo?

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

@SpydaDiego

Tem, sim. Eu faço acho que terça feira, ando meio sem tempo.

Quando eu fizer eu posto

 

@J3@n

Após alguns segundos da morte do Boss, tudo volta ao normal.

Isso pode ser retirado também, é apenas não acrescentar a tag do script no monstro.

Compartilhar este post


Link para o post
Mock    32
Mock

não. ta no começo do topico: Servidor testado: The forgotten server

ou seja so pega no TFS

Compartilhar este post


Link para o post
Kerooker    0
Kerooker

duvida: kra, tenhu um problema, gostaria de saber como poe para ele acontecer em menos tempo como a cada 2h... help plx!!!

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

Toda a configuração do incêndio está nos dois scripts .lua. Você pode modificar todas as variáveis que estão entre os comentários '-- Configuração' e '-- Fim de Configuração'

O intervalo de tentativas para que aconteça o incêndio está no globalevents.xml. Lembrando que o interval="1500" é contado em segundos, ou seja, 1500 segundos são 25 minutos.

 

local intervaloExe = 60*2 -- Intervalo de execução, em minutos. No exemplo, ela só poderá ocorrer 2 horas após a última execucao.

Compartilhar este post


Link para o post
Miikro    0
Miikro

Bom bem interessante para quem gosta de ter algumas coisas a mais para o entreterimentos dos players... parabens :music:

Compartilhar este post


Link para o post
Joka kamikaze    0
Joka kamikaze

Ja arrumei tudo certin oque tem q faze pra começar incendio? :P

tipo eu tentei um monte de negocio o bixo vem so q n da incendio

ajuda ae

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

É por sorte, configura a chance pra 100% e intervalo pra uns 10 min que ele vai acontecer +- nesse tempo

Compartilhar este post


Link para o post
Luccasmanoel    0
Luccasmanoel

Pivizz eu executo o script perfeitamente o incêndio acontece e tudo mais , mais quando eu mato um monster o server trava e quando eu vou ver no console ele esta processando um monte de coisas e não ta conseguindo , eu acho que eu puis a área 100% pra pegar fogo ai quando foi pra o the incender nascer não tinha onde e deu algum debug , me corriga se eu estiver errado , Obrigado.

Editado por Luccasmanoel
Pergunta

Compartilhar este post


Link para o post
Pivizz    1
Pivizz

Se tu botou a área em todo o servidor, ele vai processar sqm por sqm, é uma área muito grande. Tente diminuir.

Compartilhar este post


Link para o post
Luccasmanoel    0
Luccasmanoel

entendi , eu não tinha botado um servidor mais uma grande quantidade de sqm's , vou diminuir e editar o tópico se houver outra dúvida , grato.

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×