From da81a0a23a3704dd2de3ab2249496c1ad1912d1c Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Mon, 9 Oct 2017 16:20:46 -0400 Subject: Updated internal representation of inventories --- gamemode/core/combat/cl_damage.lua | 3 +- gamemode/core/database/sv_queries.lua | 4 +- gamemode/core/dataloader/cl_loadglobals.lua | 2 + gamemode/core/inventory/cl_invtracker.lua | 121 ++++++++++++++++++++++++++++ gamemode/core/inventory/inventory.lua | 1 + gamemode/core/inventory/item.lua | 2 +- gamemode/core/inventory/sv_invtracker.lua | 22 ++++- gamemode/core/mapstich/sv_mapstich.lua | 1 - 8 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 gamemode/core/inventory/cl_invtracker.lua (limited to 'gamemode/core') diff --git a/gamemode/core/combat/cl_damage.lua b/gamemode/core/combat/cl_damage.lua index 5059588..a45cb72 100644 --- a/gamemode/core/combat/cl_damage.lua +++ b/gamemode/core/combat/cl_damage.lua @@ -3,11 +3,12 @@ local drawables = {} net.Receive("art_damage_ent",function() - print("Notified of damage") + --print("Notified of damage") local who = net.ReadEntity() local dmg = net.ReadDouble() --A random vector in the entity + if not IsValid(who) then return end local aa,bb = who:WorldSpaceAABB() local mr = math.random local rx,ry,rz = mr(aa.x,bb.x),mr(aa.y,bb.y),mr(aa.z,bb.z) diff --git a/gamemode/core/database/sv_queries.lua b/gamemode/core/database/sv_queries.lua index f059b44..07b54ac 100644 --- a/gamemode/core/database/sv_queries.lua +++ b/gamemode/core/database/sv_queries.lua @@ -8,6 +8,7 @@ local track = nrequire("core/inventory/sv_invtracker.lua") local q = {} function q.serialize_player(ply) + if not IsValid(ply) and ply.data and ply.data.inventories then return "" end local sdata = {} local invs = {} for k,v in pairs(ply.data.inventories) do @@ -26,6 +27,7 @@ end function q.deserialize_player(ply,str) track.ClearInventories(ply) ply.data = ply.data or {} + ply.data.inventories = ply.data.inventories or {} local tbl = util.JSONToTable(str) local invs = tbl.inventories print("Inventories was", invs) @@ -33,10 +35,10 @@ function q.deserialize_player(ply,str) for k,v in pairs(invs) do print("Giveing inventory",v[1],v[2]) track.GiveInventoryWithData(ply,v[1],v[2]) + print("Gave inventory ", v[1]) end ply.data.skills = tbl.skills or {} ply.data.quests = tbl.quests or {} - ply.data.prayers = tbl.prayers or {} ply.data.credits = tbl.credits or 100 print("After deserializeing player, their .data is",ply.data) PrintTable(ply.data) diff --git a/gamemode/core/dataloader/cl_loadglobals.lua b/gamemode/core/dataloader/cl_loadglobals.lua index 2cf770c..3c15e63 100644 --- a/gamemode/core/dataloader/cl_loadglobals.lua +++ b/gamemode/core/dataloader/cl_loadglobals.lua @@ -4,6 +4,7 @@ net.Receive("artery_respondfile",function() local filetext = net.ReadString() local dirname = string.GetPathFromFilename(filename) file.CreateDir("artery/client/files/" .. dirname) + assert(#filetext > 0, "Retreived a size 0 file: " .. filename) file.Write("artery/client/files/" .. filename,filetext) CompileString(filetext,filename)() end) @@ -25,6 +26,7 @@ net.Receive("artery_loadfile",function() net.WriteString(filename) net.SendToServer() else + assert(#cache > 0, "File was size 0 on: " .. filename) CompileString(cache,filename)() end end) diff --git a/gamemode/core/inventory/cl_invtracker.lua b/gamemode/core/inventory/cl_invtracker.lua new file mode 100644 index 0000000..258a271 --- /dev/null +++ b/gamemode/core/inventory/cl_invtracker.lua @@ -0,0 +1,121 @@ +--[[ + One of the tabs in the inventory +]] +local inv = nrequire("inventory/inventory.lua") +local itm = nrequire("item.lua") +--local state = nrequire("cl_state.lua") + +local q = {} + +local known_inventories = {} +local inventory_frames = {} +local invsheet +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() + print("Got call to observe inventory") + 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() + --print("Putting ", item_name, "into inventory ",id, " at position") + --PrintTable(position) + local item_data = net.ReadData(net.ReadUInt(32)) + local item = itm.GetItemFromData(item_name,item_data) + known_inventories[id]:Put(position,item) + --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) + PrintTable(known_inventories) +end) + +return q diff --git a/gamemode/core/inventory/inventory.lua b/gamemode/core/inventory/inventory.lua index b96d168..c9bf6da 100644 --- a/gamemode/core/inventory/inventory.lua +++ b/gamemode/core/inventory/inventory.lua @@ -154,6 +154,7 @@ function inv.CreateInventoryFromData(name,data,owner) local ret = tinv:DeSerialize(data) --print("is now",tinv) --PrintTable(tinv) + assert(ret != nil, "Failed to create inventory " .. name .. ", returned nil") return ret end diff --git a/gamemode/core/inventory/item.lua b/gamemode/core/inventory/item.lua index 80e2a88..2eb2fb3 100644 --- a/gamemode/core/inventory/item.lua +++ b/gamemode/core/inventory/item.lua @@ -40,7 +40,7 @@ function itm.RegisterItem(tbl) end function itm.GetItemByName(name) - assert(type(name) == "string",string.format("Attempted to get an item by name with a %s.")) + 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 diff --git a/gamemode/core/inventory/sv_invtracker.lua b/gamemode/core/inventory/sv_invtracker.lua index 537d61d..7df4175 100644 --- a/gamemode/core/inventory/sv_invtracker.lua +++ b/gamemode/core/inventory/sv_invtracker.lua @@ -102,11 +102,11 @@ end) function track.ClearInventories(ply) ply.data = {} - ply.data.inventories = {} end --Updates the client side inventory whenever the inventory is updated server side function track.MakeInventoryObserver(ply,invid) + print("Making observer...") local observer = {} observer.Put = function(self,pos,item) print("In observer, item was", item) @@ -129,6 +129,7 @@ function track.MakeInventoryObserver(ply,invid) net.WriteTable(pos) net.Send(ply) end + print("Returning observer...") return observer end @@ -141,10 +142,12 @@ function track.NotifyPlayerOfInventory(ply,tinv) net.WriteData(initaldat,#initaldat) print("Before sending, inv owner is", tinv.Owner, "and type is",tinv.Name) net.WriteEntity(tinv.Owner) + net.WriteTable({}) net.Send(ply) end -function track.GiveInventoryTo(ply,name) +function track.GiveInventoryTo(ply,name,higharchy) + local hi = higharchy or {} local i = inv.CreateInventory(name) i.Owner = ply local nid = #ply.data.inventories + 1 @@ -160,25 +163,36 @@ function track.GiveInventoryTo(ply,name) net.WriteUInt(#dat,32) net.WriteData(dat,#dat) net.WriteEntity(i.Owner) + net.WriteTable(hi) net.Send(ply) end -function track.GiveInventoryWithData(ply,name,data) +function track.GiveInventoryWithData(ply,name,data,higharchy) + local hi = higharchy or {} print("Giveing inventory with data") local i = inv.CreateInventoryFromData(name,data,ply) + print("Created inventory track",ply,ply.data,ply.data.inventories) local nid = #ply.data.inventories + 1 + print("got nid") local observer = track.MakeInventoryObserver(ply,nid) + print("Made observer for", i) i.id = nid i:AddObserver(observer) + print("Added observer") ply.data.inventories[nid] = i - + print("About to tell client to observe") net.Start("art_ObserveInventory") net.WriteUInt(nid,32) net.WriteString(name) net.WriteUInt(#data,32) net.WriteData(data,#data) net.WriteEntity(ply) + net.WriteTable(hi) + print("About to send...") net.Send(ply) + + print("Finished giving inventory with data, ply.data is now ", ply.data) + PrintTable(ply.data) end diff --git a/gamemode/core/mapstich/sv_mapstich.lua b/gamemode/core/mapstich/sv_mapstich.lua index 6a2ae38..ff84fca 100644 --- a/gamemode/core/mapstich/sv_mapstich.lua +++ b/gamemode/core/mapstich/sv_mapstich.lua @@ -43,7 +43,6 @@ concommand.Add("artery_saveplayer",function(ply,cmd,args) end) net.Receive("art_zonechange",function(len,ply) - SavePlayerData(ply) timer.Simple(0.5,function() if not IsValid(ply) then return end local zone = ply:GetCurrentZone("artery_serverchange") -- cgit v1.2.3-70-g09d2