Ir para conteúdo

[Globalevent] Monster Sleeping


Dokmos

Posts Recomendados

Monster Sleeping

Desenvolvido por Dokmos

Testado em TFS 8.4+

 

 

 

Funciomaneto

 

O script foi desenvolvido para simular uma espécie de soneca que os monstros podem tirar durante o jogo. Para que isso ocorra, existem zonas específicas configuradas no script e nome dos monstros que poderão tirar soneca. A soneca só ocorrerá se não houverem jogadores por perto dentro de uma distância mínima definida em SLEEP_RANGE.

 

Caso um monstro esteja dormindo e um jogador se aproximar, ele irá imediatamente acordar e, dependendo do monstro, atacar o jogador.

 

Portanto, esse script proporciona um mundo mais dinâmico e real ao mundo Open-Tibia Servers. Divirtam-se!

 

 

Configuração

 

A explicação detalhada do funcionamento e configuração do script estão dentro dele! Qualquer dúvida ou problema postem aqui.

 

 

Script

--[[-----------------Créditos---------------------

   Idealizado por Ramza (Rick / Ricardo Ianelli).
   Desenvolvido por Dokmos (Bruno Braz).
   Data: 19 de Março de 2010.    

-----------------Funcão do Script-----------------

   O script foi desenvolvido para simular uma espécie de soneca que os monstros podem tirar durante o jogo.
   Para que isso ocorra, existem zonas específicas configuradas no script e nome dos monstros que poderão tirar soneca.
   A soneca só ocorrerá se não houverem jogadores por perto dentro de uma distância mínima definida em SLEEP_RANGE.
   Caso um monstro esteja dormindo e um jogador se aproximar, ele irá imediatamente acordar e, dependendo do monstro, atacar o jogador.

   Portanto, esse script proporciona um mundo mais dinâmico e real ao mundo Open-Tibia Servers. Divirtam-se!

--------------Configuração do Script--------------

  SLEEP_RANGE: (Recomendável - 5)
  Declaração da expansão de área que irá verificar se há jogador perto de um monstro dormindo para acordá-lo. Ou seja, quanto maior ele for,
  as criaturas acordarão com a presença de outros jogadores mais distantes.

  SLEEP_PERCENT: (Recomendável - 0.3)
  Porcentagem de monstros dentro da zona que irão tirar soneca.
      Ex.: 0.4 Corresponde a 40%.
      Condição.: 0 < SLEEP_PERCENT <= 1.

  MONSTERS_NAME: (Facultativo a Alteração)
  Tabela com o nome dos monstros que podem tirar soneca.
      ATENÇÃO!
      Os nomes dos monstros deverão obrigatoriamente estar com letras minúsculas.

  MONSTERS_CORPSE: (Facultativo a Alteração)
  Tabela com o id dos corpos dos monstros que serão apresentados como se estivessem "dormindo".
      Obs.: A posição do id deve ser correspondente à posição do nome do monstro em MONSTERS_NAME.
      Para verificar qual é o id, basta ir no diretório de monstros e abrir o arquivo .xml do monstro desejado e pegar o valor de "corpse".       

  ZONE_MONTERS: (Obrigatório a Alteração)
  Armazenará tabelas para criação de zonas, onde as criaturas dentro da zona poderão tirar uma soneca aleatoriamente.
  A lógica dessa variável é armazenar posições centrais de zonas e a extensão das mesmas. Seguindo o padrão apresentado a seguir:
  {Posição X do Centro da Zona (CZ), Posição Y do CZ, Posição Z do CZ, Expansão (em sqm) da Zona}   
      Ex.:
      {x = 100, y = 200, z = 7, range = 5}
      Neste caso, irá criar uma zona ao redor da posição x = 100, y = 200, z = 7, de expansão 5 para todas direção (norte, leste, sul e oeste).  

  SIGNAL: (Não Alterar)
  É uma tabela que contém valores que serão utilizados para alterar o sinal das variáveis, a fim de checar todas posições possíveis.  

---------------------------------------------------]]     


--------------------Configuração--------------------
SLEEP_RANGE = 5

SLEEP_PERCENT = 0.3

MONSTERS_NAME = {"bat", "globin"}
MONSTERS_CORPSE = {6053, 6002}

ZONE_MONSTERS = {
{x = 94, y = 126, z = 7, range = 20},
{x = 92, y = 129, z = 8, range = 8},
}
----------------------------------------------------
SIGNAL = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}
----------------------------------------------------


-- Função checkPlayers(pos)
-- Verifica se existem jogadores próximos as criaturas.
local function checkPlayers(pos)
   for i = 0, SLEEP_RANGE do
       for j = 0, SLEEP_RANGE do
           for k = 1, 4 do
           local PPos = {x = pos.x + (i*SIGNAL[k][1]), y = pos.y + (j*SIGNAL[k][2]), z = pos.z}
           local Player = getTopCreature(PPos).uid

               if isPlayer(Player) then
               return TRUE
               end
           end
       end
   end

