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
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()
You can paste code and tests to online tool like: https://www.tutorialspoint.com/execute_lua_online.php