176 lines
3.8 KiB
Lua
176 lines
3.8 KiB
Lua
|
AddCSLuaFile()
|
||
|
|
||
|
SWEP.Base = "weapon_zs_zombie"
|
||
|
|
||
|
SWEP.PrintName = "Slingshot Zombie Torso"
|
||
|
|
||
|
SWEP.ViewModel = Model("models/weapons/v_fza.mdl")
|
||
|
|
||
|
SWEP.MeleeDelay = 0.25
|
||
|
SWEP.MeleeDamage = 20
|
||
|
SWEP.MeleeReach = 40
|
||
|
SWEP.SwingAnimSpeed = 2.4
|
||
|
|
||
|
SWEP.PounceDamage = 20
|
||
|
SWEP.PounceDamageVsPlayerMul = 0.75
|
||
|
SWEP.PounceReach = 26
|
||
|
SWEP.PounceSize = 12
|
||
|
|
||
|
function SWEP:Think()
|
||
|
self.BaseClass.Think(self)
|
||
|
|
||
|
local curtime = CurTime()
|
||
|
local owner = self:GetOwner()
|
||
|
|
||
|
if self.NextAllowJump and self.NextAllowJump <= curtime then
|
||
|
self.NextAllowJump = nil
|
||
|
|
||
|
owner:ResetJumpPower()
|
||
|
end
|
||
|
|
||
|
if self:GetPouncing() then
|
||
|
if owner:IsOnGround() or owner:WaterLevel() >= 2 then
|
||
|
self:StopPounce()
|
||
|
else
|
||
|
local dir = owner:GetAimVector()
|
||
|
dir.z = math.Clamp(dir.z, -0.5, 0.9)
|
||
|
dir:Normalize()
|
||
|
|
||
|
local traces = owner:CompensatedZombieMeleeTrace(self.PounceReach, self.PounceSize, owner:WorldSpaceCenter(), dir)
|
||
|
local damage = self:GetDamage(self:GetTracesNumPlayers(traces), self.PounceDamage)
|
||
|
|
||
|
local hit = false
|
||
|
for _, trace in ipairs(traces) do
|
||
|
if not trace.Hit then continue end
|
||
|
|
||
|
if trace.HitWorld then
|
||
|
if trace.HitNormal.z < 0.8 then
|
||
|
hit = true
|
||
|
self:MeleeHitWorld(trace)
|
||
|
end
|
||
|
else
|
||
|
local ent = trace.Entity
|
||
|
if ent and ent:IsValid() then
|
||
|
hit = true
|
||
|
self:MeleeHit(ent, trace, damage * (ent:IsPlayer() and self.PounceDamageVsPlayerMul or ent.PounceWeakness or 1), ent:IsPlayer() and 1 or 10)
|
||
|
if ent:IsPlayer() then
|
||
|
ent:GiveStatus("slow", 5)
|
||
|
ent:AddLegDamage(24)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if SERVER and hit then
|
||
|
owner:EmitSound("physics/flesh/flesh_strider_impact_bullet1.wav")
|
||
|
owner:EmitSound("npc/fast_zombie/wake1.wav")
|
||
|
end
|
||
|
|
||
|
if hit then
|
||
|
self:StopPounce()
|
||
|
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self:NextThink(curtime)
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function SWEP:PrimaryAttack()
|
||
|
if CurTime() < self:GetNextPrimaryFire() or self:IsPouncing() then return end
|
||
|
|
||
|
local owner = self:GetOwner()
|
||
|
local armdelay = owner:GetMeleeSpeedMul()
|
||
|
|
||
|
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay * armdelay)
|
||
|
self:SetNextSecondaryFire(self:GetNextPrimaryFire() + 0.5)
|
||
|
|
||
|
self:StartSwinging()
|
||
|
end
|
||
|
|
||
|
function SWEP:Move(mv)
|
||
|
if self:IsPouncing() then
|
||
|
mv:SetMaxSpeed(0)
|
||
|
mv:SetMaxClientSpeed(0)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function SWEP:StopPounce()
|
||
|
if not self:IsPouncing() then return end
|
||
|
|
||
|
self:SetPouncing(false)
|
||
|
self.m_ViewAngles = nil
|
||
|
self.NextAllowJump = CurTime() + 0.25
|
||
|
self:SetNextPrimaryFire(CurTime() + 0.1)
|
||
|
self:GetOwner():ResetJumpPower()
|
||
|
end
|
||
|
|
||
|
|
||
|
function SWEP:PlayHitSound()
|
||
|
self:EmitSound("NPC_FastZombie.AttackHit", nil, nil, nil, CHAN_AUTO)
|
||
|
end
|
||
|
|
||
|
function SWEP:PlayMissSound()
|
||
|
self:EmitSound("NPC_FastZombie.AttackMiss", nil, nil, nil, CHAN_AUTO)
|
||
|
end
|
||
|
|
||
|
function SWEP:PlayAttackSound()
|
||
|
self:EmitSound("npc/fast_zombie/leap1.wav", nil, nil, nil, CHAN_AUTO)
|
||
|
end
|
||
|
|
||
|
function SWEP:PlayIdleSound()
|
||
|
self:GetOwner():EmitSound("NPC_FastZombie.AlertFar")
|
||
|
end
|
||
|
|
||
|
function SWEP:PlayAlertSound()
|
||
|
self:GetOwner():EmitSound("NPC_FastZombie.Frenzy")
|
||
|
end
|
||
|
|
||
|
function SWEP:Reload()
|
||
|
self:SecondaryAttack()
|
||
|
end
|
||
|
|
||
|
function SWEP:StartMoaning()
|
||
|
end
|
||
|
|
||
|
function SWEP:StopMoaning()
|
||
|
end
|
||
|
|
||
|
function SWEP:IsMoaning()
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function SWEP:SetPouncing(leaping)
|
||
|
self:SetDTBool(3, leaping)
|
||
|
end
|
||
|
|
||
|
function SWEP:GetPouncing()
|
||
|
return self:GetDTBool(3)
|
||
|
end
|
||
|
SWEP.IsPouncing = SWEP.GetPouncing
|
||
|
|
||
|
if SERVER then
|
||
|
|
||
|
function SWEP:Deploy()
|
||
|
self:GetOwner():CreateAmbience("fastzombieambience")
|
||
|
|
||
|
return self.BaseClass.Deploy(self)
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
if not CLIENT then return end
|
||
|
|
||
|
local matSkin = Material("models/barnacle/barnacle_sheet")
|
||
|
|
||
|
function SWEP:PreDrawViewModel(vm)
|
||
|
render.ModelMaterialOverride(matSkin)
|
||
|
render.SetColorModulation(0.64, 0.37, 0.39)
|
||
|
end
|
||
|
|
||
|
function SWEP:ViewModelDrawn()
|
||
|
render.ModelMaterialOverride()
|
||
|
render.SetColorModulation(1, 1, 1)
|
||
|
end
|