mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
195 lines
6.4 KiB
Lua
195 lines
6.4 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 = "obj_vj_projectile_base"
|
||
|
|
ENT.PrintName = "Flechette"
|
||
|
|
ENT.Author = "Zippy"
|
||
|
|
ENT.Spawnable = false
|
||
|
|
|
||
|
|
ENT.Model = {"models/weapons/hunter_flechette.mdl"}
|
||
|
|
|
||
|
|
ENT.DoesDirectDamage = true -- Should it do a direct damage when it hits something?
|
||
|
|
ENT.DirectDamage = 8 -- How much damage should it do when it hits something
|
||
|
|
ENT.DirectDamageType = bit.bor(DMG_NEVERGIB, DMG_SHOCK) -- Damage type
|
||
|
|
|
||
|
|
ENT.CollideCodeWithoutRemoving = true
|
||
|
|
ENT.RemoveOnHit = false -- Should it remove itself when it touches something? | It will run the hit sound, place a decal, etc.
|
||
|
|
|
||
|
|
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:CustomOnInitialize()
|
||
|
|
|
||
|
|
local light = ents.Create( "env_sprite" )
|
||
|
|
light:SetKeyValue( "model","sprites/blueflare1.spr" )
|
||
|
|
light:SetKeyValue( "rendercolor","0 75 255" )
|
||
|
|
light:SetPos( self:GetAttachment(1).Pos )
|
||
|
|
light:SetParent( self, 1 )
|
||
|
|
light:SetKeyValue( "scale","0.12" )
|
||
|
|
light:SetKeyValue( "rendermode","9" )
|
||
|
|
light:Spawn()
|
||
|
|
self:DeleteOnRemove(light)
|
||
|
|
|
||
|
|
self:DrawShadow(false)
|
||
|
|
|
||
|
|
ParticleEffectAttach("hunter_flechette_trail_striderbuster",PATTACH_ABSORIGIN_FOLLOW,self,0)
|
||
|
|
|
||
|
|
if GetConVar("vj_zippycombines_flechettes_stick_to_anything"):GetInt() == 1 then
|
||
|
|
self.DoesDirectDamage = false
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:CustomPhysicsObjectOnInitialize(phys)
|
||
|
|
phys:Wake()
|
||
|
|
phys:EnableGravity(false)
|
||
|
|
phys:EnableDrag(false)
|
||
|
|
phys:SetMass(0.1)
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:CustomOnThink()
|
||
|
|
|
||
|
|
local parent = self:GetParent()
|
||
|
|
if parent:IsPlayer() && !parent:Alive() then
|
||
|
|
self:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
if self:WaterLevel() > 0 then
|
||
|
|
self:GetPhysicsObject():EnableGravity(true)
|
||
|
|
self:Explode()
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:Explode()
|
||
|
|
|
||
|
|
local time_until_explode = 3
|
||
|
|
local blastradius = 100
|
||
|
|
|
||
|
|
sound.EmitHint(SOUND_DANGER,self:GetPos(),blastradius*1.5,time_until_explode,self)
|
||
|
|
|
||
|
|
timer.Simple(time_until_explode*0.5, function() if IsValid(self) then
|
||
|
|
self:EmitSound("npc/ministrider/hunter_flechette_preexplode" .. math.random(1, 2) .. ".wav" , 70, math.random(70, 90))
|
||
|
|
end end)
|
||
|
|
|
||
|
|
timer.Simple(time_until_explode, function() if IsValid(self) then
|
||
|
|
|
||
|
|
local realisticRadius = false
|
||
|
|
|
||
|
|
self:EmitSound("npc/ministrider/flechette_explode" .. math.random(1, 3) .. ".wav" , 100, math.random(110, 130), 0.66, CHAN_WEAPON)
|
||
|
|
|
||
|
|
ParticleEffect("hunter_projectile_explosion_1", self:GetPos(), Angle(0,0,0))
|
||
|
|
self:DeathEffects()
|
||
|
|
|
||
|
|
local expLight = ents.Create("light_dynamic")
|
||
|
|
expLight:SetKeyValue("brightness", "3")
|
||
|
|
expLight:SetKeyValue("distance", "250")
|
||
|
|
expLight:Fire("Color", "0 75 255")
|
||
|
|
expLight:SetPos(self:GetPos())
|
||
|
|
expLight:Spawn()
|
||
|
|
expLight:Fire("TurnOn", "", 0)
|
||
|
|
timer.Simple(0.1,function() if IsValid(expLight) then expLight:Remove() end end)
|
||
|
|
|
||
|
|
local attacker = self:GetOwner()
|
||
|
|
if !IsValid(attacker) then attacker = self end
|
||
|
|
|
||
|
|
util.VJ_SphereDamage(attacker, self, self:GetPos(), blastradius, self.DirectDamage, bit.bor(DMG_DISSOLVE, DMG_SHOCK), true, realisticRadius)
|
||
|
|
|
||
|
|
self:Remove()
|
||
|
|
|
||
|
|
end end)
|
||
|
|
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:IsAlly(ent)
|
||
|
|
|
||
|
|
if !ent.VJ_NPC_Class then return end
|
||
|
|
|
||
|
|
for _,npcclass in pairs(ent.VJ_NPC_Class) do
|
||
|
|
for _,mynpcclass in pairs(self.VJ_NPC_Class) do
|
||
|
|
if npcclass == mynpcclass then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:CustomOnCollideWithoutRemove(data, phys)
|
||
|
|
|
||
|
|
local hitent = data.HitEntity
|
||
|
|
|
||
|
|
if self:IsAlly(hitent) then
|
||
|
|
self:Remove()
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if hitent:IsWorld() then
|
||
|
|
|
||
|
|
self:EmitSound("npc/ministrider/flechette_impact_stick" .. math.random(1, 5) .. ".wav" , 85, math.random(90, 110))
|
||
|
|
|
||
|
|
self:SetPos(data.HitPos)
|
||
|
|
self:SetMoveType(MOVETYPE_NONE)
|
||
|
|
self:SetSolid(SOLID_NONE)
|
||
|
|
|
||
|
|
self:Explode()
|
||
|
|
|
||
|
|
self:FireBullets({
|
||
|
|
Src = self:GetPos(),
|
||
|
|
Dir = self:GetForward(),
|
||
|
|
Tracer = 0,
|
||
|
|
Damage = 0,
|
||
|
|
Distance = 25,
|
||
|
|
})
|
||
|
|
|
||
|
|
else
|
||
|
|
|
||
|
|
self:EmitSound("npc/ministrider/flechette_flesh_impact" .. math.random(1, 4) .. ".wav" , 85, math.random(90, 110))
|
||
|
|
|
||
|
|
if GetConVar("vj_zippycombines_flechettes_stick_to_anything"):GetInt() == 1 then
|
||
|
|
|
||
|
|
if hitent:GetClass() == "func_breakable_surf" then
|
||
|
|
hitent:Fire("Shatter")
|
||
|
|
self:DeathEffects()
|
||
|
|
self:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
self:SetPos(data.HitPos)
|
||
|
|
self:SetParent(hitent)
|
||
|
|
self:SetSolid(SOLID_NONE)
|
||
|
|
self:Explode()
|
||
|
|
|
||
|
|
self:FireBullets({
|
||
|
|
Src = self:GetPos(),
|
||
|
|
Dir = self:GetForward(),
|
||
|
|
Tracer = 0,
|
||
|
|
Damage = 0,
|
||
|
|
Distance = 25,
|
||
|
|
})
|
||
|
|
|
||
|
|
else
|
||
|
|
if hitent:GetClass() == "func_breakable_surf" then
|
||
|
|
hitent:Fire("Shatter")
|
||
|
|
end
|
||
|
|
|
||
|
|
self:DeathEffects()
|
||
|
|
self:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
|
|
function ENT:DeathEffects()
|
||
|
|
ParticleEffect("Weapon_Combine_Ion_Cannon_i",self:GetPos(),Angle(0,0,0))
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|