Ir para conteúdo
  • 0

Spawn de Poke Aleatorio em uma determinada Area


wenderotpoke

Pergunta

Galera estou fazendo umas coisinhas pra um projetinho e preciso de uma mão com algumas coisinhas, estou criando um sistema bem legal mas preciso de um help com o Spawn de pokemons....

 

O que eu preciso basicamente é de que em uma determinada area marcada X. Y. tenha os Spawns que eu configurar

por exemplo 

 

area1 = {fromx = 1712, fromy = 1211, fromz = 15, tox = 1966, toy = 1303, toz= 15}, 

pokemons = {"Bulbasaur", "Charmander", "Squirtle", "Torchic", "Treecko", "Mudkip", "Totodile", "Chikorita", "Cyndaquil"},

 

o que eu quero é que dentro dessa area1 nasça aleatoriamente 64 Pokémons da lista

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

você pode seguir essa lógica:

 

-- Defina a área e a lista de Pokémons
local area1 = {
    fromx = 1712,
    fromy = 1211,
    fromz = 15,
    tox = 1966,
    toy = 1303,
    toz = 15
}

local pokemons = {"Bulbasaur", "Charmander", "Squirtle", "Torchic", "Treecko", "Mudkip", "Totodile", "Chikorita", "Cyndaquil"}

local spawnCount = 64 -- Número de Pokémons a serem gerados

