diff options
Diffstat (limited to 'gamemode/inventorysystem/shapedinventory/cl_shaped.lua')
| -rw-r--r-- | gamemode/inventorysystem/shapedinventory/cl_shaped.lua | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/gamemode/inventorysystem/shapedinventory/cl_shaped.lua b/gamemode/inventorysystem/shapedinventory/cl_shaped.lua new file mode 100644 index 0000000..3bd84c2 --- /dev/null +++ b/gamemode/inventorysystem/shapedinventory/cl_shaped.lua @@ -0,0 +1,169 @@ + +local com = nrequire("cl_common.lua") + +local inv = {} + +local width = ScrW() +--local height = ScrH() +local iconsize = width / 40 + +local function default_paint(self,w,h) + draw.RoundedBox( 8, 0, 0, w, h, Color( 0, 0, 0 ) ) +end + +--[[ +local function calcposition(dimx,dimy,x,y) + return (y * dimx) + x +end +]] + +local function shapebounds(shape) + local maxx = 0 + local maxy = 0 + for rn, row in pairs(shape) do + if #row > maxx then maxx = #row end + maxy = rn + end + return maxx, maxy +end + +--Run a function on all the panels in a shape +local function runonshape(self,shape,x,y,func) + for i = 1,#shape do + for j = 1, #shape[i] do + if shape[i][j] then + print("Running on ",i,j) + print("Which translates to", x + j, y + i) + func(self.gridpanels[x + i - 1][y + j - 1]) + end + end + end +end + +--Draw the item in a position +local function drawitemat(self,x,y,item) + print("Drawing item at ",x,y) + local tp = self.gridpanels[x][y] + runonshape(self,item.Shape,x,y,function(panel) + panel:SetVisible(false) + end) + tp:SetVisible(true) + local sx,sy = shapebounds(item.Shape) + tp:SetSize(iconsize * sx, iconsize * sy) + tp.DoClick = function() + if item.GetOptions then + com.CreateMenuFor(tp,item:GetOptions()) + end + end +end + +--Reset the position, using the item and it's shape +local function undrawitemat(self,x,y) + local item = self:Get({x,y}) + runonshape(self,item.Shape,x,y,function(panel) + panel:SetVisible(true) + panel:SetSize(iconsize,iconsize) + panel.Paint = default_paint + panel.DoClick = function() end + end) +end + +--[[ +local function generatereceiver(tinv,x,y) + return function(self,panels,dropped,index,cx,cy) + if dropped then + local froment,toent = panels[1].info.owner,self.info.owner + local fromid,toid = panels[1].info.id,self.info.id + local frompos,topos = panels[1].info.pos,self.info.pos + local frominv,toinv = panels[1].info.inv,self.info.inv + print("Something was dropped on:",x,y) + PrintTable(panels) + print("froment:",froment) + print("toent:",toent) + print("fromid",fromid) + print("toid",toid) + print("frompos:",frompos) + PrintTable(panels[1].info.pos) + print("topos:",topos) + PrintTable(self.info.pos) + print("frominv",frominv) + print("toinv",toinv) + local item = frominv:Get(frompos) + print("item was", item) + --Fake remove the item, in case the position we want to move it to overlaps with where it is now. + frominv:Remove(frompos) + local cf = toinv:CanFitIn(topos,item) + frominv:Put(frompos,item) + print("canfit was:",cf) + if cf == true then + --Send the request + net.Start("art_RequestInvMove") + net.WriteEntity(froment) + net.WriteEntity(toent) + net.WriteUInt(fromid,32) + net.WriteUInt(toid,32) + net.WriteTable(frompos) + net.WriteTable(topos) + net.SendToServer() + end + end + end +end +]] + +inv.DrawOnDPanel = function(self,panel) + print("Drawing shaped on panel") + local DScrollPanel = vgui.Create( "DScrollPanel",panel) + DScrollPanel:SetPos( 0, 0 ) + DScrollPanel:Dock(FILL) + + local grid = vgui.Create( "DGrid", DScrollPanel ) + grid:SetPos(0, 0) + grid:SetCols(self.dimx) + grid:SetColWide(iconsize) + grid:SetRowHeight(iconsize) + self.grid = grid + + self.gridpanels = {} + + --Create the full grid of dpanels + for x = 1, self.dimx do + for y = 1, self.dimy do + local dp = vgui.Create("DButton") + dp:SetSize(iconsize,iconsize) + dp.Paint = default_paint + dp:Droppable("item") + dp:Receiver("item",com.generatereceiver(),{"one","two","three"}) + dp.info = {} + dp.info.owner = LocalPlayer() + dp.info.id = self.id + dp.info.pos = {x,y} + dp.info.inv = self + grid:AddItem(dp) + self.gridpanels[x] = self.gridpanels[x] or {} + self.gridpanels[x][y] = dp + end + end + + --Go through the items, and set the dpanels appropriately. + for k,v in pairs(self.tracker) do + if type(v) == "table" then + local px = k % self.dimx + local py = math.floor(k / self.dimy) + drawitemat(self,px,py,v) + end + end + + local observer = {} + observer.Put = function(obs,position,item) + print("Drawing item at",position[1],position[2]) + drawitemat(self,position[1],position[2],item) + end + observer.Remove = function(obs,position) + print("Undrawing item at",position[1],position[2]) + undrawitemat(self,position[1],position[2]) + end + return observer +end + +return inv |
