311 lines
7.9 KiB
Lua
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
|