return FALSE
end  


-- Função getMonsterByZone()
-- Checagem de monstros da zona pré-definida no começo do script.
local function getMonsterByZone()
local Zone = ZONE_MONSTERS
local Monsters = {}

   for i = 1, #Zone do   
       for j = 0, Zone[i].range do       
           for k = 0, Zone[i].range do                       
               for l = 1, 4 do
               local MPos = {x = Zone[i].x + (j*SIGNAL[l][1]), y = Zone[i].y + (k*SIGNAL[l][2]), z = Zone[i].z}
               local Monster = getTopCreature(MPos).uid   

                   if isMonster(Monster) then
                   local Name = string.lower(getCreatureName(Monster))                           
                   local NPos = table.find(MONSTERS_NAME, Name)
                   local Check = checkPlayers(MPos)

                       if not Check and NPos ~= nil then
                       table.insert(Monsters, {Monster, MONSTERS_CORPSE[NPos]})
                       end
                   end                                  
               end            
           end            
       end    
   end

return Monsters    
end


-- Função onSleep(monster, pos, corpse, speed, time)
-- Regula o estado do monstro, quer seja dormindo, quer seja para acordar.
local function onSleep(monster, pos, corpse, speed, time)    
   if isMonster(monster) then
   local Check = checkPlayers(pos)

       if not Check and (time > 0) then
       doSendMagicEffect(pos, 32)
       doSetItemOutfit(monster, corpse, 2000)
       addEvent(onSleep, 2000, monster, pos, corpse, speed, (time - 2))
       else
       doSendMagicEffect(pos, 13)
       doChangeSpeed(monster, speed)  
       end                                          
   end 
end       




