diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2018-03-23 15:20:30 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2018-03-23 15:20:30 -0400 |
| commit | d2868db28210b8c4debab2b70dca2833d582fdfd (patch) | |
| tree | 17ad5beb46e3b1c3c17d520a71a4c1ea12c47f51 /gamemode/inventorysystem | |
| parent | a7f7bed257dd96b1027c6343cd59eea4eee9fc3b (diff) | |
| download | artery-d2868db28210b8c4debab2b70dca2833d582fdfd.tar.gz artery-d2868db28210b8c4debab2b70dca2833d582fdfd.tar.bz2 artery-d2868db28210b8c4debab2b70dca2833d582fdfd.zip | |
Refactored the inventory system
Inventory system now uses flyweight pattern with metatables.
Diffstat (limited to 'gamemode/inventorysystem')
| -rw-r--r-- | gamemode/inventorysystem/equipment/sh_equipment.lua | 10 | ||||
| -rw-r--r-- | gamemode/inventorysystem/equipment/sv_equipment.lua | 16 | ||||
| -rw-r--r-- | gamemode/inventorysystem/prayers/cl_prayers.lua | 20 | ||||
| -rw-r--r-- | gamemode/inventorysystem/prayers/sh_prayers.lua | 9 | ||||
| -rw-r--r-- | gamemode/inventorysystem/quests/cl_quests.lua | 62 | ||||
| -rw-r--r-- | gamemode/inventorysystem/quests/sh_quests.lua | 69 | ||||
| -rw-r--r-- | gamemode/inventorysystem/shapedinventory/cl_shaped.lua | 3 | ||||
| -rw-r--r-- | gamemode/inventorysystem/shapedinventory/sh_shaped.lua | 7 | ||||
| -rw-r--r-- | gamemode/inventorysystem/skills/sh_skills.lua | 10 |
9 files changed, 180 insertions, 26 deletions
diff --git a/gamemode/inventorysystem/equipment/sh_equipment.lua b/gamemode/inventorysystem/equipment/sh_equipment.lua index 5bea682..b27dd08 100644 --- a/gamemode/inventorysystem/equipment/sh_equipment.lua +++ b/gamemode/inventorysystem/equipment/sh_equipment.lua @@ -117,16 +117,14 @@ inv.Serialize = function(self) end inv.DeSerialize = function(self,data) - if data == nil or data == '' then - return table.Copy(self) - end + self.equiped = {} local tbl = util.JSONToTable(data) - local cpy = table.Copy(self) + tbl = tbl or {} for k,v in pairs(tbl) do local te = itm.GetItemByName(v[1]):DeSerialize(v[2]) - cpy:Put({k},te) + self:Put({k},te) end - return cpy + return self end inventory.RegisterInventory(inv) diff --git a/gamemode/inventorysystem/equipment/sv_equipment.lua b/gamemode/inventorysystem/equipment/sv_equipment.lua index 2189122..6c28674 100644 --- a/gamemode/inventorysystem/equipment/sv_equipment.lua +++ b/gamemode/inventorysystem/equipment/sv_equipment.lua @@ -1,5 +1,21 @@ --[[ Needed so the includer dosn't freak out ]] +for k,v in pairs({ + "materials/svg/delapouite/originals/svg/000000/transparent/ring.svg", + "materials/svg/lorc/originals/svg/000000/transparent/cracked-helm.svg", + "materials/svg/skoll/originals/svg/000000/transparent/pauldrons.svg", + "materials/svg/willdabeast/deviations/svg/000000/transparent/chain-mail.svg", + "materials/svg/lorc/originals/svg/000000/transparent/knapsack.svg", + "materials/svg/skoll/originals/svg/000000/transparent/bracers.svg", + "materials/svg/lucasms/equipment/svg/000000/transparent/belt.svg", + "materials/svg/delapouite/originals/svg/000000/transparent/gloves.svg", + "materials/svg/sbed/originals/svg/000000/transparent/shield.svg", + "materials/svg/delapouite/originals/svg/000000/transparent/thor-hammer.svg", + "materials/svg/irongamer/originals/svg/000000/transparent/armored-pants.svg", + "materials/svg/lorc/originals/svg/000000/transparent/boots.svg", +}) do + resource.AddSingleFile(v) +end return {} diff --git a/gamemode/inventorysystem/prayers/cl_prayers.lua b/gamemode/inventorysystem/prayers/cl_prayers.lua index afea1cc..e28db63 100644 --- a/gamemode/inventorysystem/prayers/cl_prayers.lua +++ b/gamemode/inventorysystem/prayers/cl_prayers.lua @@ -8,7 +8,7 @@ function pray:DrawOnDPanel(panel) --Active grid local agrid = vgui.Create("DGrid",panel) agrid:SetCols(4) - local w = ((ScrW()/4) - 10) / 4 + local w = ((ScrW() / 4) - 10) / 4 agrid:SetHeight(w) agrid:SetColWide(w) agrid:SetRowHeight(w) @@ -17,14 +17,19 @@ function pray:DrawOnDPanel(panel) rec:SetText("F"..i) rec:SetSize(w,w) rec.DoClick = function(s) - local ap = self.activeprayers[i] + local ap = pray.activeprayers[i] explain:SetText(ap ~= nil and ap.Description or "Select a prayer") end rec:Receiver("prayer",function(s,tbl,dropped,mi,x,y) if not dropped then return end - self.activeprayers[i] = tbl.item - if tbl.item.DoOnPanel then - tbl.item.DoOnPanel(s) + pray.activeprayers[i] = tbl[1].item + if tbl[1].item == nil then + print("Failed to get item, tbl was") + PrintTable(tbl) + error("Failed to get item") + end + if tbl[1].item.DoOnPanel then + tbl[1].item:DoOnPanel(rec) end end,{}) agrid:AddItem(rec) @@ -64,6 +69,7 @@ function pray:DrawOnDPanel(panel) local observer = {} observer.Put = function(obs,pos,item) print("Prayer observer got request to put") + debug.Trace() drawprayer(item) end observer.Remove = function(obs,pos,item) @@ -79,12 +85,12 @@ local prayerhooks = { ["gm_showspare1"] = 3, ["gm_showspare2"] = 4 } -hook.Add("PlayerBindPress", function( ply, bind, pressed ) +hook.Add("PlayerBindPress", "pray_hook", 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() + pap:Pray() end) return pray diff --git a/gamemode/inventorysystem/prayers/sh_prayers.lua b/gamemode/inventorysystem/prayers/sh_prayers.lua index e1e7347..9d8ff3b 100644 --- a/gamemode/inventorysystem/prayers/sh_prayers.lua +++ b/gamemode/inventorysystem/prayers/sh_prayers.lua @@ -14,7 +14,7 @@ end inv.Name = "Prayers" inv.track = {} function inv:FindPlaceFor(item) - if item.isprayer then + if item.Pray ~= nil then return {#self.track} end return nil @@ -54,14 +54,15 @@ function inv:Serialize() end function inv:DeSerialize(str) - local cpy = table.Copy(self) + self.track = {} local tbl = util.JSONToTable(str) + tbl = tbl or {} local i = 1 for k,v in pairs(tbl) do local this_prayer = itm.GetItemByName(k):DeSerialize(v) - cpy:Put({i},this_prayer) + self:Put({i},this_prayer) end - return cpy + return self end diff --git a/gamemode/inventorysystem/quests/cl_quests.lua b/gamemode/inventorysystem/quests/cl_quests.lua new file mode 100644 index 0000000..2052e19 --- /dev/null +++ b/gamemode/inventorysystem/quests/cl_quests.lua @@ -0,0 +1,62 @@ + +local inv = {} +--the gui elements +local elements = {} + +local questlist = nil +local questlog = nil +local function add_quest(panel,quest) + +end + +inv.DrawOnDPanel = function(self,panel) + local spanel = vgui.Create("DPanel", panel) + spanel:Dock(FILL) + local halfs = vgui.Create("DVerticalDivider",spanel) + questlist = vgui.Create("DListLayout", spanel) + questlog = vgui.Create("DLabel",spanel) + halfs:SetBottom(questlist) + halfs:SetTop(questlog) + questlist:Dock(FILL) + questlog:Dock(FILL) + for k,v in pairs(self.track) do + local questbutton = vgui.Create("DButton",questlist) + questbutton:SetText(v.QuestName) + questbutton.DoClick = function() + questlog:SetText(v:GetText()) + end + for i,j in pairs(v) do + local ipanel = vgui.Create("DListLayout",layout) + local label = vgui.Create("DLabel",ipanel) + label:Dock(TOP) + label:SetDark(true) + local bar = vgui.Create("DProgress",ipanel) + bar:Dock(TOP) + elements[j] = { + ["label"] = label, + ["bar" ] = bar, + } + set_xp_of(j,self.skills[j] or 0) + ipanel:Add(label) + ipanel:Add(bar) + ipanel:InvalidateLayout() + ipanel:SizeToChildren(true,true) + layout:Add(ipanel) + end + layout:Dock(FILL) + sheet:AddSheet(k, spanel, "icon16/cross.png") + end + + local prox = {} + prox.Put = function(s,position,item) + --Observer might be called before our put() + end + + prox.Remove = function(s,position) + -- + end + + return prox +end + +return inv diff --git a/gamemode/inventorysystem/quests/sh_quests.lua b/gamemode/inventorysystem/quests/sh_quests.lua new file mode 100644 index 0000000..3515d61 --- /dev/null +++ b/gamemode/inventorysystem/quests/sh_quests.lua @@ -0,0 +1,69 @@ +--[[ + Quests must have an Arcs field + +]] +local reg = nrequire("inventory/inventory.lua") +local itm = nrequire("item.lua") +local inv = {} +if CLIENT then + inv = nrequire("cl_quests.lua") +end + +inv.Name = "Quests" +inv.track = {} +function inv:FindPlaceFor(item) + if item.Arcs ~= nil then + return {#self.track} + end + return nil +end +function inv:CanFitIn(pos,item) + return pos[1] == #self.track +end +function inv:Put(pos,item) + print("Added a quest:") + PrintTable(item) + self.track[pos[1]] = item +end +function inv:Has(a) + if type(a) == "string" then + for k,v in pairs(self.track) do + if v == a then return {k} end + end + elseif type(a) == "function" then + for k,v in pairs(self.track) do + if a(v) then return {k} end + end + end + return nil +end +function inv:Remove(pos) + for i = 1,pos[1] do + self.track[i] = self.track[i + 1] + end +end +function inv:Get(pos) + return self.track[pos[1]] +end +function inv:Serialize() + local ret = {} + for k,v in pairs(self.track) do + ret[v.Name] = v:Serialize() + end + return util.TableToJSON(ret) +end + +function inv:DeSerialize(str) + self.track = {} + local tbl = util.JSONToTable(str) + tbl = tbl or {} + local i = 1 + for k,v in pairs(tbl) do + local this_prayer = itm.GetItemByName(k):DeSerialize(v) + self:Put({i},this_prayer) + end + return self +end + + +reg.RegisterInventory(inv) diff --git a/gamemode/inventorysystem/shapedinventory/cl_shaped.lua b/gamemode/inventorysystem/shapedinventory/cl_shaped.lua index 7c60156..d9a4a08 100644 --- a/gamemode/inventorysystem/shapedinventory/cl_shaped.lua +++ b/gamemode/inventorysystem/shapedinventory/cl_shaped.lua @@ -46,6 +46,9 @@ end --Draw the item in a position local function drawitemat(self,x,y,item) + assert(self ~= nil, "I am nil!") + assert(self.gridpanels ~= nil, "My gridpanels were nil!") + assert(self.gridpanels[x] ~= nil, "Could not find that row!") local tp = self.gridpanels[x][y] if tp == nil then error("Unable to continue, could not find item at (" .. x .. "," .. y .. ")") diff --git a/gamemode/inventorysystem/shapedinventory/sh_shaped.lua b/gamemode/inventorysystem/shapedinventory/sh_shaped.lua index 5de6272..42edaa6 100644 --- a/gamemode/inventorysystem/shapedinventory/sh_shaped.lua +++ b/gamemode/inventorysystem/shapedinventory/sh_shaped.lua @@ -119,17 +119,18 @@ function inv:Serialize() end function inv:DeSerialize(str) - local ret = table.Copy(self) + self.tracker = {} local tbl = util.JSONToTable(str) + tbl = tbl or {} for k,v in pairs(tbl) do local name = k local pos = v[1] local data = v[2] local item = itm.GetItemFromData(name,data) - ret:Put(pos,item) + self:Put(pos,item) --ret.tracker[pos] = itm.GetItemFromData(name,data) end - return ret + return self end diff --git a/gamemode/inventorysystem/skills/sh_skills.lua b/gamemode/inventorysystem/skills/sh_skills.lua index a1c878f..3c212bf 100644 --- a/gamemode/inventorysystem/skills/sh_skills.lua +++ b/gamemode/inventorysystem/skills/sh_skills.lua @@ -140,16 +140,14 @@ inv.Serialize = function(self) end inv.DeSerialize = function(self,data) - if data == nil or data == '' then - return table.Copy(inv) - end calculate_skills() - local cpy = table.Copy(self) + self.skills = {} local gen = util.JSONToTable(data) + gen = gen or {} for k,v in pairs(gen) do - cpy.skills[k] = v + self.skills[k] = v end - return cpy + return self end inventory.RegisterInventory(inv) |
