Jump to content

Killua Automatic Raids System


Killua

Recommended Posts

Killua Raids System

 

É um sistema normal de raids, compatível com quase todas versões do TFS (testado no 0.3.6 e 0.4), que acontecem automaticamente no local desejado, com dia e hora marcada.

 

Instalando:

 

Crie amoebaRaids.lua em data/globalevents/scripts e coloque isto:

 

 

 


-- Killua Automatic Raids System
-- Created by Killua, antigo amoeba13

local raids = {
    {name = "Monstros de fogo", monsters = {"Demon", "Dragon Lord", "Fire Devil"}, boss = "Orshabaal", fromPoss = {x=150, y=37, z=7}, toPoss = {x=157, y=42, z=7}, dates = {"Thursday-15:00", "Saturday-22:12"}, maxMonsters = 15, timeBoss = 60},
    {name = "Dragons", monsters = {"Dragon", "Dragon Lord", "Dragon Hatchling"}, boss = "Demodras", fromPoss = {x=1, y=1, z=1}, toPoss = {x=1, y=1, z=1}, dates = {"Monday-12:01", "Sunday-20:10"}, maxMonsters = 20, timeBoss = 120}
}

function isWalkable(pos)-- by Nord / editado por Omega
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0
		then return false
	elseif getTopCreature(pos).uid > 0 then
		return false
	elseif isCreature(getTopCreature(pos).uid) then
		return false
    elseif getTileInfo(pos).protection then
		return false
	elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
		return false
	end
    return true
end
 
function onThink(interval, lastExecution, thinkInterval)
    for _, myRaids in pairs(raids) do
        if table.find(myRaids.dates, os.date("%A-%H:%M")) then
            local pos = {x = math.random(myRaids.fromPoss.x, myRaids.toPoss.x), y = math.random(myRaids.fromPoss.y, myRaids.toPoss.y), z = math.random(myRaids.fromPoss.z, myRaids.toPoss.z)}
            local a = 0
            local b = 60000
            addEvent(doBroadcastMessage, 60000, "A invasao de " .. myRaids.name .. " teve inicio!")
            addEvent(doBroadcastMessage, myRaids.maxMonsters * 500 + myRaids.timeBoss * 1000, "O boss " .. myRaids.boss .. " chegou na invasao!")
            while not(a == myRaids.maxMonsters) do
            local bonsters = math.random(1, #myRaids.monsters)
            local pos = {x = math.random(myRaids.fromPoss.x, myRaids.toPoss.x), y = math.random(myRaids.fromPoss.y, myRaids.toPoss.y), z = math.random(myRaids.fromPoss.z, myRaids.toPoss.z)}
            addEvent(function()
                if isWalkable(pos) then
                    doCreateMonster(myRaids.monsters[bonsters], pos)
                end
            end, b)
                a = a + 1
                b = b + 500
            end
             addEvent(function()
                if isWalkable(pos) then
                doCreateMonster(myRaids.boss, pos)
            end
        end, myRaids.maxMonsters * 500 + myRaids.timeBoss * 1000)
        end
    end
    return true
end

 

No globalevents.xml coloque essa tag:

​<globalevent name="AmoebaRaids" interval="60" event="script" value="amoebaRaids.lua"/>

Configurar:

 

A configuração é toda feita nessa tabela:

local raids = {
    {name = "Monstros de fogo", monsters = {"Demon", "Dragon Lord", "Fire Devil"}, boss = "Orshabaal", fromPoss = {x=150, y=37, z=7}, toPoss = {x=157, y=42, z=7}, dates = {"Thursday-15:00", "Saturday-22:12"}, maxMonsters = 15},
    {name = "Dragons", monsters = {"Dragon", "Dragon Lord", "Dragon Hatchling"}, boss = "Demodras", fromPoss = {x=1, y=1, z=1}, toPoss = {x=1, y=1, z=1}, dates = {"Monday-12:01", "Sunday-20:10"}, maxMonsters = 20}
}

name é o nome da invasão, que vai aparecer no broadcast.

monsters são os monstros que vão ser criados na invasão.

boss é o boss que nasce depois de x segundos após todos os monstros serem criados.

fromPoss é o canto superior esquerdo da área onde a invasão vai ocorrer.

toPoss é o canto inferior direito da área onde a invasão vai ocorrer.

dates são as datas (dias e horarios) em que as invasões ocorrerão. Sendo sempre escritas nesse formato "Dia(em inglês)-hora:minuto" . Exemplo "Monday-12:01". A primeira letra deve ser maiúscula.

maxMonsters é o número de monstros que vão ser criados na invasão, sem contar o boss.

timeBoss é o tempo (em segundos) que o boss leva pra nascer após todos os outros monstros terem sido criados.

 

Espero que gostem.

Edited by Killua
Link to comment
Share on other sites

Eu tenho uma dúvida:

 

"boss é o boss que nasce 2 minutos após todos os outros monstros serem criados."

 

Tem como alterar esse tempo, para 5 minutos, ou 10, 15, etc?

 

Vc só precisa mudar essas duas linhas:

end, myRaids.maxMonsters * 500 + 120000)

 addEvent(doBroadcastMessage, myRaids.maxMonsters * 500 + 120000, "O boss " .. myRaids.boss .. " chegou na invasao!")

120000 representa os 2 minutos, vc pode por o tempo que quiser aí. (1000 = 1 segundo). Mas já vou por uma variável no início pra escolher quanto tempo o boss vai levar pra nascer.

Link to comment
Share on other sites

  • 2 weeks later...

