Files
wnsrc/lua/entities/lvs_base_doorhandler.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

351 lines
7.6 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/
--]]
AddCSLuaFile()
ENT.Type = "anim"
ENT.DoNotDuplicate = true
ENT.RenderGroup = RENDERGROUP_BOTH
ENT.UseRange = 75
function ENT:SetupDataTables()
self:NetworkVar( "Entity",0, "Base" )
self:NetworkVar( "Bool",0, "Active" )
self:NetworkVar( "String",0, "PoseName" )
self:NetworkVar( "Vector",0, "Mins" )
self:NetworkVar( "Vector",1, "Maxs" )
self:NetworkVar( "Float",0, "Rate" )
self:NetworkVar( "Float",1, "RateExponent" )
self:NetworkVar( "Float",2, "PoseMin" )
self:NetworkVar( "Float",3, "PoseMax" )
if SERVER then
self:SetRate( 10 )
self:SetRateExponent( 2 )
self:SetPoseMax( 1 )
end
end
function ENT:IsServerSide()
local EntTable = self:GetTable()
if isbool( EntTable._IsServerSide ) then return EntTable._IsServerSide end
local PoseName = self:GetPoseName()
if PoseName == "" then return false end
local IsServerSide = string.StartsWith( PoseName, "^" )
EntTable._IsServerSide = IsServerSide
return IsServerSide
end
function ENT:IsOpen()
return self:GetActive()
end
if SERVER then
AccessorFunc(ENT, "soundopen", "SoundOpen", FORCE_STRING)
AccessorFunc(ENT, "soundclose", "SoundClose", FORCE_STRING)
AccessorFunc(ENT, "maxsopen", "MaxsOpen", FORCE_VECTOR)
AccessorFunc(ENT, "minsopen", "MinsOpen", FORCE_VECTOR)
AccessorFunc(ENT, "maxsclosed", "MaxsClosed", FORCE_VECTOR)
AccessorFunc(ENT, "minsclosed", "MinsClosed", FORCE_VECTOR)
util.AddNetworkString( "lvs_doorhandler_interact" )
net.Receive( "lvs_doorhandler_interact", function( length, ply )
if not IsValid( ply ) then return end
local ent = net.ReadEntity()
if not IsValid( ent ) then return end
if (ply:GetPos() - ent:GetPos()):Length() > (ent.UseRange or 75) * 2 then return end
ent:Use( ply, ply )
end)
function ENT:LinkToSeat( ent )
if not IsValid( ent ) or not ent:IsVehicle() then
ErrorNoHalt( "[LVS] Couldn't link seat to doorsystem. Entity expected, got "..tostring( ent ).."\n" )
return
end
self._LinkedSeat = ent
end
function ENT:GetLinkedSeat()
return self._LinkedSeat
end
function ENT:Initialize()
self:SetMoveType( MOVETYPE_NONE )
self:SetSolid( SOLID_NONE )
self:SetUseType( SIMPLE_USE )
self:DrawShadow( false )
debugoverlay.Cross( self:GetPos(), 15, 5, Color( 255, 223, 127 ) )
end
function ENT:Use( ply )
if not IsValid( ply ) then return end
local Base = self:GetBase()
if not IsValid( Base ) then return end
if not Base:IsUseAllowed( ply ) then return end
if self:IsOpen() then
self:Close( ply )
else
self:Open( ply )
end
end
function ENT:OnOpen( ply )
end
function ENT:OnClosed( ply )
end
function ENT:OpenAndClose( ply )
self:Open( ply )
self._PreventClosing = true
timer.Simple(0.5, function()
if not IsValid( self ) then return end
self:Close( ply )
self._PreventClosing = false
end )
end
function ENT:DisableOnBodyGroup( group, subgroup )
self._BodyGroupDisable = group
self._BodySubGroupDisable = subgroup
end
function ENT:IsBodyGroupDisabled()
if not self._BodyGroupDisable or not self._BodySubGroupDisable then return false end
local base = self:GetBase()
if not IsValid( base ) then return false end
return base:GetBodygroup( self._BodyGroupDisable ) == self._BodySubGroupDisable
end
function ENT:Open( ply )
if self:IsOpen() then return end
self:SetActive( true )
self:SetMins( self:GetMinsOpen() )
self:SetMaxs( self:GetMaxsOpen() )
if self:IsBodyGroupDisabled() then return end
self:OnOpen( ply )
local snd = self:GetSoundOpen()
if not snd then return end
self:EmitSound( snd )
end
function ENT:Close( ply )
if not self:IsOpen() then
if self:IsBodyGroupDisabled() then
self:Open( ply )
end
return
end
if self:IsBodyGroupDisabled() then return end
self:SetActive( false )
self:SetMins( self:GetMinsClosed() )
self:SetMaxs( self:GetMaxsClosed() )
self:OnClosed( ply )
local snd = self:GetSoundClose()
if not snd then return end
self:EmitSound( snd )
end
function ENT:OnDriverChanged( oldDriver, newDriver, pod )
if self._PreventClosing then return end
if IsValid( newDriver ) then
if self:IsOpen() then
self:Close( newDriver )
end
else
timer.Simple( FrameTime() * 2, function()
if not IsValid( self ) or not IsValid( oldDriver ) or IsValid( self._Driver ) then return end
if oldDriver:lvsGetVehicle() == self:GetBase() then return end
if not self:IsOpen() then
self:OpenAndClose()
end
end )
end
end
function ENT:SetPoseParameterSV()
local Base = self:GetBase()
if not IsValid( Base ) then return end
local Target = self:GetActive() and self:GetPoseMax() or self:GetPoseMin()
local poseName = self:GetPoseName()
if poseName == "" then return end
local EntTable = self:GetTable()
EntTable.sm_pp = EntTable.sm_pp and EntTable.sm_pp + (Target - EntTable.sm_pp) * FrameTime() * self:GetRate() or 0
local value = EntTable.sm_pp ^ self:GetRateExponent()
Base:SetPoseParameter( string.Replace(poseName, "^", ""), value )
end
function ENT:Think()
if IsValid( self._LinkedSeat ) then
local Driver = self._LinkedSeat:GetDriver()
if self._Driver ~= Driver then
self:OnDriverChanged( self._Driver, Driver, self._LinkedSeat )
self._Driver = Driver
end
end
if self:IsServerSide() then
self:SetPoseParameterSV()
self:NextThink( CurTime() )
else
self:NextThink( CurTime() + 0.25 )
end
return true
end
function ENT:OnTakeDamage( dmginfo )
end
return
end
function ENT:Initialize()
end
function ENT:Think()
if self:IsServerSide() then return end
local Base = self:GetBase()
if not IsValid( Base ) then return end
local Target = self:GetActive() and self:GetPoseMax() or self:GetPoseMin()
local poseName = self:GetPoseName()
if poseName == "" then return end
local EntTable = self:GetTable()
EntTable.sm_pp = EntTable.sm_pp and EntTable.sm_pp + (Target - EntTable.sm_pp) * RealFrameTime() * self:GetRate() or 0
local value = EntTable.sm_pp ^ self:GetRateExponent()
if string.StartsWith( poseName, "!" ) then
Base:SetBonePoseParameter( poseName, value )
else
Base:SetPoseParameter( poseName, value )
end
end
function ENT:OnRemove()
end
function ENT:Draw()
end
local LVS = LVS
ENT.ColorSelect = Color(127,255,127,150)
ENT.ColorNormal = Color(255,0,0,150)
ENT.ColorTransBlack = Color(0,0,0,150)
ENT.OutlineThickness = Vector(0.5,0.5,0.5)
function ENT:DrawTranslucent()
local ply = LocalPlayer()
if not IsValid( ply ) or ply:InVehicle() or not ply:KeyDown( IN_SPEED ) then return end
local boxOrigin = self:GetPos()
local boxAngles = self:GetAngles()
local boxMins = self:GetMins()
local boxMaxs = self:GetMaxs()
local EntTable = self:GetTable()
local HitPos, _, _ = util.IntersectRayWithOBB( ply:GetShootPos(), ply:GetAimVector() * EntTable.UseRange, boxOrigin, boxAngles, boxMins, boxMaxs )
local InRange = isvector( HitPos )
if InRange then
local Use = ply:KeyDown( IN_USE )
if EntTable.old_Use ~= Use then
EntTable.old_Use = Use
if Use then
net.Start( "lvs_doorhandler_interact" )
net.WriteEntity( self )
net.SendToServer()
end
end
end
if not LVS.DeveloperEnabled then return end
local Col = InRange and EntTable.ColorSelect or EntTable.ColorNormal
render.SetColorMaterial()
render.DrawBox( boxOrigin, boxAngles, boxMins, boxMaxs, Col )
render.DrawBox( boxOrigin, boxAngles, boxMaxs + EntTable.OutlineThickness, boxMins - EntTable.OutlineThickness, EntTable.ColorTransBlack )
end