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

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























