zombiesurvival-evolved/gamemodes/zombiesurvival/entities/weapons/weapon_zs_medicalkit.lua

204 lines
5.5 KiB
Lua

AddCSLuaFile()
if CLIENT then
SWEP.PrintName = "Medical Kit"
SWEP.Description = "An advanced kit of medicine, bandages, and morphine.\nVery useful for keeping a group of survivors healthy.\nUse PRIMARY FIRE to heal other players.\nUse SECONDARY FIRE to heal yourself.\nHealing other players is not only faster but you get a nice point bonus!"
SWEP.Slot = 4
SWEP.SlotPos = 0
SWEP.ViewModelFOV = 50
SWEP.ViewModelFlip = false
SWEP.BobScale = 2
SWEP.SwayScale = 1.5
end
SWEP.Base = "weapon_zs_base"
SWEP.WorldModel = "models/weapons/w_medkit.mdl"
SWEP.ViewModel = "models/weapons/c_medkit.mdl"
SWEP.UseHands = true
SWEP.Primary.Delay = 10
SWEP.Primary.Heal = 15
SWEP.Primary.ClipSize = 30
SWEP.Primary.DefaultClip = 150
SWEP.Primary.Ammo = "Battery"
SWEP.Secondary.Delay = 20
SWEP.Secondary.Heal = 10
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Ammo = "none"
SWEP.WalkSpeed = SPEED_NORMAL
SWEP.NoMagazine = true
SWEP.HoldType = "slam"
function SWEP:Initialize()
self:SetWeaponHoldType(self.HoldType)
self:SetDeploySpeed(1.1)
end
function SWEP:Think()
if self.IdleAnimation and self.IdleAnimation <= CurTime() then
self.IdleAnimation = nil
self:SendWeaponAnim(ACT_VM_IDLE)
end
end
function SWEP:PrimaryAttack()
if not self:CanPrimaryAttack() then return end
local owner = self.Owner
owner:LagCompensation(true)
local ent = owner:MeleeTrace(32, 2).Entity
owner:LagCompensation(false)
if ent and ent:IsValid() and ent:IsPlayer() and ent:Team() == owner:Team() and ent:Alive() and gamemode.Call("PlayerCanBeHealed", ent) then
local health, maxhealth = ent:Health(), ent:GetMaxHealth()
local multiplier = owner.HumanHealMultiplier or 1
local toheal = math.min(self:GetPrimaryAmmoCount(), math.ceil(math.min(self.Primary.Heal * multiplier, maxhealth - health)))
local totake = math.ceil(toheal / multiplier)
if toheal > 0 then
self:SetNextCharge(CurTime() + self.Primary.Delay * math.min(1, toheal / self.Primary.Heal))
owner.NextMedKitUse = self:GetNextCharge()
self:TakeCombinedPrimaryAmmo(totake)
ent:SetHealth(health + toheal)
self:EmitSound("items/medshot4.wav")
self:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
owner:DoAttackEvent()
self.IdleAnimation = CurTime() + self:SequenceDuration()
gamemode.Call("PlayerHealedTeamMember", owner, ent, toheal, self)
end
end
end
function SWEP:SecondaryAttack()
local owner = self.Owner
if not self:CanPrimaryAttack() or not gamemode.Call("PlayerCanBeHealed", owner) then return end
local health, maxhealth = owner:Health(), owner:GetMaxHealth()
local multiplier = owner.HumanHealMultiplier or 1
local toheal = math.min(self:GetPrimaryAmmoCount(), math.ceil(math.min(self.Secondary.Heal * multiplier, maxhealth - health)))
local totake = math.ceil(toheal / multiplier)
if toheal > 0 then
self:SetNextCharge(CurTime() + self.Secondary.Delay * math.min(1, toheal / self.Secondary.Heal))
owner.NextMedKitUse = self:GetNextCharge()
self:TakeCombinedPrimaryAmmo(totake)
owner:SetHealth(health + toheal)
self:EmitSound("items/smallmedkit1.wav")
self:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
owner:DoAttackEvent()
self.IdleAnimation = CurTime() + self:SequenceDuration()
end
end
function SWEP:Deploy()
gamemode.Call("WeaponDeployed", self.Owner, self)
self.IdleAnimation = CurTime() + self:SequenceDuration()
if CLIENT then
hook.Add("PostPlayerDraw", "PostPlayerDrawMedical", GAMEMODE.PostPlayerDrawMedical)
GAMEMODE.MedicalAura = true
end
return true
end
function SWEP:Holster()
if CLIENT then
hook.Remove("PostPlayerDraw", "PostPlayerDrawMedical")
GAMEMODE.MedicalAura = false
end
return true
end
function SWEP:OnRemove()
if CLIENT and self.Owner == LocalPlayer() then
hook.Remove("PostPlayerDraw", "PostPlayerDrawMedical")
GAMEMODE.MedicalAura = false
end
end
function SWEP:Reload()
end
function SWEP:SetNextCharge(tim)
self:SetDTFloat(0, tim)
end
function SWEP:GetNextCharge()
return self:GetDTFloat(0)
end
function SWEP:CanPrimaryAttack()
local owner = self.Owner
if owner:IsHolding() or owner:GetBarricadeGhosting() then return false end
if self:GetPrimaryAmmoCount() <= 0 then
self:EmitSound("items/medshotno1.wav")
self:SetNextCharge(CurTime() + 0.75)
owner.NextMedKitUse = self:GetNextCharge()
return false
end
return self:GetNextCharge() <= CurTime() and (owner.NextMedKitUse or 0) <= CurTime()
end
if not CLIENT then return end
function SWEP:DrawWeaponSelection(...)
return self:BaseDrawWeaponSelection(...)
end
local texGradDown = surface.GetTextureID("VGUI/gradient_down")
function SWEP:DrawHUD()
local screenscale = BetterScreenScale()
local wid, hei = 256, 16
local x, y = ScrW() - wid - 32, ScrH() - hei - 72
local texty = y - 4 - draw.GetFontHeight("ZSHUDFontSmall")
local timeleft = self:GetNextCharge() - CurTime()
if 0 < timeleft then
surface.SetDrawColor(5, 5, 5, 180)
surface.DrawRect(x, y, wid, hei)
surface.SetDrawColor(255, 0, 0, 180)
surface.SetTexture(texGradDown)
surface.DrawTexturedRect(x, y, math.min(1, timeleft / math.max(self.Primary.Delay, self.Secondary.Delay)) * wid, hei)
surface.SetDrawColor(255, 0, 0, 180)
surface.DrawOutlinedRect(x, y, wid, hei)
end
draw.SimpleText("Medical Kit", "ZSHUDFontSmall", x, texty, COLOR_GREEN, TEXT_ALIGN_LEFT)
local charges = self:GetPrimaryAmmoCount()
if charges > 0 then
draw.SimpleText(charges, "ZSHUDFontSmall", x + wid, texty, COLOR_GREEN, TEXT_ALIGN_RIGHT)
else
draw.SimpleText(charges, "ZSHUDFontSmall", x + wid, texty, COLOR_DARKRED, TEXT_ALIGN_RIGHT)
end
if GetConVarNumber("crosshair") == 1 then
self:DrawCrosshairDot()
end
end