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