diff options
Diffstat (limited to 'entities/weapons/rad_inv/shared.lua')
| -rw-r--r-- | entities/weapons/rad_inv/shared.lua | 562 |
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 |
