add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -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