mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
188 lines
5.8 KiB
Lua
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
|