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