Files
VnUtest/garrysmod/addons/tacrp/lua/weapons/tacrp_medkit.lua
2026-03-31 10:27:04 +03:00

311 lines
7.9 KiB
Lua

SWEP.Base = "tacrp_base"
SWEP.Spawnable = true
AddCSLuaFile()
DEFINE_BASECLASS( "tacrp_base" )
// names and stuff
SWEP.PrintName = "Аптечка первой помощи"
SWEP.Category = "[FT] Специальное Оружие"
SWEP.NoAimAssist = true
SWEP.SubCatTier = "9Special"
SWEP.SubCatType = "9Equipment"
SWEP.Description = "Compact pack of medical supplies for treating wounds."
SWEP.Description_Quote = "\"Keep still, let me patch you up.\"" -- Left 4 Dead 1/2
SWEP.Credits = "Model/Texture: Left 4 Dead 2\nAnimation: Arqu"
SWEP.ViewModel = "models/weapons/tacint/v_medkit.mdl"
SWEP.WorldModel = "models/weapons/tacint/w_medkit.mdl"
SWEP.NoRanger = true
SWEP.NoStatBox = true
SWEP.HUDAmmoMeter = true
SWEP.Slot = 4
SWEP.NPCUsable = false
SWEP.FreeAim = false
// misc. shooting
SWEP.CanBlindFire = false
SWEP.Ammo = ""
SWEP.ClipSize = 30
// handling
SWEP.NoBuffer = true
SWEP.Firemode = 0
SWEP.MoveSpeedMult = 1
SWEP.MeleeSpeedMultTime = 2 // seconds to apply slow down for
SWEP.SprintToFireTime = 0.25
SWEP.MidAirSpreadPenalty = 0
SWEP.MoveSpreadPenalty = 0
SWEP.HipFireSpreadPenalty = 0
SWEP.Scope = false
SWEP.NoSecondaryMelee = true
// hold types
SWEP.HoldType = "slam"
SWEP.HoldTypeSprint = "normal"
SWEP.GestureShoot = ACT_HL2MP_GESTURE_RANGE_ATTACK_PISTOL
SWEP.GestureReload = ACT_HL2MP_GESTURE_RELOAD_PISTOL
SWEP.PassiveAng = Angle(0, 0, 0)
SWEP.PassivePos = Vector(-2, 0, -3)
SWEP.SprintAng = Angle(0, 0, 0)
SWEP.SprintPos = Vector(2, 0, -4)
SWEP.HolsterVisible = true
SWEP.HolsterSlot = TacRP.HOLSTER_SLOT_GEAR
SWEP.HolsterPos = Vector(-3, -5, 0)
SWEP.HolsterAng = Angle(-90, -90, 15)
SWEP.SprintMidPoint = {
Pos = Vector(0.25, 2, 1),
Ang = Angle(0, -5, 10)
}
// sounds
SWEP.AnimationTranslationTable = {
["deploy"] = "draw",
["melee"] = {"melee1", "melee2"},
}
SWEP.NoHolsterAnimation = true
SWEP.HolsterTimeMult = 0.75
// attachments
SWEP.Attachments = {
[1] = {
PrintName = "Perk",
Category = {"perk_melee", "perk_throw", "perk_passive"},
AttachSound = "TacRP/weapons/flashlight_on.wav",
DetachSound = "TacRP/weapons/flashlight_off.wav",
}
}
function SWEP:Hook_GetHintCapabilities(tbl)
if TacRP.ConVars["medkit_heal_others"]:GetInt() > 0 then
tbl["+attack"] = {so = 0, str = "hint.medkit.others"}
end
if TacRP.ConVars["medkit_heal_self"]:GetInt() > 0 then
tbl["+attack2"] = {so = 0.1, str = "hint.medkit.self"}
end
end
SWEP.HealTarget = nil
SWEP.LoopSound = nil
function SWEP:PrimaryAttack()
if self:GetValue("Melee") and self:GetOwner():KeyDown(IN_USE) then
self.Primary.Automatic = true
self:Melee()
return
end
if self:StillWaiting() then return end
if self:GetCharge() then return end
if TacRP.ConVars["medkit_heal_others"]:GetInt() <= 0 then return end
local tr = util.TraceLine({
start = self:GetOwner():EyePos(),
endpos = self:GetOwner():EyePos() + (self:GetOwner():EyeAngles():Forward() * 32),
filter = self:GetOwner()
})
if !tr.Hit then return end
if !tr.Entity then return end
if !(tr.Entity:IsPlayer() or tr.Entity:IsNPC()) then return end
if tr.Entity:Health() >= tr.Entity:GetMaxHealth() then return end
self.HealTarget = tr.Entity
self.Primary.Automatic = false
self:PlayAnimation("unzip", 1, true)
self:SetCharge(true)
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
self.LoopSound = CreateSound(self, "tacrp/weapons/bandaging_1.wav")
self.LoopSound:Play()
end
function SWEP:OnRemove()
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
return BaseClass.OnRemove(self)
end
function SWEP:SecondaryAttack()
if self:StillWaiting() or !IsFirstTimePredicted() or self:GetCharge() then return end
if self:GetOwner():Health() >= self:GetOwner():GetMaxHealth() then return end
if TacRP.ConVars["medkit_heal_self"]:GetInt() <= 0 then return end
self.HealTarget = self:GetOwner()
self.Primary.Automatic = false
self.Secondary.Automatic = false
self:PlayAnimation("unzip", 1, true)
self:SetCharge(true)
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
self.LoopSound = CreateSound(self:GetOwner(), "tacrp/weapons/bandaging_1.wav")
self.LoopSound:Play()
end
function SWEP:Think()
if IsFirstTimePredicted() and self:GetCharge() and self:GetNextPrimaryFire() < CurTime() then
if !IsValid(self.HealTarget) or
self:Clip1() <= 0 or
(self.HealTarget:GetPos() - self:GetOwner():GetPos()):Length() > 64
or
(self.HealTarget:Health() >= self.HealTarget:GetMaxHealth()) or
!(self:GetOwner():KeyDown(IN_ATTACK) or self:GetOwner():KeyDown(IN_ATTACK2)) then
self.HealTarget = nil
self:SetCharge(false)
self:PlayAnimation("draw", 1, true)
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
else
if SERVER then
local selfheal = self.HealTarget == self:GetOwner()
local amt = TacRP.ConVars[selfheal and "medkit_heal_self" or "medkit_heal_others"]:GetInt()
local ret = {amt}
hook.Run("TacRP_MedkitHeal", self, self:GetOwner(), self.HealTarget, ret)
amt = ret and ret[1] or amt
self:SetClip1(self:Clip1() - 1)
self.HealTarget:SetHealth(math.min(self.HealTarget:Health() + amt, self.HealTarget:GetMaxHealth()))
end
self:SetNextPrimaryFire(CurTime() + TacRP.ConVars["medkit_interval"]:GetFloat())
end
end
return BaseClass.Think(self)
end
function SWEP:Regenerate()
if CLIENT then return end
if self:GetNextPrimaryFire() + 0.1 > CurTime() then return end
local amt = TacRP.ConVars["medkit_regen_amount"]:GetInt()
if amt == 0 then
if self:Clip1() == 0 then
self:Remove()
end
return
end
if TacRP.ConVars["medkit_regen_activeonly"]:GetBool()
and (!IsValid(self:GetOwner()) or self:GetOwner():GetActiveWeapon() != self) then return end
self:SetClip1(math.min(self:Clip1() + amt, self:GetValue("ClipSize")))
end
function SWEP:Holster(wep)
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
self:SetCharge(false)
self.HealTarget = nil
return BaseClass.Holster(self, wep)
end
function SWEP:OnRemove()
if game.SinglePlayer() then
self:CallOnClient("OnRemove")
end
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
return BaseClass.OnRemove(self)
end
function SWEP:Initialize()
self.ClipSize = TacRP.ConVars["medkit_clipsize"]:GetInt()
self:SetClip1(self:GetValue("ClipSize"))
self:SetCharge(false)
timer.Create("medkit_ammo" .. self:EntIndex(), TacRP.ConVars["medkit_regen_delay"]:GetFloat(), 0, function()
if !IsValid(self) then
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
timer.Stop("medkit_ammo" .. self:EntIndex())
return
end
if IsValid(self:GetOwner()) and self != self:GetOwner():GetActiveWeapon() then
if self.LoopSound then
self.LoopSound:Stop()
self.LoopSound = nil
end
end
self:Regenerate()
end)
return BaseClass.Initialize(self)
end
if engine.ActiveGamemode() == "terrortown" then
SWEP.HolsterVisible = false
SWEP.AutoSpawnable = false
SWEP.Kind = WEAPON_EQUIP2
SWEP.Slot = 6
SWEP.CanBuy = { ROLE_DETECTIVE, ROLE_TRAITOR }
SWEP.LimitedStock = true
SWEP.EquipMenuData = {
type = "Weapon",
desc = "Medical supplies for treating wounds.\nCharge regenrates over time.",
}
function SWEP:TTTBought(buyer)
end
end
function SWEP:Reload()
end // do nothing