-- The benny weapon handles the weapon pickups you find throughout the game. SWEP.Base = "weapon_base" SWEP.PrintName = "Benny Weapon Handler" SWEP.ViewModel = "models/weapons/c_pistol.mdl" SWEP.ViewModelFOV = 10 SWEP.WorldModel = "models/weapons/w_pistol.mdl" SWEP.Primary.ClipSize = 0 SWEP.Primary.DefaultClip = 0 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "none" SWEP.Secondary.ClipSize = 0 SWEP.Secondary.DefaultClip = 0 SWEP.Secondary.Automatic = true SWEP.Secondary.Ammo = "none" function SWEP:SetupDataTables() self:NetworkVar( "Float", 0, "Aim" ) self:NetworkVar( "Float", 1, "Delay1" ) self:NetworkVar( "Float", 2, "Delay2" ) self:NetworkVar( "String", 0, "Wep1" ) self:NetworkVar( "String", 1, "Wep2" ) self:NetworkVar( "Int", 0, "Wep1Clip" ) self:NetworkVar( "Int", 1, "Wep2Clip" ) self:NetworkVar( "Int", 2, "Wep1Burst" ) self:NetworkVar( "Int", 3, "Wep2Burst" ) self:NetworkVar( "Bool", 0, "UserAim" ) end function SWEP:PrimaryAttack() if !self:BTable() then return end if self:BClass().Fire then if self:BClass( false ).Fire( self, false ) then return end end if self:GetDelay1() > CurTime() then return end if self:GetWep1Burst() >= self:B_Firemode( false ).Mode then return end if self:Clip1() == 0 then B_Sound( self, self:BClass( false ).Sound_DryFire ) self:SetDelay1( CurTime() + 0.2 ) return end self:B_Ammo( false, self:Clip1() - 1 ) B_Sound( self, self:BClass( false ).Sound_Fire ) if CLIENT and IsFirstTimePredicted() then local tr = self:GetOwner():GetEyeTrace() do local vStart = self.CWM:GetAttachment( 1 ).Pos local vPoint = tr.HitPos local effectdata = EffectData() effectdata:SetStart( vStart ) effectdata:SetOrigin( vPoint ) effectdata:SetEntity( self ) effectdata:SetScale( 5000 ) effectdata:SetFlags( 1 ) util.Effect( "Tracer", effectdata ) end -- util.DecalEx( Material( util.DecalMaterial( "Impact.Concrete" ) ), tr.Entity, tr.HitPos, tr.HitNormal, color_white, 1, 1 ) do local effectdata = EffectData() effectdata:SetOrigin( tr.HitPos ) effectdata:SetStart( tr.StartPos ) effectdata:SetSurfaceProp( tr.SurfaceProps ) effectdata:SetEntity( tr.Entity ) effectdata:SetDamageType( DMG_BULLET ) util.Effect( "Impact", effectdata ) end end self:SetDelay1( CurTime() + self:BClass( false ).Delay ) self:SetWep1Burst( self:GetWep1Burst() + 1 ) return true end -- BENNY shit function SWEP:BTable( alt ) return self:GetOwner():INV_Get()[ alt and self:GetWep2() or self:GetWep1() ] end function SWEP:BClass( alt ) local ta = self:BTable( alt ) if ta then return WEAPONS[ ta.Class ] else return false end end function SWEP:B_Ammo( alt, value ) local clip = (alt and self:GetWep2Clip() or self:GetWep1Clip()) assert( clip > 0, "You cannot mess with an EMPTY magazine!") if alt then self:SetClip2( value ) else self:SetClip1( value ) end self:BTable( alt )["Ammo" .. clip] = value end function SWEP:B_Firemode( alt ) return self:BClass( alt ).Firemodes[1] end function SWEP:B_FiremodeName( alt ) local mode = self:B_Firemode( alt ).Mode if mode == 1 then return "SEMI" elseif mode == math.huge then return "AUTO" else return mode .. "RND" end end function SWEP:SecondaryAttack() return true end function SWEP:Reload() if self:BTable( false ) and self:GetOwner():KeyPressed( IN_RELOAD ) then if self:BClass().Reload then if self:BClass( false ).Reload( self, false ) then return end end if self:GetDelay1() > CurTime() then return false end if self:GetWep1Clip() != 0 then B_Sound( self, self:BClass().Sound_MagOut ) self:SetClip1( 0 ) self:SetWep1Clip( 0 ) self:BTable().Loaded = 0 else local maglist = { self:BTable( false ).Ammo1, self:BTable( false ).Ammo2, self:BTable( false ).Ammo3 } for i, v in SortedPairsByValue( maglist, true ) do if v == 0 then B_Sound( self, "Common.NoAmmo" ) return end self:BTable().Loaded = i self:SetWep1Clip( i ) self:SetClip1( v ) break end B_Sound( self, self:BClass().Sound_MagIn ) end end return true end CreateClientConVar( "benny_toggleaim", 0, true, true ) function SWEP:Think() local p = self:GetOwner() if tobool(p:GetInfoNum("benny_toggleaim", 0)) then if p:KeyPressed( IN_ATTACK2 ) then self:SetUserAim( !self:GetUserAim() ) end else self:SetUserAim( p:KeyDown( IN_ATTACK2 ) ) end self:SetAim( math.Approach( self:GetAim(), self:GetUserAim() and 1 or 0, FrameTime()/0.2 ) ) if !p:KeyDown( IN_ATTACK ) then self:SetWep1Burst( 0 ) end local ht = "normal" if self:GetAim() > 0 then if self:BClass( false ) then ht = self:BClass( false ).HoldType or "revolver" end end self:SetWeaponHoldType(ht) self:SetHoldType(ht) return true end function SWEP:Deploy() return true end function SWEP:Holster() return true end if CLIENT then function SWEP:DrawWorldModel() local p = self:GetOwner() local wm = self.CWM local class = self:BClass( false ) if class then if !IsValid(wm) then wm = ClientsideModel( class.WModel ) self.CWM = wm end wm:SetModel( class.WModel ) wm:SetNoDraw( true ) wm:AddEffects( EF_BONEMERGE ) wm:SetParent( p ) -- if IsValid(p) then -- -- Specify a good position -- local offsetVec = Vector(12.8, -1.4, 2.6) -- local offsetAng = Angle(180 - 10, 180, 0) -- -- local boneid = p:LookupBone("ValveBiped.Bip01_R_Hand") -- Right Hand -- if !boneid then return end -- local matrix = p:GetBoneMatrix(boneid) -- if !matrix then return end -- local newPos, newAng = LocalToWorld(offsetVec, offsetAng, matrix:GetTranslation(), matrix:GetAngles()) -- wm:SetPos(newPos) -- wm:SetAngles(newAng) -- wm:SetupBones() -- else -- wm:SetPos(self:GetPos()) -- wm:SetAngles(self:GetAngles()) -- wm:SetupBones() -- end wm:DrawModel() end end end -- Holdtype thingys do local ActIndex = { [ "pistol" ] = ACT_HL2MP_IDLE_PISTOL, [ "smg" ] = ACT_HL2MP_IDLE_SMG1, [ "grenade" ] = ACT_HL2MP_IDLE_GRENADE, [ "ar2" ] = ACT_HL2MP_IDLE_AR2, [ "shotgun" ] = ACT_HL2MP_IDLE_SHOTGUN, [ "rpg" ] = ACT_HL2MP_IDLE_RPG, [ "physgun" ] = ACT_HL2MP_IDLE_PHYSGUN, [ "crossbow" ] = ACT_HL2MP_IDLE_CROSSBOW, [ "melee" ] = ACT_HL2MP_IDLE_MELEE, [ "slam" ] = ACT_HL2MP_IDLE_SLAM, [ "normal" ] = ACT_HL2MP_IDLE, [ "fist" ] = ACT_HL2MP_IDLE_FIST, [ "melee2" ] = ACT_HL2MP_IDLE_MELEE2, [ "passive" ] = ACT_HL2MP_IDLE_PASSIVE, [ "knife" ] = ACT_HL2MP_IDLE_KNIFE, [ "duel" ] = ACT_HL2MP_IDLE_DUEL, [ "camera" ] = ACT_HL2MP_IDLE_CAMERA, [ "magic" ] = ACT_HL2MP_IDLE_MAGIC, [ "revolver" ] = ACT_HL2MP_IDLE_REVOLVER, [ "suitcase" ] = ACT_HL2MP_IDLE, [ "melee_angry" ] = ACT_HL2MP_IDLE_MELEE_ANGRY, [ "angry" ] = ACT_HL2MP_IDLE_ANGRY, [ "scared" ] = ACT_HL2MP_IDLE_SCARED, [ "zombie" ] = ACT_HL2MP_IDLE_ZOMBIE, [ "cower" ] = ACT_HL2MP_IDLE_COWER, } --[[--------------------------------------------------------- Name: SetWeaponHoldType Desc: Sets up the translation table, to translate from normal standing idle pose, to holding weapon pose. -----------------------------------------------------------]] function SWEP:SetWeaponHoldType( t ) t = string.lower( t ) local index = ActIndex[ t ] if ( index == nil ) then Msg( "SWEP:SetWeaponHoldType - ActIndex[ \"" .. t .. "\" ] isn't set! (defaulting to normal)\n" ) t = "normal" index = ActIndex[ t ] end self.ActivityTranslate = {} self.ActivityTranslate[ ACT_MP_STAND_IDLE ] = index self.ActivityTranslate[ ACT_MP_WALK ] = index + 1 self.ActivityTranslate[ ACT_MP_RUN ] = index + 2 self.ActivityTranslate[ ACT_MP_CROUCH_IDLE ] = index + 3 self.ActivityTranslate[ ACT_MP_CROUCHWALK ] = index + 4 self.ActivityTranslate[ ACT_MP_ATTACK_STAND_PRIMARYFIRE ] = index + 5 self.ActivityTranslate[ ACT_MP_ATTACK_CROUCH_PRIMARYFIRE ] = index + 5 self.ActivityTranslate[ ACT_MP_RELOAD_STAND ] = index + 6 self.ActivityTranslate[ ACT_MP_RELOAD_CROUCH ] = index + 6 self.ActivityTranslate[ ACT_MP_JUMP ] = index + 7 self.ActivityTranslate[ ACT_RANGE_ATTACK1 ] = index + 8 self.ActivityTranslate[ ACT_MP_SWIM ] = index + 9 -- "normal" jump animation doesn't exist if ( t == "normal" ) then self.ActivityTranslate[ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM end if ( t == "suitcase" ) then self.ActivityTranslate[ ACT_MP_STAND_IDLE ] = ACT_HL2MP_IDLE_SUITCASE self.ActivityTranslate[ ACT_MP_WALK ] = ACT_HL2MP_WALK_SUITCASE self.ActivityTranslate[ ACT_MP_JUMP ] = ACT_HL2MP_JUMP_SLAM end if ( t == "rpg" ) then self.ActivityTranslate[ ACT_MP_CROUCH_IDLE ] = ACT_HL2MP_IDLE_CROUCH_AR2 self.ActivityTranslate[ ACT_MP_CROUCHWALK ] = ACT_HL2MP_WALK_CROUCH_AR2 end --self:SetupWeaponHoldTypeForAI( t ) end -- Default hold pos is the pistol SWEP:SetWeaponHoldType( "pistol" ) --[[--------------------------------------------------------- Name: weapon:TranslateActivity() Desc: Translate a player's Activity into a weapon's activity So for example, ACT_HL2MP_RUN becomes ACT_HL2MP_RUN_PISTOL Depending on how you want the player to be holding the weapon -----------------------------------------------------------]] function SWEP:TranslateActivity( act ) if ( self.Owner:IsNPC() ) then if ( self.ActivityTranslateAI[ act ] ) then return self.ActivityTranslateAI[ act ] end return -1 end if ( self.ActivityTranslate[ act ] != nil ) then return self.ActivityTranslate[ act ] end return -1 end end