---Keeps track of inventories on the client side. --@client cl_invtracker.lua --@alias q local inv = nrequire("inventory/inventory.lua") local itm = nrequire("item.lua") local log = nrequire("log.lua") -- nrequire("cl_loadglobals.lua") --local state = nrequire("cl_state.lua") local q = {} local known_inventories = {} local inventory_frames = {} local invsheet ---An array of all the known inventories. --@export q.known_inventories = known_inventories local drawfloatinginventory = function(id, inventory) --print("Drawing a floating inventory!") local frame = vgui.Create("DFrame") frame:SetPos( ScrW() - (ScrW() / 4), 0 ) frame:SetSize( ScrW() / 4, ScrH() / 4 ) frame:SetTitle( inventory.Name ) frame:SetDraggable( true ) local panel = vgui.Create("DPanel",frame) panel:Dock(FILL) if inventory.DrawOnDPanel then local prox = inventory:DrawOnDPanel(panel) frame.id = known_inventories[id]:AddObserver(prox) else error("Inventory needs a DrawOnDPanel method!") end frame:MakePopup() frame.OnClose = function(self) --print("Closeing chest id", id) --print("entity is", known_inventories[id].Owner) known_inventories[id]:RemoveObserver(self.id) net.Start("closechestinv") net.WriteEntity(known_inventories[id].Owner) net.SendToServer() known_inventories[id] = nil self:Remove() end end local drawsheeton = function(id,inventory,higharchy) --print("Drawing an inventory on a sheet!") if invsheet == nil then return end local tpanel = vgui.Create( "DPanel", invsheet ) --tpanel.Paint = function( self, w, h ) -- draw.RoundedBox( 4, 0, 0, w, h, Color( 0, 128, 255 ) ) --end if inventory.DrawOnDPanel then print("Has drawondpanel") local prox = inventory:DrawOnDPanel(tpanel) print("Prox returned was",prox) PrintTable(prox) known_inventories[id]:AddObserver(prox) print("Oservers is now") PrintTable(known_inventories[id].observers) end invsheet:AddSheet( inventory.Name, tpanel, "icon16/tab.png" ) end net.Receive("art_ObserveInventory",function() local id = net.ReadUInt(32) local inv_type = net.ReadString() local datalen = net.ReadUInt(32) local inital_data = net.ReadData(datalen) local ownent = net.ReadEntity() --An array of hiarchy local partof = net.ReadTable() assert(known_inventories[id] == nil, "Trying to observe the same inventory twice!",id) local tinv = inv.CreateInventoryFromData(inv_type,inital_data,ownent) tinv.id = id local cursor = known_inventories for k,v in pairs(partof) do cursor[v] = cursor[v] or {} cursor = cursor[v] end cursor[id] = tinv if id > 10 then drawfloatinginventory(id,tinv) hook.Call("OnSpawnMenuOpen") else drawsheeton(id,tinv) end end) net.Receive("art_UpdateInventory",function() local id = net.ReadUInt(32) local isput = net.ReadBool() local position = net.ReadTable() if isput then local item_name = net.ReadString() local item_data = net.ReadData(net.ReadUInt(32)) local item = itm.GetItemFromData(item_name,item_data) known_inventories[id]:Put(position,item) item.inv = known_inventories[id] --print("Inventorie's observers:") --PrintTable(known_inventories[id].observers) --print("Inventory is now") --PrintTable(known_inventories[id]) else known_inventories[id]:Remove(position) end end) net.Receive("art_CloseInventory",function() local id = net.ReadUInt(32) known_inventories[id] = nil if inventory_frames[id] then inventory_frames[id]:Close() inventory_frames[id] = nil end end) concommand.Add("PrintKnownInventories",function(ply,cmd,args) print("Printing known inventories") PrintTable(known_inventories) end) ---Drops an item. -- Client side only, will error if you try to use it server side --@tparam entity ent_or_tbl the entity that wants to drop the item --@tparam number invid The inventory number the entity wants to drop from --@tparam table frompos The position in the inventory the item was in. function q.DropItem(ent_or_tbl,invid,frompos) --[[ if type(ent_or_tbl) == "table" then drop_self(ent_or_tbl) else drop_provided(ent_or_tbl,invid,frompos) end ]] assert(CLIENT,"requested to drop an item when we are not the client!") log.debug("Drop item was requested, ent_or_tbl is" .. tostring(ent_or_tbl)) net.Start("art_RequestInvDrop") net.WriteEntity(ent_or_tbl) net.WriteUInt(invid,32) net.WriteTable(frompos) net.SendToServer() end return q