diff options
Diffstat (limited to 'gamemode/inventorysystem/abilities')
| -rw-r--r-- | gamemode/inventorysystem/abilities/cl_abilities.lua | 96 | ||||
| -rw-r--r-- | gamemode/inventorysystem/abilities/sh_abilities.lua | 69 |
2 files changed, 165 insertions, 0 deletions
diff --git a/gamemode/inventorysystem/abilities/cl_abilities.lua b/gamemode/inventorysystem/abilities/cl_abilities.lua new file mode 100644 index 0000000..e28db63 --- /dev/null +++ b/gamemode/inventorysystem/abilities/cl_abilities.lua @@ -0,0 +1,96 @@ + +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 = 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 + 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) + 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) + local function drawprayer(prayer) + local rec = vgui.Create("DImageButton",grid) + rec:SetText(prayer.Name) + rec:SetSize(w,w) + if(prayer.DoOnPanel) then + prayer:DoOnPanel(rec) + end + rec.item = prayer + rec:Droppable("prayer") + grid:AddItem(rec) + end + + for k,v in pairs(self.track) do + drawprayer(v) + end + + 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) + print("I should never remove a prayer!") + end + return observer +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", "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() +end) + +return pray diff --git a/gamemode/inventorysystem/abilities/sh_abilities.lua b/gamemode/inventorysystem/abilities/sh_abilities.lua new file mode 100644 index 0000000..fc6cd82 --- /dev/null +++ b/gamemode/inventorysystem/abilities/sh_abilities.lua @@ -0,0 +1,69 @@ +--[[ + 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 = "Abilities" +inv.track = {} +function inv:FindPlaceFor(item) + if item.Pray ~= 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) + 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) |
