add sborka
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Base = "tacrp_proj_base"
|
||||
ENT.PrintName = "RPG-7 Improvised Rocket"
|
||||
ENT.Spawnable = false
|
||||
|
||||
ENT.Model = "models/weapons/tacint/rocket_deployed.mdl"
|
||||
|
||||
ENT.IsRocket = true // projectile has a booster and will not drop.
|
||||
|
||||
ENT.InstantFuse = false // projectile is armed immediately after firing.
|
||||
ENT.RemoteFuse = false // allow this projectile to be triggered by remote detonator.
|
||||
ENT.ImpactFuse = true // projectile explodes on impact.
|
||||
|
||||
ENT.ExplodeOnDamage = true
|
||||
ENT.ExplodeUnderwater = true
|
||||
|
||||
ENT.Delay = 0
|
||||
ENT.SafetyFuse = 0
|
||||
ENT.BoostTime = 5
|
||||
ENT.ImpactDamage = 150
|
||||
|
||||
ENT.AudioLoop = "TacRP/weapons/rpg7/rocket_flight-1.wav"
|
||||
|
||||
ENT.SmokeTrail = true
|
||||
|
||||
ENT.FlareColor = Color(255, 255, 75)
|
||||
|
||||
DEFINE_BASECLASS(ENT.Base)
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "NoBooster")
|
||||
self:NetworkVar("Entity", 0, "Weapon")
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
BaseClass.Initialize(self)
|
||||
|
||||
if SERVER then
|
||||
local phys = self:GetPhysicsObject()
|
||||
local rng = math.random()
|
||||
if rng <= 0.01 then
|
||||
self:EmitSound("weapons/rpg/shotdown.wav", 80, 95)
|
||||
local fx = EffectData()
|
||||
fx:SetOrigin(self:GetPos() + self:GetForward() * 32)
|
||||
fx:SetStart(Vector(math.Rand(0, 255), math.Rand(0, 255), math.Rand(0, 255)))
|
||||
util.Effect("balloon_pop", fx)
|
||||
self:GetOwner():EmitSound("tacrp/kids_cheering.mp3", 100, 100, 1)
|
||||
SafeRemoveEntity(self)
|
||||
elseif rng <= 0.25 then
|
||||
self.BoostTime = math.Rand(0.5, 5)
|
||||
|
||||
self:EmitSound("weapons/rpg/shotdown.wav", 80, 95)
|
||||
|
||||
self:SetNoBooster(math.random() <= 0.2)
|
||||
phys:EnableGravity(true)
|
||||
|
||||
if self:GetNoBooster() then
|
||||
phys:SetVelocityInstantaneous(self:GetOwner():GetVelocity() + self:GetForward() * math.Rand(25, 75) + self:GetUp() * math.Rand(75, 150))
|
||||
else
|
||||
phys:SetVelocityInstantaneous(self:GetOwner():GetVelocity() + self:GetForward() * math.Rand(100, 500) + self:GetUp() * math.Rand(50, 200))
|
||||
end
|
||||
phys:AddAngleVelocity(VectorRand() * 180)
|
||||
else
|
||||
self.BoostTime = math.Rand(1, 3)
|
||||
phys:SetVelocityInstantaneous(self:GetForward() * math.Rand(3000, 6000))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Detonate(ent)
|
||||
local attacker = self.Attacker or self:GetOwner()
|
||||
|
||||
if math.random() <= 0.05 then
|
||||
self:EmitSound("physics/metal/metal_barrel_impact_hard3.wav", 125, 115)
|
||||
local fx = EffectData()
|
||||
fx:SetOrigin(self:GetPos())
|
||||
fx:SetMagnitude(4)
|
||||
fx:SetScale(4)
|
||||
fx:SetRadius(4)
|
||||
fx:SetNormal(self:GetVelocity():GetNormalized())
|
||||
util.Effect("Sparks", fx)
|
||||
|
||||
for i = 1, 4 do
|
||||
local prop = ents.Create("prop_physics")
|
||||
prop:SetPos(self:GetPos())
|
||||
prop:SetAngles(self:GetAngles())
|
||||
prop:SetModel("models/weapons/tacint/rpg7_shrapnel_p" .. i .. ".mdl")
|
||||
prop:Spawn()
|
||||
prop:GetPhysicsObject():SetVelocityInstantaneous(self:GetVelocity() * 0.5 + VectorRand() * 75)
|
||||
prop:SetCollisionGroup(COLLISION_GROUP_DEBRIS)
|
||||
|
||||
SafeRemoveEntityDelayed(prop, 3)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
return
|
||||
end
|
||||
|
||||
local mult = TacRP.ConVars["mult_damage_explosive"]:GetFloat()
|
||||
if self.NPCDamage then
|
||||
util.BlastDamage(self, attacker, self:GetPos(), 350, 100)
|
||||
else
|
||||
util.BlastDamage(self, attacker, self:GetPos(), 350, math.Rand(150, 250) * mult)
|
||||
self:ImpactTraceAttack(ent, math.Rand(750, 1500) * mult, math.Rand(7500, 20000))
|
||||
end
|
||||
|
||||
local fx = EffectData()
|
||||
fx:SetOrigin(self:GetPos())
|
||||
|
||||
if self:WaterLevel() > 0 then
|
||||
util.Effect("WaterSurfaceExplosion", fx)
|
||||
else
|
||||
util.Effect("Explosion", fx)
|
||||
end
|
||||
|
||||
self:EmitSound("TacRP/weapons/rpg7/explode.wav", 125)
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsUpdate(phys)
|
||||
if self:GetNoBooster() then return end
|
||||
local len = phys:GetVelocity():Length()
|
||||
local f = math.Clamp(len / 5000, 0, 1)
|
||||
if phys:IsGravityEnabled() then
|
||||
phys:AddVelocity(self:GetForward() * math.Rand(0, Lerp(f, 100, 10)))
|
||||
phys:AddAngleVelocity(VectorRand() * Lerp(f, 8, 2))
|
||||
elseif self.SpawnTime < CurTime() and len < 500 then
|
||||
phys:EnableGravity(true)
|
||||
else
|
||||
phys:AddVelocity(VectorRand() * Lerp(f, 5, 50) + self:GetForward() * Lerp(f, 10, 0))
|
||||
end
|
||||
end
|
||||
|
||||
local smokeimages = {"particle/smokesprites_0001", "particle/smokesprites_0002", "particle/smokesprites_0003", "particle/smokesprites_0004", "particle/smokesprites_0005", "particle/smokesprites_0006", "particle/smokesprites_0007", "particle/smokesprites_0008", "particle/smokesprites_0009", "particle/smokesprites_0010", "particle/smokesprites_0011", "particle/smokesprites_0012", "particle/smokesprites_0013", "particle/smokesprites_0014", "particle/smokesprites_0015", "particle/smokesprites_0016"}
|
||||
|
||||
local function GetSmokeImage()
|
||||
return smokeimages[math.random(#smokeimages)]
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if !IsValid(self) or self:GetNoDraw() then return end
|
||||
|
||||
if !self.SpawnTime then
|
||||
self.SpawnTime = CurTime()
|
||||
end
|
||||
|
||||
if !self.Armed and isnumber(self.TimeFuse) and self.SpawnTime + self.TimeFuse < CurTime() then
|
||||
self.ArmTime = CurTime()
|
||||
self.Armed = true
|
||||
end
|
||||
|
||||
if self.Armed and self.ArmTime + self.Delay < CurTime() then
|
||||
self:PreDetonate()
|
||||
end
|
||||
|
||||
if SERVER and !self:GetNoBooster() and self.SpawnTime + self.BoostTime < CurTime() then
|
||||
self:SetNoBooster(true)
|
||||
self:GetPhysicsObject():EnableGravity(true)
|
||||
end
|
||||
|
||||
if self.LoopSound and self:GetNoBooster() then
|
||||
self.LoopSound:Stop()
|
||||
end
|
||||
|
||||
if self.ExplodeUnderwater and self:WaterLevel() > 0 then
|
||||
self:PreDetonate()
|
||||
end
|
||||
|
||||
if self.SmokeTrail and CLIENT then
|
||||
local emitter = ParticleEmitter(self:GetPos())
|
||||
if !self:GetNoBooster() then
|
||||
local smoke = emitter:Add(GetSmokeImage(), self:GetPos())
|
||||
|
||||
smoke:SetStartAlpha(50)
|
||||
smoke:SetEndAlpha(0)
|
||||
|
||||
smoke:SetStartSize(10)
|
||||
smoke:SetEndSize(math.Rand(50, 75))
|
||||
|
||||
smoke:SetRoll(math.Rand(-180, 180))
|
||||
smoke:SetRollDelta(math.Rand(-1, 1))
|
||||
|
||||
smoke:SetPos(self:GetPos())
|
||||
smoke:SetVelocity(-self:GetAngles():Forward() * 400 + (VectorRand() * 10))
|
||||
|
||||
smoke:SetColor(200, 200, 200)
|
||||
smoke:SetLighting(true)
|
||||
|
||||
smoke:SetDieTime(math.Rand(0.75, 1.25))
|
||||
|
||||
smoke:SetGravity(Vector(0, 0, 0))
|
||||
|
||||
elseif !self.LastNoBooster then
|
||||
|
||||
for i = 1, 10 do
|
||||
local smoke = emitter:Add(GetSmokeImage(), self:GetPos())
|
||||
smoke:SetStartAlpha(50)
|
||||
smoke:SetEndAlpha(0)
|
||||
smoke:SetStartSize(25)
|
||||
smoke:SetEndSize(math.Rand(100, 150))
|
||||
smoke:SetRoll(math.Rand(-180, 180))
|
||||
smoke:SetRollDelta(math.Rand(-1, 1))
|
||||
smoke:SetPos(self:GetPos())
|
||||
smoke:SetVelocity(VectorRand() * 200)
|
||||
smoke:SetColor(200, 200, 200)
|
||||
smoke:SetLighting(true)
|
||||
smoke:SetDieTime(math.Rand(0.75, 1.75))
|
||||
smoke:SetGravity(Vector(0, 0, -200))
|
||||
end
|
||||
else
|
||||
local smoke = emitter:Add(GetSmokeImage(), self:GetPos())
|
||||
|
||||
smoke:SetStartAlpha(30)
|
||||
smoke:SetEndAlpha(0)
|
||||
|
||||
smoke:SetStartSize(10)
|
||||
smoke:SetEndSize(math.Rand(25, 50))
|
||||
|
||||
smoke:SetRoll(math.Rand(-180, 180))
|
||||
smoke:SetRollDelta(math.Rand(-1, 1))
|
||||
|
||||
smoke:SetPos(self:GetPos())
|
||||
smoke:SetVelocity(VectorRand() * 10)
|
||||
|
||||
smoke:SetColor(150, 150, 150)
|
||||
smoke:SetLighting(true)
|
||||
|
||||
smoke:SetDieTime(math.Rand(0.2, 0.3))
|
||||
|
||||
smoke:SetGravity(Vector(0, 0, 0))
|
||||
end
|
||||
emitter:Finish()
|
||||
|
||||
self.LastNoBooster = self:GetNoBooster()
|
||||
|
||||
end
|
||||
|
||||
|
||||
self:OnThink()
|
||||
end
|
||||
|
||||
local mat = Material("effects/ar2_altfire1b")
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if self.FlareColor and !self:GetNoBooster() then
|
||||
render.SetMaterial(mat)
|
||||
render.DrawSprite(self:GetPos() + (self:GetAngles():Forward() * -16), math.Rand(100, 150), math.Rand(100, 150), self.FlareColor)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user