function spawnPokemons()
    for i = 1, spawnCount do
        -- Gere coordenadas aleatórias dentro da área
        local posX = math.random(area1.fromx, area1.tox)
        local posY = math.random(area1.fromy, area1.toy)
        local posZ = area1.fromz -- Mantenha a mesma altura (z)

        local position = {x = posX, y = posY, z = posZ}

        -- Escolha um Pokémon aleatoriamente da lista
        local chosenPokemon = pokemons[math.random(1, #pokemons)]

        -- Crie o Pokémon na posição escolhida
        doCreateMonster(chosenPokemon, position)
    end
end

-- Chame a função para spawnar os Pokémons
spawnPokemons()


 

Explicação do Script

  1. Área de Spawn: A área é definida pelas coordenadas fromx, fromy, fromz (canto superior esquerdo) e tox, toy, toz (canto inferior direito).

  2. Lista de Pokémons: A lista pokemons contém os nomes dos Pokémons que podem ser gerados.

  3. Função spawnPokemons:

    • Gera 64 posições aleatórias dentro da área especificada.
    • Seleciona aleatoriamente um Pokémon da lista para cada posição.
    • Usa a função doCreateMonster para criar o Pokémon na posição especificada.
  4. Execução: A função spawnPokemons é chamada para executar o spawn dos Pokémons.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 03/09/2024 em 21:51, Holograma disse:

você pode seguir essa lógica:

 

-- Defina a área e a lista de Pokémons
local area1 = {
    fromx = 1712,
    fromy = 1211,
    fromz = 15,
    tox = 1966,
    toy = 1303,
    toz = 15
}

local pokemons = {"Bulbasaur", "Charmander", "Squirtle", "Torchic", "Treecko", "Mudkip", "Totodile", "Chikorita", "Cyndaquil"}

local spawnCount = 64 -- Número de Pokémons a serem gerados

function spawnPokemons()
    for i = 1, spawnCount do
        -- Gere coordenadas aleatórias dentro da área
        local posX = math.random(area1.fromx, area1.tox)
        local posY = math.random(area1.fromy, area1.toy)
        local posZ = area1.fromz -- Mantenha a mesma altura (z)

        local position = {x = posX, y = posY, z = posZ}

        -- Escolha um Pokémon aleatoriamente da lista
        local chosenPokemon = pokemons[math.random(1, #pokemons)]

        -- Crie o Pokémon na posição escolhida
        doCreateMonster(chosenPokemon, position)
    end
end

-- Chame a função para spawnar os Pokémons
spawnPokemons()


 

Explicação do Script

  1. Área de Spawn: A área é definida pelas coordenadas fromx, fromy, fromz (canto superior esquerdo) e tox, toy, toz (canto inferior direito).

  2. Lista de Pokémons: A lista pokemons contém os nomes dos Pokémons que podem ser gerados.

  3. Função spawnPokemons:

    • Gera 64 posições aleatórias dentro da área especificada.
    • Seleciona aleatoriamente um Pokémon da lista para cada posição.
    • Usa a função doCreateMonster para criar o Pokémon na posição especificada.
  4. Execução: A função spawnPokemons é chamada para executar o spawn dos Pokémons.

Cara BRABO D+ A função pegou perfeitamente, mas agora me buguei na hora de configurar com a script que quero, vou deixar ela aqui, esse vento que to criando são 4 salas tem algum meio de deixar ele identificar qual sala o player tá entrando e criar os pokes nela?
Outro detalhe é que ele está tentando criar nas paredes também dai da o Erro no TFS

 

[Error - Action Interface]
data/actions/scripts/Quests/Dungeons/Bronze/BronzeDungeon.lua:onUse
Description:
(LuaScriptInterface::luaDoCreateMonster) Cannot create monster: Shiny Raticate


Fiz algumas mudanças pra se encaixar com o que eu busco, mas não manjo tanto então puder dar o HELP

Spoiler

local pos1 = {x = 1712, y = 1211, z = 15} 
local pos2 = {x = 1966, y = 1303, z = 15}
local pos3 = {x = 1712, y = 1319, z = 15} 
local pos4 = {x = 1966, y = 1411, z = 15}
local pos5 = {x = 1712, y = 1427, z = 15} 
local pos6 = {x = 1966, y = 1519, z = 15}
local pos7 = {x = 1712, y = 1535, z = 15} 
local pos8 = {x = 1966, y = 1627, z = 15}
local config = {
[17003] = {
        nameDz = "Bronze",
        chave = 2155, 
        count = 1, 
        area1 = {fromx = 1712, fromy = 1211, fromz = 15, tox = 1966, toy = 1303, toz= 15},
        area2 = {fromx = 1712, fromy = 1319, fromz = 15, tox = 1966, toy = 1411, toz= 15},
        area3 = {fromx = 1712, fromy = 1427, fromz = 15, tox = 1966, toy = 1519, toz= 15},
        area4 = {fromx = 1712, fromy = 1535, fromz = 15, tox = 1966, toy = 1627, toz= 15}, 
        tele1 = {x = 1789, y = 1288, z = 15},
        tele2 = {x = 1789, y = 1396, z = 15},
        tele3 = {x = 1789, y = 1504, z = 15},
        tele4 = {x = 1789, y = 1612, z = 15},
        pokemons = {"Elder Zubat", "Elder Rattata", "Shiny Golbat", "Shiny Raticate"},
        spawnCount = 64,
    }
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
    
    if not config[item.actionid] then
        return true
    end
    
    local cfg = config[item.actionid]    
    if isRiderOrFlyOrSurf(cid) then
        doPlayerSendCancel(cid, "Saia do ride ou fly para poder 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
    
function spawnPokemons()    
    for i = 1, cfg.spawnCount do
        local posX = math.random(cfg.area1.fromx, cfg.area1.tox)
        local posY = math.random(cfg.area1.fromy, cfg.area1.toy)
        local posZ = cfg.area1.fromz

        local position = {x = posX, y = posY, z = posZ}

        local chosenPokemon = cfg.pokemons[math.random(1, #cfg.pokemons)]

        doCreateMonster(chosenPokemon, position)
    end
end
        if getPlayerItemCount(cid, cfg.chave) >= cfg.count then
            if #getPlayersInArea(cfg.area1) < 1 then
                removeNpcInArea(pos1, pos2, true, false)    
                creatureInSurvival(pos1, pos2, true, false)
                doTeleportThing(cid, cfg.tele1)                                    
                setPlayerStorageValue(cid, 2154600, 1)                                    
                doPlayerRemoveItem(cid, cfg.chave, cfg.count)
                  addEvent(doTeleportFinish2, 15 * 60 * 1000, cid)
                doSendPlayerExtendedOpcode(cid, 133, 899)
                spawnPokemons()    
            elseif #getPlayersInArea(cfg.area2) < 1 then
                removeNpcInArea(pos3, pos4, true, false)    
                creatureInSurvival(pos3, pos4, true, false)
                doTeleportThing(cid, cfg.tele2)                                    
                setPlayerStorageValue(cid, 2154600, 1)                                    
                doPlayerRemoveItem(cid, cfg.chave, cfg.count)
                  addEvent(doTeleportFinish2, 15 * 60 * 1000, cid)
                doSendPlayerExtendedOpcode(cid, 133, 899)
                spawnPokemons()                        
            else
                doPlayerSendCancel(cid, "Nao tem Zonas disponiveis no momento, tente mais tarde!")
            end
        else
            doPlayerSendCancel(cid, "Voce precisa de uma Bronze Dimensional Key para acessar essa Dungeon.")        
        end            
return true  
end

 

Editado por wenderotpoke
Complemento de Informações
Link para o comentário
Compartilhar em outros sites

  • 0

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


 

  1. 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).
  2. 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.
  3. 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.
  4. 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.

Link para o comentário
Compartilhar em outros sites

  • 0
9 horas atrás, Holograma disse:

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


 

  1. 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).
  2. 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.
  3. 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.
  4. 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.

Cara estamos quase lá kkk Bom sobre a função precisei colocar a do servidor aqui, porem o ponto agora é o seguinte ta criando menos de 64 o numero está bem aleatorio, as vezes sai 6, 8 ,15, não teria algum meio de deixar fixo os 64?

Spoiler

-- Função para verificar se o local é walkable
function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end


 

Link para o comentário
Compartilhar em outros sites

  • 0
local function getWalkablePositions(area, maxPositions)
    local walkablePositions = {}
    for i = 1, #area do
        if #walkablePositions >= maxPositions then
            break -- Limitar o número de posições
        end
        local pos = area[i]
        if isWalkable(pos, true, false, true, true) then
            table.insert(walkablePositions, pos)
        end
    end
    return walkablePositions
end

-- Usar a função para obter exatamente 64 posições
local positions = getWalkablePositions(area, 64)

 

Link para o comentário
Compartilhar em outros sites

  • 0
14 horas atrás, Holograma disse:
local function getWalkablePositions(area, maxPositions)
    local walkablePositions = {}
    for i = 1, #area do
        if #walkablePositions >= maxPositions then
            break -- Limitar o número de posições
        end
        local pos = area[i]
        if isWalkable(pos, true, false, true, true) then
            table.insert(walkablePositions, pos)
        end
    end
    return walkablePositions
end

-- Usar a função para obter exatamente 64 posições
local positions = getWalkablePositions(area, 64)

 

Maninho me buguei todo aqui pra colocar a função
soltei o cod todo que to usando no script atual

Spoiler

local config = {
    [17003] = {
        nameDz = "Bronze", --Shiny Raticate Ok!
        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 = 1970, fromy = 1319, fromz = 15, tox = 2248, toy = 1303, toz= 15},
            {fromx = 1712, fromy = 1211, fromz = 14, tox = 1966, toy = 1303, toz= 14},
            {fromx = 1970, fromy = 1319, fromz = 14, tox = 2248, toy = 1303, toz= 14}
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1789, y = 1288, z = 15},
            {x = 2062, y = 1288, z = 15},
            {x = 1789, y = 1288, z = 14},
            {x = 2062, y = 1288, z = 14}         
        },
        pokemons = {"Elder Zubat", "Elder Rattata"},
        finish = 15 * 60 * 1000,
        spawnCount = 234,
    },
    
[16990] = {
        nameDz = "Silver Fire", --Volcanic Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 15, tox = 1966, toy = 1416, toz= 15},
            {fromx = 1970, fromy = 1313, fromz = 15, tox = 2248, toy = 1416, toz= 15},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1789, y = 1396, z = 15},
            {x = 2062, y = 1396, z = 15}
        },
        pokemons = {"Elder Charizard", "Elder Magmar", "Elder Blaziken"},
        finish = 30 * 60 * 1000, 
        spawnCount = 234,
    },
    
[16991] = {
        nameDz = "Silver Grass", --Naturia Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 14, tox = 1966, toy = 1416, toz= 14},
            {fromx = 1970, fromy = 1313, fromz = 14, tox = 2248, toy = 1416, toz= 14}
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1790, y = 1394, z = 14},
            {x = 2063, y = 1394, z = 14}
        },
        pokemons = {"Elder Tangela", "Elder Sceptile", "Elder Venusaur"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16992] = {
        nameDz = "Silver Water", --Seavel Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 13, tox = 1966, toy = 1416, toz= 13},     
            {fromx = 1970, fromy = 1313, fromz = 13, tox = 2248, toy = 1416, toz= 13},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1791, y = 1398, z = 13},
            {x = 2064, y = 1398, z = 13}
        },
        pokemons =  {"Elder Blastoise", "Elder Swampert", "Elder Feebas"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16993] = {
        nameDz = "Silver Flying", --Wingeon Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 12, tox = 1966, toy = 1416, toz= 12},       
            {fromx = 1970, fromy = 1313, fromz = 12, tox = 2248, toy = 1416, toz= 12},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1792, y = 1399, z = 12},
            {x = 2065, y = 1399, z = 12}
        },
        pokemons = {"Elder Pidgeot", "Elder Shelgon"},
        finish = 30 * 60 * 1000, 
        spawnCount = 234,
    },
    
