89 lines
2.4 KiB
Lua
89 lines
2.4 KiB
Lua
AddCSLuaFile()
|
|
|
|
MW19_FPSHELLS = {}
|
|
|
|
function EFFECT:Init(data)
|
|
self:SetOwner(data:GetEntity())
|
|
self:SetModel(self.Model)
|
|
self:SetAngles(data:GetAngles())
|
|
|
|
local pos = data:GetOrigin()
|
|
pos:Add(self:GetAngles():Forward() * (self.Offset.y + self:GetModelRadius()))
|
|
pos:Add(self:GetAngles():Right() * self.Offset.x)
|
|
pos:Add(self:GetAngles():Up() * self.Offset.z)
|
|
self:SetPos(pos)
|
|
|
|
self:SetModelScale(self.Scale)
|
|
|
|
self.m_Velocity = self:GetAngles():Forward()
|
|
self.m_Velocity:Mul(self.Force * math.Rand(0.9, 1.3))
|
|
self.m_Velocity:Add(data:GetNormal() * data:GetMagnitude())
|
|
|
|
self.m_NextDeath = CurTime() + 1
|
|
self.m_LastPos = self:GetPos()
|
|
self.m_NextPos = self:GetPos()
|
|
|
|
if (data:GetFlags() == 1) then
|
|
self:SetNoDraw(true)
|
|
self:GetOwner().m_Shells[self] = true
|
|
end
|
|
|
|
self.m_Timestep = self:GetDeltaTime()
|
|
end
|
|
|
|
function EFFECT:EmitSurfaceSound(tr)
|
|
self:EmitSound(self.Sounds[tr.MatType] || self.Sounds.Default)
|
|
end
|
|
|
|
function EFFECT:OnImpact(tr)
|
|
self:EmitSurfaceSound(tr)
|
|
self.m_Velocity:Add(tr.HitNormal * (self.m_Velocity:Length() * 1.15))
|
|
|
|
if (tr.MatType == "Water") then
|
|
local data = EffectData()
|
|
data:SetOrigin(self:GetPos())
|
|
data:SetScale(1)
|
|
util.Effect("waterripple", data)
|
|
end
|
|
end
|
|
|
|
function EFFECT:GetDeltaTime()
|
|
return 1 / 10
|
|
end
|
|
|
|
function EFFECT:Think()
|
|
--Collisions
|
|
while (self.m_Timestep >= self:GetDeltaTime()) do
|
|
self.m_Velocity:SetUnpacked(self.m_Velocity.x, self.m_Velocity.y, self.m_Velocity.z - (400 * self:GetDeltaTime()))
|
|
|
|
local tr = util.TraceLine({
|
|
start = self.m_LastPos,
|
|
endpos = self.m_NextPos + (self.m_Velocity * self:GetDeltaTime()),
|
|
mask = MASK_BLOCKLOS
|
|
})
|
|
|
|
if (bit.band(util.PointContents(tr.HitPos), CONTENTS_WATER) == CONTENTS_WATER) then
|
|
tr.MatType = "Water"
|
|
self:OnImpact(tr)
|
|
return false
|
|
end
|
|
|
|
if (tr.Hit) then
|
|
self:OnImpact(tr)
|
|
end
|
|
|
|
self.m_LastPos = self.m_NextPos * 1
|
|
self.m_NextPos = tr.HitPos
|
|
|
|
self.m_Timestep = self.m_Timestep - self:GetDeltaTime()
|
|
end
|
|
|
|
self.m_Timestep = self.m_Timestep + FrameTime()
|
|
|
|
--Interpolation
|
|
local delta = self.m_Timestep / self:GetDeltaTime()
|
|
self:SetAngles(AngleRand())
|
|
self:SetPos(LerpVector(delta, self.m_LastPos, self.m_NextPos))
|
|
|
|
return CurTime() < self.m_NextDeath
|
|
end |