if SERVER then AddCSLuaFile( "shared.lua" ) end if CLIENT then if (file.Exists("materials/hud/rope_knife.vmt","GAME")) then SWEP.WepSelectIcon = surface.GetTextureID("hud/rope_knife") end SWEP.ViewModelFOV = 70 SWEP.ViewModelFlip = false SWEP.BobScale = 1.5 SWEP.SwayScale = 1.5 SWEP.PrintName = "Grappling Knife" SWEP.Slot = 0 SWEP.Slotpos = 0 SWEP.BounceWeaponIcon = false SWEP.DrawWeaponInfoBox = true end SWEP.HoldType = "melee" SWEP.Author = "Krede" SWEP.Contact = "Through Steam" SWEP.Instructions = "Use it to easily climb up buildings and high places" SWEP.Category = "Krede's SWEPs" SWEP.ViewModel = "models/props_c17/TrapPropeller_Lever.mdl" SWEP.WorldModel = "models/props_c17/TrapPropeller_Lever.mdl" SWEP.UseHands = true SWEP.Primary.ClipSize = -1 SWEP.Primary.DefaultClip = -1 SWEP.Primary.Automatic = false SWEP.Primary.Ammo = "none" SWEP.Secondary.ClipSize = -1 SWEP.Secondary.DefaultClip = -1 SWEP.Secondary.Automatic = false SWEP.Secondary.Ammo = "none" SWEP.DrawCrosshair = false SWEP.Spawnable = true SWEP.AdminSpawnable = true function SWEP:GetViewModelPosition( pos, ang ) pos = pos + ang:Right() * 8 pos = pos + ang:Forward() * 12 pos = pos - ang:Up() * 5 ang:RotateAroundAxis(ang:Up(), 90) ang:RotateAroundAxis(ang:Right(), -10) ang:RotateAroundAxis(ang:Forward(), -10) return pos, ang end function SWEP:SecondaryAttack() return false end function SWEP:Think() end function SWEP:PrimaryAttack() self.Weapon:SendWeaponAnim( ACT_VM_SECONDARYATTACK ) self.Owner:DoAnimationEvent(ACT_HL2MP_GESTURE_RANGE_ATTACK_MELEE) self.Weapon:SetNextPrimaryFire( CurTime() + 2 ) if CLIENT then return end timer.Simple(0.2, function() self:EmitSound("weapons/iceaxe/iceaxe_swing1.wav") if self == NULL or !IsValid(self) then return false end local ent = ents.Create("sent_rope_knife") ent:SetNWEntity("Owner", self.Owner) ent:SetPos (self.Owner:EyePos() + (self.Owner:GetAimVector() * 48)) ent:SetAngles(self.Owner:EyeAngles() + Angle(90,0,0)) ent:Spawn() local phys = ent:GetPhysicsObject() if IsValid(phys) then phys:ApplyForceCenter(self.Owner:GetAimVector()*7500) phys:AddAngleVelocity(Vector(0,10000,0)) phys:EnableGravity(false) end undo.Create( "Grappling Knife" ) undo.AddEntity( ent ) undo.SetPlayer( self.Owner ) undo.Finish() -- Single use: remove the weapon if IsValid(self.Owner) then self:Remove() end end) end function SWEP:OnRemove() end function SWEP:Reload() return false end function SWEP:Holster() return true end function SWEP:Deploy() self.Weapon:SendWeaponAnim( ACT_VM_DRAW ) end function SWEP:Initialize() self.Weapon:SetWeaponHoldType( self.HoldType ) end if CLIENT then surface.CreateFont("RopeKnifeCrosshair", { font = "Roboto", size = 18, weight = 800, antialias = true, shadow = true }) end function SWEP:DrawHUD() if not IsValid(self.Owner) then return end local tr = self.Owner:GetEyeTrace() local pos = tr.HitPos local ent = tr.Entity local vel = LocalPlayer():GetVelocity():Length() local movement = math.Clamp(vel / 20, 0, 40) local time = CurTime() if IsValid(self.Owner:GetNWEntity("ClimbingEnt")) and self.Owner:GetMoveType() == MOVETYPE_CUSTOM and GetConVar("gk_enableshooting"):GetBool() == false then pos = self.Owner:GetNWEntity("ClimbingEnt"):GetPos() end local screenpos = pos:ToScreen() local dist = self.Owner:GetPos():Distance(pos) local distM = math.Round(dist / 60, 1) -- Tactical Theme Colors local themeColor = Color(0, 67, 28, 255) -- #00431c (Military Green) local accentColor = Color(0, 150, 60, 200) -- Dynamic Range Status local crossCol = themeColor local statusText = "RANGE: STABLE" if dist > 5000 then crossCol = Color(200, 50, 50, 220) statusText = "RANGE: EXCEEDED" elseif dist > 3000 then crossCol = Color(200, 150, 0, 220) statusText = "RANGE: UNSTABLE" end local x, y = screenpos.x, screenpos.y local gap = 12 + movement local cornerSize = 8 surface.SetDrawColor(crossCol) -- Tactical Corner Brackets -- Top Left surface.DrawLine(x - gap, y - gap, x - gap + cornerSize, y - gap) surface.DrawLine(x - gap, y - gap, x - gap, y - gap + cornerSize) -- Top Right surface.DrawLine(x + gap, y - gap, x + gap - cornerSize, y - gap) surface.DrawLine(x + gap, y - gap, x + gap, y - gap + cornerSize) -- Bottom Left surface.DrawLine(x - gap, y + gap, x - gap + cornerSize, y + gap) surface.DrawLine(x - gap, y + gap, x - gap, y + gap - cornerSize) -- Bottom Right surface.DrawLine(x + gap, y + gap, x + gap - cornerSize, y + gap) surface.DrawLine(x + gap, y + gap, x + gap, y + gap - cornerSize) -- Central Aim Dot draw.RoundedBox(0, x - 1, y - 1, 2, 2, Color(255, 255, 255, 100)) -- Tactical Data Display local dataX = x + gap + 15 draw.SimpleText("DIST: " .. string.format("%05.1f", distM) .. "m", "RopeKnifeCrosshair", dataX, y - 8, crossCol, TEXT_ALIGN_LEFT) draw.SimpleText(statusText, "RopeKnifeCrosshair", dataX, y + 8, crossCol, TEXT_ALIGN_LEFT) -- Target ID (TOP) if GetConVar("gk_enabledamage"):GetBool() == true and IsValid(ent) and not IsValid(self.Owner:GetNWEntity("ClimbingEnt")) then local name = "" if ent:IsPlayer() then name = ent:Nick() elseif ent:IsNPC() or ent:IsNextBot() then name = ent:GetClass():gsub("^npc_", ""):gsub("^ent_", ""):gsub("_", " "):upper() end if name ~= "" then draw.SimpleText("[TARGET: " .. name .. "]", "RopeKnifeCrosshair", x, y - gap - 20, Color(255, 255, 255, 120), TEXT_ALIGN_CENTER) end end -- Command Hint if IsValid(self.Owner:GetNWEntity("ClimbingEnt")) then local hintY = ScrH() - 175 draw.SimpleText("КОМАНДА: [ПРЫЖОК] - ОТЦЕПИТЬ", "RopeKnifeCrosshair", ScrH()/2, hintY, accentColor, TEXT_ALIGN_CENTER) end end