Para evitar a criação de monstros em paredes, você precisa verificar se o local gerado aleatoriamente é um local "walkable" (ou seja, acessível para o monstro andar). O TFS tem uma função chamada isWalkable que pode ser usada para validar as posições antes de gerar um Pokémon.
local config = {
[17003] = {
nameDz = "Bronze",
chave = 2155,
count = 1,
areas = { -- Criei uma tabela de áreas para simplificar
{fromx = 1712, fromy = 1211, fromz = 15, tox = 1966, toy = 1303, toz= 15},
{fromx = 1712, fromy = 1319, fromz = 15, tox = 1966, toy = 1411, toz= 15},
{fromx = 1712, fromy = 1427, fromz = 15, tox = 1966, toy = 1519, toz= 15},
{fromx = 1712, fromy = 1535, fromz = 15, tox = 1966, toy = 1627, toz= 15}
},
teleport = { -- Criado teleporte para cada área
{x = 1789, y = 1288, z = 15},
{x = 1789, y = 1396, z = 15},
{x = 1789, y = 1504, z = 15},
{x = 1789, y = 1612, z = 15}
},
pokemons = {"Elder Zubat", "Elder Rattata", "Shiny Golbat", "Shiny Raticate"},
spawnCount = 64
}
}
-- Função para verificar se o local é walkable
function isPositionWalkable(pos)
local tile = Tile(pos)
return tile and not tile:hasFlag(TILESTATE_PROTECTIONZONE) and not tile:getCreatureCount() > 0
end
-- Função para spawnar Pokémons na área correta
function spawnPokemons(area, pokemons, spawnCount)
for i = 1, spawnCount do
local posX = math.random(area.fromx, area.tox)
local posY = math.random(area.fromy, area.toy)
local posZ = area.fromz
local position = {x = posX, y = posY, z = posZ}
-- Verifica se a posição é "walkable"
if isPositionWalkable(position) then
local chosenPokemon = pokemons[math.random(1, #pokemons)]
doCreateMonster(chosenPokemon, position)
else
i = i - 1 -- Se a posição não for válida, tenta novamente
end
end
end
function onUse(cid, item, fromPosition, itemEx, toPosition)
local cfg = config[item.actionid]
if not cfg then
return true
end
if isRiderOrFlyOrSurf(cid) then
doPlayerSendCancel(cid, "Saia do ride ou fly para acessar a dungeon.")
return true
end
if getPlayerStorageValue(cid, 468703) - os.time() > 0 then
doPlayerSendCancel(cid, "Aguarde "..convertTime(getPlayerStorageValue(cid, 468703) - os.time()).." para entrar na Dungeon.")
return true
end
if getPlayerItemCount(cid, cfg.chave) >= cfg.count then
for i, area in ipairs(cfg.areas) do
if #getPlayersInArea(area) < 1 then
-- Remove monstros existentes e inicia os novos spawns
removeNpcInArea({x = area.fromx, y = area.fromy, z = area.fromz}, {x = area.tox, y = area.toy, z = area.toz}, true, false)
creatureInSurvival({x = area.fromx, y = area.fromy, z = area.fromz}, {x = area.tox, y = area.toy, z = area.toz}, true, false)
-- Teleporta o jogador para a área correspondente
doTeleportThing(cid, cfg.teleport[i])
setPlayerStorageValue(cid, 2154600, 1)
doPlayerRemoveItem(cid, cfg.chave, cfg.count)
addEvent(doTeleportFinish2, 15 * 60 * 1000, cid)
doSendPlayerExtendedOpcode(cid, 133, 899)
-- Spawna os Pokémons
spawnPokemons(area, cfg.pokemons, cfg.spawnCount)
return true
end
end
doPlayerSendCancel(cid, "Nao tem Zonas disponiveis no momento, tente mais tarde!")
else
doPlayerSendCancel(cid, "Você precisa de uma Bronze Dimensional Key para acessar essa Dungeon.")
end
return true
end
Validação de Local Walkable:
Foi adicionada a função isPositionWalkable para garantir que o Pokémon não seja criado em locais inacessíveis (como paredes).
Identificação da Sala:
Cada sala tem uma área e um ponto de teleporte definidos. A função percorre as áreas (cfg.areas) e verifica se há jogadores. Se não houver, o jogador é teleportado e os Pokémons são gerados nessa área.
Loop para Encontrar Área Livre:
O script agora percorre todas as áreas da configuração e tenta encontrar uma disponível para o jogador entrar.
Novo Teleporte e Spawn para Cada Sala:
Cada área tem seu próprio teleporte, e os Pokémons são gerados na área correspondente.
Esse ajuste deve resolver os problemas de criação em áreas incorretas e o erro de geração em paredes.