summaryrefslogtreecommitdiff
path: root/entities/weapons/rad_inv/shared.lua
diff options
context:
space:
mode:
Diffstat (limited to 'entities/weapons/rad_inv/shared.lua')
-rw-r--r--entities/weapons/rad_inv/shared.lua562
1 files changed, 562 insertions, 0 deletions
diff --git a/entities/weapons/rad_inv/shared.lua b/entities/weapons/rad_inv/shared.lua
new file mode 100644
index 0000000..50e7691
--- /dev/null
+++ b/entities/weapons/rad_inv/shared.lua
@@ -0,0 +1,562 @@
+if SERVER then
+
+ AddCSLuaFile( "shared.lua" )
+
+end
+
+if CLIENT then
+
+ SWEP.ViewModelFOV = 70
+ SWEP.ViewModelFlip = false
+
+ SWEP.PrintName = "Quick Inventory"
+ SWEP.IconLetter = "H"
+ SWEP.Slot = 0
+ SWEP.Slotpos = 1
+
+end
+
+SWEP.HoldType = "normal"
+SWEP.Base = "rad_base"
+
+SWEP.ViewModel = ""
+SWEP.WorldModel = ""
+
+SWEP.IsSniper = false
+SWEP.AmmoType = "Knife"
+
+SWEP.Primary.ClipSize = 1
+
+SWEP.Scroll = Sound( "ui/buttonrollover.wav" )
+SWEP.Selection = Sound( "ui/buttonclickrelease.wav" )
+SWEP.Cancel = Sound( "common/wpn_denyselect.wav" )
+
+SWEP.YPos = 10
+SWEP.XPos = 10
+SWEP.NumPanels = 5
+SWEP.PanelSize = 80
+
+function SWEP:Holster()
+
+ if SERVER then return true end
+
+ if self.Deployed then
+
+ self.Deployed = false
+
+ self.Weapon:RemovePanels()
+
+ end
+
+ return true
+
+end
+
+function SWEP:Deploy()
+
+ if SERVER then
+
+ self.Weapon:SetNWInt( "InvPos", 1 )
+ self.Weapon:SetNWBool( "Synch", false )
+ self.Weapon:SetNWBool( "UseMode", false )
+
+ self.Owner:SynchInventory()
+
+ self.Owner:NoticeOnce( "Right click to scroll through your inventory", GAMEMODE.Colors.Blue, 5, 2 )
+ self.Owner:NoticeOnce( "Left click to select an item and use it", GAMEMODE.Colors.Blue, 5, 4 )
+
+ return true
+
+ end
+
+ if not self.Deployed then
+
+ self.Deployed = true
+ self.LastInv = Inv_Size()
+ self.InvPos = 1
+
+ self.Weapon:GeneratePanels()
+
+ end
+
+ return true
+
+end
+
+function SWEP:GeneratePanels()
+
+ self.InvPanels = {}
+ self.YPosTbl = {}
+ self.InvItems = Inv_UniqueItems()
+
+ if Inv_Size() == 0 then return end
+
+ for i=1, math.min( self.NumPanels, #self.InvItems ) do
+
+ local id = self.Weapon:GetNWInt( "InvPos", 1 ) + i - 1
+
+ if id > #self.InvItems then
+
+ id = math.Clamp( id - #self.InvItems, 1, #self.InvItems )
+
+ end
+
+ local panel = vgui.Create( "ItemPanel" )
+ panel:SetItemTable( item.GetByID( self.InvItems[id] ) )
+
+ if i == 1 then
+
+ panel:SetPos( -self.PanelSize, self.YPos )
+ panel:SetSize( self.PanelSize * 1.5, self.PanelSize * 1.5 )
+ panel:SetSizeOverride( self.PanelSize * 1.5 )
+ panel.YPos = self.YPos
+
+ else
+
+ panel:SetPos( -self.PanelSize, self.YPos + ( self.PanelSize * ( i - 1 ) ) + ( self.PanelSize * 1.5 ) + ( 5 * i ) )
+ panel:SetSize( self.PanelSize, self.PanelSize )
+ panel:SetSizeOverride( self.PanelSize )
+ panel.YPos = self.YPos + ( self.PanelSize * ( i - 2 ) ) + ( self.PanelSize * 1.5 ) + ( 5 * i )
+
+ end
+
+ self.YPosTbl[i] = panel.YPos
+
+ table.insert( self.InvPanels, panel )
+
+ end
+
+end
+
+function SWEP:AddPanel() // call after removing a panel
+
+ local id = self.Weapon:GetNWInt( "InvPos", 1 ) - 1
+ local inv = Inv_UniqueItems()
+
+ if id < 1 then
+
+ id = #inv
+
+ end
+
+ local i = #self.InvPanels
+ local tbl = item.GetByID( inv[id] )
+
+ local panel = vgui.Create( "ItemPanel" )
+ panel:SetItemTable( tbl )
+ panel:SetPos( -self.PanelSize, self.YPosTbl[ i + 1 ] )
+ panel:SetSize( self.PanelSize, self.PanelSize )
+ panel:SetSizeOverride( self.PanelSize )
+ panel.YPos = self.YPosTbl[ i + 1 ]
+
+ table.insert( self.InvPanels, panel )
+
+end
+
+function SWEP:RemovePanels()
+
+ for k,v in pairs( self.InvPanels ) do
+
+ v:Remove()
+
+ end
+
+ self.InvPanels = {}
+ self.InvItems = {}
+ self.YPosTbl = {}
+
+end
+
+function SWEP:RemovePanel()
+
+ if not self.InvPanels[1] then return end
+
+ self.InvPanels[1].Removal = true
+
+end
+
+function SWEP:RemoveAllPanels()
+
+ for k,v in pairs( self.InvPanels ) do
+
+ v.Removal = true
+
+ end
+
+end
+
+function SWEP:SecondaryAttack()
+
+ if CLIENT then return end
+
+ self.Weapon:SetNextSecondaryFire( CurTime() + 0.3 )
+
+ if self.Weapon:GetNWBool( "UseMode", false ) then
+
+ local inv = self.Owner:GetUniqueInventory()
+ local pos = self.Weapon:GetNWInt( "InvPos", 1 )
+ local tbl = item.GetByID( inv[pos] )
+
+ self.Weapon:SetNWInt( "FuncPos", self.Weapon:GetNWInt( "FuncPos", 1 ) + 1 )
+
+ if tbl.Weapon then
+
+ if self.Weapon:GetNWInt( "FuncPos", 1 ) > 2 then
+
+ self.Weapon:SetNWInt( "FuncPos", 1 )
+
+ end
+
+ return
+
+ end
+
+ if self.Weapon:GetNWInt( "FuncPos", 1 ) > ( #self.Functions + 2 ) then
+
+ self.Weapon:SetNWInt( "FuncPos", 1 )
+
+ end
+
+ else
+
+ local size = #self.Owner:GetUniqueInventory()
+ local pos = self.Weapon:GetNWInt( "InvPos", 1 ) + 1
+
+ if pos > size then
+
+ pos = 1
+
+ end
+
+ self.Weapon:SetNWInt( "InvPos", pos )
+
+ end
+
+ self.Owner:ClientSound( self.Scroll )
+
+end
+
+function SWEP:PrimaryAttack()
+
+ if CLIENT then return end
+
+ self.Weapon:SetNextPrimaryFire( CurTime() + 0.5 )
+
+ local inv = self.Owner:GetUniqueInventory()
+ local pos = self.Weapon:GetNWInt( "InvPos", 1 )
+ local tbl = item.GetByID( inv[pos] )
+
+ if not tbl then return end
+
+ if self.Weapon:GetNWBool( "UseMode", false ) then
+
+ local fpos = self.Weapon:GetNWInt( "FuncPos", 1 )
+
+ if tbl.Weapon then
+
+ if fpos == 1 then
+
+ self.Owner:ClientSound( self.Cancel )
+
+ else
+
+ self.Functions[1]( self.Owner, tbl.ID )
+
+ end
+
+ self.Weapon:SetNWBool( "UseMode", false )
+ self.Weapon:SetNWInt( "FuncPos", 1 )
+ self.Weapon:SetNWInt( "InvPos", 1 )
+ self.Weapon:Synch()
+
+ return
+
+ end
+
+ if fpos == 1 then
+
+ self.Owner:ClientSound( self.Cancel )
+
+ elseif fpos == 2 then
+
+ self.Weapon:DropItem( tbl.ID, 1 )
+
+ else
+
+ self.Functions[ fpos - 2 ]( self.Owner, tbl.ID )
+
+ end
+
+ self.Weapon:SetNWBool( "UseMode", false )
+ self.Weapon:SetNWInt( "FuncPos", 1 )
+ self.Weapon:SetNWInt( "InvPos", 1 )
+ self.Weapon:Synch()
+
+ else
+
+ self.Weapon:SetNWBool( "UseMode", !self.Weapon:SetNWBool( "UseMode", false ) )
+
+ self.Functions = tbl.Functions
+
+ self.Owner:ClientSound( self.Selection )
+
+ end
+
+end
+
+function SWEP:DropItem( id, count )
+
+ if not self.Owner:HasItem( id ) then return end
+
+ local tbl = item.GetByID( id )
+
+ if count == 1 then
+
+ if self.Owner:HasItem( id ) then
+
+ local makeprop = true
+
+ if tbl.DropFunction then
+
+ makeprop = tbl.DropFunction( self.Owner, id, true )
+
+ end
+
+ if makeprop then
+
+ local prop = ents.Create( "prop_physics" )
+ prop:SetPos( self.Owner:GetItemDropPos() )
+ prop:SetAngles( self.Owner:GetAimVector():Angle() )
+ prop:SetModel( tbl.Model )
+ prop:SetCollisionGroup( COLLISION_GROUP_WEAPON )
+ prop:Spawn()
+ prop.IsItem = true
+ prop.Removal = CurTime() + 5 * 60
+
+ end
+
+ self.Owner:RemoveFromInventory( id, true )
+ self.Owner:EmitSound( Sound( "items/ammopickup.wav" ) )
+
+ end
+
+ return
+
+ end
+
+ local items = {}
+
+ for i=1, count do
+
+ if self.Owner:HasItem( id ) then
+
+ table.insert( items, id )
+
+ end
+
+ end
+
+ local loot = ents.Create( "sent_lootbag" )
+
+ for k,v in pairs( items ) do
+
+ loot:AddItem( v )
+
+ end
+
+ loot:SetAngles( self.Owner:GetAimVector():Angle() )
+ loot:SetPos( self.Owner:GetItemDropPos() )
+ loot:SetRemoval( 60 * 5 )
+ loot:Spawn()
+
+ self.Owner:EmitSound( Sound( "items/ammopickup.wav" ) )
+ self.Owner:RemoveMultipleFromInventory( items )
+
+ if tbl.DropFunction then
+
+ tbl.DropFunction( self.Owner, id )
+
+ end
+
+end
+
+function SWEP:Synch()
+
+ umsg.Start( "InvSWEP", self.Owner )
+ umsg.End()
+
+end
+
+function RecvSynch()
+
+ InvSWEPSynch = true
+
+end
+usermessage.Hook( "InvSWEP", RecvSynch )
+
+function SWEP:Think()
+
+ if SERVER then return end
+
+ if not self.Deployed then return end
+
+ local removing = false
+
+ if InvSWEPSynch or self.LastInv != Inv_Size() then
+
+ removing = true
+ InvSWEPSynch = false
+
+ self.Weapon:RemoveAllPanels()
+
+ end
+
+ self.LastInv = Inv_Size()
+
+ if #self.InvPanels < 1 then
+
+ self.Weapon:GeneratePanels()
+
+ end
+
+ if removing then return end
+
+ if self.Shuffle and #self.InvPanels < 5 then
+
+ for k,v in pairs( self.InvPanels ) do
+
+ v.YPos = self.YPosTbl[k]
+
+ end
+
+ self.Weapon:AddPanel()
+
+ self.Shuffle = false
+
+ end
+
+ if self.InvPos != self.Weapon:GetNWInt( "InvPos", 1 ) then
+
+ self.InvPos = self.Weapon:GetNWInt( "InvPos", 1 )
+
+ self.Weapon:RemovePanel()
+
+ end
+
+end
+
+function SWEP:DrawOption( i, name )
+
+ surface.SetFont( "InventoryFont" )
+
+ local w,h = surface.GetTextSize( name )
+ local col = Color( 255, 255, 255 )
+
+ if i == self.Weapon:GetNWInt( "FuncPos", 1 ) then
+
+ col = Color( 50, 255, 50 )
+
+ end
+
+ draw.RoundedBox( 4, self.PanelSize * 1.5 + 20, 12 + ( i - 1 ) * 25, w + 8, h, Color( 0, 0, 0, 200 ) )
+ draw.SimpleText( name, "InventoryFont", self.PanelSize * 1.5 + 24 + ( w * 0.5 ), 12 + ( i - 1 ) * 25 + ( h * 0.5 ), col, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
+
+end
+
+function SWEP:DrawHUD()
+
+ if self.Weapon:GetNWBool( "UseMode", false ) then
+
+ local inv = Inv_UniqueItems()
+ local tbl = item.GetByID( inv[ self.Weapon:GetNWInt( "InvPos", 1 ) ] )
+
+ if not tbl then return end
+
+ if tbl.Weapon then
+
+ self.Weapon:DrawOption( 1, "cancel" )
+ self.Weapon:DrawOption( 2, "drop" )
+
+ return
+
+ end
+
+ for i=1, #tbl.Functions + 2 do
+
+ if i == 1 then
+
+ self.Weapon:DrawOption( i, "cancel" )
+
+ elseif i == 2 then
+
+ self.Weapon:DrawOption( i, "drop" )
+
+ else
+
+ self.Weapon:DrawOption( i, string.lower( tbl.Functions[ i - 2 ]( 0, 0, true ) ) )
+
+ end
+
+ end
+
+ end
+
+ for k,v in pairs( self.InvPanels or {} ) do
+
+ v.LastX = math.Clamp( math.max( ( v.LastX or self.PanelSize + self.XPos ) - ( FrameTime() * 700 ), 1 ), 0, self.PanelSize + self.XPos )
+ v.LastY = math.Clamp( math.max( ( v.LastY or self.YPos ) - ( FrameTime() * 700 ), 1 ), 0, self.PanelSize + self.YPos )
+
+ if v.LastX != 0 or v.LastY != 0 then // automatically bring the panel into the screen
+
+ v:SetPos( self.XPos - v.LastX, v.YPos - v.LastY )
+
+ if v.YPos == self.YPosTbl[1] then
+
+ v:SetSize( self.PanelSize * 1.5, self.PanelSize * 1.5 )
+ v:SetSizeOverride( self.PanelSize * 1.5 )
+
+ end
+
+ end
+
+ if v.Removal then
+
+ v.RemoveX = math.Clamp( ( v.RemoveX or self.XPos ) - ( FrameTime() * 700 ), -1 * ( self.PanelSize * 2 ), self.PanelSize + self.XPos )
+
+ if v.RemoveX != -1 * ( self.PanelSize * 2 ) then
+
+ v:SetPos( v.RemoveX, v.YPos )
+
+ else
+
+ v:Remove()
+
+ table.remove( self.InvPanels, k )
+
+ local all = true
+
+ for c,d in pairs( self.InvPanels ) do
+
+ if not d.Removal then
+
+ all = false
+
+ end
+
+ end
+
+ if not all then
+
+ self.Shuffle = true
+
+ end
+
+ break
+
+ end
+
+ end
+
+ end
+
+end