diff --git a/gamemodes/benny/entities/entities/b-item.lua b/gamemodes/benny/entities/entities/b-item.lua index 136af82..cbce5a6 100644 --- a/gamemodes/benny/entities/entities/b-item.lua +++ b/gamemodes/benny/entities/entities/b-item.lua @@ -1,3 +1,59 @@ +AddCSLuaFile() -SWEP.Type = "anim" -SWEP.Base = "base_anim" \ No newline at end of file +ENT.Type = "anim" +ENT.Base = "base_anim" +ENT.RenderGroup = RENDERGROUP_BOTH + +function ENT:Initialize() + self.DieTime = CurTime() + 3 +end + +function ENT:InitSpecial( model ) + self:SetModel( model ) + + -- Physics stuff + self:SetMoveType( MOVETYPE_VPHYSICS ) + self:SetSolid( SOLID_VPHYSICS ) + + -- Init physics only on server, so it doesn't mess up physgun beam + if ( SERVER ) then self:PhysicsInit( SOLID_VPHYSICS ) end + + self:SetCollisionGroup( COLLISION_GROUP_PROJECTILE ) + + -- Make prop to fall on spawn + self:PhysWake() + + if SERVER then + local p = self:GetPhysicsObject() + p:SetMass( 0 ) + end +end + +function ENT:Think() + if SERVER and self.DieTime <= CurTime() then + self:Remove() + end +end + +function ENT:PhysicsCollide( data, phys ) + if ( data.Speed > 200 ) and data.DeltaTime > 0.2 then + local ent = data.HitEntity + print(ent:Health()) + if ent:IsValid() and ent:Health() > 0 then + ent:EmitSound( ")benny/violence/bodysplat_mix2.ogg", 70, 100, 1 ) + + local dmg = DamageInfo() + dmg:SetDamageType( DMG_CLUB ) + dmg:SetDamage( 25 ) + dmg:SetAttacker( self:GetOwner() ) + dmg:SetInflictor( self ) + print( data.HitSpeed, data.HitSpeed:Length() ) + dmg:SetDamageForce( data.HitSpeed*-10 ) + dmg:SetDamagePosition( data.HitPos ) + + ent:TakeDamageInfo( dmg ) + else + self:EmitSound( "physics/metal/weapon_impact_hard1.wav" ) + end + end +end \ No newline at end of file diff --git a/gamemodes/benny/entities/entities/b-item_firearm.lua b/gamemodes/benny/entities/entities/b-item_firearm.lua index 3dc44b3..33346a3 100644 --- a/gamemodes/benny/entities/entities/b-item_firearm.lua +++ b/gamemodes/benny/entities/entities/b-item_firearm.lua @@ -1,2 +1,3 @@ -SWEP.Base = "b-item" \ No newline at end of file +ENT.Base = "b-item" + diff --git a/gamemodes/benny/entities/entities/b-npc_human.lua b/gamemodes/benny/entities/entities/b-npc_human.lua index 530742a..e683570 100644 --- a/gamemodes/benny/entities/entities/b-npc_human.lua +++ b/gamemodes/benny/entities/entities/b-npc_human.lua @@ -4,6 +4,8 @@ ENT.Base = "base_nextbot" ENT.Spawnable = true ENT.BennyNPC = true +ENT.AutomaticFrameAdvance = true + function ENT:Nick() return "GEN#" .. self:EntIndex() end @@ -343,11 +345,11 @@ function ENT:OnEntitySightLost( ent ) self.bSeeing[ent] = nil end -local wide, tall = 12/2, 64 +local wide, tall = 16/2, 64 local b1 = Vector( wide, wide, tall ) local b2 = Vector( -wide, -wide, 0 ) -local wide, tall = 48/2, 96 +local wide, tall = 48/2, 80 local s1 = Vector( wide, wide, tall ) local s2 = Vector( -wide, -wide, 0 ) @@ -359,6 +361,13 @@ function ENT:Initialize() self.loco:SetStepHeight( 22 ) self:SetShouldServerRagdoll( false ) self:SetFOV( 90 ) + + self:SetMaxHealth( 100 ) + self:SetHealth( 100 ) + + self:SetCollisionGroup( COLLISION_GROUP_NPC ) + + if SERVER then self:PhysicsInitShadow( true, true ) end self:SetState("idle") @@ -458,4 +467,8 @@ function ENT:Think() end end net.SendPVS(self:GetPos()) + + self:NextThink( CurTime() ) + if CLIENT then self:SetNextClientThink( CurTime() ) end + return true end \ No newline at end of file diff --git a/gamemodes/benny/entities/weapons/benny/sh_drop.lua b/gamemodes/benny/entities/weapons/benny/sh_drop.lua new file mode 100644 index 0000000..86a8239 --- /dev/null +++ b/gamemodes/benny/entities/weapons/benny/sh_drop.lua @@ -0,0 +1,34 @@ + +function SWEP:Drop( hand ) + if self:bWepClass( hand ) then + local p = self:GetOwner() + self:EmitSound( "weapons/slam/throw.wav", 70, 100, 1, CHAN_STATIC ) + + if SERVER then + local throw = ents.Create( "b-item" ) + throw:SetPos( p:EyePos() + p:EyeAngles():Forward()*16 ) + throw:SetAngles( p:EyeAngles() ) + throw:SetOwner( p ) + throw:InitSpecial(self:bWepClass( hand ).WModel) + throw:SetPhysicsAttacker( p ) + throw:Spawn() + local throwp = throw:GetPhysicsObject() + assert( throwp:IsValid(), "Benny Drop: Physics object invalid" ) + throwp:SetVelocityInstantaneous( (p:EyeAngles()+Angle(-7,0,0)):Forward()*1000 ) + if self:bWepClass( hand ).ClassName == "m16a2" then + throwp:SetAngleVelocityInstantaneous( Vector( 360*-0.2, 360*1, 360*0 ) ) + else + throwp:SetAngleVelocityInstantaneous( Vector( 360*-0.25, 360*10, 360*0.25 ) ) + end + end + + if SERVER or CLIENT and IsFirstTimePredicted() then + --InvDiscard( p, self:bGetInvID( hand ) ) + end + self:SetJustThrew( CurTime() + 0.25 ) + self:SetJustThrewHand( hand ) + self:bWepTable( hand ).Thrown = true + p:AddVCDSequenceToGestureSlot( GESTURE_SLOT_JUMP, p:SelectWeightedSequence( ACT_HL2MP_GESTURE_RANGE_ATTACK_MELEE ), 0, true ) + + end +end diff --git a/gamemodes/benny/entities/weapons/benny/sh_firing.lua b/gamemodes/benny/entities/weapons/benny/sh_firing.lua index 74992d3..d877303 100644 --- a/gamemodes/benny/entities/weapons/benny/sh_firing.lua +++ b/gamemodes/benny/entities/weapons/benny/sh_firing.lua @@ -1,11 +1,13 @@ function SWEP:PrimaryAttack() + if self:bWepTable( self:hFlipHand( false ) ) and self:bWepTable( self:hFlipHand( false ) ).Thrown then return true end self:BFireLogic( self:hFlipHand( false ) ) return true end function SWEP:SecondaryAttack() + if self:bWepTable( self:hFlipHand( true ) ) and self:bWepTable( self:hFlipHand( true ) ).Thrown then return true end self:BFireLogic( self:hFlipHand( true ) ) return true end diff --git a/gamemodes/benny/entities/weapons/benny/shared.lua b/gamemodes/benny/entities/weapons/benny/shared.lua index 124b945..01dda26 100644 --- a/gamemodes/benny/entities/weapons/benny/shared.lua +++ b/gamemodes/benny/entities/weapons/benny/shared.lua @@ -31,6 +31,8 @@ AddCSLuaFile( "sh_holdtypes.lua" ) include ( "sh_holdtypes.lua" ) AddCSLuaFile( "sh_reload.lua" ) include ( "sh_reload.lua" ) +AddCSLuaFile( "sh_drop.lua" ) +include ( "sh_drop.lua" ) AddCSLuaFile( "cl_wm.lua" ) if CLIENT then @@ -50,6 +52,7 @@ function SWEP:SetupDataTables() self:NetworkVar( "Float", 9, "Wep2_Holstering" ) self:NetworkVar( "Float", 10, "Wep1_Reloading" ) self:NetworkVar( "Float", 11, "Wep2_Reloading" ) + self:NetworkVar( "Float", 12, "JustThrew" ) self:NetworkVar( "String", 0, "Wep1" ) self:NetworkVar( "String", 1, "Wep2" ) self:NetworkVar( "String", 2, "Wep1_Clip" ) @@ -62,6 +65,7 @@ function SWEP:SetupDataTables() self:NetworkVar( "Int", 5, "Wep2_ReloadType" ) self:NetworkVar( "Bool", 0, "UserAim" ) self:NetworkVar( "Bool", 1, "GrenadeDown" ) + self:NetworkVar( "Bool", 2, "JustThrewHand" ) self:SetWep1_Firemode( 1 ) self:SetWep2_Firemode( 1 ) @@ -114,6 +118,14 @@ hook.Add( "PlayerButtonDown", "Benny_PlayerButtonDown_TempForAim", function( ply if button == ply:GetInfoNum("benny_bind_reloada", KEY_T) then wep:Reload( wep:hFlipHand( true ) ) end + + if button == ply:GetInfoNum("benny_bind_drop", KEY_G) then + wep:Drop( wep:hFlipHand( false ) ) + end + + if button == ply:GetInfoNum("benny_bind_dropa", KEY_H) then + wep:Drop( wep:hFlipHand( true ) ) + end end end) @@ -184,6 +196,8 @@ function SWEP:Think() -- Just know, this feels bad. if self:bGetReloadTime( hand ) > 0 then -- hold + elseif self:GetJustThrew() > CurTime() then + -- hold elseif self:bWepClass( hand ) and self:bGetShotTime( hand ) + self:GetStat( hand, "ShootHolsterTime" ) > CurTime() then -- hold else @@ -207,6 +221,13 @@ function SWEP:Think() self:BThinkHolster( hand ) + if self:GetJustThrew() != 0 and self:GetJustThrew() <= CurTime() then + if SERVER then + InvDiscard( p, self:bGetInvID( self:GetJustThrewHand() ) ) + end + self:SetJustThrew( 0 ) + end + do -- Reload logic if self:bGetReloadTime( hand ) != -1 then local rlt = self:bGetReloadType( hand ) @@ -250,7 +271,9 @@ function SWEP:Think() if self:bWepClass( false ) and self:bGetHolsterTime( false ) < 0 then ht = "passive" if self:GetUserAim() then - if self:bWepClass( true ) then + if self:GetJustThrew() != 0 then + ht = "melee" + elseif self:bWepClass( true ) then ht = "duel" else ht = self:GetStat( false, "HoldType" ) diff --git a/gamemodes/benny/gamemode/modules/player/cl_hud.lua b/gamemodes/benny/gamemode/modules/player/cl_hud.lua index 4df30fe..09d989f 100644 --- a/gamemodes/benny/gamemode/modules/player/cl_hud.lua +++ b/gamemodes/benny/gamemode/modules/player/cl_hud.lua @@ -524,6 +524,11 @@ hook.Add( "HUDPaint", "Benny_HUDPaint", function() draw.SimpleText( wep:B_FiremodeName( hand ), "Benny_12", p_x + pb + ss(14.5), p_y + pb + t_h + ss(8), scheme["bg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) -- draw.SimpleText( "[AMMO TYPE]", "Benny_10", p_x + pb + ss(30+4), p_y + pb + t_h + ss(8), scheme["fg"], TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER ) end + if wep_table.Thrown then + + draw.SimpleText( "X", "Benny_48", p_x+p_w/2, p_y+p_h/2 + ss(8), scheme["fg"], TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER ) + + end if wep:bMagClass( hand ) then -- Ammo local b_w, b_h = ss(3), ss(10) local lw, lh = ss(2), ss(2) diff --git a/gamemodes/benny/gamemode/modules/player/sh_basic.lua b/gamemodes/benny/gamemode/modules/player/sh_basic.lua index fc417ca..4670c0f 100644 --- a/gamemodes/benny/gamemode/modules/player/sh_basic.lua +++ b/gamemodes/benny/gamemode/modules/player/sh_basic.lua @@ -59,42 +59,46 @@ if CLIENT then end) end -concommand.Add("benny_inv_discard", function( ply, cmd, args ) +function InvDiscard( ply, ID ) local inv = ply:INV_Get() local wep = ply:GetActiveWeapon() - local item = inv[args[1]] + local item = inv[ID] -- PROTO: Check that this is the correct 'benny' weapon. assert( item, "That item doesn't exist. " .. tostring(item) ) - inv[args[1]] = nil + inv[ID] = nil net.Start( "benny_discardinvitem" ) - net.WriteString( args[1] ) + net.WriteString( ID ) net.Send( ply ) - if wep:bGetInvID( false ) == args[1] then - print( "Disequipped " .. args[1] .. " for " .. tostring(wep) ) + if wep:bGetInvID( false ) == ID then + print( "Disequipped " .. ID .. " for " .. tostring(wep) ) wep:SetWep1( "" ) wep:SetWep1_Clip( "" ) wep:SetClip1( 0 ) end - if wep:bGetInvID( true ) == args[1] then - print( "Disequipped " .. args[1] .. " for " .. tostring(wep) ) + if wep:bGetInvID( true ) == ID then + print( "Disequipped " .. ID .. " for " .. tostring(wep) ) wep:SetWep2( "" ) wep:SetWep2_Clip( "" ) wep:SetClip2( 0 ) end - if wep:bGetMagInvID( false ) == args[1] then - print( "Unloaded " .. args[1] .. " for " .. tostring(wep) ) + if wep:bGetMagInvID( false ) == ID then + print( "Unloaded " .. ID .. " for " .. tostring(wep) ) inv[wep:bGetInvID( false )].Loaded = "" wep:SetWep1_Clip( "" ) wep:SetClip1( 0 ) end - if wep:bGetMagInvID( true ) == args[1] then - print( "Unloaded " .. args[1] .. " for " .. tostring(wep) ) + if wep:bGetMagInvID( true ) == ID then + print( "Unloaded " .. ID .. " for " .. tostring(wep) ) inv[wep:bGetInvID( true )].Loaded = "" wep:SetWep2_Clip( "" ) wep:SetClip2( 0 ) end +end + +concommand.Add("benny_inv_discard", function( ply, cmd, args ) + InvDiscard( ply, args[1] ) end) hook.Add( "PlayerDeathSound", "Benny_PlayerDeathSound", function( ply ) diff --git a/gamemodes/benny/gamemode/modules/weapons/sh_weapons.lua b/gamemodes/benny/gamemode/modules/weapons/sh_weapons.lua index 741c1b9..0c0d04b 100644 --- a/gamemodes/benny/gamemode/modules/weapons/sh_weapons.lua +++ b/gamemodes/benny/gamemode/modules/weapons/sh_weapons.lua @@ -543,7 +543,7 @@ do -- Toolgun end, ["summon_human"] = function( self, p, tr ) if SERVER then - local summon = ents.Create( "benny_npc_human" ) + local summon = ents.Create( "b-npc_human" ) summon:SetPos( tr.HitPos + tr.HitNormal ) local ang = Angle( 0, p:EyeAngles().y+0, 0 ) summon:SetAngles( ang )