SWEP.PrintName = "'Helios' Gluon Gun" SWEP.Description = "Projects a stream of gluons at the target, causing immense damage. Hard to wield and aim, and builds up heat over time." SWEP.Base = "weapon_zs_base" SWEP.HoldType = "physgun" SWEP.ViewModel = "models/weapons/c_physcannon.mdl" SWEP.WorldModel = "models/weapons/w_physics.mdl" SWEP.ShowViewModel = false SWEP.ShowWorldModel = false SWEP.UseHands = true SWEP.Primary.Damage = 13.25 SWEP.Primary.NumShots = 1 SWEP.Primary.Delay = 0.09 SWEP.Primary.KnockbackScale = 0.1 SWEP.Primary.MaxDistance = 764 SWEP.Primary.ClipSize = 30 SWEP.Primary.Automatic = true SWEP.Primary.Ammo = "pulse" GAMEMODE:SetupDefaultClip(SWEP.Primary) SWEP.ConeMax = 0 SWEP.ConeMin = 0 SWEP.Tier = 4 SWEP.MaxStock = 3 SWEP.HeatBuildShort = 0.10 SWEP.HeatBuildLong = 0.045 SWEP.HeatVentShort = 0.16 SWEP.HeatVentLong = 0.13 SWEP.HeatDecayShort = 0.1 SWEP.HeatDecayLong = 0.01 SWEP.HeatInitialLong = 0.05 SWEP.WalkSpeed = SPEED_SLOWEST * 0.9 SWEP.FireAnimSpeed = 0.24 SWEP.FireSoundPitch = 125 SWEP.TracerName = "tracer_gluon" GAMEMODE:AttachWeaponModifier(SWEP, WEAPON_MODIFIER_SHORT_TEAM_HEAT, -0.01, 1) local branch = GAMEMODE:AddNewRemantleBranch(SWEP, 1, "'Hades' Higgs Gun", "Has a pulse slowing effect but deals less damage", function(wept) wept.Primary.Damage = wept.Primary.Damage * 10.5/12.5 wept.TracerName = "tracer_higgs" wept.EmitStartFiringSound = function(self) self:EmitSound("ambient/machines/teleport1.wav", 75, 210) self:EmitSound("npc/combine_gunship/ping_patrol.wav", 75, 120, 1, CHAN_AUTO+20) end wept.FireSoundPitch = 96 wept.LegDamage = true end) branch.Colors = {Color(160, 160, 160), Color(105, 105, 105), Color(50, 50, 50)} branch.NewNames = {"Deep", "Null", "Void"} GAMEMODE:AddNewRemantleBranch(SWEP, 2, "'Tartarus' Muon Gun", "Deals more damage with heat, but can overheat and damage you, reduced range", function(wept) wept.GluonDamage = function(self) return wept.Primary.Damage + (self:GetShortHeat() * 0.25 * wept.Primary.Damage) end wept.TracerName = "tracer_muon" wept.FireSoundPitch = 65 wept.Overheat = true wept.Primary.MaxDistance = 512 end).Colors = {Color(150, 110, 180), Color(130, 90, 160), Color(110, 60, 150)} function SWEP:Initialize() self.FiringSound = CreateSound(self, "^thrusters/rocket02.wav") self.FiringSound:SetSoundLevel(85) if CLIENT then self.VentingSound = CreateSound(self, "ambient/levels/labs/teleport_alarm_loop1.wav") end self.BaseClass.Initialize(self) end function SWEP:Deploy() local owner = self:GetOwner() if not self.PostOwner then self.PostOwner = owner end local timediff = owner.GluonInactiveTime and CurTime() - owner.GluonInactiveTime or 0 self:SetShortHeat(math.Clamp((owner.ShortGluonHeat or 0) - timediff * self.HeatDecayShort, 0, 1)) self:SetLongHeat(math.Clamp((owner.LongGluonHeat or 0) - timediff * self.HeatDecayLong, 0, 1)) if self:GetLongHeat() > 0.5 then self:SetGunState(2) self:EmitSound("npc/scanner/scanner_siren1.wav") end return self.BaseClass.Deploy(self) end function SWEP:Holster() self:EndGluonState() return self.BaseClass.Holster(self) end function SWEP:OnRemove() self.BaseClass.OnRemove(self) self:EndGluonState() end function SWEP:EmitStartFiringSound() self:EmitSound("ambient/machines/teleport1.wav", 75, 210) end function SWEP:GluonDamage() return self.Primary.Damage end function SWEP:PrimaryAttack() if not self:CanPrimaryAttack() then return end self:SetNextPrimaryFire(CurTime() + self:GetFireDelay()) -- Move this to DT vars because predicted at high pings local altuse = self:GetAltUsage() if altuse then self:TakeCombinedPrimaryAmmo(1) end self:SetAltUsage(not altuse) self:ShootBullets(self:GluonDamage(), self.Primary.NumShots, self:GetCone()) self.IdleAnimation = CurTime() + self:SequenceDuration() if self:GetGunState() ~= 1 then if IsFirstTimePredicted() then self:EmitStartFiringSound() self:GetOwner():ViewPunch(Angle(math.Rand(-2, 2), math.Rand(-2, 2), math.Rand(-5, 5))) end -- We prevent a bit of tapping fire by doing this. self:SetLongHeat(math.min(self:GetLongHeat() + self.HeatInitialLong, 1)) self:SetGunState(1) end end function SWEP:CanPrimaryAttack() if self:GetPrimaryAmmoCount() <= 0 then return false end if self:GetOwner():IsHolding() or self:GetOwner():GetBarricadeGhosting() or self:GetReloadFinish() > 0 then return false end return self:GetNextPrimaryFire() <= CurTime() end function SWEP.BulletCallback(attacker, tr, dmginfo) dmginfo:SetDamageType(DMG_DISSOLVE) if tr.HitWorld then util.Decal("FadingScorch", tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal) end if attacker:GetActiveWeapon().LegDamage then local ent = tr.Entity if ent:IsValidZombie() then ent:AddLegDamageExt(4.5, attacker, attacker:GetActiveWeapon(), SLOWTYPE_PULSE) end end return {impact = false} end function SWEP:Reload() if self:GetGunState() == 0 and self:GetLongHeat() ~= 0 then self:SetGunState(2) self:EmitSound("npc/scanner/scanner_siren1.wav") end end function SWEP:SecondaryAttack() end function SWEP:StopGluonSounds() self.FiringSound:Stop() if CLIENT then self.VentingSound:Stop() end end function SWEP:EndGluonState() local owner = self.PostOwner or self:GetOwner() if owner:IsValid() then owner.ShortGluonHeat = self:GetShortHeat() owner.LongGluonHeat = self:GetLongHeat() owner.GluonInactiveTime = CurTime() owner.GunSway = false end self:StopGluonSounds() end function SWEP:SetGunState(state) self:SetDTInt(1, state) end function SWEP:GetGunState(state) return self:GetDTInt(1) end function SWEP:SetAltUsage(usage) self:SetDTBool(1, usage) end function SWEP:GetAltUsage() return self:GetDTBool(1) end function SWEP:SetShortHeat(heat) self:SetDTFloat(8, heat) end function SWEP:GetShortHeat() return self:GetDTFloat(8) end function SWEP:SetLongHeat(heat) self:SetDTFloat(9, heat) end function SWEP:GetLongHeat() return self:GetDTFloat(9) end function SWEP:ManageHeat() local owner = self:GetOwner() if owner and owner:IsValid() then local frametime = FrameTime() if self:GetGunState() == 1 then self.FiringSound:PlayEx(1, self.FireSoundPitch + CurTime() % 1) self:SetShortHeat(math.min(self:GetShortHeat() + frametime * self.HeatBuildShort, 1)) self:SetLongHeat(math.min(self:GetLongHeat() + frametime * self.HeatBuildLong, 1)) if CLIENT then owner.GunSway = true end elseif self:GetGunState() == 2 then self.FiringSound:Stop() if CLIENT then owner.GunSway = false self.VentingSound:PlayEx(1, 55 + CurTime() % 1) end local frametimeadj = frametime * self:GetReloadSpeedMultiplier() self:SetShortHeat(math.max(self:GetShortHeat() - frametimeadj * self.HeatVentShort, 0)) self:SetLongHeat(math.max(self:GetLongHeat() - frametimeadj * self.HeatVentLong, 0)) self:SetNextPrimaryFire(CurTime() + 0.25) if self:GetLongHeat() == 0 and self:GetShortHeat() < self.HeatBuildShort then self:SetGunState(0) self:EmitSound("npc/scanner/combat_scan3.wav", 65, 90) end else owner.GunSway = false self:StopGluonSounds() self:SetShortHeat(math.max(self:GetShortHeat() - frametime * self.HeatDecayShort, 0)) self:SetLongHeat(math.max(self:GetLongHeat() - frametime * self.HeatDecayLong, 0)) end else self:StopGluonSounds() end end function SWEP:Think() self.BaseClass.Think(self) local overheat = self:GetShortHeat() + self:GetLongHeat() >= 1 if self:GetGunState() == 1 and CurTime() >= self:GetNextPrimaryFire() + 0.1 or overheat then self:SetGunState(overheat and 2 or 0) self:SetNextPrimaryFire(CurTime() + 0.15) if overheat then if self.Overheat then self:GetOwner():TakeSpecialDamage(15, DMG_BURN, self:GetOwner(), self) end self:EmitSound("npc/scanner/scanner_siren1.wav", 75) end self:EmitSound("weapons/zs_gluon/egon_off1.wav", 75, 115, 0.9, CHAN_WEAPON + 20) end self:ManageHeat() end