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/client/cl_inventory.lua | 64 ++++++-- gamemode/client/qpanels/inventory.lua | 194 ------------------------ gamemode/client/qpanels/prayers.lua | 170 --------------------- gamemode/client/qpanels/quests.lua | 31 ---- gamemode/client/qpanels/skills.lua | 10 -- gamemode/client/qtabs/cl_qinventory.lua | 1 + gamemode/config/sv_newplayer.lua | 4 +- 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 - gamemode/inventorysystem/prayers/cl_prayers.lua | 67 ++++++++ gamemode/inventorysystem/prayers/sh_prayers.lua | 13 +- gamemode/itemsystem/exampleitem.lua | 2 +- gamemode/itemsystem/testprayer.lua | 42 +++++ gamemode/shared/log.lua | 9 +- 20 files changed, 328 insertions(+), 435 deletions(-) delete mode 100644 gamemode/client/qpanels/inventory.lua delete mode 100644 gamemode/client/qpanels/prayers.lua delete mode 100644 gamemode/client/qpanels/quests.lua delete mode 100644 gamemode/client/qpanels/skills.lua create mode 100644 gamemode/core/inventory/cl_invtracker.lua create mode 100644 gamemode/inventorysystem/prayers/cl_prayers.lua create mode 100644 gamemode/itemsystem/testprayer.lua (limited to 'gamemode') diff --git a/gamemode/client/cl_inventory.lua b/gamemode/client/cl_inventory.lua index 92eae94..4e2545d 100644 --- a/gamemode/client/cl_inventory.lua +++ b/gamemode/client/cl_inventory.lua @@ -8,7 +8,7 @@ 3 - Skills 4 - Quests ]] -local qinv = nrequire("cl_qinventory.lua") +--local qinv = nrequire("cl_qinventory.lua") local state = nrequire("cl_state.lua") --Holds weather or not player is in inventory local itm = nrequire("core/inventory/common/items.lua") --local qpray = nrequire("cl_qprayers.lua") @@ -38,6 +38,8 @@ local creditslabel local droppanel --Dpanel to drop things on when they are dropped, should be the backmost panel, and cover the entire screen. inv.tabsheet = nil +local clt = nrequire("cl_invtracker.lua") + local player_data --The data the player needs to show the q panel net.Receive("art_load_player_data",function() --print("Got player data") @@ -49,6 +51,34 @@ net.Receive("art_load_player_data",function() --print("Credits was", credits) end) +local function CreateSheetTree(tabs,dpropertysheet) + print("Createing sheet tree!") + PrintTable(tabs) + for k,v in pairs(tabs) do + if type(k) == "string" then + print("Makeing inventory ", k) + local tsheet = vgui.Create( "DPropertySheet", dpropertysheet ) + dpropertysheet:AddSheet(k,tsheet,"icon16/user.png") + CreateSheetTree(v,tsheet) + elseif type(k) == "number" then + print("Makeing inventory number ", k) + local tsheet = vgui.Create("DPanel") + dpropertysheet:AddSheet(v.Name,tsheet,"icon16/user.png") + v:DrawOnDPanel(tsheet) + else + error("k was not a number or string, it was a " .. type(k)) + end + end + --local invsheet = qinv.CreateInventorySheet(inv.tabsheet) + --qpray.CreatePrayerSheet(tabsheet) + --invsheet.id = #qtabs + 1 + --qtabs[#qtabs + 1] = invsheet + --prasheet.id = #qtabs + 1 + --qtabs[#qtabs + 1] = prasheet + --inv.tabsheet:AddSheet("Inventory",invsheet,"icon16/user.png") + --tabsheet:AddSheet("Prayers",prasheet,"icon16/user.png") +end + local function BuildInventory() --print("Building inventory") if qframe and IsValid(qframe) then return end @@ -80,17 +110,10 @@ local function BuildInventory() creditstext:SetText("Credits:") creditstext:SetPos(100,5) - inv.tabsheet = vgui.Create("DPropertySheet",qframe) - inv.tabsheet:Dock(FILL) + local initalsheet = vgui.Create("DPropertySheet",qframe) + initalsheet:Dock(FILL) - local invsheet = qinv.CreateInventorySheet(inv.tabsheet) - --qpray.CreatePrayerSheet(tabsheet) - invsheet.id = #qtabs + 1 - qtabs[#qtabs + 1] = invsheet - --prasheet.id = #qtabs + 1 - --qtabs[#qtabs + 1] = prasheet - inv.tabsheet:AddSheet("Inventory",invsheet,"icon16/user.png") - --tabsheet:AddSheet("Prayers",prasheet,"icon16/user.png") + CreateSheetTree(clt.known_inventories,initalsheet) end @@ -139,13 +162,20 @@ local viewdistance = 100 local rotatespeed = 65 local bone = nil local previousheadscale = Vector(1,1,1) +local toggle_arteryview = true hook.Add("CalcView","ArteryInventoryView",function(ply,pos,ang,fov,nearz,farz) + if not toggle_arteryview then return end if bone == nil then bone = LocalPlayer():LookupBone("ValveBiped.Bip01_Head1") end local view = {} --view.origin = LocalPlayer():GetBonePosition(bone) + LocalPlayer():GetUp() * 2 - view.origin = pos + local tr = util.TraceLine({ + start = pos, + endpos = (ang:Forward() * -100) + pos, + filter = LocalPlayer() + }) + view.origin = tr.HitPos or (ang:Forward() * -100) + pos if state.invopen then local trot = math.rad(CurTime() * rotatespeed) local xoff = viewdistance * math.sin(trot) @@ -161,9 +191,17 @@ hook.Add("CalcView","ArteryInventoryView",function(ply,pos,ang,fov,nearz,farz) else LocalPlayer():ManipulateBoneScale(bone,previousheadscale) end - view.drawviewer = state.invopen + view.drawviewer = true--state.invopen return view end) +concommand.Add("delete_inventory",function(ply,cmd,args) + qframe = nil +end) + +concommand.Add("toggle_artery_view",function(ply,cmd,args) + toggle_arteryview = not toggle_arteryview +end) + return inv diff --git a/gamemode/client/qpanels/inventory.lua b/gamemode/client/qpanels/inventory.lua deleted file mode 100644 index 4dc5075..0000000 --- a/gamemode/client/qpanels/inventory.lua +++ /dev/null @@ -1,194 +0,0 @@ --- do return end --- local invfuncs --- invfuncs = ART.invfuncs --- --invfuncs = include("../gamemodes/artery/gamemode/shared/inventory_common.lua") --- --invfuncs = include("../shared/inventory_common.lua") --- assert(invfuncs ~= nil, "Dependency failed") --- --- local function createMenuFor(menu, tbl) --- for k,v in pairs(tbl) do --- if isfunction(v) then --This is a dead-end, add the menu --- local thisoption = menu:AddOption(k,v) --- else --Otherwise it should be a table, recursively call to create --- local submenu = menu:AddSubMenu(k) --- createMenuFor(submenu,v) --- end --- end --- end --- --- local function DrawBackpackOnDPanel(dp, backpack, backpacknum, tent) --- local width = ScrW() --- local height = ScrH() --- local slotsize = math.Round(width / 32) --- local backgrid = vgui.Create( "DGrid", dp ) --- backgrid:SetPos( 10, 30 ) --- backgrid:SetCols( backpack[2][1] ) --- backgrid:SetColWide( backpack[2][2] ) --- backgrid:Dock(FILL) --- for i = 1,#(backpack[1]) do --- for j = 1,#(backpack[1][i]) do --- local item = backpack[1][j][i] --- if type(backpack[1][j][i]) == "table" then --- local itemwidth = 0 --- for _,l in pairs(item.Shape) do --- itemwidth = math.Max(itemwidth,#l) --- end --- local itemheight = #item.Shape --- local invicon = vgui.Create( "DImageButton", dp ) --- invicon:SetSize(slotsize * itemwidth, slotsize * itemheight) --- invicon:SetPos(slotsize * (i - 1), slotsize * (j - 1)) --- invicon:SetText(item.Name) --- if item.Tooltip then --- invicon:SetTooltip(item.Tooltip) --- end --- if item.Paint then --- invicon.Paint = item.Paint --- end --- if item.DoOnPanel then --- item.DoOnPanel(invicon) --- end --- --invicon.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,100,0)) end --- invicon.DoClick = function() --- if not item.GetOptions then return end --- local menu = vgui.Create("DMenu") --- createMenuFor(menu,item:GetOptions()) --- menu:Open() --- end --- invicon.Item = item --- invicon.invpos = {j,i} --- invicon.ent = tent --- invicon.backpacknum = backpacknum --- invicon:Droppable("Inventory") --- elseif not backpack[1][j][i] then --- local emptyslot = vgui.Create("DPanel", dp) --- emptyslot:SetSize(slotsize,slotsize) --- emptyslot:SetPos(slotsize * (i - 1), slotsize * (j - 1)) --- --emptyslot.Paint = function(self, w, h) draw.RoundedBox(4, 0,0,w,h,Color(0,0,100)) end --- emptyslot:Receiver( "Inventory", function( receiver, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY ) --- if not isDropped then return end --- local icon = tableOfDroppedPanels[1] --- local item = icon.Item --- local curpos = icon.invpos --- --Set the shape it was at to false --- if not icon.wasequiped and icon.ent == tent then --- assert(curpos ~= nil, "print curpos was nil when not equiped") --- for k = 1,#item.Shape do --- for l = 1,#(item.Shape[k]) do --- if k == 1 and l == 1 then continue end --- backpack[1][curpos[1] + k - 1][curpos[2] + l - 1] = false --- end --- end --- backpack[1][curpos[1]][curpos[2]] = false --- end --- if invfuncs.CanFitInBackpack(backpack,j,i,item) then --- local fromtbl = icon.invpos --- local wasequiped = icon.wasequiped --- local ondropped = icon.ondropped --- if ondropped then --- ondropped(backpacknum,j,i,item) --- elseif wasequiped then --- net.Start("unequipitem") --- net.WriteString(wasequiped) --- net.WriteUInt(backpacknum,16) --- net.WriteUInt(i,16) --- net.WriteUInt(j,16) --- net.SendToServer() --- else --- net.Start("moveitem") --- net.WriteEntity(icon.ent) -- from ent --- net.WriteEntity(tent) -- to ent --- net.WriteUInt(icon.backpacknum,16) -- from backpack number --- net.WriteUInt(backpacknum,16) -- to backpack number --- net.WriteUInt(fromtbl[1],16) -- From position --- net.WriteUInt(fromtbl[2],16) --- net.WriteUInt(j,16) -- To position --- net.WriteUInt(i,16) --- net.SendToServer() --- if item.onEquip ~= nil then --- item:onEquip(LocalPlayer()) --- end --- end --- end --- end, {} ) --- end --- end --- end --- end --- --- local invsheetfunc = function() --- local width = ScrW() --- local height = ScrH() --- --- --- local invsheet = vgui.Create( "DPanel" ) --- --- invsheet.Paint = function( self, w, h ) end --- --- --Display gear --- local slotsize = math.Round(width / 32) --- local displaypos = { --- ["Head"] = {(width / 8) - slotsize, 25}, --- ["Body"] = {(width / 8) - slotsize, slotsize + 26}, --- ["Legs"] = {(width / 8) - slotsize, (slotsize * 2) + 27}, --- ["Boots"] = {(width / 8) - slotsize, (slotsize * 3) + 28}, --- ["Gloves"] = {(width / 8) + (slotsize), (slotsize * 2) + 27}, --- ["Left"] = {(width / 8) - (1.5 * slotsize), (slotsize * 4) + 29}, --- ["Right"] = {(width / 8) - (0.5 * slotsize), (slotsize * 4) + 29} --- } --- for k,v in pairs (LocalPlayer().Inventory.Equiped) do --- if v == false then --- local eqslot = vgui.Create( "DPanel", invsheet ) --- eqslot:SetSize( slotsize, slotsize ) --- eqslot:SetPos(displaypos[k][1],displaypos[k][2]) --- eqslot:Receiver( "Inventory", function( receiver, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY ) --- if not isDropped then return end --- print("Attempting to equip") --- local icon = tableOfDroppedPanels[1] --- local item = icon.Item --- if item.Equipable == k then --- net.Start("equipitem") --- net.WriteUInt(icon.backpacknum,16) -- Backpack number --- local fromtbl = icon.invpos --- net.WriteUInt(fromtbl[1],16) -- From position --- net.WriteUInt(fromtbl[2],16) --- net.WriteString(k) --- net.SendToServer() --- end --- end, {} ) --- else --- local eqslot = vgui.Create("DImageButton",invsheet) --- eqslot:SetSize(slotsize,slotsize) --- eqslot:SetPos(displaypos[k][1],displaypos[k][2]) --- if v.PaintEquiped then --- eqslot.Paint = v.PaintEquiped --- end --- if v.DoOnEquipPanel then --- v.DoOnEquipPanel(eqslot) --- end --- eqslot:Droppable("Inventory") --- eqslot.Item = v --- eqslot.wasequiped = k --- end --- end --- local moneylabel = vgui.Create("DLabel",invsheet) --- moneylabel:SetPos(0,0) --- moneylabel:SetSize(width/5,18) --- moneylabel:SetText(string.format("Credits:%7d", ART.Credits or 0)) --- print("Displaying credits:" .. string.format("Credits:%7d", ART.Credits or 0)) --- --- local backpacksheet = vgui.Create( "DPropertySheet", invsheet ) --- backpacksheet:SetPos(0,slotsize * 6) --- backpacksheet:SetSize((width / 4) - 26, height - (slotsize * 6) - 70) --- for k,v in pairs(LocalPlayer().Inventory.Backpacks) do --- local tbacksheet = vgui.Create( "DPanel", backpacksheet ) --- tbacksheet.Paint = function( self, w, h ) draw.RoundedBox( 4, 0, 0, w, h, Color( 157, 160, 167 ) ) end --- backpacksheet:AddSheet( v[3], tbacksheet, "icon16/cross.png" ) --- --- DrawBackpackOnDPanel(tbacksheet,v,k,LocalPlayer()) --- end --- --- return "Inventory", invsheet, "icon16/cross.png" --- end --- --- --- ART.RegisterInventorySheet(invsheetfunc) diff --git a/gamemode/client/qpanels/prayers.lua b/gamemode/client/qpanels/prayers.lua deleted file mode 100644 index 674d5d8..0000000 --- a/gamemode/client/qpanels/prayers.lua +++ /dev/null @@ -1,170 +0,0 @@ --- do return end --- local refreshboundprayers --- local infopart --- local prayersheet --- --- local function displaydefaulthelp(panel) --- local ll = vgui.Create("DLabel",panel) --- ll:Dock(FILL) --- ll:SetWrap(true) --- ll:SetDark(true) --- ll:SetText("Oh no! It looks like this dosen't have any help text yet!") --- end --- --- local function createprayericon(parrent,prayer,equiped,place) --- --- local width = ScrW() --- local height = ScrH() --- --- local ret = vgui.Create("DButton",parrent) --- ret:SetText(prayer) --- ret:SetWrap(true) --- ret:SetSize(64,64) --- local prayertbl = ART.GetPrayerByName(prayer) --- assert(prayertbl ~= nil, "Could not find an appropriate prayer!") --- if prayertbl.Paint then --- ret.Paint = prayertbl.Paint --- end --- if prayertbl.DoOnPanel then --- prayertbl.DoOnPanel(ret) --- end --- if equiped then --- ret.DoClick = function(self) --- self:Remove() --- ART.PrayerEquiped[place] = false --- refreshboundprayers() --- infopart:Remove() --- infopart = vgui.Create("DPanel") --- infopart:SetSize( (width / 4) - 10, height / 3) --- infopart:SetPos(0, height * 2 / 3) --- prayersheet:Add(infopart) --- end --- else --- ret:Droppable("PrayerBind") --- ret.PrayerName = prayer --- ret:SetSize(64,64) --- ret.DoClick = function(self) --- infopart:Remove() --- infopart = vgui.Create("DPanel") --- infopart:SetSize( (width / 4) - 10, height / 3) --- prayersheet:Add(infopart) --- local rettbl = ART.GetPrayerByName(prayer) --- if rettbl.DisplayHelp ~= nil then --- rettbl.DisplayHelp(infopart) --- else --- displaydefaulthelp(infopart) --- end --- end --- end --- return ret --- end --- --- local function createreceiver(parrent,num) --- local prayerbut = vgui.Create( "DPanel", parrent ) --- local prayerlabel = vgui.Create("DLabel",prayerbut) --- prayerlabel:SetText( "F" .. num ) --- prayerlabel.Paint = function( self, w, h ) end --- prayerlabel:SetWrap(true) --- prayerlabel:SetDark(true) --- prayerlabel:Dock(FILL) --- prayerbut:Dock(FILL) --- prayerbut:Receiver( "PrayerBind", function( self, tableOfDroppedPanels, isDropped, menuIndex, mouseX, mouseY ) --- if not isDropped then return end --- local pname = tableOfDroppedPanels[1].PrayerName --- print("Prayer name:") --- print(pname) --- ART.PrayerEquiped[num] = pname --- print("Prayer bound to " .. num) --- prayerbut:Remove() --- createprayericon(parrent,pname,true,num) --- end) --- end --- --- local function displayboundprayers(panel) --- --- local width = ScrW() --- local height = ScrH() --- --- local prayerbindgrid = nil --- --- refreshboundprayers = function() --- --- if prayerbindgrid ~= nil then prayerbindgrid:Remove() end --- --- prayerbindgrid = vgui.Create("DGrid") --- prayerbindgrid:SetPos(height * (2 / 3),5) --- prayerbindgrid:SetSize((width / 4) - 20, height / 3) --- prayerbindgrid:SetColWide(64) --- prayerbindgrid:SetRowHeight(64) --- function prayerbindgrid:Paint(w,h) --- draw.RoundedBox( 8, 0, 0, w, h, Color( 0, 255, 0 ) ) --- end --- --- for k,v in pairs(ART.PrayerEquiped) do --- local but = vgui.Create( "DPanel", prayerbindgrid ) --- but:SetSize(64, 64) --- if v ~= false then --- createprayericon(but,v,true,k) --- else --- createreceiver(but,k) --- end --- prayerbindgrid:AddItem(but) --- end --- panel:Add(prayerbindgrid) --- end --- refreshboundprayers() --- end --- --- ART.RegisterInventorySheet(function() --- --- local width = ScrW() --- local height = ScrH() --- --- prayersheet = vgui.Create( "DListLayout") --- --- local prayergridscroll = vgui.Create("DScrollPanel") --- prayergridscroll:SetSize( (width / 4) - 20, height / 3 ) --- prayergridscroll:SetPos( 5, 5 ) --- prayersheet:Add(prayergridscroll) --- local prayergrid = vgui.Create( "DGrid", prayergridscroll ) --- prayergrid:SetPos( 5 , 5 ) --- prayergrid:Dock(FILL) --- --- prayergrid:SetCols( (width / 4) / 64 ) --- prayergrid:SetColWide( 64 ) --- prayergrid:SetRowHeight(64) --- prayergridscroll:AddItem(prayergrid) --- --- for k,v in pairs(ART.MyPrayer) do --- print("Displaying prayer:" .. k) --- print("Type:" .. type(k)) --- if k == "" then --- ART.MyPrayer[k] = nil --- end --- local but = createprayericon(prayergrid,k,false,nil) --- prayergrid:AddItem(but) --- end --- --- displayboundprayers(prayersheet) --- --- infopart = vgui.Create("DPanel") --- infopart:SetSize( (width / 4) - 10, height / 3) --- infopart:SetPos(0, height * 2 / 3) --- prayersheet:Add(infopart) --- --- return "Prayers", prayersheet, "icon16/tick.png" --- end) --- --- hook.Add("Think","art_prayer_keybinds",function() --- local mapping = { --- KEY_F1, --- KEY_F2, --- KEY_F3, --- KEY_F4, --- } --- for k,v in pairs(mapping) do --- if input.IsKeyDown(v) and ART.PrayerEquiped[k] then --- ART.GetPrayerByName(ART.PrayerEquiped[k]).Pray() --- end --- end --- end) diff --git a/gamemode/client/qpanels/quests.lua b/gamemode/client/qpanels/quests.lua deleted file mode 100644 index eda9e31..0000000 --- a/gamemode/client/qpanels/quests.lua +++ /dev/null @@ -1,31 +0,0 @@ --- do return end --- --- ART.RegisterInventorySheet(function() --- --- local width = ScrW() --- local height = ScrH() --- --- local questsheet = vgui.Create( "DPanel") --- questsheet.Paint = function(self,w,h) end --- --- --Display quests --- local questselector = vgui.Create( "DScrollPanel", questsheet ) --- questselector:SetSize((width / 4) - 20, (height / 2) - 40) --- questselector:SetPos(0,0) --- local questinfo = vgui.Create("DScrollPanel", questsheet) --- questinfo:SetSize(width / 4, height / 2) --- questinfo:SetPos(0,height / 2) --- for k,v in pairs(LocalPlayer().Quests or {}) do --- print("Displaying quest:" .. k) --- local questbutton = vgui.Create( "DButton" , questselector ) --- questbutton:Dock(TOP) --- questbutton:SetText(k) --- questbutton.DoClick = function() --- print("At point of clicking, art is:") --- PrintTable(ART) --- ART.GetQuest(k).DrawQuestInfo(questinfo,v) --- end --- end --- --- return "Quests", questsheet, "icon16/house.png" --- end) diff --git a/gamemode/client/qpanels/skills.lua b/gamemode/client/qpanels/skills.lua deleted file mode 100644 index 1904445..0000000 --- a/gamemode/client/qpanels/skills.lua +++ /dev/null @@ -1,10 +0,0 @@ --- do return end --- --- --- ART.RegisterInventorySheet(function() --- --- local skillsheet = vgui.Create( "DPanel" ) --- skillsheet.Paint = function( self, w, h ) end --- --- return "Skills", skillsheet, "icon16/tick.png" --- end) diff --git a/gamemode/client/qtabs/cl_qinventory.lua b/gamemode/client/qtabs/cl_qinventory.lua index 1e1ceb3..32fd441 100644 --- a/gamemode/client/qtabs/cl_qinventory.lua +++ b/gamemode/client/qtabs/cl_qinventory.lua @@ -1,6 +1,7 @@ --[[ One of the tabs in the inventory ]] +do return end local inv = nrequire("inventory/inventory.lua") local itm = nrequire("item.lua") --local state = nrequire("cl_state.lua") diff --git a/gamemode/config/sv_newplayer.lua b/gamemode/config/sv_newplayer.lua index 2a2f7d3..931cf60 100644 --- a/gamemode/config/sv_newplayer.lua +++ b/gamemode/config/sv_newplayer.lua @@ -6,10 +6,10 @@ np.newdata = function() return { inventories = { {"Equipment", inv.CreateInventory("Equipment"):Serialize()}, - {"Shaped Inventory",inv.CreateInventory("Shaped Inventory"):Serialize()} + {"Shaped Inventory",inv.CreateInventory("Shaped Inventory"):Serialize()}, + {"Prayers",inv.CreateInventory("Prayers"):Serialize()} }, skills = {}, - prayers = {}, quests = {}, } end 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") diff --git a/gamemode/inventorysystem/prayers/cl_prayers.lua b/gamemode/inventorysystem/prayers/cl_prayers.lua new file mode 100644 index 0000000..aba778e --- /dev/null +++ b/gamemode/inventorysystem/prayers/cl_prayers.lua @@ -0,0 +1,67 @@ + +local pray = {} + +local explain +pray.activeprayers = {} +function pray:DrawOnDPanel(panel) + print("Attempted to draw prayer panel") + --Active grid + local agrid = vgui.Create("DGrid",panel) + agrid:SetCols(4) + local w = ((ScrW()/4) - 10) / 4 + agrid:SetHeight(w) + agrid:SetColWide(w) + agrid:SetRowHeight(w) + for i=1,4 do + local rec = vgui.Create("DImageButton",agrid) + rec:SetText("F"..i) + rec:SetSize(w,w) + rec.DoClick = function(s) + local ap = self.activeprayers[i] + explain:SetText(ap ~= nil and ap.Description or "Select a prayer") + end + agrid:AddItem(rec) + end + agrid:Dock(TOP) + --Explanation of spells + local explainpanel = vgui.Create("DPanel",panel) + explainpanel:SetHeight(w*2) + explainpanel:Dock(TOP) + explainpanel:SetText("This panel will explain information about a hovered skill") + explain = vgui.Create("DLabel",explainpanel) + explain:Dock(FILL) + explain:SetDark(true) + --All spells we know + local scroll = vgui.Create( "DScrollPanel", panel ) + scroll:Dock( FILL ) + local grid = vgui.Create("DGrid",scroll) + grid:SetCols(4) + grid:SetColWide(w) + grid:SetRowHeight(w) + for k,v in pairs(self.track) do + local rec = vgui.Create("DImageButton",grid) + rec:SetText(v.Name) + rec:SetSize(w,w) + if(v.DoOnPanel) then + v:DoOnPanel(rec) + end + grid:AddItem(rec) + end +end + +--Rebind f1, f2, f3, f4 to prayers +local prayerhooks = { + ["gm_showhelp"] = 1, + ["gm_showteam"] = 2, + ["gm_showspare1"] = 3, + ["gm_showspare2"] = 4 +} +hook.Add("PlayerBindPress", function( ply, bind, pressed ) + local phn = prayerhooks[bind] + if phn == nil then return end + local pap = pray.activeprayers[phn] + if pap == nil then return end + pap:pray() +end) + +return pray diff --git a/gamemode/inventorysystem/prayers/sh_prayers.lua b/gamemode/inventorysystem/prayers/sh_prayers.lua index 83414b7..15cd2af 100644 --- a/gamemode/inventorysystem/prayers/sh_prayers.lua +++ b/gamemode/inventorysystem/prayers/sh_prayers.lua @@ -1,7 +1,16 @@ +--[[ + prayers must have a "Pray" method, + a "Name" string, + a "Description" string +]] local reg = nrequire("inventory/inventory.lua") local itm = nrequire("item.lua") local inv = {} +if CLIENT then + inv = nrequire("cl_prayers.lua") +end + inv.Name = "Prayers" inv.track = {} function inv:FindPlaceFor(item) @@ -42,12 +51,14 @@ function inv:Serialize() end function inv:DeSerialize(str) + local cpy = table.Copy(self) local tbl = util.JSONToTable(str) local i = 1 for k,v in pairs(tbl) do local this_prayer = itm.GetItemByName(k):DeSerialize(v) - self:Put({i},this_prayer) + cpy:Put({i},this_prayer) end + return cpy end diff --git a/gamemode/itemsystem/exampleitem.lua b/gamemode/itemsystem/exampleitem.lua index 6beb1f6..d7af511 100644 --- a/gamemode/itemsystem/exampleitem.lua +++ b/gamemode/itemsystem/exampleitem.lua @@ -7,7 +7,7 @@ local item = {} item.Name = "Test item" --Optional, a tooltip to display when hovered over -item.Tooltip = "An old axe, probably good for fighting." +item.Tooltip = "An example item. Copy this file\nand edit it to make your own items!" --Required Returns the data needed to rebuild this item, should only contain the minimum data nessessary since this gets sent over the network item.Serialize = function(self) diff --git a/gamemode/itemsystem/testprayer.lua b/gamemode/itemsystem/testprayer.lua new file mode 100644 index 0000000..3cdb52e --- /dev/null +++ b/gamemode/itemsystem/testprayer.lua @@ -0,0 +1,42 @@ +--[[ + An example item +]] +local item = {} + +--Required, a name, all item names must be unique +item.Name = "Test prayer" + +--Optional, a tooltip to display when hovered over +item.Tooltip = "A test prayer" +item.Description = "This is a test prayer\nYou can equip it!" + +--Required Returns the data needed to rebuild this item, should only contain the minimum data nessessary since this gets sent over the network +item.Serialize = function(self) + print("Trying to serailize!") + return "" +end + +--Required, Rebuilds the item from data created in Serialize, if the item is different from the "main" copy of the item, it should retun a tabl.Copy(self), with the appropriate fields set. +item.DeSerialize = function(self,string) + print("Trying to deserialize!") + return self +end + +--Optional. Something run once when this item is drawn in a backpack +function item.DoOnPanel(self,dimagebutton) + dimagebutton:SetImage("icon16/bomb.png") +end + +--Optional, what to do when the player clicks, and this item is in the slot in inventory. only works for items equipable in left and right +item.onClick = function(self,owner) + print("pew pew!") +end + +--Client-side only +item.Pray = function(self) + print("I prayed with a test item!") +end + +--Don't forget to register the item! +local itm = nrequire("item.lua") +itm.RegisterItem(item) diff --git a/gamemode/shared/log.lua b/gamemode/shared/log.lua index ad5da46..92bb349 100644 --- a/gamemode/shared/log.lua +++ b/gamemode/shared/log.lua @@ -10,7 +10,7 @@ log.debug = fn.compose( ), fn.curry( string.format, - "[DEBUG] %s" + "[DEBUG] %s\n" ) ) @@ -21,7 +21,7 @@ log.info = fn.compose( ), fn.curry( string.format, - "[INFO] %s" + "[INFO] %s\n" ) ) @@ -30,10 +30,9 @@ log.warn = fn.compose( MsgC, col.console.yellow ), - debug.traceback, fn.curry( - ErrorNoHalt, - "[WARNING]" + string.format, + "[WARNING] %s\n" ) ) -- cgit v1.2.3-70-g09d2