Files
wnsrc/lua/entities/lvs_base/sv_doorsystem.lua

118 lines
2.6 KiB
Lua
Raw Permalink Normal View History

2024-08-04 23:54:45 +03:00
--[[
| 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/
--]]
function ENT:AddDoorHandler( poseparameter, pos, ang, mins, maxs, openmins, openmaxs )
if not isstring( poseparameter ) then return end
if not isvector( pos ) or not isangle( ang ) or not isvector( mins ) or not isvector( maxs ) then
pos = vector_origin
ang = angle_zero
mins = self:OBBMins()
maxs = self:OBBMaxs()
end
if not isvector( openmins ) then
openmins = mins
end
if not isvector( openmaxs ) then
openmaxs = maxs
end
local Handler = ents.Create( "lvs_base_doorhandler" )
if not IsValid( Handler ) then
return
end
Handler:SetPos( self:LocalToWorld( pos ) )
Handler:SetAngles( self:LocalToWorldAngles( ang ) )
Handler:Spawn()
Handler:Activate()
Handler:SetParent( self )
Handler:SetBase( self )
Handler:SetMins( mins )
Handler:SetMinsOpen( openmins )
Handler:SetMinsClosed( mins )
Handler:SetMaxs( maxs )
Handler:SetMaxsOpen( openmaxs )
Handler:SetMaxsClosed( maxs )
Handler:SetPoseName( poseparameter )
self:DeleteOnRemove( Handler )
self:TransferCPPI( Handler )
if not istable( self._DoorHandlers ) then
self._DoorHandlers = {}
end
table.insert( self._DoorHandlers, Handler )
return Handler
end
function ENT:GetDoorHandler( ply )
if not IsValid( ply ) or not istable( self._DoorHandlers ) then return NULL end
local ShootPos = ply:GetShootPos()
local AimVector = ply:GetAimVector()
local radius = 99999999999
local target = NULL
for _, doorHandler in pairs( self._DoorHandlers ) do
if not IsValid( doorHandler ) then continue end
local boxOrigin = doorHandler:GetPos()
local boxAngles = doorHandler:GetAngles()
local boxMins = doorHandler:GetMins()
local boxMaxs = doorHandler:GetMaxs()
local HitPos, _, _ = util.IntersectRayWithOBB( ShootPos, AimVector * doorHandler.UseRange, boxOrigin, boxAngles, boxMins, boxMaxs )
local InRange = isvector( HitPos )
if not InRange then continue end
local dist = (ShootPos - HitPos):Length()
if dist < radius then
target = doorHandler
radius = dist
end
end
return target
end
function ENT:GetDoorHandlers()
if istable( self._DoorHandlers ) then return self._DoorHandlers end
return {}
end
function ENT:HasDoorSystem()
local HasDoorSystem = false
for _, Handler in pairs( self:GetDoorHandlers() ) do
if not IsValid( Handler ) then continue end
if IsValid( Handler:GetLinkedSeat() ) then
HasDoorSystem = true
break
end
end
return HasDoorSystem
end