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,514 @@
SWEP.Base = "tacrp_base"
SWEP.Spawnable = true
AddCSLuaFile()
// names and stuff
SWEP.PrintName = "Infantry First Aid Kit"
SWEP.AbbrevName = "IFAK"
SWEP.Category = "[FT] Медицина"
SWEP.SubCatTier = "9Special"
SWEP.SubCatType = "9Special"
SWEP.Description = "Индивидуальная аптечка первой помощи. Содержит бинты, гемостаты и порошки QuikClot для остановки кровотечений."
SWEP.Description_Quote = "Поддержка жизни в полевых условиях."
SWEP.Trivia_Manufacturer = "Military Issue"
SWEP.Trivia_Year = "2000s"
SWEP.Faction = TacRP.FACTION_NEUTRAL
SWEP.Credits = "Original: Firearms Source 2\nPort: TacRP"
SWEP.ViewModel = "models/weapons/v_ifak.mdl"
SWEP.WorldModel = "models/Items/HealthKit.mdl"
SWEP.Slot = 4
SWEP.NoRanger = true
SWEP.NoStatBox = true
// handling
SWEP.MoveSpeedMult = 1
SWEP.ShootingSpeedMult = 1
SWEP.SightedSpeedMult = 1
SWEP.AimDownSightsTime = 0.25
SWEP.SprintToFireTime = 0.25
SWEP.Sway = 0
SWEP.FreeAimMaxAngle = 0
// hold types
SWEP.HoldType = "slam"
SWEP.HoldTypeSprint = "normal"
SWEP.HoldTypeBlindFire = false
SWEP.GestureShoot = ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL
SWEP.GestureReload = ACT_HL2MP_GESTURE_RELOAD_PISTOL
SWEP.PassiveAng = Angle(0, 0, 0)
SWEP.PassivePos = Vector(0, -2, -4)
SWEP.BlindFireAng = Angle(0, 0, 0)
SWEP.BlindFirePos = Vector(0, 0, 0)
SWEP.SprintAng = Angle(0, 30, 0)
SWEP.SprintPos = Vector(2, 0, -12)
SWEP.SightAng = Angle(-0.5, 0, 0)
SWEP.SightPos = Vector(-3.412, -6.4, -2.238)
SWEP.CorrectivePos = Vector(0, 0, 0)
SWEP.CorrectiveAng = Angle(0, 0, 0)
SWEP.HolsterVisible = true
SWEP.HolsterSlot = TacRP.HOLSTER_SLOT_GEAR
SWEP.HolsterPos = Vector(2, 0, 0)
SWEP.HolsterAng = Angle(-90, 0, 0)
// reload
SWEP.ClipSize = -1
SWEP.Ammo = "none"
// sounds
SWEP.Sounds = {}
SWEP.Sounds["bandage"] = {
{time = 0.4, sound = "FAS2_Bandage.Retrieve"},
{time = 1.25, sound = "FAS2_Bandage.Open"},
{time = 2.15, sound = "FAS2_Hemostat.Retrieve"}
}
SWEP.Sounds["quikclot"] = {
{time = 0.3, sound = "FAS2_QuikClot.Retrieve"},
{time = 1.45, sound = "FAS2_QuikClot.Loosen"},
{time = 2.55, sound = "FAS2_QuikClot.Open"}
}
SWEP.Sounds["suture"] = {
{time = 0.3, sound = "FAS2_Hemostat.Retrieve"},
{time = 3.5, sound = "FAS2_Hemostat.Close"}
}
// attachments
SWEP.Attachments = {
[1] = {
PrintName = "Аксессуар",
Category = "acc",
AttachSound = "TacRP/weapons/flashlight_on.wav",
DetachSound = "TacRP/weapons/flashlight_off.wav",
},
}
SWEP.FreeAim = false
SWEP.Scope = false
SWEP.DrawCrosshair = true
SWEP.DrawCrosshairInSprint = true
// Custom vars
SWEP.EasterWait = 0
function SWEP:Initialize()
self:SetHoldType(self.HoldType)
if CLIENT then
self.SoundTime = 0
self.SoundEntry = 1
self.CurrentSoundTable = nil
end
end
function SWEP:Deploy()
local owner = self:GetOwner()
if SERVER and IsValid(owner) then
owner:GiveAmmo(4, "Bandages", true)
owner:GiveAmmo(3, "Quikclots", true)
owner:GiveAmmo(2, "Hemostats", true)
end
return true
end
function SWEP:Holster()
if self.HealTime and CurTime() < self.HealTime then
return false
end
if CLIENT then
self.CurrentSoundTable = nil
self.SoundEntry = 1
self.SoundTime = 0
end
return true
end
local Mins, Maxs = Vector(-8, -8, -8), Vector(8, 8, 8)
function SWEP:FindHealTarget()
local owner = self:GetOwner()
if not IsValid(owner) then return owner end
local tr = util.TraceHull({
start = owner:GetShootPos(),
endpos = owner:GetShootPos() + owner:GetAimVector() * 50,
filter = owner,
mins = Mins,
maxs = Maxs
})
if tr.Hit and IsValid(tr.Entity) and tr.Entity:IsPlayer() then
return tr.Entity
end
return owner
end
function SWEP:PlaySounds(soundTable)
if not self.Sounds[soundTable] then return end
self.CurrentSoundTable = soundTable
self.SoundEntry = 1
self.SoundTime = CurTime()
end
function SWEP:Think()
local CT = CurTime()
-- Sound system
if CLIENT and self.CurrentSoundTable then
local sounds = self.Sounds[self.CurrentSoundTable]
if sounds and sounds[self.SoundEntry] then
local snd = sounds[self.SoundEntry]
if CT >= self.SoundTime + snd.time then
self:EmitSound(snd.sound, 70, 100)
if sounds[self.SoundEntry + 1] then
self.SoundEntry = self.SoundEntry + 1
else
self.CurrentSoundTable = nil
self.SoundEntry = 1
end
end
end
end
-- Healing process
if self.CurrentHeal and CT >= self.HealTime then
self:EndHealingProcess()
end
-- Update viewmodel bodygroups
if CLIENT and not self.CurrentHeal then
self:UpdateBodygroups()
end
end
function SWEP:UpdateBodygroups()
local owner = self:GetOwner()
if not IsValid(owner) then return end
local vm = owner:GetViewModel()
if not IsValid(vm) then return end
-- Bodygroup 2 - бинты (0-2)
vm:SetBodygroup(2, math.Clamp(owner:GetAmmoCount("Bandages"), 0, 2))
-- Bodygroup 3 - гемостаты/квикклоты
local hemostats = owner:GetAmmoCount("Hemostats")
if hemostats > 0 then
vm:SetBodygroup(3, hemostats == 1 and 2 or 3)
else
local quikclots = owner:GetAmmoCount("Quikclots")
vm:SetBodygroup(3, quikclots > 0 and 1 or 0)
end
end
function SWEP:EndHealingProcess()
local owner = self:GetOwner()
if not IsValid(owner) then return end
-- Play end animation
local vm = owner:GetViewModel()
if IsValid(vm) then
local anim = "idle"
if self.CurrentHeal == "suture" and owner:GetAmmoCount("Hemostats") == 1 then
anim = "bandage_end"
else
anim = self.CurrentHeal .. "_end"
end
local seq = vm:LookupSequence(anim)
if seq > 0 then
vm:SendViewModelMatchingSequence(seq)
end
end
owner:RemoveAmmo(1, self.AmmoType)
if CLIENT then
self:UpdateBodygroups()
end
if SERVER then
if self.OwnHeal then
owner:SetHealth(math.Clamp(owner:Health() + self.HealAmount, 0, owner:GetMaxHealth()))
else
if IsValid(self.Target) then
self.Target:SetHealth(math.Clamp(self.Target:Health() + self.HealAmount, 0, self.Target:GetMaxHealth()))
end
end
end
self.CurrentHeal = nil
self.HealTime = nil
self.HealAmount = nil
self.Target = nil
self.OwnHeal = false
end
function SWEP:PrimaryAttack()
if not IsFirstTimePredicted() then return end
local owner = self:GetOwner()
if not IsValid(owner) then return end
local bandages = owner:GetAmmoCount("Bandages")
if bandages <= 0 then return end
local target = self:FindHealTarget()
if not IsValid(target) then return end
-- Проверка здоровья
if CLIENT then
if target:Health() >= 100 then return end
else
if target:Health() >= target:GetMaxHealth() then return end
end
local CT = CurTime()
self:SetNextPrimaryFire(CT + 2.95)
self:SetNextSecondaryFire(CT + 2.95)
self.HealTime = CT + 2.5
self.CurrentHeal = "bandage"
self.AmmoType = "Bandages"
self.HealAmount = 10
self.Target = target
self.OwnHeal = (target == owner)
-- Анимация
local vm = owner:GetViewModel()
if IsValid(vm) then
local seq = vm:LookupSequence("bandage")
if seq > 0 then
vm:SendViewModelMatchingSequence(seq)
end
end
-- Звуки
self:PlaySounds("bandage")
return true
end
function SWEP:SecondaryAttack()
if not IsFirstTimePredicted() then return end
local owner = self:GetOwner()
if not IsValid(owner) then return end
local hemostats = owner:GetAmmoCount("Hemostats")
local quikclots = owner:GetAmmoCount("Quikclots")
if hemostats <= 0 and quikclots <= 0 then return end
local target = self:FindHealTarget()
if not IsValid(target) then return end
-- Проверка здоровья
if CLIENT then
if target:Health() >= 100 then return end
else
if target:Health() >= target:GetMaxHealth() then return end
end
local CT = CurTime()
if hemostats > 0 then
-- Гемостат
self:SetNextPrimaryFire(CT + 5.5)
self:SetNextSecondaryFire(CT + 5.5)
self.HealTime = CT + 4.5
self.CurrentHeal = "suture"
self.AmmoType = "Hemostats"
self.HealAmount = 30
local vm = owner:GetViewModel()
if IsValid(vm) then
local seq = vm:LookupSequence("suture")
if seq > 0 then
vm:SendViewModelMatchingSequence(seq)
end
end
self:PlaySounds("suture")
else
-- QuikClot
self:SetNextPrimaryFire(CT + 4.65)
self:SetNextSecondaryFire(CT + 4.65)
self.HealTime = CT + 4.2
self.CurrentHeal = "quikclot"
self.AmmoType = "Quikclots"
self.HealAmount = 20
local vm = owner:GetViewModel()
if IsValid(vm) then
local seq = vm:LookupSequence("quikclot")
if seq > 0 then
vm:SendViewModelMatchingSequence(seq)
end
end
self:PlaySounds("quikclot")
end
self.Target = target
self.OwnHeal = (target == owner)
return true
end
if CLIENT then
local White = Color(255, 255, 255, 255)
local Black = Color(0, 0, 0, 255)
local Green = Color(202, 255, 163, 255)
local Grey = Color(200, 200, 200, 255)
surface.CreateFont("IFAK_HUD24", {
font = "Arial",
size = 24,
weight = 700,
antialias = true
})
surface.CreateFont("IFAK_HUD36", {
font = "Arial",
size = 36,
weight = 700,
antialias = true
})
function SWEP:DrawHUD()
local owner = self:GetOwner()
if not IsValid(owner) then return end
local x, y = ScrW() / 2, ScrH() / 2
local target = self:FindHealTarget()
local targetName = "СЕБЯ"
if IsValid(target) and target != owner then
targetName = target:Nick()
end
draw.SimpleTextOutlined(
"ЦЕЛЬ ЛЕЧЕНИЯ: " .. targetName,
"IFAK_HUD24",
x, y + 200,
White, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER,
2, Black
)
-- Информация о расходниках
local bandages = owner:GetAmmoCount("Bandages")
local hemostats = owner:GetAmmoCount("Hemostats")
local quikclots = owner:GetAmmoCount("Quikclots")
-- Левая сторона - Бинты
draw.SimpleTextOutlined(
"БИНТЫ: " .. bandages,
"IFAK_HUD36",
x - 100, y + 125,
White, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP,
2, Black
)
if bandages > 0 then
draw.SimpleTextOutlined(
"ЛКМ - БИНТ",
"IFAK_HUD24",
x - 100, y + 100,
Green, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP,
2, Black
)
draw.SimpleTextOutlined(
"+10 HP",
"IFAK_HUD24",
x - 100, y + 75,
Green, TEXT_ALIGN_RIGHT, TEXT_ALIGN_TOP,
2, Black
)
end
-- Правая сторона - Гемостаты/QuikClot
if hemostats > 0 then
draw.SimpleTextOutlined(
"ГЕМОСТАТЫ: " .. hemostats,
"IFAK_HUD36",
x + 100, y + 125,
White, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
draw.SimpleTextOutlined(
"ПКМ - ГЕМОСТАТ",
"IFAK_HUD24",
x + 100, y + 100,
Green, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
draw.SimpleTextOutlined(
"+30 HP",
"IFAK_HUD24",
x + 100, y + 75,
Green, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
else
draw.SimpleTextOutlined(
"QUIKCLOTS: " .. quikclots,
"IFAK_HUD36",
x + 100, y + 125,
White, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
if quikclots > 0 then
draw.SimpleTextOutlined(
"ПКМ - QUIKCLOT",
"IFAK_HUD24",
x + 100, y + 100,
Green, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
draw.SimpleTextOutlined(
"+20 HP",
"IFAK_HUD24",
x + 100, y + 75,
Green, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP,
2, Black
)
end
end
end
end