add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
if SERVER then
AddCSLuaFile("shared.lua")
end
if CLIENT then
SWEP.PrintName = "Surrender"
SWEP.Slot = 2
SWEP.SlotPos = 1
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = false
end
SWEP.Author = "ToBadForYou"
SWEP.Instructions = ""
SWEP.Contact = ""
SWEP.Purpose = ""
SWEP.HoldType = "passive";
SWEP.ViewModelFlip = false
SWEP.AnimPrefix = "passive"
SWEP.Category = "ToBadForYou"
SWEP.UID = 76561198187122039
SWEP.Spawnable = false
SWEP.AdminSpawnable = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = ""
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = ""
function SWEP:Initialize() self:SetHoldType("passive") end
function SWEP:CanPrimaryAttack() return false; end
function SWEP:SecondaryAttack() return false; end
function SWEP:PreDrawViewModel(vm)
return true
end
function SWEP:DrawWorldModel()
end
if CLIENT then
function SWEP:DrawHUD()
draw.SimpleTextOutlined(RHC_GetLang("SurrenderedText"),"Trebuchet24",ScrW()/2,ScrH()/12,Color(255,255,255,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_BOTTOM,2,Color(0,0,0,255))
end
end

View File

@@ -0,0 +1,138 @@
if SERVER then
AddCSLuaFile("shared.lua")
end
if CLIENT then
SWEP.PrintName = "Cuffed"
SWEP.Slot = 2
SWEP.SlotPos = 1
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = false
end
SWEP.Author = "Military RP"
SWEP.Instructions = ""
SWEP.Contact = ""
SWEP.Purpose = ""
SWEP.HoldType = "passive"
SWEP.ViewModelFlip = false
SWEP.AnimPrefix = "passive"
SWEP.Category = "Military RP"
SWEP.Spawnable = false
SWEP.AdminSpawnable = false
SWEP.ViewModel = "models/tobadforyou/c_hand_cuffs.mdl"
SWEP.WorldModel = "models/tobadforyou/handcuffs.mdl"
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = ""
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = ""
local CuffedBones = {
["ValveBiped.Bip01_R_UpperArm"] = Angle(-21.4, 21.4, 3.6),
["ValveBiped.Bip01_L_UpperArm"] = Angle(30, 8.2, 27.8),
["ValveBiped.Bip01_R_Forearm"] = Angle(0, 25, -10.7),
["ValveBiped.Bip01_L_Forearm"] = Angle(-11.5, 31.1, -18),
["ValveBiped.Bip01_R_Hand"] = Angle(14.3, -14.3, 60),
["ValveBiped.Bip01_L_Hand"] = Angle(-11, 14.7, 70.4),
}
function SWEP:Initialize()
self:SetHoldType("normal")
end
function SWEP:CanPrimaryAttack() return false end
function SWEP:SecondaryAttack() return false end
function SWEP:Reload() return false end
function SWEP:Deploy()
self:SetHoldType("normal")
if SERVER then
local ply = self:GetOwner()
if IsValid(ply) then
for boneName, ang in pairs(CuffedBones) do
local boneId = ply:LookupBone(boneName)
if boneId then
ply:ManipulateBoneAngles(boneId, ang)
end
end
end
end
return true
end
function SWEP:Holster()
if SERVER then
local ply = self:GetOwner()
if IsValid(ply) then
for boneName, _ in pairs(CuffedBones) do
local boneId = ply:LookupBone(boneName)
if boneId then
ply:ManipulateBoneAngles(boneId, Angle(0,0,0))
end
end
end
end
return true
end
function SWEP:OnRemove()
if SERVER then
local ply = self:GetOwner()
if IsValid(ply) then
for boneName, _ in pairs(CuffedBones) do
local boneId = ply:LookupBone(boneName)
if boneId then
ply:ManipulateBoneAngles(boneId, Angle(0,0,0))
end
end
end
end
end
if CLIENT then
function SWEP:PreDrawViewModel(vm) return true end
function SWEP:DrawWorldModel()
local ply = self:GetOwner()
if not IsValid(ply) then return end
local boneindex = ply:LookupBone("ValveBiped.Bip01_L_Hand")
if boneindex then
local pos, ang = ply:GetBonePosition(boneindex)
if pos and ang then
-- Hardcoded tuned values
local cx, cy, cz = 0.9, 0.8, 4.8
local cp, cyaw, cr = 7.1, -14.3, 96.2
local offset = ang:Forward() * cx + ang:Right() * cy + ang:Up() * cz
ang:RotateAroundAxis(ang:Right(), cp)
ang:RotateAroundAxis(ang:Up(), cyaw)
ang:RotateAroundAxis(ang:Forward(), cr)
self:SetRenderOrigin(pos + offset)
self:SetRenderAngles(ang)
self:DrawModel()
end
end
end
end
if SERVER then
hook.Add("PlayerSwitchWeapon", "MRP_Handcuffs_PreventSwitch", function(ply, oldWep, newWep)
if ply:GetNWBool("rhc_cuffed", false) and newWep:GetClass() ~= "weapon_r_cuffed" then
return true -- Block switching weapons when cuffed
end
end)
end
if CLIENT then
function SWEP:DrawHUD()
draw.SimpleTextOutlined("Вы закованы в наручники","Trebuchet24",ScrW()/2,ScrH() - 100,Color(255,100,100,255), TEXT_ALIGN_CENTER, TEXT_ALIGN_BOTTOM,2,Color(0,0,0,255))
end
end

View File

@@ -0,0 +1,379 @@
if SERVER then
AddCSLuaFile("shared.lua")
end
if CLIENT then
SWEP.PrintName = "Handcuffs"
SWEP.Slot = 2
SWEP.SlotPos = 1
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = false
end
SWEP.Author = "ToBadForYou"
SWEP.Instructions = "Left Click: Restrain/Release.\nRight Click: Force Players out of vehicle.\nReload: Drag Cuffed Player."
SWEP.Contact = ""
SWEP.Purpose = ""
SWEP.HoldType = "melee"
SWEP.UseHands = true
SWEP.ViewModelFOV = 62
SWEP.ViewModelFlip = false
SWEP.AnimPrefix = "melee"
SWEP.Category = "Military RP"
SWEP.Spawnable = true
SWEP.AdminSpawnable = true
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = ""
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = ""
SWEP.PlayBackRate = 2
function SWEP:Initialize()
self:SetHoldType("melee")
self.ViewModel = "models/tobadforyou/c_hand_cuffs.mdl"
self.WorldModel = "models/tobadforyou/handcuffs.mdl"
end
function SWEP:CanPrimaryAttack() return true end
function SWEP:CanSecondaryAttack() return true end
function SWEP:PlayCuffSound(Time)
timer.Simple(Time, function() if IsValid(self) then self:EmitSound("npc/metro-police/gear2.wav") end end)
timer.Simple(Time+1, function() if IsValid(self) then self:EmitSound("npc/metro-police/gear2.wav") end end)
end
local function IsPolice(ply)
return true
end
local function RestrainPlayer(target, cop)
if not IsValid(target) or not target:IsPlayer() then return end
target:SetNWBool("rhc_cuffed", true)
if SERVER then
target:EmitSound("npc/metro-police/gear2.wav")
local serverlogsPlugin = ix.plugin.list["serverlogs"]
if serverlogsPlugin then
serverlogsPlugin:AddLog("HANDCUFF_RESTRAIN", cop:Nick() .. " restrained " .. target:Nick(), cop, {target = target})
end
-- Save weapons
target.RHC_SavedWeapons = {}
for _, w in ipairs(target:GetWeapons()) do
table.insert(target.RHC_SavedWeapons, w:GetClass())
end
target:StripWeapons()
target:Give("weapon_r_cuffed")
target:SelectWeapon("weapon_r_cuffed")
target.RHC_OldWalk = target:GetWalkSpeed()
target.RHC_OldRun = target:GetRunSpeed()
target:SetWalkSpeed(100)
target:SetRunSpeed(100)
end
end
local CuffedBones = {
["ValveBiped.Bip01_R_UpperArm"] = true,
["ValveBiped.Bip01_L_UpperArm"] = true,
["ValveBiped.Bip01_R_Forearm"] = true,
["ValveBiped.Bip01_L_Forearm"] = true,
["ValveBiped.Bip01_R_Hand"] = true,
["ValveBiped.Bip01_L_Hand"] = true,
}
local function UnrestrainPlayer(target, cop)
if not IsValid(target) or not target:IsPlayer() then return end
target:SetNWBool("rhc_cuffed", false)
target:SetNWBool("MRP_Gagged", false)
target:SetNWBool("MRP_Blindfolded", false)
if SERVER then
target:EmitSound("npc/metro-police/gear2.wav")
local serverlogsPlugin = ix.plugin.list["serverlogs"]
if serverlogsPlugin then
serverlogsPlugin:AddLog("HANDCUFF_UNRESTRAIN", cop:Nick() .. " unrestrained " .. target:Nick(), cop, {target = target})
end
target:StripWeapon("weapon_r_cuffed")
for boneName, _ in pairs(CuffedBones) do
local boneId = target:LookupBone(boneName)
if boneId then
target:ManipulateBoneAngles(boneId, Angle(0,0,0))
end
end
if target.RHC_SavedWeapons then
for _, class in ipairs(target.RHC_SavedWeapons) do
target:Give(class)
end
target.RHC_SavedWeapons = nil
end
if target.RHC_OldWalk then
target:SetWalkSpeed(target.RHC_OldWalk)
target:SetRunSpeed(target.RHC_OldRun)
end
if IsValid(target.DraggedBy) then
target.DraggedBy.Dragging = nil
target.DraggedBy = nil
end
end
end
function SWEP:Think()
local target = self.AttemptToCuff
if IsValid(target) then
local vm = self.Owner:GetViewModel()
local ResetSeq = vm:LookupSequence("Reset")
local TraceEnt = self.Owner:GetEyeTrace().Entity
local distance = target:GetPos():Distance(self.Owner:GetPos())
if not IsValid(TraceEnt) or TraceEnt ~= target or distance > 150 then
self.AttemptToCuff = nil
target.RHC_BeingCuffed = false
vm:SendViewModelMatchingSequence(ResetSeq)
target:Freeze(false)
elseif CurTime() >= self.AttemptCuffFinish then
if SERVER then
RestrainPlayer(target, self.Owner)
end
target.RHC_BeingCuffed = false
self.AttemptToCuff = nil
vm:SendViewModelMatchingSequence(ResetSeq)
target:Freeze(false)
end
end
end
function SWEP:PrimaryAttack()
self.Weapon:SetNextPrimaryFire(CurTime() + 1.5)
if not IsPolice(self.Owner) then
if SERVER then self.Owner:ChatPrint("Вам не разрешено использовать наручники.") end
return
end
self.Weapon:EmitSound("npc/vort/claw_swing" .. math.random(1, 2) .. ".wav")
self.Owner:SetAnimation(PLAYER_ATTACK1)
local target = self.Owner:GetEyeTrace().Entity
if not IsValid(target) or not target:IsPlayer() then return end
if self.Owner:EyePos():Distance(target:GetPos()) > 150 then return end
-- Uncuff
if target:GetNWBool("rhc_cuffed", false) then
if SERVER then UnrestrainPlayer(target, self.Owner) end
return
end
-- Begin Cuffing
self.AttemptToCuff = target
self.AttemptCuffStart = CurTime()
self.AttemptCuffFinish = CurTime() + 2
target.RHC_BeingCuffed = true
local vm = self.Owner:GetViewModel()
local DeploySeq = vm:LookupSequence("Deploy")
vm:SendViewModelMatchingSequence(DeploySeq)
vm:SetPlaybackRate(self.PlayBackRate)
self:PlayCuffSound(0.3)
if SERVER then target:Freeze(true) end
end
-- Dragging logic mapped to Reload
function SWEP:Reload()
if not IsFirstTimePredicted() then return end
if self.NextRPress and self.NextRPress > CurTime() then return end
self.NextRPress = CurTime() + 1
if CLIENT then return end
local target = self.Owner:GetEyeTrace().Entity
-- Stop dragging
if IsValid(self.Owner.Dragging) then
self.Owner.Dragging.DraggedBy = nil
self.Owner.Dragging = nil
self.Owner:ChatPrint("Вы перестали тащить игрока.")
return
end
-- Start dragging
if IsValid(target) and target:IsPlayer() and target:GetNWBool("rhc_cuffed", false) then
if self.Owner:EyePos():Distance(target:GetPos()) <= 150 then
self.Owner.Dragging = target
target.DraggedBy = self.Owner
self.Owner:ChatPrint("Вы теперь тащите " .. target:Nick())
end
end
end
function SWEP:SecondaryAttack()
-- Force out of vehicle
self.Weapon:SetNextSecondaryFire(CurTime() + 1)
if CLIENT then return end
if not IsPolice(self.Owner) then return end
-- Helper function to find an empty seat
local function GetEmptySeat(veh)
if veh.IsDriveable and veh:IsDriveable() then
-- LVS Specific
if veh.GetDriver and not IsValid(veh:GetDriver()) then
local dSeat = veh:GetDriverSeat()
if IsValid(dSeat) then return dSeat end
end
if veh.GetPassengerSeats then
for _, seat in pairs(veh:GetPassengerSeats()) do
if IsValid(seat) and not IsValid(seat:GetDriver()) then
return seat
end
end
end
return nil
end
-- Standard/Simfphys
if veh.GetDriver and not IsValid(veh:GetDriver()) then return veh end
if veh.pSeats then
for _, seat in pairs(veh.pSeats) do
if IsValid(seat) and not IsValid(seat:GetDriver()) then
return seat
end
end
end
return nil
end
local target = self.Owner:GetEyeTrace().Entity
if not IsValid(target) then return end
if self.Owner:GetPos():Distance(target:GetPos()) > 300 then return end
local isVeh = target:IsVehicle() or (target.GetClass and string.find(string.lower(target:GetClass()), "lvs"))
if IsValid(self.Owner.Dragging) then
local dragged = self.Owner.Dragging
if isVeh then
local seat = GetEmptySeat(target)
if IsValid(seat) then
dragged:EnterVehicle(seat)
self.Owner.Dragging = nil
dragged.DraggedBy = nil
self.Owner:ChatPrint("Игрок посажен в транспорт.")
else
self.Owner:ChatPrint("Нет свободных мест.")
end
end
else
if isVeh then
local found = false
-- LVS Specific
if target.IsDriveable and target:IsDriveable() then
local drv = target:GetDriver()
if IsValid(drv) and drv:GetNWBool("rhc_cuffed", false) then
drv:ExitVehicle()
found = true
end
if target.GetPassengerSeats then
for _, seat in pairs(target:GetPassengerSeats()) do
local sDrv = IsValid(seat) and seat:GetDriver()
if IsValid(sDrv) and sDrv:GetNWBool("rhc_cuffed", false) then
sDrv:ExitVehicle()
found = true
end
end
end
else
-- Standard/Simfphys
local drv = target:GetDriver()
if IsValid(drv) and drv:GetNWBool("rhc_cuffed", false) then
drv:ExitVehicle()
found = true
end
if target.pSeats then
for _, seat in pairs(target.pSeats) do
local sDrv = IsValid(seat) and seat:GetDriver()
if IsValid(sDrv) and sDrv:GetNWBool("rhc_cuffed", false) then
sDrv:ExitVehicle()
found = true
end
end
end
end
if found then
self.Owner:ChatPrint("Игрок(и) вытащен(ы) из транспорта.")
end
end
end
end
if SERVER then
hook.Add("PlayerTick", "MRP_Handcuffs_DragLogic", function(ply)
local dragged = ply.Dragging
if IsValid(dragged) and dragged:IsPlayer() and dragged:GetNWBool("rhc_cuffed", false) then
local dist = ply:GetPos():Distance(dragged:GetPos())
if dist > 300 then
ply.Dragging = nil
dragged.DraggedBy = nil
ply:ChatPrint("Таскание прекращено: слишком далеко.")
elseif dist > 100 then
local dir = (ply:GetPos() - dragged:GetPos()):GetNormalized()
dragged:SetVelocity(dir * (dist * 2))
end
elseif dragged then
ply.Dragging = nil
if IsValid(dragged) then dragged.DraggedBy = nil end
end
end)
hook.Add("PlayerDisconnected", "MRP_Handcuffs_DragCleanup", function(ply)
if IsValid(ply.DraggedBy) then ply.DraggedBy.Dragging = nil end
if IsValid(ply.Dragging) then ply.Dragging.DraggedBy = nil end
end)
end
if CLIENT then
function SWEP:DrawWorldModel()
if not IsValid(self.Owner) then return end
local boneindex = self.Owner:LookupBone("ValveBiped.Bip01_R_Hand")
if boneindex then
local HPos, HAng = self.Owner:GetBonePosition(boneindex)
local offset = HAng:Right() * 0.5 + HAng:Forward() * 3.3
HAng:RotateAroundAxis(HAng:Right(), 0)
HAng:RotateAroundAxis(HAng:Forward(), -90)
self:SetRenderOrigin(HPos + offset)
self:SetRenderAngles(HAng)
self:DrawModel()
end
end
function SWEP:DrawHUD()
draw.SimpleText("ЛКМ: Надеть/Снять наручники", "default", ScrW()/2, 5, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 2, color_black)
draw.SimpleText("ПКМ: Посадить/Вытащить из транспорта", "default", ScrW()/2, 15, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 2, color_black)
draw.SimpleText("Перезарядка (R): Тащить закованного", "default", ScrW()/2, 25, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 2, color_black)
local target = self.AttemptToCuff
if not IsValid(target) then return end
local percent = math.Clamp((CurTime() - self.AttemptCuffStart) / (self.AttemptCuffFinish - self.AttemptCuffStart), 0, 1)
draw.SimpleText("Заковываем " .. target:Nick() .. " (" .. math.Round(percent * 100) .. "%)", "DermaLarge", ScrW()/2, ScrH()/2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
end