mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
82
lua/arccw/shared/sh_vehicle.lua
Normal file
82
lua/arccw/shared/sh_vehicle.lua
Normal file
@@ -0,0 +1,82 @@
|
||||
--[[
|
||||
| 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
|
||||
Reference in New Issue
Block a user