Jump to content

table.remove dentro de um for "pulando" index


ber

Recommended Posts

Posted (edited)

Estou com um grande problema no meu sistema de inventário, não consegui pensar em uma solução até o momento. Preciso fazer um sistema de resetar o inventário do player através de comando ou quando o mesmo morrer, tentei mais ou menos desta maneira:

ItensNaoRemoviveis = {
  ["identidade"] = true,
  ["porte"] = true,
  ["cnh"] = true,
  ["ak47natal"] = true,
}
inventario = {
  [1] = {"hamburguer", 2},
  [2] = {"suco", 3},
  [3] = {"glock", 5},
  [4] = {"kit_reparo", 2},
}

function teste()
  for i, v in pairs(inventario) do
    local item = inventario[i][1]
    if not ItensNaoRemoviveis[item] then
      table.remove(i)
    end
  end
end
addCommandHandler("test", teste)

Porém, quando usa o table.remove, ele "deleta" o index atual e acaba puxando o próximo pro lugar dele, ai quando o loop roda novamente, ele vai para o próximo index do loop, ignorando o que foi "movido".

Usar o bom e velho 'nil' não é viável nessa situação pois se setar o inventario inteiro como nil, o jogador perde itens como documentos, skins de armas compradas na loja, etc. e se setar o inventario[index] como nil, o próximo item que será adicionado através do table.insert irá "pular" este campo vazio e será adicionado depois da última linha "válida" da tabela, e quando chegar no limite de slots do inventario (30), ele não vai mais acrescentar item e vai retornar uma mensagem de erro, mesmo tendo os espaços vazios feitos pelo nil.

inventario = nil
inventario[i] = nil

 

Edited by ber
Posted
ItensNaoRemoviveis = {
  ["identidade"] = true,
  ["porte"] = true,
  ["cnh"] = true,
  ["ak47natal"] = true,
}

inventario = {
  {"hamburguer", 2},
  {"suco", 3},
  {"glock", 5},
  {"kit_reparo", 2}
}

function teste()
    for i=#inventario,1,-1 do
        local item = inventario[i][1]
        if not ItensNaoRemoviveis[item] then
            table.remove(inventario,i)
        end
    end
end
addCommandHandler("test", teste)

testa ae!

  • Thanks 1
Posted

No for, tenta usar "ipairs" no lugar de "pairs". pairs varre a tabela em modo aleatório, ipairs em modo sequencial, não sei se vai funcionar mas vale a pena tentar...

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