Files
VnUtest/garrysmod/gamemodes/militaryrp/entities/weapons/tacrp_ifak/shared.lua
2026-03-31 10:27:04 +03:00

515 lines
11 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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