diff options
Diffstat (limited to 'gamemode/core/inventory')
| -rw-r--r-- | gamemode/core/inventory/inventory.lua | 14 | ||||
| -rw-r--r-- | gamemode/core/inventory/item.lua | 4 | ||||
| -rw-r--r-- | gamemode/core/inventory/sv_invtracker.lua | 80 |
3 files changed, 91 insertions, 7 deletions
diff --git a/gamemode/core/inventory/inventory.lua b/gamemode/core/inventory/inventory.lua index 59c2bba..f6e8f9c 100644 --- a/gamemode/core/inventory/inventory.lua +++ b/gamemode/core/inventory/inventory.lua @@ -50,8 +50,8 @@ local inventories = {} --Master list local function DefaultAddObserver(self,tbl) if self.observers == nil then self.observers = {} end - self.observers[#observers + 1] = tbl - return #observers + self.observers[#self.observers + 1] = tbl + return #self.observers end local function DefaultRemoveObserver(self,observer_id) for i = observer_id, #self.observers do @@ -98,7 +98,7 @@ function inv.RegisterInventory(tbl) string.format("Attempted to register inventory with field %q of type %q when it should have been %q",v[1],type(tbl[v[1]]),v[2])) end assert(inventories[tbl.Name] == nil, - "Attempted to register 2 inventories with the same name") + "Attempted to register 2 inventories with the same name:" .. tbl.Name) assert((tbl.AddObserver == nil and tbl.RemoveObserver == nil) or (tbl.AddObserver ~= nil and tbl.RemoveObserver ~= nil), "AddObserver and RemoveObserver must be defined in pairs") @@ -106,17 +106,19 @@ function inv.RegisterInventory(tbl) SetDefaultObservers(tbl) end inventories[tbl.Name] = tbl - log.debug("Registered item: " .. tbl.Name) + log.debug("Registered inventory: " .. tbl.Name .. "\n") end --Create an inventory function inv.CreateInventory(name) - return table_copy(inventories[name]) + print("Createing inventory", name) + 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"))) + return TableCopy(inventories[name]) end --Recreates an inventory from data function inv.CreateInventoryFromData(name,data) - return create_inventory(name):DeSerialize(data) + return inv.CreateInventory(name):DeSerialize(data) end --Must be called in a coroutine. diff --git a/gamemode/core/inventory/item.lua b/gamemode/core/inventory/item.lua index ef6ec1d..86bd105 100644 --- a/gamemode/core/inventory/item.lua +++ b/gamemode/core/inventory/item.lua @@ -18,6 +18,8 @@ Items may also have methods from one or more interfaces registered with RegisterInterface ]] local log = nrequire("log.lua") +print("in item.lua, log is:") +PrintTable(log) local itm = {} local required_fields = { @@ -30,7 +32,7 @@ function itm.RegisterItem(tbl) assert(tbl[v] ~= nil, string.format("Attempted to register item without field %q",v)) end assert(items[tbl.Name] == nil, string.format("Attempted to register 2 items with the same name %q",tbl.Name)) - log.debug("Registered item: " .. tbl.Name) + log.debug("Registered item: " .. tbl.Name .. "\n") end function itm.GetItemByName(name) diff --git a/gamemode/core/inventory/sv_invtracker.lua b/gamemode/core/inventory/sv_invtracker.lua new file mode 100644 index 0000000..3bb2b37 --- /dev/null +++ b/gamemode/core/inventory/sv_invtracker.lua @@ -0,0 +1,80 @@ +--[[ + some accessability functions +]] + +local inv = nrequire("inventory/inventory.lua") +local itm = nrequire("item.lua") + +for k,v in pairs({ + "art_ObserveInventory", + "art_UpdateInventory", + "art_CloseInventory", + "art_load_player_data", + "art_RequestInvMove", +}) do util.AddNetworkString(v) end +--[[ +net.Receive("art_ObserveInventory",function() + local id = net.ReadUInt(32) + local inv_type = net.ReadString() + local inital_data = net.ReadData(net.ReadUInt(32)) + known_inventories[id] = inv.CreateInventoryFromData(inv_type,initaldata) +end) +]] + +--[[ + Moves an item from one position to another, format: + froment ::entity + toent ::entity + frominvid ::int32 + toinvid ::int32 + frompos ::table + topos ::table +]] +net.Receive("art_RequestInvMove",function(len,ply) + print("ply",ply,"requested inv move") + local froment,toent = net.ReadEntity(),net.ReadEntity() + local frominvid,toinvid = net.ReadUInt(32),net.ReadUInt(32) + local frompos,topos = net.ReadTable(),net.ReadTable() + --Make sure the player is not stealing! + assert(not (froment:IsPlayer() and toent:IsPlayer()), "Tried to move item between players!") + assert(froment.data ~= nil and froment.data.inventories ~= nil and froment.data.inventories[frominvid] ~= nil, "From entity did not have that inventory!") + assert(toent.data ~= nil and toent.data.inventories ~= nil and toent.data.inventories[toinvid] ~= nil, "To entity did not have that inventory!") + local frominv = froment.data.inventories[frominvid] + local toinv = toent.data.inventories[toinvid] + local item = frominv:Get(frompos) + assert(item ~= nil, "Could not find an item at that position!") + assert(toinv:CanFitIn(topos,item), "Could not fit the item in that position!") + --If we've gotten here without error, we're all good! Move the item! + frominv:Remove(frompos) + toinv:Put(topos) +end) + +local slots = { + "inv_Head", + "inv_Shoulders", + "inv_Chest", + "inv_Arms", + "inv_Hands", + "inv_Legs", + "inv_Belt", + "inv_Feet", + "inv_Back", +} + +concommand.Add("SendMeData",function(ply,cmd,args) + local i = inv.CreateInventory("Equipment") + if not ply.data then ply.data = {} end + if not ply.data.inventories then ply.data.inventories = {} end + ply.data.inventories[1] = i + net.Start("art_ObserveInventory") + net.WriteUInt(1,32) + net.WriteString("Equipment") + local data = i:Serialize() + net.WriteUInt(#data,32) + net.WriteData(data,#data) + net.Send(ply) + + net.Start("art_load_player_data") + net.WriteTable({}) + net.Send(ply) +end) |
