Ir para conteúdo

[ Ripping ] Sistema De Incêndio V1.0


LorD Sybian

Posts Recomendados

Sistema de Incêndio desenvolvido por esK~

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: esK~ (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.

incendio.lua:

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



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

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:

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:

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.

Vlwos galera

Créditos 100% esK~ por ter criado este sistema !!!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...