O.G Kash Posted December 24, 2019 Share Posted December 24, 2019 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: Link to comment
[M]ister Posted December 24, 2019 Share Posted December 24, 2019 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
O.G Kash Posted December 24, 2019 Author Share Posted December 24, 2019 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: Link to comment
Other Languages Moderators Lord Henry Posted December 24, 2019 Other Languages Moderators Share Posted December 24, 2019 (edited) 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 December 25, 2019 by Lord Henry Correção do meu vacilo. 1 Link to comment
[M]ister Posted December 24, 2019 Share Posted December 24, 2019 (edited) 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: 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 December 24, 2019 by [M]ister Link to comment
Other Languages Moderators Lord Henry Posted December 25, 2019 Other Languages Moderators Share Posted December 25, 2019 Ah, perdão pelo vacilo. Corrigido. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now