[16994] = {
        nameDz = "Silver Fighting", --Gardestrike Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1211, fromz = 13, tox = 1966, toy = 1303, toz= 13},  
            {fromx = 1970, fromy = 1319, fromz = 13, tox = 2248, toy = 1303, toz= 13},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1791, y = 1290, z = 13},
            {x = 2064, y = 1290, z = 13},        
        },
        pokemons = {"Elder Heracross", "Elder Kangaskhan", "Elder Vigoroth"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16995] = {
        nameDz = "Silver Ghost", --Malefic Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1211, fromz = 12, tox = 1966, toy = 1303, toz= 12},
            {fromx = 1970, fromy = 1319, fromz = 12, tox = 2248, toy = 1303, toz= 12}
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1792, y = 1291, z = 12},
            {x = 2065, y = 1291, z = 12}        
        },
        pokemons = {"Elder Gengar", "Elder Banette", "Elder Dusclops"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16996] = {
        nameDz = "Silver Rock", --Orebound Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1415, fromz = 12, tox = 1966, toy = 1529, toz= 12},
            {fromx = 1970, fromy = 1415, fromz = 12, tox = 2248, toy = 1529, toz= 12}
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1792, y = 1507, z = 12},
            {x = 2065, y = 1507, z = 12}        
        },
        pokemons = {"Elder Tyranitar", "Elder Rhydon", "Elder Aggron"},
        finish = 30 * 60 * 1000,  
        spawnCount = 234,                                                  
    },
    
