From c6279b4b5753524ede29e65c3d22f9e71747df9e Mon Sep 17 00:00:00 2001 From: Fesiug Date: Fri, 17 Nov 2023 22:56:41 -0500 Subject: [PATCH] Akimbo is looking reaaal SWEET --- .../benny/entities/weapons/benny/sh_inv.lua | 7 +- .../benny/entities/weapons/benny/shared.lua | 20 +++- .../benny/gamemode/modules/player/cl_hud.lua | 23 +++-- .../gamemode/modules/player/sh_basic.lua | 91 +++++++++++++++++-- .../gamemode/modules/player/sh_player.lua | 2 +- 5 files changed, 125 insertions(+), 18 deletions(-) diff --git a/gamemodes/benny/entities/weapons/benny/sh_inv.lua b/gamemodes/benny/entities/weapons/benny/sh_inv.lua index 4409bd7..593cdba 100644 --- a/gamemodes/benny/entities/weapons/benny/sh_inv.lua +++ b/gamemodes/benny/entities/weapons/benny/sh_inv.lua @@ -73,10 +73,13 @@ function SWEP:BDeploy( hand, id ) self:D_SetID( hand, id ) self:D_SetMagID( hand, "" ) self:D_SetClip( hand, 0 ) - if item.Loaded then + if item.Loaded and item.Loaded != "" then local mid = item.Loaded local midi = inv[ mid ] - assert( midi, "Deploy: Magazine doesn't exist in the inventory!! " .. tostring(item.Loaded) ) + if !midi then + item.Loaded = "" + error( "Deploy: Magazine doesn't exist in the inventory!! " .. tostring(mid) .. " item.Loaded removed." ) + end self:D_SetMagID( hand, mid ) self:D_SetClip( hand, midi.Ammo ) end diff --git a/gamemodes/benny/entities/weapons/benny/shared.lua b/gamemodes/benny/entities/weapons/benny/shared.lua index 0d2c03a..587bfef 100644 --- a/gamemodes/benny/entities/weapons/benny/shared.lua +++ b/gamemodes/benny/entities/weapons/benny/shared.lua @@ -130,7 +130,25 @@ function SWEP:Reload() wep_table.Loaded = "" else local maglist = p:INV_FindMag( "mag_" .. wep_table.Class ) - local mag = maglist[1] + local mag + + local usedlist = {} + for _id, mrow in pairs( inv ) do + if mrow.Loaded and mrow.Loaded != "" then + usedlist[mrow.Loaded] = true + -- print( mrow.Loaded .. " Added to Mrowlist" ) + end + end + + for num, mid in ipairs( maglist ) do + if usedlist[mid] then + -- print( "oh No we can't use " .. mid ) + else + mag = mid + break + end + end + if mag then self:D_SetMagID( hand, mag ) self:D_SetClip( hand, inv[mag].Ammo ) diff --git a/gamemodes/benny/gamemode/modules/player/cl_hud.lua b/gamemodes/benny/gamemode/modules/player/cl_hud.lua index ffd2a78..3a37dba 100644 --- a/gamemodes/benny/gamemode/modules/player/cl_hud.lua +++ b/gamemodes/benny/gamemode/modules/player/cl_hud.lua @@ -339,7 +339,10 @@ hook.Add( "HUDPaint", "Benny_HUDPaint", function() draw.SimpleText( wep_class.Name, "Benny_16", p_x+ss(6), p_y+ss(5), scheme["bg"], TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP ) - draw.SimpleText( wep:D_GetID( hand ), "Benny_10", p_x+p_w-pb2, p_y+ss(7), scheme["bg"], TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP ) + local identicallist = p:INV_Find( wep:BTable( hand ).Class ) + identicallist = table.Flip( identicallist ) + local numba = identicallist[ wep:D_GetID( hand ) ] + draw.SimpleText( "(" .. tostring(numba) .. ") - " .. wep:D_GetID( hand ), "Benny_10", p_x+p_w-pb2, p_y+ss(7), scheme["bg"], TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP ) if wep_class.Firemodes then -- Firemode surface.SetDrawColor( scheme["fg"] ) @@ -385,12 +388,15 @@ hook.Add( "HUDPaint", "Benny_HUDPaint", function() local b2 = ss( 2 ) local b3 = ss( 3 ) local b4 = ss( 4 ) - local maglist = p:INV_FindMag( "mag_" .. wep_table.Class, wep:D_GetMagID( hand ) ) + local maglist = p:INV_FindMag( "mag_" .. wep_table.Class, { [wep:D_GetMagID( hand )] = true, [wep:D_GetMagID( !hand )] = true, } ) local newmaglist = {} if wep:D_GetMagID( hand ) != "" then table.insert( newmaglist, wep:D_GetMagID( hand ) ) end + if wep:D_GetMagID( !hand ) != "" then + table.insert( newmaglist, wep:D_GetMagID( !hand ) ) + end for i, v in ipairs( maglist ) do table.insert( newmaglist, v ) end @@ -406,19 +412,20 @@ hook.Add( "HUDPaint", "Benny_HUDPaint", function() local perc = math.abs( math.cos( CurTime() ) ) local s1 = (m_h - b2 - b2) - local s2 = (m_h - b2 - b2) * ( inv[tag].Ammo / WEAPONS[inv[tag].Class].Ammo ) + local s2 = (m_h - b2 - b2) * (inv[tag] and ( inv[tag].Ammo / WEAPONS[inv[tag].Class].Ammo ) or 8) local s3 = math.floor( s2 - s1 ) local m1, m2, m3, m4 = m_x + bb + bb - chunk, m_y + bb + bb - s3, m_w - b2 - b2, s2 local active = tag == wep:D_GetMagID( hand ) - if active then - draw.SimpleText( "x", "Benny_10", m_x + (m_w/2) - chunk, m_y + (m_h/2), scheme["fg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) + local active2 = tag == wep:D_GetMagID( !hand ) + if active or active2 then + draw.SimpleText( active2 and "|" or "x", "Benny_10", m_x + (m_w/2) - chunk, m_y + (m_h/2), scheme["fg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) end surface.DrawRect( m1, m2, m3, m4 ) - if active then + if active or active2 then render.SetScissorRect( m1, m2, m1 + m3, m2 + m4, true ) - draw.SimpleText( "x", "Benny_10", m_x + (m_w/2) - chunk, m_y + (m_h/2), scheme["bg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) + draw.SimpleText( active2 and "|" or "x", "Benny_10", m_x + (m_w/2) - chunk, m_y + (m_h/2), scheme["bg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) render.SetScissorRect( 0, 0, 0, 0, false ) end end @@ -808,7 +815,7 @@ do end local function Wrap( ply, num ) local buckets = ply:INV_Buckets() - local currsel = ply:GetActiveWeapon():GetWep1() + local currsel = ply:GetActiveWeapon():D_GetID( ply:GetActiveWeapon():GetTempHandedness() ) local lb, li = Locate( ply, buckets, currsel ) if lb then diff --git a/gamemodes/benny/gamemode/modules/player/sh_basic.lua b/gamemodes/benny/gamemode/modules/player/sh_basic.lua index a6d23ba..d2cee14 100644 --- a/gamemodes/benny/gamemode/modules/player/sh_basic.lua +++ b/gamemodes/benny/gamemode/modules/player/sh_basic.lua @@ -47,7 +47,43 @@ 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 wep:BDeploy( wep:GetTempHandedness(), args[1] ) end + if wep then + print(args[2]) + local hand = args[2]!=nil and tobool(args[2]) or wep:GetTempHandedness() + print(hand) + 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()) @@ -238,24 +274,67 @@ if CLIENT then end local function regen_items( itemlist ) local ply = LocalPlayer() + local inv = ply:INV_Get() local active = GetConVar("benny_hud_tempactive"):GetString() itemlist:Clear() - for i, v in pairs( ply:INV_Get() ) do + for i, v in pairs( ply:INV_ListFromBuckets() ) do local button = vgui.Create( "DButton" ) itemlist:AddItem( button ) - button:SetSize( 1, ss(36) ) + button:SetSize( 1, ss(30) ) button:Dock( TOP ) button:DockMargin( 0, 0, 0, ss(4) ) - button.ID = i - local Class = WEAPONS[v.Class] + button.ID = v + local Class = WEAPONS[inv[v].Class] button.Text_Name = Class.Name button.Text_Desc = Class.Description -- PROTO: These functions don't need to be remade over and over like this. function button:DoClick() - RunConsoleCommand("benny_inv_equip", button.ID) + local Menu = DermaMenu() + + local opt0 = Menu:AddOption( "Equip", function() + RunConsoleCommand( "benny_inv_equip", button.ID ) + end) + opt0:SetIcon( "icon16/control_play_blue.png" ) + + Menu:AddSpacer() + + local opt1 = Menu:AddOption( "Equip Right", function() + RunConsoleCommand( "benny_inv_equip", button.ID, "false" ) + end) + opt1:SetIcon( "icon16/resultset_next.png" ) + + local opt2 = Menu:AddOption( "Equip Left", function() + RunConsoleCommand( "benny_inv_equip", button.ID, "true" ) + end) + opt2:SetIcon( "icon16/resultset_previous.png" ) + + local opt3 = Menu:AddOption( "Swap Right", function() + RunConsoleCommand( "benny_inv_equip", button.ID, "false", "true" ) + end) + opt3:SetIcon( "icon16/resultset_first.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 diff --git a/gamemodes/benny/gamemode/modules/player/sh_player.lua b/gamemodes/benny/gamemode/modules/player/sh_player.lua index 837a1c6..07ccef2 100644 --- a/gamemodes/benny/gamemode/modules/player/sh_player.lua +++ b/gamemodes/benny/gamemode/modules/player/sh_player.lua @@ -93,7 +93,7 @@ function PT:INV_FindMag( class, exclude ) local inv = self:INV_Get() local results = {} for i, v in pairs( inv ) do - if v.Class == class and i != (exclude or "") then + if v.Class == class and (exclude and !exclude[i] or !exclude and true) then table.insert( results, i ) end end