Pivizz 1 #1 Posted March 30, 2009 (edited) 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 Mapa usado para Teste Scripts 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 Edited January 24, 2011 by Black Ice Formatação Share this post Link to post
Mock 32 #2 Posted March 31, 2009 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 mls mais vo mover pra lá Porfav-r sem comentario inuteis no topico x.x' Aprovado & Movido Share this post Link to post
Eventide 7 #3 Posted March 31, 2009 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á.. Share this post Link to post
Pivizz 1 #4 Posted March 31, 2009 @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 Share this post Link to post
Pivizz 1 #6 Posted April 1, 2009 @difernandes Você configurou a área corretamente? @topic Adicionado vídeo e mapa usado para o teste Share this post Link to post
Gpwjhlkdcf 21 #7 Posted April 5, 2009 (edited) 1º Pivigu World OTServ, em breve! /\ PROPAGANDA DE OT!!!! \o/ 2º 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. ¬¬ 3º 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. 4º 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? Edited April 5, 2009 by Skyen Hasus Não importa, eu edito porque eu quero. ¬¬ Share this post Link to post
Pivizz 1 #8 Posted April 5, 2009 (edited) 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 Edited April 5, 2009 by Pivizz Share this post Link to post
♪ ♫SpydaDiego® 0 #9 Posted April 23, 2009 foda pra caralho adorei õ/ mto rox mas nao tem como faze cm comando?? Share this post Link to post
J3@n 0 #10 Posted April 24, 2009 uma duvida, qnd terminar esse incendio, as arvores vao estar destruidas ou vai continuar como se nao tivesse pegado fogo? Share this post Link to post
Pivizz 1 #11 Posted April 24, 2009 @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. Share this post Link to post
Mock 32 #12 Posted April 28, 2009 não. ta no começo do topico: Servidor testado: The forgotten server ou seja so pega no TFS Share this post Link to post
Kerooker 0 #13 Posted April 28, 2009 duvida: kra, tenhu um problema, gostaria de saber como poe para ele acontecer em menos tempo como a cada 2h... help plx!!! Share this post Link to post
Pivizz 1 #14 Posted April 28, 2009 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. Share this post Link to post
Miikro 0 #15 Posted April 30, 2009 Bom bem interessante para quem gosta de ter algumas coisas a mais para o entreterimentos dos players... parabens :music: Share this post Link to post
Joka kamikaze 0 #16 Posted May 3, 2009 Ja arrumei tudo certin oque tem q faze pra começar incendio? tipo eu tentei um monte de negocio o bixo vem so q n da incendio ajuda ae Share this post Link to post
Pivizz 1 #17 Posted May 3, 2009 É por sorte, configura a chance pra 100% e intervalo pra uns 10 min que ele vai acontecer +- nesse tempo Share this post Link to post
Luccasmanoel 0 #18 Posted June 5, 2009 (edited) 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. Edited June 5, 2009 by Luccasmanoel Pergunta Share this post Link to post
Pivizz 1 #19 Posted June 5, 2009 Se tu botou a área em todo o servidor, ele vai processar sqm por sqm, é uma área muito grande. Tente diminuir. Share this post Link to post
Luccasmanoel 0 #20 Posted June 5, 2009 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. Share this post Link to post