add sborka
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:Draw()
|
||||
if CurTime() > self:GetNWFloat("HideTime", 0) then
|
||||
self:DrawModel()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:IsTranslucent()
|
||||
return true
|
||||
end
|
||||
229
garrysmod/addons/tfa_antitank/lua/entities/rpg26_rocket/init.lua
Normal file
229
garrysmod/addons/tfa_antitank/lua/entities/rpg26_rocket/init.lua
Normal file
@@ -0,0 +1,229 @@
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
local LVS = LVS
|
||||
|
||||
ENT.Damage = 0
|
||||
ENT.Prime = 0.03
|
||||
ENT.Delay = 30
|
||||
ENT.HideDelay = 0.0
|
||||
|
||||
function ENT:Initialize()
|
||||
if not self:GetModel() or self:GetModel() == "" or self:GetModel() == "models/error.mdl" then
|
||||
self:SetModel("models/weapons/fas2/world/explosives/rpg26/rocket.mdl")
|
||||
end
|
||||
|
||||
if not self.Owner:IsPlayer() then
|
||||
self.Owner = NULL
|
||||
end
|
||||
|
||||
self.burnout = CurTime() + 2
|
||||
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
|
||||
local phys = self:GetPhysicsObject()
|
||||
if IsValid(phys) then
|
||||
phys:Wake()
|
||||
end
|
||||
|
||||
self:SetFriction(self.Delay)
|
||||
self.killtime = CurTime() + self.Delay
|
||||
self.StartTime = CurTime()
|
||||
|
||||
self:EmitSound("TFA_INS2_RPG7.Loop")
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
|
||||
self.HasIdle = true
|
||||
self.HP = math.random(30, 60)
|
||||
|
||||
timer.Simple(0.1, function()
|
||||
if IsValid(self) then
|
||||
self:SetOwner(self:GetOwner() or NULL)
|
||||
end
|
||||
end)
|
||||
|
||||
self:SetNWFloat("HideTime", CurTime() + self.HideDelay)
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local ct = CurTime()
|
||||
if self.killtime < ct then return false end
|
||||
|
||||
local phys = self:GetPhysicsObject()
|
||||
if not IsValid(phys) then return end
|
||||
if phys:IsValid() then
|
||||
phys:ApplyForceCenter(Vector(0, 0, -9.80665 * 7) * phys:GetMass() * engine.TickInterval())
|
||||
end
|
||||
|
||||
self:NextThink(ct)
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:Explode()
|
||||
if self._Exploding then return end
|
||||
self._Exploding = true
|
||||
|
||||
if not IsValid(self.Owner) then
|
||||
self:Remove()
|
||||
return
|
||||
end
|
||||
|
||||
local tr = util.TraceLine({
|
||||
start = pos,
|
||||
endpos = pos + self:GetAngles():Forward() * 200,
|
||||
filter = self
|
||||
})
|
||||
|
||||
local hit = tr.Entity
|
||||
|
||||
if IsValid(hit) and hit.LVS then
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetDamage(250)
|
||||
dmg:SetDamageType(DMG_BLAST)
|
||||
dmg:SetAttacker(self.Owner or self)
|
||||
dmg:SetInflictor(self)
|
||||
hit:TakeDamageInfo(dmg)
|
||||
|
||||
if hit.GetSubSystem then
|
||||
local subsys = hit:GetSubSystem(tr.HitPos)
|
||||
if subsys then
|
||||
subsys:TakeDamage(300)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local pos = self:GetPos()
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(pos)
|
||||
effectdata:SetScale(5)
|
||||
effectdata:SetMagnitude(5)
|
||||
|
||||
util.Effect("HelicopterMegaBomb", effectdata)
|
||||
util.Effect("Explosion", effectdata)
|
||||
|
||||
util.BlastDamage(self, self.Owner, pos, 100, 10)
|
||||
|
||||
local shake = ents.Create("env_shake")
|
||||
shake:SetOwner(self.Owner)
|
||||
shake:SetPos(pos)
|
||||
shake:SetKeyValue("amplitude", "20")
|
||||
shake:SetKeyValue("radius", "768")
|
||||
shake:SetKeyValue("duration", tostring(self.Damage / 800))
|
||||
shake:SetKeyValue("frequency", "255")
|
||||
shake:SetKeyValue("spawnflags", "4")
|
||||
shake:Spawn()
|
||||
shake:Activate()
|
||||
shake:Fire("StartShake", "", 0)
|
||||
|
||||
self:EmitSound("TFA_INS2_RPG7.2")
|
||||
|
||||
LVS:FireBullet({
|
||||
Src = pos,
|
||||
Dir = self:GetAngles():Forward(),
|
||||
Spread = vector_origin,
|
||||
Force = 42000,
|
||||
HullSize = 0,
|
||||
Damage = 12000,
|
||||
Velocity = 16000,
|
||||
Attacker = self.Owner
|
||||
})
|
||||
|
||||
local tr = util.TraceHull({
|
||||
start = pos,
|
||||
endpos = pos,
|
||||
mins = Vector(-80, -80, -80),
|
||||
maxs = Vector(80, 80, 80),
|
||||
filter = self
|
||||
})
|
||||
|
||||
local hit = tr.Entity
|
||||
|
||||
if IsValid(hit) and hit.LVS then
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetDamage(200)
|
||||
dmg:SetDamageType(DMG_BLAST)
|
||||
dmg:SetAttacker(self.Owner or self)
|
||||
dmg:SetInflictor(self)
|
||||
hit:TakeDamageInfo(dmg)
|
||||
|
||||
if hit.GetSubSystem then
|
||||
local subsys = hit:GetSubSystem(pos)
|
||||
|
||||
if subsys then
|
||||
local name = subsys.Name:lower()
|
||||
|
||||
if name:find("engine") then
|
||||
subsys:SetHP(0)
|
||||
|
||||
elseif name:find("ammo") then
|
||||
subsys:SetHP(0)
|
||||
|
||||
elseif name:find("fuel") then
|
||||
subsys:SetHP(0)
|
||||
|
||||
else
|
||||
subsys:TakeDamage(250)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, phys)
|
||||
if self._LastCollide and self._LastCollide > CurTime() - 0.05 then return end
|
||||
self._LastCollide = CurTime()
|
||||
local ct = CurTime()
|
||||
|
||||
if data.Speed > 60 and ct > self.StartTime + self.Prime then
|
||||
timer.Simple(0, function()
|
||||
if IsValid(self) then self:Explode() end
|
||||
end)
|
||||
return
|
||||
end
|
||||
|
||||
self.Prime = math.huge
|
||||
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_INS2_RPG7.Loop")
|
||||
self.HasIdle = false
|
||||
self:SetNWFloat("HideTime", -1)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_INS2_RPG7.Loop")
|
||||
self.HasIdle = false
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Use(activator)
|
||||
if activator:IsPlayer() and self.WeaponClass then
|
||||
local wep = activator:GetWeapon(self.WeaponClass)
|
||||
if IsValid(wep) then
|
||||
activator:GiveAmmo(1, wep:GetPrimaryAmmoType(), false)
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmg)
|
||||
if dmg:GetInflictor() == self or dmg:GetAttacker() == self then return end
|
||||
if self.Exploded then return end
|
||||
|
||||
local damage = dmg:GetDamage()
|
||||
self.HP = self.HP - damage
|
||||
|
||||
if self.HP <= 0 then
|
||||
self.Exploded = true
|
||||
self:Explode()
|
||||
return
|
||||
end
|
||||
|
||||
self:TakePhysicsDamage(dmg)
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Contact Explosive"
|
||||
ENT.Author = ""
|
||||
ENT.Contact = ""
|
||||
ENT.Purpose = ""
|
||||
ENT.Instructions = ""
|
||||
ENT.DoNotDuplicate = true
|
||||
ENT.DisableDuplicator = true
|
||||
Reference in New Issue
Block a user