Files
wnsrc/gamemodes/ixhl2rp/plugins/wncremator/entities/weapons/immolator.lua

255 lines
6.2 KiB
Lua
Raw Normal View History

2024-08-05 18:40:29 +03:00
--[[
| 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