Jump to content

Valor aleatório pego de uma tabela


Recommended Posts

Eu havia criado 3 markers, porém queria que eles aparecessem de forma aleatória (que de forma aleatória fosse escolhido qual deles ia ser criado), porém o jeito que eu estava fazendo não dava certo.

Isso foi o que fiz até agora:

function randomValue(arr)
	local tempTable = {}
	for key, value in pairs(arr) do
		table.insert(tempTable, value)
	end
	return tempTable[math.random(#tempTable)]
end

local arr = {
	pos1 = 2455.423, -2079.331, 12.547,
	pos2 = 2458.529, -2078.655, 12.547,
	pos3 = 2462.126, -2078.502, 12.547,
}

function test ()
	createMarker(randomValue(arr), "cylinder", 1.5, 50,100,255, 100)
end
addCommandHandler("teste", test)

Quando eu do o comando "/teste" (que no caso era pra criar um dos markers), aparece o seguinte erro:

zmhI6MU.png

Link to comment
local arr = {
	{ 2455.423, -2079.331, 12.547 },
	{ 2458.529, -2078.655, 12.547 },
	{ 2462.126, -2078.502, 12.547 },
}

function test ()
    local index = math.random(#arr)
    local x,y,z = table.unpack(arr[index])
    createMarker(x, y, z, "cylinder", 1.5, 50, 100, 255, 100)
end
addCommandHandler("teste", test)

 

Link to comment
1 hour ago, [M]ister said:

local arr = {
	{ 2455.423, -2079.331, 12.547 },
	{ 2458.529, -2078.655, 12.547 },
	{ 2462.126, -2078.502, 12.547 },
}

function test ()
    local index = math.random(#arr)
    local x,y,z = table.unpack(arr[index])
    createMarker(x, y, z, "cylinder", 1.5, 50, 100, 255, 100)
end
addCommandHandler("teste", test)

 

ta dando esse erro:

7r6Q0gh.png

Link to comment
  • Other Languages Moderators

A função unpack não funciona dessa maneira. Ela serve para "desempacotar" uma table em valores separados. Ex:

Spoiler

tabelaQualquer = {
	[1] = "abc",
	[2] = 12,
	[3] = nil,
  	[4] = true
}

local a, b, c, d = unpack (tabelaQualquer) -- Desempacota todos os elementos, atribuindo cada um nas variáveis.
-- a será igual a "abc".
-- b será igual a 12.
-- c não receberá valor.
-- d será igual a true.

local e, f, g = unpack (tabelaQualquer, 2, 4) -- Desempacota desde o segundo elemento até o quarto elemento, atribuindo cada um nas variáveis.
-- e será igual a 12.
-- f não receberá valor.
-- g será igual a true.

local h = unpack (tabelaQualquer) -- Desempacota todos os elementos, atribuindo o primeiro valor na variável. Os demais não possuem variáveis para serem atribuídos.
-- h será igual a "abc".

 

Voltando ao seu problema, por favor evite de censurar a imagem do erro, pois assim não tem como saber qual função específica está gerando erro. Além disso, ninguém se importa com o nome do seu script.

Você tem uma table com as coordenadas aleatórias onde o marker deve aparecer. Com o math.random vc seleciona uma dessas coordenadas e cria o marker nela. O unpack será usado para separar as coordenadas x, y, z em variáveis para poder criar o marker. Mas vale lembrar que não é obrigatório fazer com unpack, vou mostrar ambos os jeitos de ser feito:

local arr = {
    {2455.423, -2079.331, 12.547}, -- Item 1 da table arr
    {2458.529, -2078.655, 12.547}, -- Item 2 da table arr
    {2462.126, -2078.502, 12.547}, -- E assim por diante.
}

function test () -- Exemplo com unpack:
    local x, y, z = unpack (arr[math.random (#arr)]) -- Desempacota um item aleatório da table arr. Atribuindo seus valores nas variáveis.
    createMarker (x, y, z, "cylinder", 1.5, 50, 100, 255, 100)
end
addCommandHandler ("teste", test)

function test2 () -- Exemplo sem unpack:
    local indice = math.random (#arr) -- Gera um valor aleatório de 1 até 3 (pois 3 é o maior índice da table arr) [veja no próximo conteúdo oculto]
    local x = arr[indice][1] -- Atribui o primeiro valor do item aleatório no x.
    local y = arr[indice][2] -- Atribui o segundo valor do item aleatório no y.
    local z = arr[indice][3] -- Atribui o terceiro valor do item aleatório no z.
    -- Acima fiz basicamente o mesmo trabalho do unpack.
    createMarker (x, y, z, "cylinder", 1.5, 50, 100, 255, 100)
end
addCommandHandler ("testar", test2)
Spoiler

-- Sua table é interpretada pelo sistema da seguinte maneira:
local arr = {
    [1] = {
        [1] = 2455.423, -- Esse é o valor x do item 1.
        [2] = -2079.331, -- Esse é o valor y do item 1.
        [3] = 12.547 -- Esse é o valor z do item 1.
    },
    [2] = {
        [1] = 2458.529, -- Esse é o valor x do item 2.
        [2] = -2078.655, -- Esse é o valor y do item 2.
        [3] = 12.547 -- Esse é o valor z do item 2.
    },
    [3] = {
        [1] = 2462.126, -- Esse é o valor x do item 3.
        [2] = -2078.502, -- Esse é o valor y do item 3.
        [3] = 12.547 -- Esse é o valor z do item 3.
    }
}

-- Você pode, por exemplo, chamar os valores do item 2 usando arr[2][1], arr[2][2], arr[2][3].
--[[
Imagine isso como um jogo de batalha naval. Onde o primeiro valor é a linha e o segundo valor é a coluna da tabela.
-----X-----------Y---------Z-----
| 2455.423 | -2079.331 | 12.547 |
| 2458.529 | -2078.655 | 12.547 |
| 2462.126 | -2078.502 | 12.547 |
---------------------------------
A posição declarada é o valor que a tabela contém.
]]

 

 

Edited by Lord Henry
Correção do meu vacilo.
  • Like 1
Link to comment
21 hours ago, O.G Kash said:

Quando eu do o comando "/teste" (que no caso era pra criar um dos markers), aparece o seguinte erro:

zmhI6MU.png

Troque o trecho "table.unpack" por apenas "unpack". O MTA roda a versão 5.1 de Lua, sendo que o unpack só foi alterado para table.unpack na v5.2.

2 hours ago, Lord Henry said:

A função unpack não funciona dessa maneira. Ela serve para "desempacotar" uma table em valores separados. Ex:

E como foi usado ?

2 hours ago, Lord Henry said:

local arr = {
    {2455.423, -2079.331, 12.547}, -- Item 1 da table arr
    {2458.529, -2078.655, 12.547}, -- Item 2 da table arr
    {2462.126, -2078.502, 12.547}, -- E assim por diante.
}

function test () -- Exemplo com unpack:
    local x, y, z = unpack (arr, math.random (#arr)) -- Desempacota um item aleatório da table arr. Atribuindo seus valores nas variáveis.
    createMarker (x, y, z, "cylinder", 1.5, 50, 100, 255, 100)
end
addCommandHandler ("teste", test)

 

Ali estamos trabalhando com array multidimensional, fazendo unpack na tabela raiz retornara as tabelas filhas, e não os elementos "desempacotados" dessa sub-tabela.

local x, y, z = unpack (arr, math.random (#arr))
É igual à:
x = arr[math.random(#arr))
y = arr[math.random(#arr)+1)
... arr[#arr]

 

Edited by [M]ister
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...