mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
255 lines
6.2 KiB
Lua
255 lines
6.2 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
resource.AddFile("materials/effects/muzzleflash2edit.vtf")
|
|
resource.AddFile("materials/effects/muzzleflash2edit.vmt")
|
|
|
|
SWEP.Author = "Draco_2k"
|
|
SWEP.Category = "HL2RP"
|
|
SWEP.Purpose = "Set stuff on fire"
|
|
SWEP.Instructions = "Left-Click: Fire\nReload: Regenerate Ammunition"
|
|
SWEP.Spawnable = true
|
|
SWEP.AdminSpawnable = true
|
|
|
|
SWEP.ViewModel = "models/weapons/v_physcannon.mdl"
|
|
SWEP.WorldModel = ""
|
|
|
|
SWEP.UseHands = false
|
|
SWEP.IsAlwaysRaised = true
|
|
SWEP.HoldType = "normal"
|
|
SWEP.AnimPrefix = "normal"
|
|
SWEP.PrintName = "Immolator"
|
|
SWEP.DrawAmmo = false
|
|
SWEP.Primary.Automatic = true
|
|
SWEP.Primary.ClipSize = -1
|
|
SWEP.Primary.DefaultClip = -1
|
|
SWEP.Primary.Ammo = "none"
|
|
SWEP.Secondary.ClipSize = 75
|
|
SWEP.Secondary.DefaultClip = -1
|
|
SWEP.Secondary.Automatic = true
|
|
SWEP.Secondary.Ammo = "ar2"
|
|
SWEP.Slot = 3
|
|
SWEP.SlotPos = 3
|
|
|
|
SWEP.ReloadDelay = 0
|
|
|
|
--Precache everything
|
|
function SWEP:Precache()
|
|
util.PrecacheSound("ambient/machines/keyboard2_clicks.wav")
|
|
|
|
util.PrecacheSound("ambient/machines/thumper_dust.wav")
|
|
util.PrecacheSound("ambient/fire/mtov_flame2.wav")
|
|
util.PrecacheSound("ambient/fire/ignite.wav")
|
|
|
|
util.PrecacheSound("vehicles/tank_readyfire1.wav")
|
|
end
|
|
|
|
function SWEP:Initialize()
|
|
self:SetHoldType(self.HoldType)
|
|
end
|
|
|
|
-- luacheck: globals ACT_VM_FISTS_DRAW ACT_VM_FISTS_HOLSTER
|
|
ACT_IDLE = 1
|
|
|
|
function SWEP:Holster()
|
|
if (!IsValid(self.Owner)) then
|
|
return
|
|
end
|
|
|
|
local viewModel = self.Owner:GetViewModel()
|
|
|
|
if (IsValid(viewModel)) then
|
|
viewModel:SetPlaybackRate(1)
|
|
viewModel:ResetSequence(ACT_IDLE)
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function SWEP:ShouldDrawViewModel()
|
|
return false
|
|
end
|
|
|
|
--Primary attack
|
|
function SWEP:PrimaryAttack()
|
|
if (SERVER) then
|
|
if (self.Owner:GetAmmoCount("ar2") < 1 or self.ReloadDelay == 1) then
|
|
self:RunoutReload()
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
if (self.Owner:GetAmmoCount("ar2") > 0 and self.ReloadDelay == 0) then
|
|
self.Owner:RemoveAmmo(1, self.Weapon:GetSecondaryAmmoType())
|
|
self.Owner:MuzzleFlash()
|
|
self.Weapon:SetNextPrimaryFire(CurTime() + 0.08)
|
|
|
|
if (SERVER) then
|
|
local trace = self.Owner:GetEyeTrace()
|
|
local Distance = self.Owner:GetPos():Distance(trace.HitPos)
|
|
|
|
if (Distance < 520) then
|
|
--This is how we ignite stuff
|
|
local Ignite = function()
|
|
--Safeguard
|
|
if (!self:IsValid()) then return end
|
|
|
|
--Damage things in radius of impact
|
|
local flame = ents.Create("point_hurt")
|
|
flame:SetPos(trace.HitPos)
|
|
flame:SetOwner(self.Owner)
|
|
flame:SetKeyValue("DamageRadius",128)
|
|
flame:SetKeyValue("Damage",4)
|
|
flame:SetKeyValue("DamageDelay",0.32)
|
|
flame:SetKeyValue("DamageType",8)
|
|
flame:Spawn()
|
|
flame:Fire("TurnOn","",0)
|
|
flame:Fire("kill","",0.72)
|
|
|
|
if (trace.HitWorld) then
|
|
--Create actual fire - doesn't work very well in practice
|
|
local fire = ents.Create("env_fire")
|
|
|
|
fire:SetPos(trace.HitPos + Vector(0, 0, -8))
|
|
fire:SetAngles(Angle(0,0, math.random(-360, 360)))
|
|
fire:SetKeyValue("health", 10)
|
|
fire:SetKeyValue("firesize", math.random(82, 128))
|
|
fire:SetKeyValue("fireattack", tostring(math.random(0.72, 1.32)))
|
|
fire:SetKeyValue("damagescale", 8)
|
|
fire:SetKeyValue("spawnflags","178") --162
|
|
fire:Spawn()
|
|
fire:Activate()
|
|
fire:Fire("StartFire","", 0)
|
|
|
|
local nearbystuff = ents.FindInSphere(trace.HitPos, 100)
|
|
|
|
for _, stuff in pairs(nearbystuff) do
|
|
if (stuff != self.Owner) then
|
|
if (stuff:GetPhysicsObject():IsValid()) then
|
|
stuff:Ignite(5, 100)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (trace.Entity:IsValid()) then
|
|
if (trace.Entity:GetPhysicsObject():IsValid()) then
|
|
trace.Entity:Ignite(5, 100)
|
|
end
|
|
end
|
|
end
|
|
|
|
--Ignite stuff; based on how long it takes for flame to reach it
|
|
timer.Simple(Distance/1520, Ignite)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--Unused
|
|
function SWEP:SecondaryAttack() end
|
|
|
|
--Play a nice sound on deployment
|
|
function SWEP:Deploy()
|
|
self.Weapon:SendWeaponAnim(ACT_VM_DRAW)
|
|
|
|
if (SERVER) then
|
|
self.Owner:EmitSound("ambient/machines/keyboard2_clicks.wav", 42, 100)
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
--Think function
|
|
function SWEP:Think()
|
|
if (SERVER) then
|
|
if (self.Owner:KeyReleased(IN_ATTACK) and (self.Owner:GetAmmoCount("ar2") > 1) and (self.ReloadDelay != 1)) then
|
|
self.Owner:EmitSound("ambient/fire/mtov_flame2.wav", 24, 100)
|
|
end
|
|
|
|
if (self.Owner:GetAmmoCount("ar2") > 0 and self.ReloadDelay == 0) then
|
|
if (self.Owner:KeyPressed(IN_ATTACK)) then
|
|
self.Owner:EmitSound("ambient/machines/thumper_dust.wav", 46, 100)
|
|
end
|
|
|
|
if (self.Owner:KeyDown(IN_ATTACK)) then
|
|
self.Owner:EmitSound("ambient/fire/mtov_flame2.wav", math.random(27, 35), math.random(32, 152))
|
|
|
|
local trace = self.Owner:GetEyeTrace()
|
|
local flamefx = EffectData()
|
|
|
|
flamefx:SetOrigin(trace.HitPos)
|
|
flamefx:SetStart(self.Owner:GetShootPos())
|
|
flamefx:SetAttachment(1)
|
|
flamefx:SetEntity(self.Weapon)
|
|
|
|
util.Effect("swep_flamethrower_flame", flamefx, true, true)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--Reload function
|
|
function SWEP:Reload()
|
|
if (self.Owner:GetAmmoCount("ar2") > 74 or self.ReloadDelay == 1) then return end
|
|
|
|
self.ReloadDelay = 1
|
|
|
|
if (SERVER) then
|
|
self.Owner:EmitSound("vehicles/tank_readyfire1.wav", 30, 100)
|
|
end
|
|
|
|
timer.Simple(1.82, function()
|
|
if (self:IsValid()) then
|
|
self:ReloadSelf()
|
|
end
|
|
end)
|
|
end
|
|
|
|
--How to reload if running out of ammo
|
|
function SWEP:RunoutReload()
|
|
if (self.Owner:GetAmmoCount("ar2") > 74 or self.ReloadDelay == 1) then return end
|
|
|
|
self.ReloadDelay = 1
|
|
|
|
if (SERVER) then
|
|
self.Owner:EmitSound("ambient/machines/thumper_dust.wav", 48, 100)
|
|
self.Owner:EmitSound("vehicles/tank_readyfire1.wav", 30, 100)
|
|
end
|
|
|
|
timer.Simple(1.82, function()
|
|
if (self:IsValid()) then
|
|
self:ReloadSelf()
|
|
end
|
|
end)
|
|
end
|
|
|
|
--Finish reloading
|
|
function SWEP:ReloadSelf()
|
|
--Safeguards
|
|
if (!self or !self:IsValid()) then return end
|
|
|
|
if (SERVER) then
|
|
local ammo = math.Clamp((75 - self.Owner:GetAmmoCount("ar2")), 0, 75)
|
|
|
|
self.Owner:GiveAmmo(ammo, "ar2")
|
|
end
|
|
|
|
self.ReloadDelay = 0
|
|
|
|
if (self.Owner:KeyDown(IN_ATTACK)) then
|
|
if (SERVER) then
|
|
self.Owner:EmitSound("ambient/machines/thumper_dust.wav", 46, 100)
|
|
end
|
|
end
|
|
end
|