Ir para conteúdo
  • 0

Spawn de Poke Aleatorio em uma determinada Area


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
https://xtibia.com/forum/topic/259732-spawn-de-poke-aleatorio-em-uma-determinada-area/
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.

  • 0
  Em 04/09/2024 em 00: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.

Expand  

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

  Mostrar conteúdo oculto

 

Editado por wenderotpoke
Complemento de Informações
  • 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.

  • 0
  Em 05/09/2024 em 14:01, 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.

Expand  

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?

  Mostrar conteúdo oculto


 

  • 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)

 

  • 0
  Em 10/09/2024 em 21:52, 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)

 

Expand  

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

  Mostrar conteúdo oculto

 

  • 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.
  • 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>
 

  • 0
  Em 13/09/2024 em 22: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>
 

Expand  

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

  • Quem Está Navegando   0 membros estão online

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