134 lines
3.8 KiB
Lua
134 lines
3.8 KiB
Lua
AddCSLuaFile("cl_init.lua")
|
|
AddCSLuaFile("shared.lua")
|
|
|
|
include("shared.lua")
|
|
|
|
ENT.bCollided = false
|
|
ENT.Projectile = {
|
|
Class = "mg_bullet",
|
|
Speed = 4000,
|
|
Gravity = 1
|
|
}
|
|
ENT.Maxs = Vector(1, 1, 1)
|
|
ENT.Model = Model("models/items/ar2_grenade.mdl")
|
|
ENT.AoeEntity = nil
|
|
|
|
function ENT:Initialize()
|
|
self:SetModel(self.Model)
|
|
self:PhysicsInitBox(Vector(-10, -1, -1), Vector(10, 1, 1))
|
|
self:GetPhysicsObject():Wake()
|
|
self:GetPhysicsObject():SetMaterial("default_silent")
|
|
self:GetPhysicsObject():AddGameFlag(FVPHYSICS_NO_PLAYER_PICKUP)
|
|
self:GetPhysicsObject():AddGameFlag(FVPHYSICS_NO_IMPACT_DMG)
|
|
self:GetPhysicsObject():AddGameFlag(FVPHYSICS_HEAVY_OBJECT)
|
|
self:GetPhysicsObject():EnableMotion(true)
|
|
self:GetPhysicsObject():EnableDrag(false)
|
|
self:GetPhysicsObject():SetMass(1000)
|
|
self:SetSolid(SOLID_VPHYSICS)
|
|
self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) --doesn't collide with anything, no traces
|
|
self:AddEFlags(EFL_NO_DAMAGE_FORCES)
|
|
self:AddEFlags(EFL_DONTWALKON)
|
|
self:AddEFlags(EFL_DONTBLOCKLOS)
|
|
self:AddEFlags(EFL_NO_PHYSCANNON_INTERACTION)
|
|
|
|
self.Projectile = table.Copy(self.Weapon.Projectile)
|
|
self:GetPhysicsObject():SetVelocityInstantaneous(self:GetAngles():Forward() * self.Projectile.Speed)
|
|
self.LastPos = self:GetOwner():EyePos()
|
|
self.Bullet = self.Weapon.Bullet
|
|
self.ImpactDamage = self.Weapon.Explosive.ImpactBlastRatio
|
|
self.BlastRadius = self.Weapon.Explosive.BlastRadius
|
|
end
|
|
|
|
ENT.m_gravity = 0
|
|
|
|
function ENT:PhysicsUpdate(phys)
|
|
if (!phys:IsMotionEnabled()) then
|
|
return
|
|
end
|
|
|
|
self.m_gravity = math.Clamp(self.m_gravity + (self.Projectile.Gravity), -90, 90)
|
|
|
|
phys:SetAngles(phys:GetAngles() + Angle(self.m_gravity, 0, 0) * FrameTime())
|
|
phys:SetPos(self.LastPos + phys:GetAngles():Forward() * (self.Projectile.Speed * FrameTime()))
|
|
|
|
--Aim assist
|
|
if (GetConVar("mgbase_debug_projectiles"):GetInt() > 0) then
|
|
debugoverlay.Box(phys:GetPos(), -self.Maxs, self.Maxs, 0, Color(0, 200, 50, 10))
|
|
end
|
|
|
|
local trData = {
|
|
start = self.LastPos,
|
|
endpos = phys:GetPos(),
|
|
filter = {self:GetOwner(), self},
|
|
mask = MASK_SHOT_PORTAL,
|
|
collisiongroup = COLLISION_GROUP_NONE,
|
|
mins = -self.Maxs,
|
|
maxs = self.Maxs
|
|
}
|
|
|
|
local tr = util.TraceHull(trData)
|
|
|
|
if (tr.Hit && (tr.Entity:IsPlayer() || tr.Entity:IsNPC())) then
|
|
self:Impact(tr, phys, true)
|
|
return
|
|
end
|
|
|
|
--Normal hitscan
|
|
if (GetConVar("mgbase_debug_projectiles"):GetInt() > 0) then
|
|
debugoverlay.Line(self.LastPos, phys:GetPos(), 1, Color(255, 0, 0, 1))
|
|
end
|
|
|
|
tr = util.TraceLine(trData)
|
|
|
|
if (tr.Hit) then
|
|
self:Impact(tr, phys, false)
|
|
return
|
|
end
|
|
|
|
self.LastPos = phys:GetPos()
|
|
end
|
|
|
|
function ENT:Impact(tr1, phys, bHull)
|
|
phys:EnableMotion(false)
|
|
|
|
self:SetPos(tr1.HitPos)
|
|
|
|
self:FireBullets({
|
|
Attacker = self:GetOwner(),
|
|
Num = 1,
|
|
Tracer = 0,
|
|
Src = self.LastPos,
|
|
Dir = (phys:GetPos() - self.LastPos):GetNormalized(),
|
|
HullSize = bHull && self.Maxs:Length() * 2 || 1,
|
|
IgnoreEntity = self,
|
|
Callback = function(attacker, tr, dmgInfo)
|
|
dmgInfo:SetInflictor(IsValid(self.Weapon) && self.Weapon || self)
|
|
dmgInfo:SetDamageType(dmgInfo:GetDamageType() + DMG_DIRECT + self:GetDamageType())
|
|
|
|
if (IsValid(self.Weapon)) then
|
|
self.Weapon:BulletCallback(attacker, tr, dmgInfo)
|
|
end
|
|
end
|
|
})
|
|
|
|
local dmg = DamageInfo()
|
|
|
|
dmg:SetAttacker(self:GetOwner())
|
|
dmg:SetInflictor(self)
|
|
dmg:SetDamage(self.Bullet.Damage[1])
|
|
dmg:SetDamageType(DMG_BLAST + DMG_AIRBOAT)
|
|
dmg:SetReportedPosition(self:GetPos())
|
|
|
|
util.BlastDamageInfo(dmg, self:GetPos(), self.BlastRadius)
|
|
util.ScreenShake(self:GetPos(), 3500, 1111, 1, 124 * 4)
|
|
|
|
ParticleEffect("Generic_explo_high", self:GetPos(), self:GetAngles())
|
|
self:EmitSound("^viper/shared/frag_expl.ogg", 0, 100, 1, CHAN_WEAPON)
|
|
util.Decal("Scorch", self:GetPos(), self:GetPos() + self:GetUp() * -100, {self})
|
|
|
|
self:Remove()
|
|
end
|
|
|
|
function ENT:GetDamageType()
|
|
return DMG_BLAST + DMG_DIRECT
|
|
end |