-- Função onThink(interval, lastExecution)
-- Função principal que executa as demais funções e ações do script.
function onThink(interval, lastExecution)
local Monsters = getMonsterByZone()

   if #Monsters ~= 0 then

       for i = 1, math.floor(#Monsters*SLEEP_PERCENT) do
       local r = math.random(#Monsters)

           if isMonster(Monsters[r][1]) then
           local MPos = getCreaturePosition(Monsters[r][1])
           local Speed = getCreatureSpeed(Monsters[r][1])

           doChangeSpeed(Monsters[r][1], -Speed)
           onSleep(Monsters[r][1], MPos, Monsters[r][2], Speed, interval-10)
           table.remove(Monsters, r)
           end        
       end    
   end

return TRUE
end

 

Em data/glovalevents/globalevents.xml

<globalevent name="sleep" interval="300" event="script" value="sleeping.lua"/>

 

 

Imagem

 

imgzc.jpg

 

 

 

Bom isso é tudo, qualquer dúvida postem aqui. Divirtam-se!

 

Obs.: Vocês vão perceber que configurei apenas dois monstros para dormirem, gostaria que alguém pudesse disponibilizar uma lista mais completa para eu atualizar o tópico!

 

 

 

Atenciosamente,

Dokmos

Editado por Dokmos
Link para o comentário
Compartilhar em outros sites

@DevilMoon

Sim, ele funciona nas versões mais recentes!

 

@Kydrai

Eu estou recrutando uma equipe para o projeto. Em breve postarei atualizações.

 

 

Agradeço os comentários e postem qualquer dúvida de instalação que tiverem...

Editado por Dokmos
Link para o comentário
Compartilhar em outros sites

eu nao conseguir fazer olha soh a minha script no caso eu coloquei hero:

 

 

--------------------Configuração--------------------

SLEEP_RANGE = 5

 

SLEEP_PERCENT = 0.3

 

MONSTERS_NAME = {"hero", "globin"}

MONSTERS_CORPSE = {6080, 6002}

 

ZONE_MONSTERS = {

{x = 154, y = 108, z = 9, range = 20},

{x = 92, y = 129, z = 8, range = 8},

}

----------------------------------------------------

SIGNAL = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}

----------------------------------------------------

 

 

-- Função checkPlayers(pos)

-- Verifica se existem jogadores próximos as criaturas.

local function checkPlayers(pos)

for i = 0, SLEEP_RANGE do

for j = 0, SLEEP_RANGE do

for k = 1, 4 do

local PPos = {x = pos.x + (i*SIGNAL[k][1]), y = pos.y + (j*SIGNAL[k][2]), z = pos.z}

local Player = getTopCreature(PPos).uid

 

if isPlayer(Player) then

return TRUE

end

end

end

end

 

return FALSE

end

 

 

-- Função getMonsterByZone()

-- Checagem de monstros da zona pré-definida no começo do script.

local function getMonsterByZone()

local Zone = ZONE_MONSTERS

local Monsters = {}

 

for i = 1, #Zone do

for j = 0, Zone.range do

for k = 0, Zone.range do

for l = 1, 4 do

local MPos = {x = Zone.x + (j*SIGNAL[l][1]), y = Zone.y + (k*SIGNAL[l][2]), z = Zone.z}

local Monster = getTopCreature(MPos).uid

 

if isMonster(Monster) then

local Name = string.lower(getCreatureName(Monster))

local NPos = table.find(MONSTERS_NAME, Name)

local Check = checkPlayers(MPos)

 

if not Check and NPos ~= nil then

table.insert(Monsters, {Monster, MONSTERS_CORPSE[NPos]})

end

end

end

end

end

end

 

return Monsters

end

 

 

-- Função onSleep(monster, pos, corpse, speed, time)

-- Regula o estado do monstro, quer seja dormindo, quer seja para acordar.

local function onSleep(monster, pos, corpse, speed, time)

if isMonster(monster) then

local Check = checkPlayers(pos)

 

if not Check and (time > 0) then

doSendMagicEffect(pos, 32)

doSetItemOutfit(monster, corpse, 2000)

addEvent(onSleep, 2000, monster, pos, corpse, speed, (time - 2))

else

doSendMagicEffect(pos, 13)

doChangeSpeed(monster, speed)

end

end

end

 

 

 

 

-- Função onThink(interval, lastExecution)

-- Função principal que executa as demais funções e ações do script.

function onThink(interval, lastExecution)

local Monsters = getMonsterByZone()

 

if #Monsters ~= 0 then

 

for i = 1, math.floor(#Monsters*SLEEP_PERCENT) do

local r = math.random(#Monsters)

 

if isMonster(Monsters[r][1]) then

local MPos = getCreaturePosition(Monsters[r][1])

local Speed = getCreatureSpeed(Monsters[r][1])

 

doChangeSpeed(Monsters[r][1], -Speed)

onSleep(Monsters[r][1], MPos, Monsters[r][2], Speed, interval-10)

table.remove(Monsters, r)

end

end

end

 

return TRUE

end

 

 

algo no script está errado?

eu só adc tudo em globalevents\scrits

e em globalevents.XML

Servidor 8.54 eu uso

Editado por Critico
Link para o comentário
Compartilhar em outros sites

eu nao conseguir fazer olha soh a minha script no caso eu coloquei hero:

 

 

 

 

 

algo no script está errado?

Servidor 8.54 eu uso

 

Critico,

<globalevent name="sleep" interval="300" event="script" value="sleeping.lua"/>

Como você está configurado para o evento repetir a cada 300 segundos (5 minutos).

 

1) Certifique-se que colocou a posição exata de onde estão os Heros.

2) O SLEEP_RANGE está 5, logo você precisa estar distante mais de 5 sqm para que eles durmam.

3) É necessário ter uma certa quantidade de Hero (acima de 3), pois está configurado para pegar 30% em SLEEP_PERCENT.

 

Caso não funcione poste de novo aqui.

Link para o comentário
Compartilhar em outros sites

ainda nao funcionou..

 

eu coloquei até o percent assim:

 

SLEEP_PERCENT = 0.9

 

e ainda nao deu certo...

 

oque seria? o.O

 

 

 

 

--------------------------------edited-----

 

agr funfou certinho!

Obrigado abraços

Editado por Critico
Link para o comentário
Compartilhar em outros sites

ainda nao funcionou..

 

eu coloquei até o percent assim:

 

SLEEP_PERCENT = 0.9

 

e ainda nao deu certo...

 

oque seria? o.O

 

--------------------------------edited-----

 

agr funfou certinho!

Obrigado abraços

 

Como configurado em globalevents.xml, o tempo é de 300 segundos, por isso a primeira execução ocorrerá apenas após 5 minutos. Acho que foi esse o 'problema'.

Editado por Dokmos
Link para o comentário
Compartilhar em outros sites

  • 3 months later...
  • 4 weeks later...

Manin achei legal isso ai eu arrumei e fiz tudo mas nao deu muito certo nao me ajuda ai acho q fiz algo de errado mais aki nao disse erro nenhum a e eu mudei os bichos q iriam durmi mais so mudei os nomes os corpos tem alguma coisa a ver com isso ?

Link para o comentário
Compartilhar em outros sites

@UP

 

tem que mudar tbm o local onde os monstros estão

 

se configura aqui:

 

ZONE_MONSTERS = { 
{x = 94, y = 126, z = 7, range = 20}, 
{x = 92, y = 129, z = 8, range = 8}, 
} 

Link para o comentário
Compartilhar em outros sites

  • 1 year later...
×
×
  • Criar Novo...