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

168 lines
4.5 KiB
Lua
Raw Permalink Normal View History

SWEP.PrintName = "'Hephaestus' Tau Cannon"
SWEP.Description = "Also known as the Gauss Gun. Launches tau projectiles at incredibly high speeds."
SWEP.Base = "weapon_zs_base"
SWEP.HoldType = "ar2"
SWEP.ViewModel = "models/weapons/c_shotgun.mdl"
SWEP.WorldModel = "models/weapons/w_physics.mdl"
SWEP.ShowViewModel = false
SWEP.ShowWorldModel = false
SWEP.UseHands = true
SWEP.Primary.Sound = Sound("weapons/gauss/fire1.wav")
SWEP.Primary.Damage = 26.5
SWEP.Primary.NumShots = 1
SWEP.Primary.Delay = 0.2
SWEP.Primary.ClipSize = 30
SWEP.Primary.Automatic = true
SWEP.Primary.Ammo = "pulse"
SWEP.Primary.DefaultClip = 30
SWEP.ConeMax = 3
SWEP.ConeMin = 1.5
SWEP.HeadshotMulti = 1.5
SWEP.ChargeDelay = 0.12
SWEP.Tier = 5
GAMEMODE:AttachWeaponModifier(SWEP, WEAPON_MODIFIER_FIRE_DELAY, -0.01)
GAMEMODE:AddNewRemantleBranch(SWEP, 1, "'Prometheus' Tau Cannon", "Bounces at low angles, three weaker shots, charges faster, increased fire delay", function(wept)
wept.Primary.Delay = wept.Primary.Delay * 1.4
wept.Primary.Damage = wept.Primary.Damage * 1.2/3
wept.Primary.NumShots = 3
wept.ChargeDelay = 0.08
local function DoRicochet(attacker, hitpos, hitnormal, normal, damage)
attacker.RicochetBullet = true
if attacker:IsValid() then
attacker:FireBulletsLua(hitpos, 2 * hitnormal * hitnormal:Dot(normal * -1) + normal, 0, 1, damage, nil, nil, "tracer_heph_alt", nil, nil, nil, nil, nil, attacker:GetActiveWeapon())
end
attacker.RicochetBullet = nil
end
wept.BulletCallback = function(attacker, tr, dmginfo)
if SERVER and tr.HitWorld and not tr.HitSky and tr.HitNormal:Dot(tr.Normal) > -0.2 then
local hitpos, hitnormal, normal, dmg = tr.HitPos, tr.HitNormal, tr.Normal, dmginfo:GetDamage() * 1.2
timer.Simple(0, function() DoRicochet(attacker, hitpos, hitnormal, normal, dmg) end)
end
return {impact = false}
end
end)
SWEP.WalkSpeed = SPEED_SLOW
SWEP.FireAnimSpeed = 1
SWEP.TracerName = "tracer_heph"
function SWEP:TakeAmmo()
self:TakeCombinedPrimaryAmmo(1)
if CLIENT then
self.LastVel = 7
end
end
function SWEP:Reload()
end
function SWEP:Initialize()
self.BaseClass.Initialize(self)
self.ChargeSound = CreateSound(self, "weapons/gauss/chargeloop.wav")
end
function SWEP:CanPrimaryAttack()
if self:GetPrimaryAmmoCount() <= 0 then
return false
end
if self:GetCharging() or self:GetOwner():IsHolding() or self:GetOwner():GetBarricadeGhosting() then return false end
return self:GetNextPrimaryFire() <= CurTime()
end
function SWEP:SecondaryAttack()
if not self:CanPrimaryAttack() or self:GetCharging() then return end
self:SetNextPrimaryFire(CurTime() + self:GetFireDelay())
self:SetLastChargeTime(CurTime())
self:TakeAmmo()
self:SetCharging(true)
end
function SWEP.BulletCallback(attacker, tr, dmginfo)
return {impact = false}
end
function SWEP:CheckCharge()
if self:GetCharging() then
local owner = self:GetOwner()
if not owner:KeyDown(IN_ATTACK2) then
self:EmitFireSound()
self.FireAnimSpeed = 0.3
self:ShootBullets(self.Primary.Damage * self:GetGunCharge(), self.Primary.NumShots, self:GetCone())
self.IdleAnimation = CurTime() + self:SequenceDuration()
self.FireAnimSpeed = 1
owner:SetGroundEntity(NULL)
owner:SetVelocity(-34 * self:GetGunCharge() * owner:GetAimVector())
self:SetNextPrimaryFire(CurTime() + self:GetFireDelay() * 4)
self:SetCharging(false)
self:SetLastChargeTime(CurTime())
self:SetGunCharge(0)
elseif self:GetGunCharge() < 13 and self:GetPrimaryAmmoCount() ~= 0 and self:GetLastChargeTime() + self.ChargeDelay < CurTime() then
self:SetGunCharge(self:GetGunCharge() + 1)
self:SetLastChargeTime(CurTime())
self:TakeAmmo()
end
self.ChargeSound:PlayEx(1, math.min(255, 47 + self:GetGunCharge() * 16))
else
self.ChargeSound:Stop()
end
end
function SWEP:SetLastChargeTime(lct)
self:SetDTFloat(8, lct)
end
function SWEP:GetLastChargeTime()
return self:GetDTFloat(8)
end
function SWEP:SetGunCharge(charge)
self:SetDTInt(1, charge)
end
function SWEP:GetGunCharge(charge)
return self:GetDTInt(1)
end
function SWEP:SetCharging(charge)
self:SetDTBool(1, charge)
end
function SWEP:GetCharging()
return self:GetDTBool(1)
end
function SWEP:EmitFireSound()
local deduct = self:GetCharging() and 100 - self:GetGunCharge() or 100
local owner = self:GetOwner()
self:EmitSound("weapons/gauss/fire1.wav", 75, deduct, 0.9)
timer.Simple(0.2, function()
if self:IsValid() and owner:IsValid() and not owner:KeyDown(IN_ATTACK) then
self:EmitSound("weapons/zs_heph/electro"..math.random(4,6)..".wav", 75, deduct, 0.75, CHAN_WEAPON + 20)
end
end)
end