zombiesurvival-evolved/gamemodes/zombiesurvival/entities/weapons/weapon_zs_extinctioncrab/shared.lua

168 lines
3.7 KiB
Lua
Raw Normal View History

SWEP.ZombieOnly = true
SWEP.IsMelee = true
SWEP.ViewModel = "models/weapons/v_crowbar.mdl"
SWEP.WorldModel = "models/weapons/w_crowbar.mdl"
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = true
SWEP.Primary.Ammo = "none"
SWEP.Primary.Delay = 0.4
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Delay = 0.22
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = true
SWEP.Secondary.Ammo = "none"
SWEP.NoHitRecovery = 0.75
SWEP.HitRecovery = 1
SWEP.AttackTime = 1.875
SWEP.AttackProcessTime = 1.35
AccessorFuncDT(SWEP, "AttackStartTime", "Float", 0)
AccessorFuncDT(SWEP, "AttackProcessTime", "Float", 1)
SWEP.PoundAttackStart = 0
function SWEP:Initialize()
self:HideViewAndWorldModel()
end
function SWEP:Think()
local time = CurTime()
local owner = self:GetOwner()
if self:GetAttackProcessTime() > 0 and time >= self:GetAttackProcessTime() then
self:SetAttackProcessTime(0)
if SERVER then
self:ThrowGibs()
end
end
if self:IsAttacking() and time > self:GetAttackEndTime() then
self:SetAttackStartTime(0)
self:SetAttackProcessTime(0)
end
if self:IsPouncing() then
local delay = owner:GetMeleeSpeedMul()
if owner:WaterLevel() >= 2 then
self:SetPouncing(false)
self:SetNextPrimaryFire(time + 0.5 * delay)
elseif owner:OnGround() and owner:IsOnGround() then
self:SetPouncing(false)
self:SetNextPrimaryFire(time + 0.4 * delay)
if SERVER then
self:PoundAttackProcess()
end
end
end
self:NextThink(time)
return true
end
function SWEP:PrimaryAttack()
local owner = self:GetOwner()
if self:IsPouncing() or CurTime() < self:GetNextPrimaryFire() or not owner:IsOnGround() or self:IsAttacking() then return end
self.PoundAttackStart = CurTime()
local vel = owner:GetAimVector()
vel.z = math.max(0.45, vel.z)
vel:Normalize()
owner:SetGroundEntity(NULL)
owner:SetVelocity(vel * 250)
owner:DoAnimationEvent(ACT_RANGE_ATTACK1)
if SERVER then
self:EmitAttackSound()
end
self.m_ViewAngles = owner:EyeAngles()
self:SetPouncing(true)
end
function SWEP:SecondaryAttack()
local owner = self:GetOwner()
if self:IsAttacking() or self:IsPouncing() or not owner:IsOnGround() then return end
self:SetAttackStartTime(CurTime())
self:SetAttackProcessTime(CurTime() + self.AttackProcessTime)
if SERVER then
self:EmitAttackSound()
end
end
function SWEP:Reload()
if CurTime() < self:GetNextSecondaryFire() then return end
self:SetNextSecondaryFire(CurTime() + 2)
if SERVER then
self:EmitIdleSound()
end
end
function SWEP:Move(mv)
if self:IsPouncing() then
if CurTime() < self.PoundAttackStart + 0.1 then
local vel = mv:GetVelocity()
vel.z = 350
self:GetOwner():SetGroundEntity(NULL)
mv:SetVelocity(vel)
end
mv:SetMaxSpeed(mv:GetMaxSpeed() * 5)
mv:SetMaxClientSpeed(mv:GetMaxClientSpeed() * 5)
return true
end
if self:IsAttacking() then
mv:SetMaxSpeed(16)
mv:SetMaxClientSpeed(16)
return true
end
end
function SWEP:EmitIdleSound()
local ent = self:GetOwner():CompensatedMeleeTrace(4096, 24).Entity
if ent:IsValidPlayer() then
self:GetOwner():EmitSound("npc/headcrab/idle"..math.random(3)..".wav", 75, 60)
else
self:GetOwner():EmitSound("npc/headcrab/alert1.wav", 75, 60)
end
end
function SWEP:EmitAttackSound()
self:GetOwner():EmitSound("npc/ichthyosaur/attack_growl"..math.random(3)..".wav", 70, math.random(130, 160))
end
function SWEP:IsAttacking()
return self:GetAttackStartTime() > 0
end
function SWEP:GetAttackEndTime()
return self:GetAttackStartTime() + self.AttackTime
end
function SWEP:SetPouncing(pouncing)
if not pouncing then
self.m_ViewAngles = nil
end
self:SetDTBool(1, pouncing)
end
function SWEP:IsPouncing()
return self:GetDTBool(1)
end
SWEP.GetPouncing = SWEP.IsPouncing