[16997] = {
        nameDz = "Silver Psychic", --Psycraft Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1415, fromz = 13, tox = 1966, toy = 1529, toz= 13},
            {fromx = 1970, fromy = 1415, fromz = 13, tox = 2248, toy = 1529, toz= 13}
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1791, y = 1506, z = 13},
            {x = 2064, y = 1506, z = 13}        
        },
        pokemons = {"Elder Alakazam", "Elder Gardevoir", "Elder Metang"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16998] = {
        nameDz = "Silver Electric", --Raibolt Ok!
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 13, tox = 1966, toy = 1416, toz= 13},
            {fromx = 1970, fromy = 1313, fromz = 13, tox = 2248, toy = 1416, toz= 13},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1791, y = 1398, z = 13},
            {x = 2064, y = 1398, z = 13}
        },
        pokemons = {"Elder Manectric", "Elder Ampharos", "Elder Electabuzz"},
        finish = 30 * 60 * 1000,
        spawnCount = 234,
    },
    
[16999] = {
        nameDz = "Silver Iron", --Ironhard
        chave = 2156, 
        count = 1, 
        areas = { -- Criei uma tabela de áreas para simplificar
            {fromx = 1712, fromy = 1313, fromz = 12, tox = 1966, toy = 1416, toz= 12},
            {fromx = 1970, fromy = 1313, fromz = 12, tox = 2248, toy = 1416, toz= 12},
        },
        teleport = { -- Criado teleporte para cada área
            {x = 1789, y = 1396, z = 12},
            {x = 2062, y = 1396, z = 12}
        },
        pokemons = {"Elder Mawile", "Elder Aggron", "Elder Riolu"},
        finish = 30 * 60 * 1000, 
        spawnCount = 234,
    }    
}

