Quantum is a Garry's Mod RPG framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
quantum/gamemode/engine/derma/menus/menu_crafting.lua

462 lines
15 KiB

-- __ _ _______ _ __
-- / / /\ | | |__ __| | | \ \
-- / / / \ | |_ __ ___ | | ___ ___| |__ \ \
-- < < / /\ \ | | '_ ` _ \| |/ _ \/ __| '_ \ > >
-- \ \ / ____ \| | | | | | | | __/ (__| | | | / /
-- \_\ /_/ \_\_|_| |_| |_|_|\___|\___|_| |_| /_/
local menu = {}
local snm = Quantum.Client.Menu.GetAPI( "net" )
local theme = Quantum.Client.Menu.GetAPI( "theme" )
local iteminfo = Quantum.Client.Menu.GetAPI( "iteminfo" )
local resScale = Quantum.Client.ResolutionScale
local sw, sh = ScrW(), ScrH()
local padding = 10 * resScale
local padding_s = 4 * resScale
local itemWidth, itemHeight = 65 * resScale, 65 * resScale
local function configureCamLookPos( icon )
local mn, mx = icon.Entity:GetRenderBounds()
local size = 0
size = math.max( size, math.abs( mn.x ) + math.abs( mx.x ) )
size = math.max( size, math.abs( mn.y ) + math.abs( mx.y ) )
size = math.max( size, math.abs( mn.z ) + math.abs( mx.z ) )
icon:SetCamPos( Vector( size/2, size, size ) )
icon:SetLookAt( ( mn + mx )/2 )
end
local function createItemAmountLabel( icon, item )
icon.amountpanel = vgui.Create( "DLabel", icon )
icon.amountpanel:SetText( tostring( item.amount ) .. "x" )
icon.amountpanel:SetTextColor( Color( 205, 205, 205, 255 ) )
icon.amountpanel:SetFont( "q_info" )
icon.amountpanel:SizeToContents()
icon.amountpanel.w, icon.amountpanel.h = icon.amountpanel:GetSize()
icon.amountpanel:SetPos( ( icon.w - icon.amountpanel.w ) - padding_s, icon.h - icon.amountpanel.h )
return icon.amountpanel
end
local function createItemPanel( x, y, scale, parent, frame, addW, giveToolTip )
local p = vgui.Create( "DPanel", parent )
p:SetSize( itemWidth * scale, itemHeight * scale )
p.w, p.h = p:GetSize()
p:SetPos( x - p.w/2, y - p.h/2 )
p.x, p.y = p:GetPos()
p.Paint = function( self )
theme.itempanel( self, self.itemcolor, true )
end
function p.SetItem( itemid )
if( itemid != nil ) then
local itemTbl = Quantum.Item.Get( itemid )
p.itemid = itemid -- give it its equipped item
p.itemcolor = itemTbl.rarity.color -- give it its color
p.item = itemTbl
p.item.amount = 1
if( IsValid( p.icon.tooltip ) ) then
p.icon.tooltip:Remove() -- remove the old
end
if( giveToolTip == true ) then
p.icon.tooltip = iteminfo.givetooltip( p.icon, frame, addW ) -- create a new
p.icon.tooltip:CreateInfo()
end
p.icon:SetVisible( true )
p.icon:SetModel( itemTbl.model )
configureCamLookPos( p.icon )
else
p.icon:SetVisible( false ) -- hide it if there is no item
if( IsValid( p.icon.tooltip ) ) then
p.icon.tooltip:Remove()
end
p.itemid = nil -- remove its item id
p.itemcolor = nil -- remove the background color
end
end
p.icon = vgui.Create( "DModelPanel", p )
p.icon:SetSize( p:GetSize() )
p.icon.w, p.icon.h = p.icon:GetSize()
p.icon:SetPos( 0, 0 )
p.icon:SetFOV( 45 )
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 )
local station
local stationEnt
local recipes
local stationTbl
if( dt != nil ) then
if( dt.cont != nil ) then
station = dt.cont.station
stationTbl = Quantum.Station.Get( station )
recipes = Quantum.Station.GetRecipes( station )
stationEnt = dt.cont.stationEnt
end
end
local items = Quantum.Client.Inventory
local equipped = Quantum.Client.Equipped
if( Quantum.Client.Character == nil ) then
chat.AddText( Color( 255, 25, 25 ), "[Quantum] - [ERROR] Check console for details.\n" )
Quantum.Error( "\nCharacter could not be found. Can not open inventory!\nGive this message to someone important: Quantum.Client.Character=nil\nTry rejoining the server and this should be fixed." )
return
end
if( !Quantum.Client.CurStationMenu ) then
Quantum.Client.IsInMenu = true
local back = vgui.Create( "DPanel" )
back:SetSize( sw, sh )
back.Paint = function( self )
theme.renderblur( self, 20, 20 )
end
local f = vgui.Create( "DFrame" )
Quantum.Client.CurStationMenu = f
f:SetSize( 1100 * resScale, 800 * resScale )
f.w, f.h = f:GetSize()
f:SetPos( sw/2 - f.w/2, sh/2 - f.h/2 )
f:SetTitle( "" )
f:SetDraggable( false )
f:ShowCloseButton( false )
f:MakePopup()
f.Paint = function( self, w, h )
surface.SetDrawColor( 0, 0, 0, 120 )
surface.DrawRect( 0, 0, w, h )
theme.renderblur( self, 10, 10 )
end
function f:OnClose()
back:Remove()
Quantum.Client.IsInMenu = false
Quantum.Client.CurStationMenu = nil
Quantum.Client.Cam.Stop()
end
local keycodesClose = {
[KEY_ESCAPE] = true,
[KEY_TAB] = true
}
function f:OnKeyCodeReleased( keyCode )
if( keycodesClose[keyCode] ) then
self:Close()
end
end
function f:Think()
if( IsValid( stationEnt ) ) then
if( LocalPlayer():GetPos():Distance( stationEnt:GetPos() ) >= 100 ) then -- clientside security sucks but works in this case :P
self:Close()
end
end
end
Quantum.Client.CurMenu = f
-- Title --
local bar = vgui.Create( "DPanel", f )
bar:SetSize( f.w, padding*4 )
bar.w, bar.h = bar:GetSize()
bar:SetPos( 0, 0 )
bar.Paint = function( self ) theme.blurpanel( self ) end
bar.DoClick = function( self ) f:Close() end
-- Inventory title --
title = vgui.Create( "DLabel", bar )
title:SetText( stationTbl.name || "ERROR name=nil" )
title:SetFont( "q_header_vs" )
title:SetTextColor( Color( 255, 255, 255, 255 ) )
title.Paint = function( self )
theme.pagetext( self )
end
title:SizeToContents()
title.w, title.h = title:GetSize()
title:SetPos( bar.w/2 - title.w/2, bar.h/2 - title.h/2 )
---- recipe list ----
local list = vgui.Create( "DPanel", f )
list:SetSize( f.w/4.2, f.h - bar.h )
list.w, list.h = list:GetSize()
list:SetPos( 0, bar.h )
list.Paint = function( self )
theme.blurpanel( self )
end
local scroll = vgui.Create( "DScrollPanel", list )
scroll:SetSize( list.w, list.h )
scroll.w, scroll.h = scroll:GetSize()
local vbar = scroll:GetVBar()
function vbar:Paint() theme.borderpanel( vbar, Color( 200, 200, 200, 200 ) ) end
local btnColors = Color( 100, 100, 100, 50 )
vbar.btnUp:SetText( "" ) -- up
vbar.btnUp:SetTextColor( Color( 255, 255, 255, 200 ) )
function vbar.btnUp:Paint() theme.sharpblurrbutton( vbar.btnUp, btnColors) end
vbar.btnDown:SetText( "" ) -- down
vbar.btnDown:SetTextColor( Color( 255, 255, 255, 200 ) )
function vbar.btnDown:Paint() theme.sharpblurrbutton( vbar.btnDown, btnColors ) end
-- grip
function vbar.btnGrip:Paint() theme.sharpbutton( vbar.btnGrip, btnColors ) end
local cont = vgui.Create( "DPanel", f )
cont:SetSize( f.w - list.w, f.h - bar.h )
cont.w, cont.h = cont:GetSize()
cont:SetPos( list.w, bar.h )
cont.Paint = function( self )
theme.blurpanel( self, Color( 255, 255, 255, 1 ) )
end
local resBars = {}
local selectedBar
for i, resID in pairs( recipes ) do
resBars[resID] = vgui.Create( "DPanel", scroll )
resBars[resID].resTbl = Quantum.Recipe.Get( resID )
resBars[resID].resItemTbl = Quantum.Item.Get( resID )
resBars[resID]:SetSize( scroll.w, 30 * resScale )
resBars[resID].w, resBars[resID].h = resBars[resID]:GetSize()
resBars[resID]:SetPos( 0, resBars[resID].h * (i-1) + padding*i )
resBars[resID].x, resBars[resID].y = resBars[resID]:GetPos()
resBars[resID].Paint = function( self, w, h )
surface.SetDrawColor( 255, 255, 255, 1 )
surface.DrawRect( 0, 0, w, h )
end
resBars[resID].txt_panel = vgui.Create( "DLabel", resBars[resID] )
resBars[resID].txt_panel:SetText( resBars[resID].resTbl.name )
resBars[resID].txt_panel:SetFont( "q_text" )
resBars[resID].txt_panel:SetTextColor( theme.color.setalpha(resBars[resID].resItemTbl.rarity.color, 200) )
resBars[resID].txt_panel:SizeToContents()
resBars[resID].txt_panel.w, resBars[resID].txt_panel.h = resBars[resID].txt_panel:GetSize()
resBars[resID].txt_panel:SetPos( padding, resBars[resID].h/2 - resBars[resID].txt_panel.h/2 )
---- content page ----
resBars[resID].cont = vgui.Create( "DPanel", cont )
resBars[resID].cont:SetSize( cont:GetSize() )
resBars[resID].cont.Paint = function( self ) end
resBars[resID].cont.w ,resBars[resID].cont.h = resBars[resID].cont:GetSize()
local mw, mh = resBars[resID].cont.w ,resBars[resID].cont.h
-- icon
resBars[resID].cont.icon = createItemPanel( mw/8, mh/8, 2, resBars[resID].cont, back, false, true )
resBars[resID].cont.icon.SetItem( resID )
if( resBars[resID].resTbl.amount > 1 ) then
createItemAmountLabel( resBars[resID].cont.icon, resBars[resID].resTbl )
end
-- title
resBars[resID].cont.title = vgui.Create( "DLabel", resBars[resID].cont )
resBars[resID].cont.title:SetText( resBars[resID].resTbl.name )
resBars[resID].cont.title:SetFont( "q_header_vs" )
resBars[resID].cont.title:SetTextColor( theme.color.setalpha( resBars[resID].resItemTbl.rarity.color, 255 ) )
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.enabled = true
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 )
if( self.enabled ) then
theme.sharpblurrbutton( self, Color( 110, 255, 110, 120 ) )
else
theme.sharpblurrbutton( self, Color( 255, 110, 110, 120 ) )
end
end
resBars[resID].cont.craft.DoClick = function( self )
if( self.enabled ) then
surface.PlaySound( "UI/buttonclick.wav" )
f:Close()
-- SEND NET CRAFT HERE --
else
surface.PlaySound( "common/wpn_denyselect.wav" )
end
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 )
resBars[resID].cont.reagentsTXT:SetText( "Reagents:" )
resBars[resID].cont.reagentsTXT:SetFont( "q_info" )
resBars[resID].cont.reagentsTXT:SetTextColor( Color( 255, 255, 255, 200 ) )
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( 750 * 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], back, false, true )
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 ) )
if( resBars[resID].cont.craft.enabled == true ) then
resBars[resID].cont.craft.enabled = false
end
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 )
local overlay = vgui.Create( "DButton", resBars[resID] )
overlay:SetText("")
overlay:SetSize( resBars[resID].w, resBars[resID].h )
overlay:SetPos( 0, 0 )
overlay.Paint = function( self, w, h )
theme.sharpbutton( self, Color( 0, 0, 0, 0 ), 10, 80 )
if( selectedBar == self:GetParent() ) then
surface.SetDrawColor( Color( 255, 255, 255, 10 ) )
surface.DrawRect( 0, 0, w, h )
end
end
overlay.DoClick = function( self )
surface.PlaySound( "UI/buttonclick.wav" )
selectedBar.cont:SetVisible( false )
selectedBar = resBars[resID]
resBars[resID].cont:SetVisible( true )
end
overlay.OnCursorEntered = function() surface.PlaySound( "UI/buttonrollover.wav" ) end
if( i == 1 ) then
selectedBar = resBars[resID]
selectedBar.cont:SetVisible( true )
end
end
end
end
return menu