432 lines
11 KiB
Lua
432 lines
11 KiB
Lua
|
|
if SERVER then
|
|
util.AddNetworkString( "benny_syncinv" )
|
|
util.AddNetworkString( "benny_sendinvitem" )
|
|
util.AddNetworkString( "benny_discardinvitem" )
|
|
end
|
|
|
|
concommand.Add("benny_debug_give", function(ply, cmd, args)
|
|
assert(SERVER, "not server")
|
|
local inv = ply:INV_Get()
|
|
local str = UUID_generate()
|
|
|
|
local class = WEAPONS[args[1]]
|
|
|
|
assert(class, "Invalid Class.")
|
|
|
|
local item = {
|
|
Class = args[1],
|
|
Acquisition = CurTime(),
|
|
}
|
|
|
|
if class.Features == "firearm" then
|
|
item.Loaded = ""
|
|
elseif class.Features == "magazine" then
|
|
item.Ammo = class.Ammo
|
|
end
|
|
|
|
inv[str] = item
|
|
|
|
-- PROTO: WriteTable.
|
|
net.Start( "benny_sendinvitem" )
|
|
net.WriteString( str )
|
|
net.WriteTable( item )
|
|
net.Send( ply )
|
|
end,
|
|
function(cmd, args)
|
|
args = string.Trim(args:lower())
|
|
local meow = {}
|
|
for i, v in SortedPairs( WEAPONS ) do
|
|
if string.lower(i):find(args) then
|
|
table.insert( meow, cmd .. " " .. i )
|
|
end
|
|
end
|
|
return meow
|
|
end, "arg 1: player ent index, arg 2: classname")
|
|
|
|
-- PROTO: Move this all into weapon code.
|
|
concommand.Add("benny_inv_equip", function( ply, cmd, args )
|
|
local wep = ply:BennyCheck()
|
|
if wep then
|
|
local hand = args[2]!=nil and tobool(args[2])
|
|
local id = args[1]
|
|
local swap_or_replace = tobool(args[3])
|
|
|
|
local L, R = true, false
|
|
local curr_r = wep:D_GetID( false )
|
|
local curr_l = wep:D_GetID( true )
|
|
|
|
if hand == R then
|
|
if curr_r == id then
|
|
-- We already have this equipped
|
|
return
|
|
elseif swap_or_replace and curr_r != "" then
|
|
-- We already have something equipped here, move it to the offhand
|
|
wep:BDeploy( L, curr_r )
|
|
elseif curr_l == id then
|
|
-- You have the gun we want, snatched
|
|
wep:BHolster( L )
|
|
end
|
|
wep:BDeploy( R, id )
|
|
elseif hand == L then
|
|
if curr_l == id then
|
|
-- We already have this equipped
|
|
return
|
|
elseif swap_or_replace and curr_l != "" then
|
|
-- We already have something equipped here, move it to the offhand
|
|
wep:BDeploy( R, curr_l )
|
|
elseif curr_r == id then
|
|
-- You have the gun we want, snatched
|
|
wep:BHolster( R )
|
|
end
|
|
wep:BDeploy( L, id )
|
|
end
|
|
end
|
|
end,
|
|
function(cmd, args)
|
|
args = string.Trim(args:lower())
|
|
local meow = {}
|
|
for i, v in SortedPairs( Entity(1):INV_Get() ) do
|
|
if string.lower(i):find(args) then
|
|
table.insert( meow, cmd .. " " .. i )
|
|
end
|
|
end
|
|
return meow
|
|
end, "arg 1: item id, arg 2 does offhand")
|
|
|
|
-- PROTO: Move this all into weapon code.
|
|
concommand.Add("benny_inv_holster", function( ply, cmd, args )
|
|
local wep = ply:BennyCheck()
|
|
if wep then
|
|
if wep:D_GetID( false ) == args[1] then
|
|
wep:BHolster( false )
|
|
elseif wep:D_GetID( true ) == args[1] then
|
|
wep:BHolster( true )
|
|
end
|
|
end
|
|
end)
|
|
|
|
concommand.Add("benny_inv_sync", function( ply, cmd, args )
|
|
local inv = ply:INV_Get()
|
|
|
|
-- PROTO: WriteTable.
|
|
net.Start("benny_syncinv")
|
|
net.WriteUInt( table.Count( inv ), 4 )
|
|
for ID, Data in pairs( inv ) do
|
|
net.WriteString( ID )
|
|
net.WriteTable( Data )
|
|
end
|
|
net.Send( ply )
|
|
end)
|
|
|
|
concommand.Add("benny_inv_discard", function( ply, cmd, args )
|
|
local inv = ply:INV_Get()
|
|
local wep = ply:GetActiveWeapon()
|
|
local item = inv[args[1]]
|
|
-- PROTO: Check that this is the correct 'benny' weapon.
|
|
assert( item, "That item doesn't exist. " .. tostring(item) )
|
|
|
|
inv[args[1]] = nil
|
|
net.Start( "benny_discardinvitem" )
|
|
net.WriteString( args[1] )
|
|
net.Send( ply )
|
|
|
|
if wep:GetWep1() == args[1] then
|
|
wep:SetWep1( "" )
|
|
wep:SetWep1_Clip( "" )
|
|
wep:SetClip1( 0 )
|
|
end
|
|
if wep:GetWep2() == args[1] then
|
|
wep:SetWep2( "" )
|
|
wep:SetWep2_Clip( "" )
|
|
wep:SetClip2( 0 )
|
|
end
|
|
end)
|
|
|
|
-- Network to client
|
|
if CLIENT then
|
|
net.Receive( "benny_syncinv", function( len, ply )
|
|
local ply = LocalPlayer()
|
|
local inv = ply:INV_Get()
|
|
|
|
table.Empty( inv )
|
|
for i=1, net.ReadUInt( 4 ) do
|
|
inv[net.ReadString()] = net.ReadTable()
|
|
end
|
|
end)
|
|
net.Receive( "benny_sendinvitem", function( len, ply )
|
|
local ply = LocalPlayer()
|
|
ply:INV_Get()[net.ReadString()] = net.ReadTable()
|
|
end)
|
|
net.Receive( "benny_discardinvitem", function( len, ply )
|
|
local ply = LocalPlayer()
|
|
ply:INV_Get()[net.ReadString()] = nil
|
|
end)
|
|
end
|
|
|
|
hook.Add( "PlayerDeathSound", "Benny_PlayerDeathSound", function( ply )
|
|
return true -- we don't want the default sound!
|
|
end )
|
|
|
|
function GM:ShowHelp( ply )
|
|
if SERVER then
|
|
ply:SendLua( [[OpenSMenu()]] )
|
|
end
|
|
end
|
|
|
|
function GM:ShowTeam( ply )
|
|
if SERVER then
|
|
ply:SendLua( [[OpenDeadeye()]] )
|
|
end
|
|
end
|
|
|
|
function GM:ShowSpare1( ply )
|
|
if SERVER then
|
|
ply:ConCommand( "benny_inv_holster" )
|
|
end
|
|
end
|
|
|
|
-- Debug inv
|
|
if CLIENT then
|
|
function GM:OnSpawnMenuOpen()
|
|
RunConsoleCommand( "benny_debug_inv" )
|
|
end
|
|
function GM:OnSpawnMenuClose()
|
|
if IsValid( base ) then base:Remove() end
|
|
end
|
|
|
|
function OpenSMenu()
|
|
if IsValid( smenu ) then smenu:Remove() return end
|
|
local active = GetConVar("benny_hud_tempactive"):GetString()
|
|
smenu = vgui.Create("DFrame")
|
|
smenu:SetSize( ss(1+(96+2)*4), ss(360) )
|
|
smenu:MakePopup()
|
|
smenu:SetKeyboardInputEnabled( false )
|
|
smenu:Center()
|
|
|
|
function smenu:Paint( w, h )
|
|
surface.SetDrawColor( schemes[active]["bg"] )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
return true
|
|
end
|
|
|
|
local itemlist = smenu:Add("DScrollPanel")
|
|
itemlist:Dock( FILL )
|
|
|
|
-- local List = vgui.Create( "DIconLayout", itemlist )
|
|
-- List:Dock( FILL )
|
|
-- List:SetSpaceX( 5 )
|
|
-- List:SetSpaceY( 5 )
|
|
|
|
|
|
local createlist = {}
|
|
|
|
for ClassName, Class in pairs( WEAPONS ) do
|
|
if !createlist[Class.Type] then
|
|
createlist[Class.Type] = {}
|
|
end
|
|
|
|
table.insert( createlist[Class.Type], { ClassName = ClassName, Class = Class } )
|
|
end
|
|
|
|
for i, v in SortedPairs( createlist ) do
|
|
local Collapse = itemlist:Add( "DCollapsibleCategory" )
|
|
Collapse:Dock( TOP )
|
|
Collapse:SetLabel( i )
|
|
local Lays = itemlist:Add( "DIconLayout" )
|
|
Collapse:SetContents( Lays )
|
|
Collapse:SetExpanded( i!="magazine" )
|
|
Lays:Dock( FILL )
|
|
Lays:SetSpaceX( ss(1) )
|
|
Lays:SetSpaceY( ss(1) )
|
|
for Mew, New in ipairs( v ) do
|
|
local button = Lays:Add( "DButton" )
|
|
button:SetSize( ss(95), ss(14) )
|
|
--button:Dock( TOP )
|
|
button:DockMargin( 0, 0, 0, ss(4) )
|
|
|
|
button.Text_Name = New.Class.Name
|
|
button.Text_Desc = New.Class.Description
|
|
|
|
-- PROTO: These functions don't need to be remade over and over like this.
|
|
function button:DoClick()
|
|
RunConsoleCommand( "benny_debug_give", New.ClassName )
|
|
end
|
|
|
|
function button:DoRightClick()
|
|
RunConsoleCommand( "benny_debug_give", "mag_" .. New.ClassName )
|
|
end
|
|
|
|
function button:Paint( w, h )
|
|
surface.SetDrawColor( schemes[active]["fg"] )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
|
|
surface.SetTextColor( schemes[active]["bg"] )
|
|
|
|
surface.SetFont( "Benny_12" )
|
|
surface.SetTextPos( ss(2), ss(2) )
|
|
surface.DrawText( self.Text_Name )
|
|
|
|
-- surface.SetFont( "Benny_10" )
|
|
-- surface.SetTextPos( ss(4), ss(4 + 12) )
|
|
-- surface.DrawText( self.Text_Desc )
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
local function regen_items( itemlist )
|
|
local ply = LocalPlayer()
|
|
local inv = ply:INV_Get()
|
|
local active = GetConVar("benny_hud_tempactive"):GetString()
|
|
itemlist:Clear()
|
|
|
|
local maidlist = {}
|
|
local catesmade = {}
|
|
|
|
for i, v in pairs( ply:INV_ListFromBuckets() ) do
|
|
local class = inv[v].Class
|
|
local Class = WEAPONS[class]
|
|
|
|
if !catesmade[Class.Type] then
|
|
catesmade[Class.Type] = true
|
|
local cate = vgui.Create( "DButton" )
|
|
itemlist:AddItem( cate )
|
|
cate:SetSize( 1, ss(12) )
|
|
cate:Dock( TOP )
|
|
cate:DockMargin( 0, 0, 0, ss(2) )
|
|
|
|
cate.Text_Name = Class.Type
|
|
|
|
function cate:Paint( w, h )
|
|
surface.SetDrawColor( schemes[active]["bg"] )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
surface.SetDrawColor( schemes[active]["fg"] )
|
|
surface.DrawOutlinedRect( 0, 0, w, h, ss(0.5) )
|
|
|
|
surface.SetTextColor( schemes[active]["fg"] )
|
|
surface.SetFont( "Benny_10" )
|
|
surface.SetTextPos( ss(2), ss(2) )
|
|
surface.DrawText( self.Text_Name )
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
local button = vgui.Create( "DButton" )
|
|
itemlist:AddItem( button )
|
|
button:SetSize( 1, ss(24) )
|
|
button:Dock( TOP )
|
|
button:DockMargin( 0, 0, 0, ss(2) )
|
|
|
|
button.ID = v
|
|
|
|
local mag = false
|
|
if class:Left( 4 ) == "mag_" then
|
|
mag = true
|
|
button:SetTall( ss(11) )
|
|
end
|
|
|
|
if !maidlist[class] then
|
|
maidlist[class] = table.Flip( ply:INV_Find( class ) )
|
|
end
|
|
local ml = maidlist[class]
|
|
|
|
button.Text_Name = Class.Name
|
|
button.Text_Desc = Class.Description
|
|
button.Text_ID = "[" .. ml[v] .. "] " .. button.ID
|
|
|
|
-- PROTO: These functions don't need to be remade over and over like this.
|
|
function button:DoClick()
|
|
local Menu = DermaMenu()
|
|
|
|
local opt1 = Menu:AddOption( "Equip Right", function()
|
|
RunConsoleCommand( "benny_inv_equip", button.ID, "false" )
|
|
end)
|
|
opt1:SetIcon( "icon16/resultset_next.png" )
|
|
|
|
local opt3 = Menu:AddOption( "Swap Right", function()
|
|
RunConsoleCommand( "benny_inv_equip", button.ID, "false", "true" )
|
|
end)
|
|
opt3:SetIcon( "icon16/resultset_first.png" )
|
|
|
|
Menu:AddSpacer()
|
|
|
|
local opt2 = Menu:AddOption( "Equip Left", function()
|
|
RunConsoleCommand( "benny_inv_equip", button.ID, "true" )
|
|
end)
|
|
opt2:SetIcon( "icon16/resultset_previous.png" )
|
|
|
|
local opt4 = Menu:AddOption( "Swap Left", function()
|
|
RunConsoleCommand( "benny_inv_equip", button.ID, "true", "true" )
|
|
end)
|
|
opt4:SetIcon( "icon16/resultset_last.png" )
|
|
|
|
Menu:AddSpacer()
|
|
|
|
local opt5 = Menu:AddOption( "Holster", function()
|
|
RunConsoleCommand( "benny_inv_holster", button.ID )
|
|
end)
|
|
opt5:SetIcon( "icon16/control_pause_blue.png" )
|
|
|
|
local opt6 = Menu:AddOption( "Discard", function()
|
|
RunConsoleCommand("benny_inv_discard", button.ID)
|
|
self:Remove()
|
|
end)
|
|
opt6:SetIcon( "icon16/bin.png" )
|
|
|
|
Menu:Open()
|
|
-- timer.Simple( 0.1, function() if IsValid( itemlist ) then regen_items( itemlist ) end end )
|
|
end
|
|
|
|
button.DoRightClick = function( self )
|
|
RunConsoleCommand("benny_inv_discard", button.ID)
|
|
self:Remove()
|
|
end
|
|
|
|
function button:Paint( w, h )
|
|
surface.SetDrawColor( schemes[active]["fg"] )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
|
|
surface.SetTextColor( schemes[active]["bg"] )
|
|
|
|
surface.SetFont( !mag and "Benny_16" or "Benny_10" )
|
|
surface.SetTextPos( ss(2), ss(2) )
|
|
surface.DrawText( self.Text_Name )
|
|
|
|
if !mag then
|
|
surface.SetFont( "Benny_12" )
|
|
surface.SetTextPos( ss(2), ss(2 + 11) )
|
|
surface.DrawText( self.Text_Desc )
|
|
end
|
|
|
|
surface.SetFont( "Benny_10" )
|
|
local tx = surface.GetTextSize( self.Text_ID )
|
|
surface.SetTextPos( w - ss(2) - tx, ss(2) )
|
|
surface.DrawText( self.Text_ID )
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
concommand.Add("benny_debug_inv", function()
|
|
if IsValid( base ) then base:Remove() end
|
|
base = vgui.Create("DFrame")
|
|
base:SetSize( ss(400), ss(400) )
|
|
base:MakePopup()
|
|
base:SetKeyboardInputEnabled( false )
|
|
base:Center()
|
|
local active = GetConVar("benny_hud_tempactive"):GetString()
|
|
|
|
function base:Paint( w, h )
|
|
surface.SetDrawColor( schemes[active]["bg"] )
|
|
surface.DrawRect( 0, 0, w, h )
|
|
return true
|
|
end
|
|
|
|
local itemlist = base:Add("DScrollPanel")
|
|
itemlist:Dock( FILL )
|
|
|
|
regen_items( itemlist )
|
|
end)
|
|
end |