Meu deus, que script gigante e mal otimizado. Tem umas variáveis que eu não descobri de onde surgiram. Também você usou um while quando podia usar um for.

 

local raids = {
    {name = "Monstros de fogo", monsters = {"Demon", "Dragon Lord", "Fire Devil"}, boss = "Orshabaal", fromPos = {x=150, y=37, z=7}, toPos = {x=157, y=42, z=7}, dates = {"Thursday-15:00", "Saturday-22:12"}, maxMonsters = 15, timeBoss = 60},
    {name = "Dragons", monsters = {"Dragon", "Dragon Lord", "Dragon Hatchling"}, boss = "Demodras", fromPos = {x=1, y=1, z=1}, toPos = {x=1, y=1, z=1}, dates = {"Monday-12:01", "Sunday-20:10"}, maxMonsters = 20, timeBoss = 120},
}

-- http://stackoverflow.com/questions/18093728/is-there-any-performance-value-in-creating-local-copies-of-lua-functions
local r = math.random

function doCreateMonsterIfWalkable(monster, pos)
    (getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 or getTopCreature(pos).uid > 0 or isCreature(getTopCreature(pos).uid) or getTileInfo(pos).protection or hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7)) and doCreateMonster(raid.monsters[monster], pos)
end
 
function onThink(interval, lastExecution, thinkInterval)
    for _, raid in pairs(raids) do
        if table.find(raid.dates, os.date("%A-%H:%M")) then
            local spawn_time = 60000, spawn_boss = raid.maxMonsters + (raid.timeBoss << 1)) * 500
            addEvent(doBroadcastMessage, 60000, "A invasao de " .. raid.name .. " teve inicio!")
            addEvent(doBroadcastMessage, spawn_boss, "O boss " .. raid.boss .. " chegou na invasao!")
            for i = 1, raid.maxMonsters do
                addEvent(doCreateMonsterIfWalkable(raid.monsters[r(1, #raid.monsters)], {x = r(raid.fromPos.x, raid.toPos.x), y = r(raid.fromPos.y, raid.toPos.y), z = r(raid.fromPos.z, raid.toPos.z)}), spawn_time)
                spawn_time = spawn_time + 500
            end
            addEvent(doCreateMonsterIfWalkable(raid.boss, {x = r(raid.fromPos.x, raid.toPos.x), y = r(raid.fromPos.y, raid.toPos.y), z = r(raid.fromPos.z, raid.toPos.z)}, spawn_boss)
        end
    end
    return true
end
Mudei umas coisas de cabeça, se não der me avisa.
Link to comment
Share on other sites

Cara o tamanho ficou quase o mesmo, vc só colocou as linhas da função do Omega em uma só gigantesca (eu sei que vc já incluiu o doCreateMonster nela)... E qual o problema de usar while no lugar de for se funciona do mesmo jeito? Eu acho que o meu é mais organizado e fácil de entender...

 

As variáveis que eu fiz repetidas são pq eu precisava usar o math.random dentro e fora do while, quando eu usava só fora, o script fazia o sorteio uma vez só...

Link to comment
Share on other sites

Usar while no lugar de for não é problema, mas o for foi criado justamente pra isso (iterar de x até y), aí faz a mesma coisa sem você precisar se preocupar com o iterador. Do mais foi só mania minha de DRY.

 

Uma sugestão, faça seu script receber várias waves com delays diferentes, tipo assim:

{
  name = "Dragons",
  waves = {
    {
      monsters = {"Dragon Hatchling", "Dragon Lord Hatchling"},
      maxMonsters = 15
    },
    {
      delay = 120,
      monsters = {"Dragon Hatchling", "Dragon Lord Hatchling", "Dragon"},
      maxMonsters = 18
    },
    {
      delay = 300,
      monsters = {"Dragon Hatchling", "Dragon Lord Hatchling", "Dragon", "Dragon Lord"},
      maxMonsters = 21
    },
    {
      delay = 600,
      monsters = {"Dragon Hatchling", "Dragon Lord Hatchling"},
      maxMonsters = 24
    },
  },
  boss = "Orshabaal",
  fromPos = {x=150, y=37, z=7},
  toPos = {x=157, y=42, z=7},
  dates = {"Thursday-15:00", "Saturday-22:12"},
  bossDelay = 900
}
Link to comment
Share on other sites

  • 3 weeks later...

e se ninguem matar o boss? ele não some depois de tantos tempo?? eu precisava de um script que fizesse isso, me ajuda ai plix '-'

 

Se ngm matar ele continua lá... Mas posso fazer ele remover sim. Se vc puder esperar até segunda-feira fica tranquilo, pq só vou ter tempo a partir de lá...

 

 

Achei simples e funcional, não é complexo.

As pessoas que não entendem não sofreriam com mistérios nele, parabéns, rs.

 

Obrigado :)

Link to comment
Share on other sites

Script funcionou,mas cria infinitos monstros e envia monte de msg!!

00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!

Mesmo colocando 8 monstros aparece um monte!

 

Servidor 8.6(DEV 0.4 3884)

Link to comment
Share on other sites

  • 1 month later...

Script funcionou,mas cria infinitos monstros e envia monte de msg!!

00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!
00:46 O boss Demodras chegou na invasao!

Mesmo colocando 8 monstros aparece um monte!

 

Servidor 8.6(DEV 0.4 3884)

 

Desculpe a demora para responder, eu não tinha visto. Seu servidor deve ser por milissegundos. Na tag do globalevents, mude o intervalo de 60 para 60000, abraços.

Link to comment
Share on other sites

×
×
  • Create New...