From d2868db28210b8c4debab2b70dca2833d582fdfd Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Fri, 23 Mar 2018 15:20:30 -0400 Subject: Refactored the inventory system Inventory system now uses flyweight pattern with metatables. --- gamemode/core/inventory/inventory.lua | 20 ++++++++++++++------ gamemode/core/inventory/item.lua | 22 +++++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) (limited to 'gamemode/core') diff --git a/gamemode/core/inventory/inventory.lua b/gamemode/core/inventory/inventory.lua index d97f5be..ff9cc8c 100644 --- a/gamemode/core/inventory/inventory.lua +++ b/gamemode/core/inventory/inventory.lua @@ -149,10 +149,16 @@ end -- Consider carefully if you want to use this method, or the CreateInventoryFromData method. --@see invtbl --@tparam string name The name of the inventory type when it was registered -function inv.CreateInventory(name) +function inv.CreateInventory(name,initstr) --print("Createing inventory", name) + initstr = initstr or "" assert(inventories[name] ~= nil, string.format("Tried to create a copy of inventory that does not exist:%s\nValid inventories are:\n\t%s",name,table.concat(table.GetKeys(inventories),"\n\t"))) - local ret = TableCopy(inventories[name]) + local ret_m = { + __index = inventories[name] + } + local ret = {} + setmetatable(ret,ret_m) + ret:DeSerialize(initstr) ret.observers = {} return ret end @@ -177,10 +183,12 @@ end concommand.Add("artery_printinventories", function(ply,cmd,args) PrintTable(inventories) end) -concommand.Add("artery_printmyinventories",function(ply,cmd,args) - print("Inventories of:",ply:Nick()) - PrintTable(ply.data.inventories) -end) +if SERVER then + concommand.Add("artery_printmyinventories",function(ply,cmd,args) + print("Inventories of:",ply:Nick()) + PrintTable(ply.data.inventories) + end) +end ---To Be Depriciated. function inv.DeriveInventory(name) diff --git a/gamemode/core/inventory/item.lua b/gamemode/core/inventory/item.lua index 79f9ad5..16b30dd 100644 --- a/gamemode/core/inventory/item.lua +++ b/gamemode/core/inventory/item.lua @@ -41,7 +41,7 @@ function itm.RegisterItem(tbl) if items[tbl.Name] ~= nil then log.warn(string.format("Attempted to register 2 items with the same name: %q, overwriteing previous",tbl.Name)) else - log.info(string.format("Registered item %s",tbl.Name)) + --log.info(string.format("Registered item %s",tbl.Name)) end items[tbl.Name] = tbl --print("Registered item: " .. tbl.Name) @@ -54,11 +54,13 @@ end function itm.GetItemByName(name) assert(type(name) == "string",string.format("Attempted to get an item by name with a %s.",type(name))) assert(items[name] ~= nil,string.format("Attempted to get item with invalid name %q Valid item names are:\n\t%s",name,table.concat(table.GetKeys(items),"\n\t"))) - local item - if items[name].init then - item = items[name]:init() - else - item = table.Copy(items[name]) + local item_m = { + __index = items[name] + } + local item = {} + setmetatable(item,item_m) + if item.init then + item:init() end return item end @@ -70,7 +72,13 @@ end --@treturn itemtbl The item that was deserialized function itm.GetItemFromData(name,data) assert(items[name] ~= nil,string.format("Attempted to get item with invalid name %q",name)) - return items[name]:DeSerialize(data) + local ret_m = { + __index = items[name] + } + local ret = {} + setmetatable(ret,ret_m) + ret:DeSerialize(data) + return ret end local function printitems() -- cgit v1.2.3-70-g09d2