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

176 lines
3.8 KiB
Lua
Raw Normal View History

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