Залив
This commit is contained in:
112
lua/entities/mg_bullet/init.lua
Normal file
112
lua/entities/mg_bullet/init.lua
Normal file
@@ -0,0 +1,112 @@
|
||||
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(6, 6, 6)
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/weapons/ar2_grenade.mdl")
|
||||
self:PhysicsInitBox(Vector(-1, -1, -1), Vector(1, 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()
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if (self.bCollided && IsValid(self)) then
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsUpdate(phys)
|
||||
phys:AddVelocity(Vector(0, 0, self.Projectile.Gravity))
|
||||
|
||||
if (!self.bCollided) then
|
||||
--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_PROJECTILE,
|
||||
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
|
||||
end
|
||||
|
||||
self.LastPos = phys:GetPos()
|
||||
end
|
||||
|
||||
function ENT:Impact(tr, phys, bHull)
|
||||
if (IsValid(self.Weapon)) then
|
||||
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(self.Weapon)
|
||||
dmgInfo:SetDamageType(DMG_DIRECT + self:GetDamageType())
|
||||
self.Weapon:BulletCallback(attacker, tr, dmgInfo)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
self:Kill()
|
||||
end
|
||||
|
||||
function ENT:Kill()
|
||||
self.bCollided = true
|
||||
self:SetNoDraw(true)
|
||||
self:GetPhysicsObject():EnableMotion(false)
|
||||
end
|
||||
|
||||
function ENT:GetDamageType()
|
||||
return DMG_BULLET
|
||||
end
|
||||
Reference in New Issue
Block a user