Files
wnsrc/lua/entities/arccw_uc_riflegrenade.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

188 lines
5.8 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/
--]]
AddCSLuaFile()
ENT.Type = "anim"
ENT.Base = "base_entity"
ENT.PrintName = "Base Rifle Grenade"
ENT.Author = ""
ENT.Information = ""
ENT.Spawnable = false
ENT.Ticks = 0
ENT.CollisionGroup = COLLISION_GROUP_PROJECTILE
-- Intentionally not ENT.Damage since ArcCW base overwrites it with weapon damage (for some reason)
ENT.GrenadeDamage = false
ENT.GrenadeRadius = 0
ENT.FuseTime = 10
ENT.DragCoefficient = 1
ENT.DetonateOnImpact = true
ENT.Model = "models/items/ar2_grenade.mdl"
ENT.ExplosionEffect = true
ENT.Scorch = "Scorch"
ENT.SmokeTrail = true
local path = "arccw_uc/common/"
local path1 = "arccw_uc/common/"
ENT.ExplosionSounds = {path .. "explosion-close-01.ogg", path .. "explosion-close-02.ogg"}
ENT.DebrisSounds = {path1 .. "debris-01.ogg", path1 .. "debris-02.ogg", path1 .. "debris-03.ogg", path1 .. "debris-04.ogg", path1 .. "debris-05.ogg"}
if SERVER then
function ENT:Initialize()
local pb_vert = 1
local pb_hor = 1
self:SetModel(self.Model)
self:PhysicsInitBox(Vector(-pb_vert, -pb_hor, -pb_hor), Vector(pb_vert, pb_hor, pb_hor))
local phys = self:GetPhysicsObject()
if phys:IsValid() then
phys:Wake()
phys:SetDragCoefficient(self.DragCoefficient)
phys:SetBuoyancyRatio(0.1)
end
self.SpawnTime = CurTime()
end
function ENT:Think()
if SERVER and CurTime() - self.SpawnTime >= self.FuseTime then
self:Detonate()
end
end
else
function ENT:Think()
if self.SmokeTrail then
if self.Ticks % 5 == 0 then
local emitter = ParticleEmitter(self:GetPos())
if not self:IsValid() or self:WaterLevel() > 2 then return end
if not IsValid(emitter) then return end
local smoke = emitter:Add("particle/particle_smokegrenade", self:GetPos())
smoke:SetVelocity(VectorRand() * 25)
smoke:SetGravity(Vector(math.Rand(-5, 5), math.Rand(-5, 5), math.Rand(-20, -25)))
smoke:SetDieTime(math.Rand(1.5, 2.0))
smoke:SetStartAlpha(255)
smoke:SetEndAlpha(0)
smoke:SetStartSize(0)
smoke:SetEndSize(100)
smoke:SetRoll(math.Rand(-180, 180))
smoke:SetRollDelta(math.Rand(-0.2, 0.2))
smoke:SetColor(20, 20, 20)
smoke:SetAirResistance(5)
smoke:SetPos(self:GetPos())
smoke:SetLighting(false)
emitter:Finish()
end
self.Ticks = self.Ticks + 1
end
end
end
-- overwrite to do special explosion things
function ENT:DoDetonation()
local attacker = IsValid(self:GetOwner()) and self:GetOwner() or self
util.BlastDamage(self, attacker, self:GetPos(), self.GrenadeRadius, self.GrenadeDamage or self.Damage or 0)
end
function ENT:DoImpact(ent)
local attacker = IsValid(self:GetOwner()) and self:GetOwner() or self
local dmg = DamageInfo()
dmg:SetAttacker(attacker)
dmg:SetInflictor(self)
dmg:SetDamage(100)
dmg:SetDamageType(DMG_CRUSH)
dmg:SetDamageForce(self.GrenadeDir * 5000)
dmg:SetDamagePosition(self:GetPos())
ent:TakeDamageInfo(dmg)
end
function ENT:Detonate()
if not self:IsValid() or self.BOOM then return end
self.BOOM = true
if self.ExplosionEffect then
local effectdata = EffectData()
effectdata:SetOrigin(self:GetPos())
if self:WaterLevel() >= 1 then
util.Effect("WaterSurfaceExplosion", effectdata)
self:EmitSound("weapons/underwater_explode3.wav", 125, 100, 1, CHAN_AUTO)
else
-- util.Effect("Explosion", effectdata)
-- explosion_HE_m79_fas2
-- explosion_he_grenade_fas2
-- explosion_HE_claymore_fas2
-- explosion_grenade_fas2
self:EmitSound(self.ExplosionSounds[math.random(1,#self.ExplosionSounds)], 125, 100, 1, CHAN_AUTO)
ParticleEffect("explosion_HE_m79_fas2", self:GetPos(), Angle(-90, 0, 0))
--self:EmitSound("phx/kaboom.wav", 125, 100, 1, CHAN_AUTO)
-- Where is the sound zenith ? ???
end
util.ScreenShake(self:GetPos(), 25, 4, 0.75, self.GrenadeRadius * 4)
if self.GrenadePos == nil then
self.GrenadePos = self:GetPos()
end
if self.GrenadeDir == nil then
self.GrenadeDir = self:GetVelocity():GetNormalized()
end
local trace = util.TraceLine({
start = self.GrenadePos,
endpos = self.GrenadePos + self.GrenadeDir * 4,
mask = MASK_SOLID_BRUSHONLY
})
if trace.Hit then
self:EmitSound(self.DebrisSounds[math.random(1,#self.DebrisSounds)], 85, 100, 1, CHAN_AUTO)
end
end
self:DoDetonation()
if self.Scorch then
util.Decal(self.Scorch, self.GrenadePos, self.GrenadePos + self.GrenadeDir * 4, self)
end
self:Remove()
end
function ENT:PhysicsCollide(colData, collider)
self.GrenadeDir = colData.OurOldVelocity:GetNormalized()
self.GrenadePos = colData.HitPos
self:DoImpact(colData.HitEntity)
if self.DetonateOnImpact then
self:Detonate()
else
local effectdata = EffectData()
effectdata:SetOrigin(self:GetPos())
effectdata:SetMagnitude(2)
effectdata:SetScale(1)
effectdata:SetRadius(2)
effectdata:SetNormal(self.GrenadeDir)
util.Effect("Sparks", effectdata)
self:EmitSound("weapons/rpg/shotdown.wav", 100, 150)
self:Remove()
end
end
function ENT:Draw()
self:DrawModel()
end