add sborka
This commit is contained in:
165
garrysmod/addons/tacrp/lua/entities/tacrp_proj_gyrojet.lua
Normal file
165
garrysmod/addons/tacrp/lua/entities/tacrp_proj_gyrojet.lua
Normal file
@@ -0,0 +1,165 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Base = "tacrp_proj_base"
|
||||
ENT.PrintName = "Gyrojet Round"
|
||||
ENT.Spawnable = false
|
||||
|
||||
ENT.Model = "models/weapons/tacint_shark/projectiles/gyrojet_rocket.mdl"
|
||||
ENT.CollisionSphere = 2
|
||||
|
||||
ENT.IsRocket = true
|
||||
|
||||
ENT.InstantFuse = false
|
||||
ENT.RemoteFuse = false
|
||||
ENT.ImpactFuse = true
|
||||
|
||||
ENT.ExplodeOnDamage = false
|
||||
ENT.ExplodeUnderwater = true
|
||||
|
||||
ENT.Delay = 0
|
||||
ENT.SafetyFuse = 0
|
||||
|
||||
ENT.AudioLoop = "TacRP/weapons/rpg7/rocket_flight-1.wav"
|
||||
|
||||
ENT.SmokeTrail = true
|
||||
ENT.FlareColor = Color(255, 128, 0, 100)
|
||||
ENT.FlareLife = 0.5
|
||||
|
||||
ENT.ExplodeSounds = {
|
||||
"^TacRP/weapons/grenade/40mm_explode-1.wav",
|
||||
"^TacRP/weapons/grenade/40mm_explode-2.wav",
|
||||
"^TacRP/weapons/grenade/40mm_explode-3.wav",
|
||||
}
|
||||
|
||||
ENT.ImpactDamage = 0
|
||||
|
||||
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:MakeSmoke()
|
||||
local emitter = ParticleEmitter(self:GetPos())
|
||||
|
||||
local smoke = emitter:Add(GetSmokeImage(), self:GetPos())
|
||||
|
||||
smoke:SetStartAlpha(55)
|
||||
smoke:SetEndAlpha(0)
|
||||
|
||||
smoke:SetStartSize(4)
|
||||
smoke:SetEndSize(math.Rand(16, 24))
|
||||
|
||||
smoke:SetRoll(math.Rand(-180, 180))
|
||||
smoke:SetRollDelta(math.Rand(-1, 1))
|
||||
|
||||
smoke:SetPos(self:GetPos())
|
||||
smoke:SetVelocity(-self:GetAngles():Forward() * 200 + (VectorRand() * 5)
|
||||
+ self:GetAngles():Right() * math.sin(CurTime() * math.pi * 16) * 32
|
||||
+ self:GetAngles():Up() * math.cos(CurTime() * math.pi * 16) * 32)
|
||||
|
||||
smoke:SetColor(255, 255, 255)
|
||||
smoke:SetLighting(true)
|
||||
|
||||
smoke:SetDieTime(math.Rand(0.4, 0.6))
|
||||
|
||||
smoke:SetGravity(Vector(0, 0, 0))
|
||||
|
||||
emitter:Finish()
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if !IsValid(self) or self:GetNoDraw() then return end
|
||||
|
||||
if CurTime() - self.SpawnTime >= self.FlareLife then
|
||||
self.FlareColor = false
|
||||
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 self.ExplodeUnderwater and self:WaterLevel() > 0 then
|
||||
self:PreDetonate()
|
||||
end
|
||||
|
||||
if CLIENT and self.SmokeTrail and CurTime() - self.SpawnTime >= 0.1 then
|
||||
self:MakeSmoke()
|
||||
end
|
||||
|
||||
self:OnThink()
|
||||
end
|
||||
|
||||
function ENT:Impact(data, collider)
|
||||
|
||||
local ang = data.OurOldVelocity:Angle()
|
||||
local fx = EffectData()
|
||||
fx:SetOrigin(data.HitPos)
|
||||
fx:SetNormal(-ang:Forward())
|
||||
fx:SetAngles(-ang)
|
||||
util.Effect("MetalSpark", fx)
|
||||
|
||||
local attacker = self.Attacker or self:GetOwner() or self
|
||||
local inflictor = attacker.GetWeapon and attacker:GetWeapon("tacrp_sd_gyrojet")
|
||||
local dmg = inflictor and inflictor.GetValue and inflictor:GetValue("Damage_Max") or 75
|
||||
self:FireBullets({
|
||||
Attacker = attacker,
|
||||
Inflictor = inflictor or self,
|
||||
Force = 5,
|
||||
Num = 1,
|
||||
Tracer = 0,
|
||||
Dir = data.OurOldVelocity:GetNormalized(),
|
||||
Src = data.HitPos,
|
||||
Damage = dmg,
|
||||
HullSize = 2,
|
||||
Callback = function(att, btr, dmginfo)
|
||||
if IsValid(btr.Entity) then
|
||||
if IsValid(inflictor) and inflictor.GetValue then
|
||||
local range = (btr.HitPos - btr.StartPos):Length()
|
||||
inflictor:AfterShotFunction(btr, dmginfo, range, inflictor:GetValue("Penetration"), {})
|
||||
end
|
||||
else
|
||||
-- Even though bullet did not hit, projectile did; just apply damage
|
||||
if attacker:IsNPC() and !TacRP.ConVars["npc_equality"]:GetBool() then
|
||||
dmginfo:ScaleDamage(0.25)
|
||||
end
|
||||
data.HitEntity:TakeDamageInfo(dmginfo)
|
||||
end
|
||||
|
||||
end
|
||||
})
|
||||
|
||||
self:Remove()
|
||||
return false
|
||||
end
|
||||
|
||||
function ENT:Detonate()
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsUpdate(phys)
|
||||
local len = phys:GetVelocity():Length()
|
||||
local f = math.Clamp(len / 4000, 0, 1)
|
||||
phys:AddVelocity(self:GetForward() * Lerp(f, 10, 1))
|
||||
end
|
||||
|
||||
local mat = Material("sprites/light_glow02_add")
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if self.FlareColor then
|
||||
local s = Lerp(((CurTime() - self.SpawnTime) / self.FlareLife) ^ 0.5, 1, 0)
|
||||
local s1, s2 = 32 * s, 64 * s
|
||||
render.SetMaterial(mat)
|
||||
render.DrawSprite(self:GetPos() + (self:GetAngles():Forward() * -4), math.Rand(s1, s2), math.Rand(s1, s2), self.FlareColor)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user