KI
globalevent

Killua Automatic Raids System

Por Killua, 16 de jan. de 2014 em Globalevents e Spells

raid
automatica
amoeba
system
invasao
killua
script
13
5.6k
KilluaK
16 de janeiro de 2014 às 15:14

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.

Editado Janeiro 24 por Killua

16 de janeiro de 2014 às 15:25

lindo esse garoto

JustinnoTibiannoJ
16 de janeiro de 2014 às 15:27

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?

Editado Janeiro 16 por JustinnoTibianno

KilluaK
16 de janeiro de 2014 às 15:29

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.

2 semanas depois...
LordfireL
25 de janeiro de 2014 às 00:48

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.
KilluaK
25 de janeiro de 2014 às 01:25

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ó...

LordfireL
25 de janeiro de 2014 às 17:31

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
}
KilluaK
25 de janeiro de 2014 às 17:59

Huum gostei da idéia, vou fer se faço assim depois e atualizo no tópico

1 mês depois...
11 de fevereiro de 2014 às 12:21

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 '-'

leleeuhL
12 de fevereiro de 2014 às 22:10

Achei simples e funcional, não é complexo.

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

KilluaK
12 de fevereiro de 2014 às 22:17

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 :)

duasrodasD
16 de fevereiro de 2014 às 00:50

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)

1 mês depois...
KilluaK
22 de março de 2014 às 00:01

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.