Jump to content

Inventário usando elementData irá pesar o servidor?


Recommended Posts

Estou fazendo um inventário no estilo desses Húngaros, porém como não tenho conhecimento nenhum sobre sql e pouco sobre tabelas, resolvi usar o bom e velho elementData. Porém ficou a dúvida se iria ter problemas em relação ao desempenho/processamento desses dados, pois teria slots para 20 itens diferentes nesse inventário e todos com os dados armazenados através de elementData. Eu teria problemas com isso? Se sim, a única saída seria usando tabelas?

Link to comment
  • Other Languages Moderators

Use tabelas. O inventário não precisa renderizar toda hora o valor de um certo item, basta atualizá-lo quando o jogador pegar/remover o item. Dará um pouco mais de trabalho, mas no final, o servidor sai ganhando.

Link to comment
2 hours ago, andreisrww said:

Use tabelas. O inventário não precisa renderizar toda hora o valor de um certo item, basta atualizá-lo quando o jogador pegar/remover o item. Dará um pouco mais de trabalho, mas no final, o servidor sai ganhando.

Então se eu fizer um refresh que puxa todos os elementData do inventário apenas quando o player logar e puxar o elementData de apenas um item apenas quando este item for usado, já vai fazer uma diferença ou é quase a mesma coisa?

Edited by ber
Link to comment
  • Other Languages Moderators

Fará diferença. Além do mais, se eu entendi bem, isso daria ainda mais trabalho e aumentaria a carga do servidor kkk. Na minha concepção, você teria dois trabalhos. Melhor tabelas.

Link to comment
19 hours ago, andreisrww said:

Fará diferença. Além do mais, se eu entendi bem, isso daria ainda mais trabalho e aumentaria a carga do servidor kkk. Na minha concepção, você teria dois trabalhos. Melhor tabelas.

Se eu for utilizar tabelas então, eu começaria basicamente assim: 

Itens = {
  suco = {},
  refrigerante = {},
  hamburguer = {},
}

ou eu precisaria declarar o player/source depois da tabela de Itens?

Link to comment
  • Other Languages Moderators

Você precisa sim indexar o jogador à tabela. Ficaria mais ou menos assim:

Spoiler

local playerInventory = {}

function findItemById(inventory, id)
    if inventory and type(inventory) == "table" then
        local foundItem
        local itemId = tonumber(id)

        if itemId then
            for _, data in pairs(inventory) do
                if data[1] == itemId then
                    foundItem = data
                    break
                end
            end

            return foundItem
        end
    end

    return false
end

addCommandHandler("addItem", function(thePlayer, command, ...)
    if not playerInventory[thePlayer] then
        playerInventory[thePlayer] = {}
    end

    local args = {...}

    if #args > 0 then
        local itemId = math.random(9, 99999) -- Não é importante aqui, mas no client-side seria interessante adicionarmos um ID, para facilitar a remoção do item do inventário ou qualquer outra ação.
        local itemName = tostring(args[1])
        local itemAmount = tonumber(args[2])

        if itemName and itemAmount then
            table.insert(playerInventory[thePlayer], {itemId, itemName, itemAmount})
            outputChatBox("Novo item adicionado ao seu inventário! ID: " .. itemId, thePlayer)
        else
            outputChatBox("/addItem <name> <amount>", thePlayer)
        end
    end
end)

addCommandHandler("removeItem", function(thePlayer, command, ...)
    if not playerInventory[thePlayer] then
        return outputChatBox("Você não possui um inventário ainda.", thePlayer)
    end

    local args = {...}

    if #args > 0 then
        local itemId = tonumber(args[1])

        if itemId then
            local item = findItemById(playerInventory[thePlayer], itemId)

            if item then
                local itemName = item[2]
                local itemAmount = item[3]

                if itemAmount - 1 <= 0 then
                    for i, v in pairs(playerInventory[thePlayer]) do
                        if v == item then
                            table.remove(playerInventory[thePlayer], i)
                            break
                        end
                    end

                    outputChatBox("Item " .. itemName .. " removido do seu inventário!", thePlayer)
                else
                    item[3] = itemAmount - 1
                    outputChatBox("Item " .. itemName .. " agora possui " .. item[3] .. " unidade(s)!", thePlayer)
                end
            end
        else
            outputChatBox("/removeItem <id>", thePlayer)
        end
    end
end)

 

 

Link to comment
1 hour ago, andreisrww said:

