From c51e5213278a0e7b6ab435cade2925f8fdbae7b5 Mon Sep 17 00:00:00 2001 From: AlmTech Software Date: Fri, 31 Jan 2020 23:54:53 +0100 Subject: [PATCH] Added item amount & other crafting UI stuff --- gamemode/engine/derma/menus/menu_crafting.lua | 123 +++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/gamemode/engine/derma/menus/menu_crafting.lua b/gamemode/engine/derma/menus/menu_crafting.lua index 90e2ef3..932f5c2 100644 --- a/gamemode/engine/derma/menus/menu_crafting.lua +++ b/gamemode/engine/derma/menus/menu_crafting.lua @@ -93,6 +93,46 @@ local function createItemPanel( x, y, scale, parent, frame, addW, giveToolTip ) return p end +local function getItemSlots( itemid ) + local inv = Quantum.Client.Inventory + + if( inv != nil ) then + local indexes = {} + + for i, item in pairs( inv ) do + if( item != nil ) then + if( item[1] == itemid ) then + indexes[ #indexes + 1 ] = i + end + end + end + + return indexes + else + Quantum.Error( "Could not get item slots. Inventory is nil!" ) + end +end + +local function calcAmountOfItem( itemid ) + local slots = getItemSlots( itemid ) + local inv = Quantum.Client.Inventory + local count = 0 + + if( slots != nil ) then + for i, slot in pairs( slots ) do + if( inv[slot] != nil ) then + if( inv[slot][2] == nil ) then + count = count + 1 + else + count = count + inv[slot][2] + end + end + end + return count + else + return 0 + end +end function menu.open( dt ) @@ -282,6 +322,24 @@ function menu.open( dt ) resBars[resID].cont.title:SizeToContents() resBars[resID].cont.title.w, resBars[resID].cont.title.h = resBars[resID].cont.title:GetSize() resBars[resID].cont.title:SetPos( resBars[resID].cont.icon.x + resBars[resID].cont.icon.w + padding*2, resBars[resID].cont.icon.y ) + resBars[resID].cont.title.x, resBars[resID].cont.title.y = resBars[resID].cont.title:GetPos() + + resBars[resID].cont.craft = vgui.Create( "DButton", resBars[resID].cont ) + resBars[resID].cont.craft:SetText( "Create Item" ) + resBars[resID].cont.craft:SetFont( "q_button_m" ) + resBars[resID].cont.craft:SetTextColor( Color( 255, 255, 255 ) ) + resBars[resID].cont.craft:SizeToContents() + resBars[resID].cont.craft.w, resBars[resID].cont.craft.h = resBars[resID].cont.craft:GetSize() + resBars[resID].cont.craft:SetPos( resBars[resID].cont.title.x, resBars[resID].cont.title.y + resBars[resID].cont.craft.h + padding ) + resBars[resID].cont.craft.Paint = function( self ) + theme.sharpblurrbutton( self ) + end + resBars[resID].cont.craft.DoClick = function( self ) + surface.PlaySound( "UI/buttonclick.wav" ) + f:Close() + -- SEND NET CRAFT HERE -- + end + resBars[resID].cont.craft.OnCursorEntered = function() surface.PlaySound( "UI/buttonrollover.wav" ) end -- reagents txt resBars[resID].cont.reagentsTXT = vgui.Create( "DLabel", resBars[resID].cont ) @@ -291,8 +349,71 @@ function menu.open( dt ) resBars[resID].cont.reagentsTXT:SizeToContents() resBars[resID].cont.reagentsTXT.w, resBars[resID].cont.reagentsTXT.h = resBars[resID].cont.reagentsTXT:GetSize() resBars[resID].cont.reagentsTXT:SetPos( resBars[resID].cont.icon.x, resBars[resID].cont.icon.y + resBars[resID].cont.icon.h + padding*5 ) + resBars[resID].cont.reagentsTXT.x, resBars[resID].cont.reagentsTXT.y = resBars[resID].cont.reagentsTXT:GetPos() + + -- reagents scroll + local diffPadding = ( resBars[resID].cont.reagentsTXT.y + resBars[resID].cont.reagentsTXT.h + padding ) + resBars[resID].cont.reagents = vgui.Create( "DScrollPanel", resBars[resID].cont ) + resBars[resID].cont.reagents:SetSize( mw, mh - diffPadding ) + resBars[resID].cont.reagents.w, resBars[resID].cont.reagents.h = resBars[resID].cont.reagents:GetSize() + resBars[resID].cont.reagents:SetPos( 0, diffPadding ) + resBars[resID].cont.reagents.Paint = Quantum.EmptyFunction + + -- reagents panels + local itemid + local amount + local itemtbl + local count = 0 + + local itemPanels = {} + + local regScale = 1.5 + + for i, reg in pairs( resBars[resID].resTbl.recipe ) do + itemid = reg.item + amount = reg.amount + itemtbl = Quantum.Item.Get( itemid ) + + if( itemtbl != nil ) then + count = count + 1 + + itemPanels[count] = vgui.Create( "DPanel", resBars[resID].cont.reagents ) + itemPanels[count]:SetSize( 600 * resScale, itemHeight*regScale + padding*2 ) + itemPanels[count].w, itemPanels[count].h = itemPanels[count]:GetSize() -- + itemPanels[count]:SetPos( resBars[resID].cont.reagentsTXT.x + padding, itemPanels[count].h*(count-1) + padding*(count-1) ) + itemPanels[count].Paint = function( self, w, h ) + surface.SetDrawColor( Color( 0, 0, 0, 120 ) ) + surface.DrawRect( 0, 0, w, h ) + end + + itemPanels[count].icon = createItemPanel( (itemWidth*regScale)/2 + padding*2, itemPanels[count].h/2, regScale, itemPanels[count], f ) + itemPanels[count].icon.SetItem( itemid ) + + local itemname = vgui.Create( "DLabel", itemPanels[count] ) + itemname:SetText( itemtbl.name ) + itemname:SetFont( "q_info" ) + itemname:SetTextColor( theme.color.setalpha( itemtbl.rarity.color, 220 ) ) + itemname:SizeToContents() + itemname.w, itemname.h = itemname:GetSize() + itemname:SetPos( itemPanels[count].w/2 - itemname.w/2 + itemPanels[count].icon.w/2, padding ) + itemname.x, itemname.y = itemname:GetPos() + + local itemamount = vgui.Create( "DLabel", itemPanels[count] ) + itemamount.amount = calcAmountOfItem( itemid ) + itemamount:SetText( tostring( itemamount.amount ) .. " / " .. amount ) + itemamount:SetFont( "q_header_vs" ) + if( itemamount.amount >= amount ) then + itemamount:SetTextColor( Color( 255, 255, 255, 220 ) ) + else + itemamount:SetTextColor( Color( 255, 155, 155, 220 ) ) + end + itemamount:SizeToContents() + itemamount.w, itemamount.h = itemamount:GetSize() + itemamount:SetPos( itemPanels[count].w/2 - itemamount.w/2 + itemPanels[count].icon.w/2, itemname.y + itemamount.h + padding ) - + end + + end resBars[resID].cont:SetVisible( false )