Jump to content

[Resolvido] Tables


Recommended Posts

Eai galera, estou com uma duvida. Nao sei como são os comandos em tables, mais especificamente tenho essa table teste, no qual passei para ela todos os jogadores online.

function pegaTodosOnline()  
    local Teste= {} 
    for _,player in ipairs(getElementsByType("player")) do 
        table.insert(Teste, player) 
    end 
    return Teste 
end 

Entao sempre que chamar a função terei um retorno com uma table com todos players online, certo? Agora preciso guardar em uma variavel o primeiro elemento dessa player, ou seja, o primeiro player, pois minha meta é ir comparando esse primeiro player com todos os demais até pegar o que possui mais kills, para entao exibir o top killer. Meu pensamento está correto? e como eu pego o primeiro elemento da table Teste?

#Edit: tambem gostaria de saber o que é o #, exemplo #Teste, é para pegar o tamanho da table ou algo assim?

Obrigado!

Edited by Guest
Link to comment

Para pegar o primeiro elemento da tabela basta usar Teste[1], Você até pode calcular o "top killer" com um loop, Mas existe uma função exatamente para isso:

table.sort 

Ela ordena os elementos de uma tabela de acordo com uma função que você deve passar no segundo argumento:

--Imagine que você queira ordenar esta tabela: 
tabela = { 4, 1, 26, 8, 16, 18, 22, -6 } 
-- ... dos números maiores para os menores, Você usaria: 
  
table.sort (  
    tabela, -- primeiro argumento, a tabela que você quer ordenar 
    function ( a, b ) -- segundo argumento, a função que vai ordenar a tabela 
        -- a e b correspondem a algum item da tabela 
         
        -- com o > vamos ordenar do maior para o menor 
        -- com < fazemos o contrario (menor pro maior) 
         
        return a > b 
    end 
) 
  
-- se fizermos um loop agora podemos ver que a tabela já esta ordenada 
  
for k, v in ipairs ( tabela ) do 
    print ( k, v ) 
end 

Porem, O código acima não vai funcionar com a sua tabela (Porque os itens dela são jogadores e não numeros, sendo assim não podemos checar se um jogador é maior (>) que o outro), Então temos que fazer algo assim:

tabela = {}  
  
for _, v in ipairs ( getElementsByType ( "player" ) ) do  
    table.insert ( tabela, v ) 
end 
  
-- 
  
table.sort (  
    tabela, 
    function ( a, b ) 
        -- como a e b são itens da tabela sabemos que vão ser elementos (jogadores) 
        -- agora basta comparar as kills deles 
         
        return getElementData ( a, "kills" ) > getElementData ( b, "kills" ) 
    end 
) 

Com esse codigo tabela[1] vai ser o primeiro jogador com mais kills, tabela[2] o segundo etc, Se não entendeu tente ver a explicação no Manual da linguagem.

O # antes do 'nome' da tabela retorna o tamanho dela (no seu caso o total de jogadores no servidor).

Link to comment

Hmm entendi! Eu ja imaginava usar um getElementData para ir comparando eles, mas nao sabia desse table.sort.

Eu ia criar uma variavel e passar o kills do primeiro player pra ela e depois ir comparando ela com os kills de todos os outros da tabela, se nenhum fosse maior retornaria o primeiro, senao retornaria o maior. Mas esse jeito parece ser muito mais pratico.

Mais uma vez, muito obrigado!

edit: Esse return dentro do table.sort retorna eles ordenados para a tabela né?

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