Você precisa sim indexar o jogador à tabela. Ficaria mais ou menos assim:

  Hide contents


 
local playerInventory = {}

function findItemById(inventory, id)
    if inventory and type(inventory) == "table" then
        local foundItem
        local itemId = tonumber(id)

        if itemId then
            for _, data in pairs(inventory) do
                if data[1] == itemId then
                    foundItem = data
                    break
                end
            end

            return foundItem
        end
    end

    return false
end

addCommandHandler("addItem", function(thePlayer, command, ...)
    if not playerInventory[thePlayer] then
        playerInventory[thePlayer] = {}
    end

    local args = {...}

    if #args > 0 then
        local itemId = math.random(9, 99999) -- Não é importante aqui, mas no client-side seria interessante adicionarmos um ID, para facilitar a remoção do item do inventário ou qualquer outra ação.
        local itemName = tostring(args[1])
        local itemAmount = tonumber(args[2])

        if itemName and itemAmount then
            table.insert(playerInventory[thePlayer], {itemId, itemName, itemAmount})
            outputChatBox("Novo item adicionado ao seu inventário! ID: " .. itemId, thePlayer)
        else
            outputChatBox("/addItem <name> <amount>", thePlayer)
        end
    end
end)

addCommandHandler("removeItem", function(thePlayer, command, ...)
    if not playerInventory[thePlayer] then
        return outputChatBox("Você não possui um inventário ainda.", thePlayer)
    end

    local args = {...}

    if #args > 0 then
        local itemId = tonumber(args[1])

        if itemId then
            local item = findItemById(playerInventory[thePlayer], itemId)

            if item then
                local itemName = item[2]
                local itemAmount = item[3]

                if itemAmount - 1 <= 0 then
                    for i, v in pairs(playerInventory[thePlayer]) do
                        if v == item then
                            table.remove(playerInventory[thePlayer], i)
                            break
                        end
                    end

                    outputChatBox("Item " .. itemName .. " removido do seu inventário!", thePlayer)
                else
                    item[3] = itemAmount - 1
                    outputChatBox("Item " .. itemName .. " agora possui " .. item[3] .. " unidade(s)!", thePlayer)
                end
            end
        else
            outputChatBox("/removeItem <id>", thePlayer)
        end
    end
end)

 

 

Tentei fazer assim mas não deu certo: 

function onPlayerLogin(_, playeraccount)
	if (playeraccount) then
		if getAccountData(playeraccount, "Inventario") == nil then
			Itens[source] = {
				suco = 0,
				refrigerante = 0,
				whisky = 0,
				burrito = 0,
				pizza = 0,
				hamburguer = 0,
				celular = 0,
				capacete = 0,
				kit_reparo = 0,
				analgesico = 0,
				c4 = 0,
				maconha = 0,
				cocaina = 0,
				semente = 0,
				folha = 0,
				presente = 0,
				cigarro = 0,
				gasolina = 0,
			}
		else
			Itens[source] = fromJSON(getAccountData(playeraccount, "Inventario"))
		end
		triggerClientEvent(source, "RefreshClient", source, Itens[source])
	end
end
addEventHandler("onPlayerLogin", getRootElement(), onPlayerLogin)
function receiveFromServer(table)
	burrito = Itens[source].burrito
	pizza = Itens[source].pizza
	hamburguer = Itens[source].hamburguer
	suco = Itens[source].suco
	refrigerante = Itens[source].refrigerante
	whisky = Itens[source].whisky
	celular = Itens[source].celular
	capacete = Itens[source].capacete
	analgesico = Itens[source].analgesico
	kit_reparo = Itens[source].kit_reparo
	gasolina = Itens[source].gasolina
	cigarro = Itens[source].cigarro
	c4 = Itens[source].c4
	maconha = Itens[source].maconha
	cocaina = Itens[source].cocaina
	semente = Itens[source].semente
	folha = Itens[source].folha
	presente = Itens[source].presente
end
addEvent("RefreshClient", true)
addEventHandler("RefreshClient", root, receiveFromServer)

tentei usando os próprios dados da tabela e não foi, aí tentei declarar assim e também não foi... :/ 

Link to comment
3 hours ago, andreisrww said:

Preste mais atenção em seu código.

Já reli o código diversas vezes, o problema é que eu não tenho conhecimento mesmo sobre tabelas... O que eu estou fazendo de errado ali?

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