-- Função para verificar se o local é walkable
function isWalkable(pos, creature, proj, pz, water)-- by Nord
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
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 isWalkable(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, 2154610, 1)
                doPlayerRemoveItem(cid, cfg.chave, cfg.count)
                addEvent(doTeleportFinish2, cfg.finish, cid)
                doSendPlayerExtendedOpcode(cid, 133, (cfg.finish / 1000))

                -- 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 Dimensional Key para acessar essa Dungeon.")
    end
    return true
end

 

Link para o comentário
Compartilhar em outros sites

  • 0
local config = {
    [17003] = {
        nameDz = "Bronze",
        chave = 2155,
        count = 1,
        areas = {
            {fromx = 1712, fromy = 1211, fromz = 15, tox = 1966, toy = 1303, toz= 15},
            {fromx = 1970, fromy = 1319, fromz = 15, tox = 2248, toy = 1303, toz= 15},
            {fromx = 1712, fromy = 1211, fromz = 14, tox = 1966, toy = 1303, toz= 14},
            {fromx = 1970, fromy = 1319, fromz = 14, tox = 2248, toy = 1303, toz= 14}
        },
        teleport = {
            {x = 1789, y = 1288, z = 15},
            {x = 2062, y = 1288, z = 15},
            {x = 1789, y = 1288, z = 14},
            {x = 2062, y = 1288, z = 14}
        },
        pokemons = {"Elder Zubat", "Elder Rattata"},
        finish = 15 * 60 * 1000,
        spawnCount = 64, -- Corrigido para 64
    },
    -- Outros níveis de Dungeon configurados aqui
}

-- Função para verificar se o local é walkable
function isWalkable(pos, creature, proj, pz, water)
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if isWater(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid) and water then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end

-- Função para spawnar Pokémons na área correta
function spawnPokemons(area, pokemons, spawnCount)
    local spawnedCount = 0
    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}

        if isWalkable(position) then
            local chosenPokemon = pokemons[math.random(1, #pokemons)]
            doCreateMonster(chosenPokemon, position)
            spawnedCount = spawnedCount + 1
        end
    end
    return spawnedCount
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, 2154610, 1)
                doPlayerRemoveItem(cid, cfg.chave, cfg.count)

                -- Spawnar os pokémons na área correta
                local spawnedPokemons = spawnPokemons(area, cfg.pokemons, cfg.spawnCount)
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Foram spawnados "..spawnedPokemons.." pokémons na dungeon.")
            end
        end
        return true
    else
        doPlayerSendCancel(cid, "Você precisa de "..cfg.count.." "..getItemNameById(cfg.chave).." para entrar.")
    end

    return true
end

 

Neste script:

  • A função spawnPokemons foi ajustada para tentar spawnar um total de 64 pokémons por área (ou o número especificado em spawnCount).
  • Foram feitas correções para garantir que apenas posições "walkable" sejam consideradas para o spawn.
  • O número de pokémons spawnados é mostrado ao jogador após o teleporte.
Link para o comentário
Compartilhar em outros sites

  • 0

[Error - Action Interface]
data/actions/scripts/Quests/Dungeons/Dungeons.lua:onUse
Description:
data/actions/scripts/Quests/Dungeons/Dungeons.lua:218: bad argument #2 to 'random' (interval is empty)
stack traceback:
        [C]: in function 'random'
        data/actions/scripts/Quests/Dungeons/Dungeons.lua:218: in function 'spawnPokemons'
        data/actions/scripts/Quests/Dungeons/Dungeons.lua:261: in function <data/actions/scripts/Quests/Dungeons/Dungeons.lua:232>
 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 13/09/2024 em 19:55, wenderotpoke disse:

[Error - Action Interface]
data/actions/scripts/Quests/Dungeons/Dungeons.lua:onUse
Description:
data/actions/scripts/Quests/Dungeons/Dungeons.lua:218: bad argument #2 to 'random' (interval is empty)
stack traceback:
        [C]: in function 'random'
        data/actions/scripts/Quests/Dungeons/Dungeons.lua:218: in function 'spawnPokemons'
        data/actions/scripts/Quests/Dungeons/Dungeons.lua:261: in function <data/actions/scripts/Quests/Dungeons/Dungeons.lua:232>
 

Ele subiu esse erro e não gera os 64 pokes fora que ele também buga a configuração no final que faz o check e transporta pra sala do Boss

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...