if( SERVER ) then AddCSLuaFile( "shared.lua" ); end if( CLIENT ) then SWEP.PrintName = "Hands"; SWEP.Slot = 0; SWEP.SlotPos = 1; SWEP.DrawAmmo = false; SWEP.DrawCrosshair = false; SWEP.DrawDotCrosshair = true; end // Variables that are used on both client and server SWEP.Base = "weapon_ts_base"; SWEP.Author = "Rick Darkaliono" SWEP.Instructions = "Left click - Knock On Door/Throw punch Right click - Untie/Block punch Reload+Unholstered - Ram a door" SWEP.Contact = "" SWEP.Purpose = "You can use right click while holstered to untie someone!" SWEP.NotHolsterAnim = ACT_HL2MP_IDLE; SWEP.ViewModel = Model( "models/weapons/v_fists.mdl" ); SWEP.WorldModel = Model( "models/weapons/w_fists.mdl" ); SWEP.ViewModelFOV = 62 SWEP.ViewModelFlip = false SWEP.AnimPrefix = "rpg" SWEP.Spawnable = false SWEP.AdminSpawnable = true SWEP.Primary.ClipSize = -1 // Size of a clip SWEP.Primary.DefaultClip = 0 // Default number of bullets in a clip SWEP.Primary.Automatic = false // Automatic/Semi Auto SWEP.Primary.Ammo = "" SWEP.Secondary.ClipSize = -1 // Size of a clip SWEP.Secondary.DefaultClip = 0 // Default number of bullets in a clip SWEP.Secondary.Automatic = false // Automatic/Semi Auto SWEP.Secondary.Ammo = "" SWEP.IronSightPos = Vector( 0, 6.2, -8.0 ); SWEP.IronSightAng = Vector( -4, 0, 0.0 ); SWEP.NoIronSightFovChange = true; SWEP.NoIronSightAttack = true; SWEP.LastDoorKick = 0; SWEP.Untying = false; /*--------------------------------------------------------- Name: SWEP:Initialize( ) Desc: Called when the weapon is first loaded ---------------------------------------------------------*/ function SWEP:Initialize() if( SERVER ) then self:SetWeaponHoldType( "ar2" ); end self.HitSounds = { Sound( "npc/vort/foot_hit.wav" ), Sound( "weapons/crossbow/hitbod1.wav" ), Sound( "weapons/crossbow/hitbod2.wav" ) } self.SwingSounds = { Sound( "npc/vort/claw_swing1.wav" ), Sound( "npc/vort/claw_swing2.wav" ) } end /*--------------------------------------------------------- Name: SWEP:Precache( ) Desc: Use this function to precache stuff ---------------------------------------------------------*/ function SWEP:Precache() end /*--------------------------------------------------------- Name: SWEP:PrimaryAttack( ) Desc: +attack1 has been pressed ---------------------------------------------------------*/ function SWEP:PrimaryAttack() if( self.Owner:KeyDown( IN_SPEED ) and self.Owner:GetVelocity():Length() >= 140 ) then return; end if( self.Owner:GetNWInt( "holstered" ) == 0 ) then if( self.Weapon:GetNWBool( "ironsights" ) ) then return; end self.Weapon:EmitSound( self.SwingSounds[math.random( 1, #self.SwingSounds )] ); self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER ) self.Weapon:SetNextPrimaryFire( CurTime() + 1.4 - ( .8 * math.Clamp( self.Owner:GetNWInt( "sprint" ) / 100, 0, 1 ) ) ); self.Owner:SetNWInt( "sprint", math.Clamp( self.Owner:GetNWInt( "sprint" ) - math.Clamp( 200 / self.Owner:GetNWFloat( "stat.Sprint" ), .01, 40 ), 0, 100 ) ); local trace = { } trace.start = self.Owner:EyePos(); trace.endpos = trace.start + self.Owner:GetAimVector() * 60; trace.filter = self.Owner; local tr = util.TraceLine( trace ); if( tr.Hit or tr.Entity:IsValid() ) then if( SERVER ) then if( tr.Entity:IsValid() ) then local norm = ( tr.Entity:GetPos() - self.Owner:GetPos() ):Normalize(); local push = 2000 * norm; if( tr.Entity:IsPlayer() or tr.Entity:IsPlayerRagdoll() ) then local ply = tr.Entity; if( tr.Entity:IsPlayerRagdoll() ) then ply = tr.Entity:GetPlayer(); end ply:HandlePunch( self.Owner, tr.HitGroup ); push = 50 * norm; tr.Entity:SetVelocity( push ); else local stat = self.Owner:GetNWFloat( "stat.Strength" ); local amt = 0; if( stat < 17 ) then amt = .01; elseif( stat < 30 ) then amt = .05; elseif( stat < 50 ) then amt = .03; elseif( stat < 75 ) then amt = .02; elseif( stat < 85 ) then amt = .014; elseif( stat < 100 ) then amt = .001; end self.Owner:SetNWFloat( "stat.Strength", stat + amt * .35 ); tr.Entity:GetPhysicsObject():ApplyForceOffset( push, tr.HitPos ); end end end self.Weapon:EmitSound( self.HitSounds[math.random( 1, #self.HitSounds )] ); end else self.Weapon:EmitSound( Sound( "physics/wood/wood_crate_impact_hard2.wav" ) ); end end /*--------------------------------------------------------- SecondaryAttack ---------------------------------------------------------*/ function SWEP:SecondaryAttack() if( self.Owner:GetNWInt( "holstered" ) == 1 ) then if( self.Untying ) then return; end local trace = { } trace.start = self.Owner:EyePos(); trace.endpos = trace.start + self.Owner:GetAimVector() * 60; trace.filter = self.Owner; local tr = util.TraceLine( trace ); if( tr.Entity:IsValid() and ( tr.Entity:IsPlayer() or tr.Entity:IsPlayerRagdoll() ) ) then if( tr.Entity:IsPlayerRagdoll() ) then tr.Entity = tr.Entity:GetPlayer(); end if( tr.Entity:GetNWInt( "tiedup" ) == 1 ) then self.Untying = true; tr.Entity:SetNWInt( "beingtiedup", 1 ); self.Owner:SetNWInt( "tyingup", 1 ); tr.Entity:SetNWInt( "untying", 1 ); self.Owner:SetNWInt( "untying", 1 ); self.Owner:SetNWInt( "tieduptarget", tr.Entity:EntIndex() ); else self.Owner:PrintMessage( 3, "Target is not tied up" ); self.Weapon:SetNextSecondaryFire( CurTime() + 1 ); end end else self:ToggleIronsight(); end end function SWEP:Think() if( self.Weapon:GetNWBool( "ironsights" ) and not self.Owner:KeyDown( IN_ATTACK2 ) ) then self:SecondaryAttack(); end if( self.Untying ) then if( not self.Owner:KeyDown( IN_ATTACK2 ) ) then self.Untying = false; self.Owner:ConCommand( "rp_stoptie\n" ); end end if( SERVER and self.Owner:KeyDown( IN_RELOAD ) ) then self.Owner:TryDoorRam(); end end