Files
wnsrc/lua/arccw/shared/sh_vehicle.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

82 lines
3.0 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/
--]]
-- returns a table of entities to ignore (the player's vehicle)
function ArcCW:GetVehicleFilter(ply)
if !ArcCW.ConVars["driveby"]:GetBool() or !IsValid(ply) or !ply:IsPlayer() then return {} end
local tbl = {}
local veh = ply:GetVehicle()
if simfphys then
-- gredwitch, why do you think it's a good idea to create the simfphys table yourself???
-- people might need to do dependency checks, you know
local car = ply.GetSimfphys and ply:GetSimfphys()
if IsValid(car) then
table.insert(tbl, car)
if SERVER then
table.insert(tbl, car.DriverSeat)
for _, seat in ipairs(car.pSeat) do
table.insert(tbl, seat)
if IsValid(seat:GetDriver()) then
table.insert(tbl, seat:GetDriver())
end
end
table.Add(tbl, car.Wheels or {})
else
table.insert(tbl, veh) -- should be the pod
-- client doesn't know what the wheels/passenger seats are
-- iterate over all wheels and seats. inefficient, but its client so whatever
for _, w in ipairs(ents.FindByClass("gmod_sent_vehicle_fphysics_wheel")) do
if w:GetBaseEnt() == car then
table.insert(tbl, w)
end
end
for _, s in ipairs(ents.FindByClass("prop_vehicle_prisoner_pod")) do
if s:GetParent() == car then
table.insert(tbl, s)
if IsValid(s:GetDriver()) then
table.insert(tbl, s:GetDriver())
end
end
end
end
elseif IsValid(veh) then
table.insert(tbl, veh)
end
elseif IsValid(veh) then
table.insert(tbl, veh)
end
return tbl
end
-- returns a new source to fire from, this should be moved right outside the vehicle
-- since we can't ignore multiple entities in FireBullets, this is the only solution
function ArcCW:GetVehicleFireTrace(ply, src, dir)
if !ArcCW.ConVars["driveby"]:GetBool() then return src end
local tbl = ArcCW:GetVehicleFilter(ply)
if table.IsEmpty(tbl) then return src end
-- Make some traces from the outside to find a good spot
local trace_dist = {256, 128, 64}
for i = 1, #trace_dist do
local tr = util.TraceLine({
start = src + dir * trace_dist[i],
endpos = src,
ignoreworld = true,
mask = MASK_SHOT
})
if IsValid(tr.Entity) and table.HasValue(tbl, tr.Entity) then
return tr.HitPos + tr.HitNormal * 4
end
end
return src
end