Мне трудно понять, почему мой код ведет себя так, как он есть. У меня есть таблица с именем игроков, структурированная как ключ, пары значений. Значения также являются вложенными таблицами (элементами). Каждый элемент должен содержать хотя бы один уникальный идентификатор с именем «id», содержащийся во вложенной таблице (имя ключа) «specs».
players = {
['identifier_one'] = {
{
["label"] = "Flashlight",
["weight"] = 1,
["name"] = "WEAPON_FLASHLIGHT",
["specs"] = {
["pockets"] = false,
["id"] = "ZT345", --This is our unique identifier
["equip"] = true,
["stack"] = 1,
["craft"] = true
}
},
{
["label"] = "Flashlight",
["weight"] = 1,
["name"] = "WEAPON_FLASHLIGHT",
["specs"] = {
["pockets"] = false,
["id"] = "ACF124",
["equip"] = true,
["stack"] = 1,
["craft"] = true
}
}
},
['another_item'] = {
...
},
}
Я правильно записал структуру данных. Однако, когда я вставляю новый вложенный элемент, он добавляет новый элемент к следующему приращению в таблице, как и ожидалось, и в то же время перезаписывает все предыдущие индексы. Таким образом, предыдущие элементы ['spe c'] ['id'] становятся идентификатором newItem, если это имеет смысл? Итак, если посмотреть на макет выше, предыдущий идентификатор «ZT345» станет «ACF124». Таким образом, делая два предмета идентичными.
Когда я распечатываю, из чего состоит newItem, все идеально и должно записываться в таблицу, как задумано. Сначала я подумал, что это может быть связано с кодированием таблицы в json при записи в базу данных. Однако, если я распечатываю таблицу Players [identifier], после вставки newItem она перезаписывает все предыдущие индексы. Поэтому я почти уверен, что проблема заключается в добавлении newItem в мои плееры [идентификатор]
Мой код выглядит следующим образом:
ESX.RegisterServerCallback('zombie-inventory:itemCheck', function(source, cb, item)
--check our item is allowed to be added.
if items[item] then
local src = source
local identifier = getIdentifier(src)
local newItem = items[item]
if string.match(item, 'WEAPON') then
newItem['specs'][1].id = genId(players[identifier])
end
--This point is where the code falls apart.
table.insert(players[identifier], newItem)
MySQL.Async.execute('UPDATE `user_inventory` SET `inventory` = @inventory WHERE `identifier` = @identifier', {
['@identifier'] = identifier,
['@inventory'] = json.encode(players[identifier])
})
cb(true)
else
print(('[inventory] [^3WARNING^7] invalid item for itemCheck cb: %s'):format(item))
end
end)
Просто добавьте, функция genId () 100% возвращая уникальный идентификатор, я напечатал идентификатор много раз, и он всегда отличается.