Friend asked me about code to keep ‘auto loot lists’ in storage. So player can configure few lists of items and then just switch between them, when he goes to other spawn with different loot.
-- config
local listsStartStorage = 550000000
local maximumListsCount = 10
local maximumElementsPerList = 100
-- variables for calculations
local listOffset = maximumElementsPerList + 1
function lists_getLists(player)
local result = {}
for i = 1, maximumListsCount do
result[i] = lists_getListElementsCount(player, i)
end
return result
end
function lists_getListElementsCount(player, listId)
local startStorage = listsStartStorage + listOffset * listId
return math.max(0, player:getStorage(startStorage))
end
function lists_getListElements(player, listId)
local result = {}
local startStorage = listsStartStorage + listOffset * listId
local listElementsCount = lists_getListElementsCount(player, listId)
for i = startStorage + 1, startStorage + listElementsCount do
table.insert(result, player:getStorage(i))
end
return result
end
function lists_removeAllListElements(player, listId)
local startStorage = listsStartStorage + listOffset * listId
local listElementsCount = lists_getListElementsCount(player, listId)
for i = startStorage + 1, startStorage + listElementsCount + 1 do
player:setStorage(i, -1)
end
player:setStorage(startStorage, -1)
end
function lists_getListElement(player, listId, elementKey)
local elementStorage = listsStartStorage + listOffset * listId + elementKey
return player:getStorage(elementStorage)
end
local function lists_assertListId(listId)
assert(listId >= 1, 'minimum list id is 1')
assert(listId <= maximumListsCount, 'maximum list id is 1' .. maximumListsCount)
end
local function lists_assertElementKey(elementKey)
assert(elementKey >= 1, 'minimum list element id is 1')
assert(elementKey <= maximumElementsPerList, 'maximum list element id is ' .. maximumElementsPerList)
end
-- this is for internal use only, should not be used by user
local function lists_setListElement(player, listId, elementKey, elementValue)
lists_assertListId(listId)
lists_assertElementKey(elementKey)
local elementStorage = listsStartStorage + listOffset * listId + elementKey
player:setStorage(elementStorage, elementValue)
end
-- this is for internal use only, should not be used by user
local function lists_setListElementsCount(player, listId, count)
lists_assertListId(listId)
lists_assertElementKey(count)
local startStorage = listsStartStorage + listOffset * listId
player:setStorage(startStorage, count)
end
function lists_addListElement(player, listId, elementValue)
local elements = lists_getListElements(player, listId)
for k, v in pairs(elements) do
if v == elementValue then
return
end
end
local elementsCount = lists_getListElementsCount(player, listId)
lists_setListElement(player, listId, elementsCount + 1, elementValue)
lists_setListElementsCount(player, listId, elementsCount + 1)
end
function lists_removeListElement(player, listId, elementValue)
local elements = lists_getListElements(player, listId)
local elementToRemovePosition = nil
for k, v in pairs(elements) do
if v == elementValue then
elementToRemovePosition = k
break
end
end
if elementToRemovePosition then
local elementsCount = lists_getListElementsCount(player, listId)
for i = elementToRemovePosition + 1, elementsCount do
local nextElementValue = lists_getListElement(player, listId, i)
lists_setListElement(player, listId, i - 1, nextElementValue)
end
lists_setListElement(player, listId, elementsCount, -1)
lists_setListElementsCount(player, listId, elementsCount - 1)
end
end
-- config
local listsStartStorage = 550000000
local maximumListsCount = 10
local maximumElementsPerList = 100
-- variables for calculations
local listOffset = maximumElementsPerList + 1
function lists_getLists(player)
local result = {}
for i = 1, maximumListsCount do
result[i] = lists_getListElementsCount(player, i)
end
return result
end
function lists_getListElementsCount(player, listId)
local startStorage = listsStartStorage + listOffset * listId
return math.max(0, player:getStorage(startStorage))
end
function lists_getListElements(player, listId)
local result = {}
local startStorage = listsStartStorage + listOffset * listId
local listElementsCount = lists_getListElementsCount(player, listId)
for i = startStorage + 1, startStorage + listElementsCount do
table.insert(result, player:getStorage(i))
end
return result
end
function lists_removeAllListElements(player, listId)
local startStorage = listsStartStorage + listOffset * listId
local listElementsCount = lists_getListElementsCount(player, listId)
for i = startStorage + 1, startStorage + listElementsCount + 1 do
player:setStorage(i, -1)
end
player:setStorage(startStorage, -1)
end
function lists_getListElement(player, listId, elementKey)
local elementStorage = listsStartStorage + listOffset * listId + elementKey
return player:getStorage(elementStorage)
end
local function lists_assertListId(listId)
assert(listId >= 1, 'minimum list id is 1')
assert(listId <= maximumListsCount, 'maximum list id is 1' .. maximumListsCount)
end
local function lists_assertElementKey(elementKey)
assert(elementKey >= 1, 'minimum list element id is 1')
assert(elementKey <= maximumElementsPerList, 'maximum list element id is ' .. maximumElementsPerList)
end
-- this is for internal use only, should not be used by user
local function lists_setListElement(player, listId, elementKey, elementValue)
lists_assertListId(listId)
lists_assertElementKey(elementKey)
local elementStorage = listsStartStorage + listOffset * listId + elementKey
player:setStorage(elementStorage, elementValue)
end
-- this is for internal use only, should not be used by user
local function lists_setListElementsCount(player, listId, count)
lists_assertListId(listId)
lists_assertElementKey(count)
local startStorage = listsStartStorage + listOffset * listId
player:setStorage(startStorage, count)
end
function lists_addListElement(player, listId, elementValue)
local elements = lists_getListElements(player, listId)
for k, v in pairs(elements) do
if v == elementValue then
return
end
end
local elementsCount = lists_getListElementsCount(player, listId)
lists_setListElement(player, listId, elementsCount + 1, elementValue)
lists_setListElementsCount(player, listId, elementsCount + 1)
end
function lists_removeListElement(player, listId, elementValue)
local elements = lists_getListElements(player, listId)
local elementToRemovePosition = nil
for k, v in pairs(elements) do
if v == elementValue then
elementToRemovePosition = k
break
end
end
if elementToRemovePosition then
local elementsCount = lists_getListElementsCount(player, listId)
for i = elementToRemovePosition + 1, elementsCount do
local nextElementValue = lists_getListElement(player, listId, i)
lists_setListElement(player, listId, i - 1, nextElementValue)
end
lists_setListElement(player, listId, elementsCount, -1)
lists_setListElementsCount(player, listId, elementsCount - 1)
end
end
-- config local listsStartStorage = 550000000 local maximumListsCount = 10 local maximumElementsPerList = 100 -- variables for calculations local listOffset = maximumElementsPerList + 1 function lists_getLists(player) local result = {} for i = 1, maximumListsCount do result[i] = lists_getListElementsCount(player, i) end return result end function lists_getListElementsCount(player, listId) local startStorage = listsStartStorage + listOffset * listId return math.max(0, player:getStorage(startStorage)) end function lists_getListElements(player, listId) local result = {} local startStorage = listsStartStorage + listOffset * listId local listElementsCount = lists_getListElementsCount(player, listId) for i = startStorage + 1, startStorage + listElementsCount do table.insert(result, player:getStorage(i)) end return result end function lists_removeAllListElements(player, listId) local startStorage = listsStartStorage + listOffset * listId local listElementsCount = lists_getListElementsCount(player, listId) for i = startStorage + 1, startStorage + listElementsCount + 1 do player:setStorage(i, -1) end player:setStorage(startStorage, -1) end function lists_getListElement(player, listId, elementKey) local elementStorage = listsStartStorage + listOffset * listId + elementKey return player:getStorage(elementStorage) end local function lists_assertListId(listId) assert(listId >= 1, 'minimum list id is 1') assert(listId <= maximumListsCount, 'maximum list id is 1' .. maximumListsCount) end local function lists_assertElementKey(elementKey) assert(elementKey >= 1, 'minimum list element id is 1') assert(elementKey <= maximumElementsPerList, 'maximum list element id is ' .. maximumElementsPerList) end -- this is for internal use only, should not be used by user local function lists_setListElement(player, listId, elementKey, elementValue) lists_assertListId(listId) lists_assertElementKey(elementKey) local elementStorage = listsStartStorage + listOffset * listId + elementKey player:setStorage(elementStorage, elementValue) end -- this is for internal use only, should not be used by user local function lists_setListElementsCount(player, listId, count) lists_assertListId(listId) lists_assertElementKey(count) local startStorage = listsStartStorage + listOffset * listId player:setStorage(startStorage, count) end function lists_addListElement(player, listId, elementValue) local elements = lists_getListElements(player, listId) for k, v in pairs(elements) do if v == elementValue then return end end local elementsCount = lists_getListElementsCount(player, listId) lists_setListElement(player, listId, elementsCount + 1, elementValue) lists_setListElementsCount(player, listId, elementsCount + 1) end function lists_removeListElement(player, listId, elementValue) local elements = lists_getListElements(player, listId) local elementToRemovePosition = nil for k, v in pairs(elements) do if v == elementValue then elementToRemovePosition = k break end end if elementToRemovePosition then local elementsCount = lists_getListElementsCount(player, listId) for i = elementToRemovePosition + 1, elementsCount do local nextElementValue = lists_getListElement(player, listId, i) lists_setListElement(player, listId, i - 1, nextElementValue) end lists_setListElement(player, listId, elementsCount, -1) lists_setListElementsCount(player, listId, elementsCount - 1) end end
TESTS:
Player = {}
function Player:new()
o = {storages = {}}
setmetatable(o, self)
self.__index = self
return o
end
function Player.getStorage(self, k)
if (self.storages[k]) then
return self.storages[k]
end
return -1
end
function Player.setStorage(self, k, v)
if (v == -1) then
v = nil
end
self.storages[k] = v
end
function Player.dumpStorages(self)
local storages = 'storages: '
for k, v in pairs(self.storages) do
storages = storages .. k .. '=' .. v .. ', '
end
print(storages)
end
local function printPlayerListsElementsCount(player)
local playerLists = lists_getLists(player)
for k, v in pairs(playerLists) do
local listElementsString = ''
for k2, v2 in pairs(lists_getListElements(player, k)) do
listElementsString = listElementsString .. ' ' .. k2 .. '=' .. v2 .. ', '
end
print ('list', k, 'elements', v, 'values', listElementsString)
end
end
player = Player:new()
print()
player:dumpStorages()
print('start - empty list')
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_addListElement(player, 2, 2001)
lists_addListElement(player, 2, 2002)
print('added 2 elements to list 2')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_addListElement(player, 1, 1001)
lists_addListElement(player, 1, 1002)
lists_addListElement(player, 1, 1003)
lists_addListElement(player, 1, 1004)
lists_addListElement(player, 1, 1005)
print('added 5 elements to list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1001)
print('removed first element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1005)
print('removed last element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1003)
print('removed middle element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeAllListElements(player, 1)
print('removed all elements from list 1')
player:dumpStorages()
Player = {}
function Player:new()
o = {storages = {}}
setmetatable(o, self)
self.__index = self
return o
end
function Player.getStorage(self, k)
if (self.storages[k]) then
return self.storages[k]
end
return -1
end
function Player.setStorage(self, k, v)
if (v == -1) then
v = nil
end
self.storages[k] = v
end
function Player.dumpStorages(self)
local storages = 'storages: '
for k, v in pairs(self.storages) do
storages = storages .. k .. '=' .. v .. ', '
end
print(storages)
end
local function printPlayerListsElementsCount(player)
local playerLists = lists_getLists(player)
for k, v in pairs(playerLists) do
local listElementsString = ''
for k2, v2 in pairs(lists_getListElements(player, k)) do
listElementsString = listElementsString .. ' ' .. k2 .. '=' .. v2 .. ', '
end
print ('list', k, 'elements', v, 'values', listElementsString)
end
end
player = Player:new()
print()
player:dumpStorages()
print('start - empty list')
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_addListElement(player, 2, 2001)
lists_addListElement(player, 2, 2002)
print('added 2 elements to list 2')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_addListElement(player, 1, 1001)
lists_addListElement(player, 1, 1002)
lists_addListElement(player, 1, 1003)
lists_addListElement(player, 1, 1004)
lists_addListElement(player, 1, 1005)
print('added 5 elements to list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1001)
print('removed first element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1005)
print('removed last element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeListElement(player, 1, 1003)
print('removed middle element from list 1')
player:dumpStorages()
printPlayerListsElementsCount(player)
print()
player:dumpStorages()
lists_removeAllListElements(player, 1)
print('removed all elements from list 1')
player:dumpStorages()
Player = {} function Player:new() o = {storages = {}} setmetatable(o, self) self.__index = self return o end function Player.getStorage(self, k) if (self.storages[k]) then return self.storages[k] end return -1 end function Player.setStorage(self, k, v) if (v == -1) then v = nil end self.storages[k] = v end function Player.dumpStorages(self) local storages = 'storages: ' for k, v in pairs(self.storages) do storages = storages .. k .. '=' .. v .. ', ' end print(storages) end local function printPlayerListsElementsCount(player) local playerLists = lists_getLists(player) for k, v in pairs(playerLists) do local listElementsString = '' for k2, v2 in pairs(lists_getListElements(player, k)) do listElementsString = listElementsString .. ' ' .. k2 .. '=' .. v2 .. ', ' end print ('list', k, 'elements', v, 'values', listElementsString) end end player = Player:new() print() player:dumpStorages() print('start - empty list') printPlayerListsElementsCount(player) print() player:dumpStorages() lists_addListElement(player, 2, 2001) lists_addListElement(player, 2, 2002) print('added 2 elements to list 2') player:dumpStorages() printPlayerListsElementsCount(player) print() player:dumpStorages() lists_addListElement(player, 1, 1001) lists_addListElement(player, 1, 1002) lists_addListElement(player, 1, 1003) lists_addListElement(player, 1, 1004) lists_addListElement(player, 1, 1005) print('added 5 elements to list 1') player:dumpStorages() printPlayerListsElementsCount(player) print() player:dumpStorages() lists_removeListElement(player, 1, 1001) print('removed first element from list 1') player:dumpStorages() printPlayerListsElementsCount(player) print() player:dumpStorages() lists_removeListElement(player, 1, 1005) print('removed last element from list 1') player:dumpStorages() printPlayerListsElementsCount(player) print() player:dumpStorages() lists_removeListElement(player, 1, 1003) print('removed middle element from list 1') player:dumpStorages() printPlayerListsElementsCount(player) print() player:dumpStorages() lists_removeAllListElements(player, 1) print('removed all elements from list 1') player:dumpStorages()
You can paste code and tests to online tool like: https://www.tutorialspoint.com/execute_lua_online.php