168 lines
3.7 KiB
Lua
168 lines
3.7 KiB
Lua
|
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
|