if CLIENT then SWEP.WepSelectIcon = surface.GetTextureID( "csgo/econ/weapons/base_weapons/weapon_knife_t" ) SWEP.DrawWeaponInfoBox = false SWEP.BounceWeaponIcon = false killicon.Add( "weapon_csgo_knife_t", "csgo/econ/weapons/base_weapons/weapon_knife_t", Color( 255, 255, 255, 255 ) ) end SWEP.PrintName = "Knife" SWEP.Category = "Counter-Strike: Global Offensive" SWEP.Spawnable= true SWEP.AdminSpawnable= true SWEP.AdminOnly = false SWEP.ViewModelFOV = 60 SWEP.ViewModel = "models/csgo/weapons/v_knife_default_t.mdl" SWEP.WorldModel = "models/csgo/weapons/w_knife_default_t.mdl" SWEP.ViewModelFlip = false SWEP.BobScale = 0.4 SWEP.SwayScale = 0.75 SWEP.AutoSwitchTo = false SWEP.AutoSwitchFrom = false SWEP.Weight = 0 SWEP.Slot = 0 SWEP.SlotPos = 0 SWEP.UseHands = false SWEP.HoldType = "knife" SWEP.FiresUnderwater = true SWEP.DrawCrosshair = false SWEP.DrawAmmo = true SWEP.CSMuzzleFlashes = 1 SWEP.Base = "weapon_base" SWEP.InspectTimer = CurTime() SWEP.Idle = 0 SWEP.IdleTimer = CurTime() SWEP.Speed = 200 SWEP.CrosshairDistance = 24 SWEP.Primary.Sound = Sound( "Weapon_CSGO_Knife.Slash" ) SWEP.Primary.ClipSize = 0 SWEP.Primary.DefaultClip = 0 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "none" SWEP.Primary.DamageMin = 25 SWEP.Primary.DamageMax = 40 SWEP.Primary.DamageBackstab = 90 SWEP.Primary.Spread = 0.001 SWEP.Primary.SpreadMin = 0.001 SWEP.Primary.SpreadMax = 0.044240002 SWEP.Primary.SpreadKick = 0.022120001 SWEP.Primary.SpreadMove = 0.04 SWEP.Primary.SpreadAir = 0.044240002 SWEP.Primary.SpreadTimer = CurTime() SWEP.Primary.SpreadTime = 0.345388 SWEP.Primary.Delay = 0.4 SWEP.Primary.Force = 1 SWEP.Secondary.ClipSize = 0 SWEP.Secondary.DefaultClip = 0 SWEP.Secondary.Automatic = true SWEP.Secondary.Ammo = "none" SWEP.Secondary.Damage = 65 SWEP.Secondary.DamageBackstab = 180 SWEP.Secondary.Delay = 1 SWEP.Secondary.Force = 2 function SWEP:Initialize() self:SetWeaponHoldType( self.HoldType ) self.Idle = 0 self.IdleTimer = CurTime() + 0.5 end function SWEP:DrawHUD() local dist1 = self.Primary.Spread / self.Primary.SpreadMax * self.CrosshairDistance + 4 local dist2 = self.Primary.Spread / self.Primary.SpreadMax * self.CrosshairDistance + 12 surface.SetDrawColor( GetConVar( "csgo_crosshair_red" ):GetInt(), GetConVar( "csgo_crosshair_green" ):GetInt(), GetConVar( "csgo_crosshair_blue" ):GetInt(), GetConVar( "csgo_crosshair_alpha" ):GetInt() ) surface.DrawLine( ScrW() / 2 - dist1, ScrH() / 2, ScrW() / 2 - dist2, ScrH() / 2 ) surface.DrawLine( ScrW() / 2 + dist1, ScrH() / 2, ScrW() / 2 + dist2, ScrH() / 2 ) surface.DrawLine( ScrW() / 2, ScrH() / 2 - dist1, ScrW() / 2, ScrH() / 2 - dist2 ) surface.DrawLine( ScrW() / 2, ScrH() / 2 + dist1, ScrW() / 2, ScrH() / 2 + dist2 ) surface.DrawLine( ScrW() / 2 - dist1, ScrH() / 2 + 1, ScrW() / 2 - dist2, ScrH() / 2 + 1 ) surface.DrawLine( ScrW() / 2 + dist1, ScrH() / 2 + 1, ScrW() / 2 + dist2, ScrH() / 2 + 1 ) surface.DrawLine( ScrW() / 2 + 1, ScrH() / 2 - dist1, ScrW() / 2 + 1, ScrH() / 2 - dist2 ) surface.DrawLine( ScrW() / 2 + 1, ScrH() / 2 + dist1, ScrW() / 2 + 1, ScrH() / 2 + dist2 ) end function SWEP:GetViewModelPosition( pos, ang ) if CLIENT then pos = pos + ang:Forward() * GetConVar( "csgo_vm_y" ):GetInt() + ang:Right() * GetConVar( "csgo_vm_x" ):GetInt() + ang:Up() * GetConVar( "csgo_vm_z" ):GetInt() return pos end end function SWEP:Deploy() self:SetWeaponHoldType( self.HoldType ) self.Weapon:SendWeaponAnim( ACT_VM_DRAW ) self:SetNextPrimaryFire( CurTime() + self.Owner:GetViewModel():SequenceDuration() ) self:SetNextSecondaryFire( CurTime() + self.Owner:GetViewModel():SequenceDuration() ) self.InspectTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() self.Idle = 0 self.IdleTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() self.Owner:SetWalkSpeed( self.Speed ) self.Owner:SetRunSpeed( self.Speed * 2 ) return true end function SWEP:Holster() self.InspectTimer = CurTime() self.Idle = 0 self.IdleTimer = CurTime() self.Owner:SetWalkSpeed( 200 ) self.Owner:SetRunSpeed( 400 ) return true end function SWEP:PrimaryAttack() if self.FiresUnderwater == false and self.Owner:WaterLevel() == 3 then return end local tr = util.TraceLine( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * 64, filter = self.Owner, mask = MASK_SHOT_HULL } ) if !IsValid( tr.Entity ) then tr = util.TraceHull( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * 64, filter = self.Owner, mins = Vector( -16, -16, 0 ), maxs = Vector( 16, 16, 0 ), mask = MASK_SHOT_HULL } ) end if tr.Hit then self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER ) end if SERVER and IsValid( tr.Entity ) and tr.Entity:IsNPC() || tr.Entity:IsPlayer() then local dmg = DamageInfo() local attacker = self.Owner if !IsValid( attacker ) then attacker = self end dmg:SetAttacker( attacker ) dmg:SetInflictor( self ) local angle = self.Owner:GetAngles().y - tr.Entity:GetAngles().y if angle < -180 then angle = 360 + angle end if tr.Entity:IsNPC() || tr.Entity:IsPlayer() then self.Owner:EmitSound( "Weapon_CSGO_Knife.Hit" ) if angle <= 90 and angle >= -90 then dmg:SetDamage( self.Primary.DamageBackstab ) self.Weapon:SendWeaponAnim( ACT_VM_SWINGHIT ) else dmg:SetDamage( math.Rand( self.Primary.DamageMin, self.Primary.DamageMax ) ) end else dmg:SetDamage( math.Rand( self.Primary.DamageMin, self.Primary.DamageMax ) ) end dmg:SetDamageType( DMG_CLUB ) dmg:SetDamageForce( self.Owner:GetForward() * self.Primary.Force ) tr.Entity:TakeDamageInfo( dmg ) end if tr.Hit and !( tr.Entity:IsNPC() || tr.Entity:IsPlayer() ) then local trace = util.TraceLine( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:EyeAngles():Forward() * 64, filter = self.Owner } ) util.Decal( "ManhackCut", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal ) self.Owner:EmitSound( "Weapon_CSGO_Knife.HitWall" ) end if !tr.Hit then self:EmitSound( self.Primary.Sound ) self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER ) end self:ShootEffects() self:SetNextPrimaryFire( CurTime() + self.Primary.Delay ) self:SetNextSecondaryFire( CurTime() + self.Primary.Delay ) self.InspectTimer = CurTime() + self.Primary.Delay self.Idle = 0 self.IdleTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() end function SWEP:ShootEffects() self.Owner:SetAnimation( PLAYER_ATTACK1 ) end function SWEP:SecondaryAttack() if self.InspectTimer <= CurTime() and self.Owner:KeyDown( IN_USE ) then self.Weapon:SendWeaponAnim( ACT_VM_IDLE_DEPLOYED ) self.InspectTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() self.Idle = 0 self.IdleTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() end if !self.Owner:KeyDown( IN_USE ) and !( self.FiresUnderwater == false and self.Owner:WaterLevel() == 3 ) then local tr = util.TraceLine( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * 48, filter = self.Owner, mask = MASK_SHOT_HULL } ) if !IsValid( tr.Entity ) then tr = util.TraceHull( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:GetAimVector() * 48, filter = self.Owner, mins = Vector( -16, -16, 0 ), maxs = Vector( 16, 16, 0 ), mask = MASK_SHOT_HULL } ) end if tr.Hit then self.Weapon:SendWeaponAnim( ACT_VM_HITCENTER2 ) end if SERVER and IsValid( tr.Entity ) and tr.Entity:IsNPC() || tr.Entity:IsPlayer() then local dmg = DamageInfo() local attacker = self.Owner if !IsValid( attacker ) then attacker = self end dmg:SetAttacker( attacker ) dmg:SetInflictor( self ) local angle = self.Owner:GetAngles().y - tr.Entity:GetAngles().y if angle < -180 then angle = 360 + angle end if tr.Entity:IsNPC() || tr.Entity:IsPlayer() then self.Owner:EmitSound( "Weapon_CSGO_Knife.Stab" ) if angle <= 90 and angle >= -90 then dmg:SetDamage( self.Secondary.DamageBackstab ) self.Weapon:SendWeaponAnim( ACT_VM_SWINGHARD ) else dmg:SetDamage( self.Secondary.Damage ) end else dmg:SetDamage( self.Secondary.Damage ) end dmg:SetDamageType( DMG_CLUB ) dmg:SetDamageForce( self.Owner:GetForward() * self.Secondary.Force ) tr.Entity:TakeDamageInfo( dmg ) end if tr.Hit and !( tr.Entity:IsNPC() || tr.Entity:IsPlayer() ) then local trace = util.TraceLine( { start = self.Owner:GetShootPos(), endpos = self.Owner:GetShootPos() + self.Owner:EyeAngles():Forward() * 48, filter = self.Owner } ) util.Decal( "ManhackCut", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal ) self.Owner:EmitSound( "Weapon_CSGO_Knife.HitWall" ) end if !tr.Hit then self:EmitSound( self.Primary.Sound ) self.Weapon:SendWeaponAnim( ACT_VM_MISSCENTER2 ) end self:ShootEffects() self:SetNextPrimaryFire( CurTime() + self.Secondary.Delay ) self:SetNextSecondaryFire( CurTime() + self.Secondary.Delay ) self.InspectTimer = CurTime() + self.Secondary.Delay self.Idle = 0 self.IdleTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() end end function SWEP:Reload() end function SWEP:IdleAnimation() if self.Idle == 0 then self.Idle = 1 end if SERVER and self.Idle == 1 then self.Weapon:SendWeaponAnim( ACT_VM_IDLE ) end self.IdleTimer = CurTime() + self.Owner:GetViewModel():SequenceDuration() end function SWEP:Think() self.Owner:GetViewModel():SetBodygroup( 1, GetConVar( "csgo_vm_hands" ):GetInt() ) self.ViewModelFOV = GetConVar( "csgo_vm_fov" ):GetInt() if self.Owner:IsOnGround() then if self.Owner:GetVelocity():Length() <= 100 then if self.Primary.SpreadTimer <= CurTime() then self.Primary.Spread = self.Primary.SpreadMin end if self.Primary.Spread > self.Primary.SpreadMin then self.Primary.Spread = ( ( self.Primary.SpreadTimer - CurTime() ) / self.Primary.SpreadTime ) * self.Primary.Spread end end if self.Owner:GetVelocity():Length() <= 100 and self.Primary.Spread > self.Primary.SpreadMax then self.Primary.Spread = self.Primary.SpreadMax end if self.Owner:GetVelocity():Length() > 100 then self.Primary.Spread = self.Primary.SpreadMove self.Primary.SpreadTimer = CurTime() + self.Primary.SpreadTime if self.Primary.Spread > self.Primary.SpreadMin then self.Primary.Spread = ( ( self.Primary.SpreadTimer - CurTime() ) / self.Primary.SpreadTime ) * self.Primary.SpreadMove end end end if !self.Owner:IsOnGround() then self.Primary.Spread = self.Primary.SpreadAir self.Primary.SpreadTimer = CurTime() + self.Primary.SpreadTime if self.Primary.Spread > self.Primary.SpreadMin then self.Primary.Spread = ( ( self.Primary.SpreadTimer - CurTime() ) / self.Primary.SpreadTime ) * self.Primary.SpreadAir end end if self.IdleTimer <= CurTime() then self:IdleAnimation() end end