Files
wnsrc/lua/weapons/gmod_tool/stools/prop_door.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

620 lines
24 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/
--]]
-- Original idea by High6
TOOL.Category = "Half-Life 2"
TOOL.Name = "#tool.prop_door"
TOOL.ClientConVar[ "model" ] = "models/props_c17/door01_left.mdl"
TOOL.ClientConVar[ "type" ] = "1"
TOOL.ClientConVar[ "key_open" ] = "38"
TOOL.ClientConVar[ "key_close" ] = "39"
TOOL.ClientConVar[ "key_lock" ] = "40"
TOOL.ClientConVar[ "key_unlock" ] = "41"
TOOL.ClientConVar[ "auto_close" ] = "1"
TOOL.ClientConVar[ "auto_close_delay" ] = "4"
TOOL.ClientConVar[ "skin" ] = "1"
TOOL.ClientConVar[ "r_double" ] = "0"
TOOL.ClientConVar[ "r_hardware" ] = "1"
TOOL.ClientConVar[ "r_distance" ] = "90"
TOOL.ClientConVar[ "r_speed" ] = "100"
TOOL.ClientConVar[ "breakable" ] = "0"
local gDoorUniqueID = 0
cleanup.Register( "prop_doors" )
local minsZ = {}
minsZ[ "models/props/portal_door_combined.mdl" ] = -18.421800613403
minsZ[ "models/props_mining/elevator01_cagedoor.mdl" ] = 0
minsZ[ "models/props_mining/techgate01.mdl" ] = -3.0040739147807e-05
minsZ[ "models/props_combine/combine_door01.mdl" ] = -96.376152038574
minsZ[ "models/combine_gate_vehicle.mdl" ] = -30.216606140137
minsZ[ "models/combine_gate_citizen.mdl" ] = -30.00006103515
minsZ[ "models/props_lab/elevatordoor.mdl" ] = -1
--minsZ[ "models/props_doors/doorklab01.mdl" ] = -5.004433631897
function TOOL:FixDynamicPos( mdl, pos, ang, minz )
-- This is UGLY AF
if ( --[[!minz &&]] minsZ[ mdl ] ) then minz = minsZ[ mdl ] else minz = 0 end
local ent = self:GetOwner()
if ( mdl == "models/props_mining/elevator01_cagedoor.mdl" ) then
ang:RotateAroundAxis( Vector( 0, 0, 1 ), -90 )
else
pos = pos - Vector( 0, 0, minz )
end
if ( mdl == "models/props_combine/combine_door01.mdl" ) then
ang:RotateAroundAxis( Vector( 0, 0, 1 ), -90 )
end
if ( mdl == "models/props_mining/techgate01.mdl" or mdl == "models/props_mining/techgate01_outland03.mdl" ) then
ang:RotateAroundAxis( Vector( 0, 0, 1 ), -90 )
pos = pos - ent:GetRight() * 80
end
if ( mdl == "models/props/portal_door_combined.mdl" ) then
pos = pos - ent:GetUp() * 21
ang:RotateAroundAxis( Vector( 0, 0, 1 ), -180 )
end
return pos, ang
end
function TOOL:FixRotatingPos( ent )
if ( !IsValid( ent ) ) then return end
local e = ent
local min = ent:OBBMins()
local max = ent:OBBMaxs()
local pos = ent:GetPos()
local ang = ent:GetAngles()
local typ = self:GetClientNumber( "type" )
local doubl = self:GetClientNumber( "r_double" ) + 1
if ( typ == 1 or typ == 3 ) then pos = pos + ent:GetRight() * ( max.y / 2.01 ) * doubl end
if ( typ == 2 ) then pos = pos + ent:GetRight() * ( max.y / 3.1 ) * doubl end
-- L4D2 doors
if ( typ == 4 ) then pos = pos + ent:GetRight() * ( max.y / 2.34 ) * doubl end -- This really should be more dynamic!
if ( typ == 5 ) then pos = pos + ent:GetRight() * ( max.y / 2.04 ) * doubl end
if ( typ == 6 ) then pos = pos + ent:GetRight() * ( max.y / 2.21 ) * doubl end
if ( typ == 7 ) then pos = pos + ent:GetRight() * ( max.y / 2.057 ) * doubl end
if ( typ == 8 ) then pos = pos + ent:GetRight() * ( max.y / 2.07 ) * doubl end
if ( typ == 9 ) then pos = pos + ent:GetRight() * ( max.y / 2.067 ) * doubl end
if ( typ == 10 ) then pos = pos + ent:GetRight() * ( max.y / 2.081 ) * doubl end
e:SetPos( pos - Vector( 0, 0, min.z ) )
e:SetAngles( ang )
e:Activate()
end
if ( SERVER ) then
CreateConVar( "sbox_maxprop_doors", 10, FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY )
numpad.Register( "prop_door_open", function( ply, prop_door ) if ( !IsValid( prop_door ) ) then return false end prop_door:Fire( "Open" ) end )
numpad.Register( "prop_door_close", function( ply, prop_door ) if ( !IsValid( prop_door ) ) then return false end prop_door:Fire( "Close" ) end )
numpad.Register( "prop_door_lock", function( ply, prop_door ) if ( !IsValid( prop_door ) ) then return false end prop_door:Fire( "Lock" ) end )
numpad.Register( "prop_door_unlock", function( ply, prop_door ) if ( !IsValid( prop_door ) ) then return false end prop_door:Fire( "Unlock" ) end )
local function ApplyWireModSupport( door, mapCreationID )
if ( Wire_CreateOutputs and !mapCreationID ) then
--door.Outputs = Wire_CreateOutputs( door, { "OnClosed", "OnOpened", "OnLocked", "OnUnlocked" } )
door.Inputs = Wire_CreateInputs( door, { "Open", "Lock" } )
function door:TriggerInput( name, value )
if ( name == "Open" ) then self:Fire( value != 0 and "Open" or "Close" ) end
if ( name == "Lock" ) then self:Fire( value != 0 and "Lock" or "Unlock" ) end
end
rb655_hl2_CopyWireModMethods( door )
end
end
local function EnsureNameIsUnique( input )
local doors = ents.FindByName( input )
if ( #doors > 1 ) then
--ErrorNoHalt( "Map already has 2 doors with name ", input , "\n" )
-- Could probably use a while loop here...
return EnsureNameIsUnique( input .. "_2" )
end
return input
end
local function RotatingDoorPostDupe( door )
function door:PreEntityCopy()
self.rb655_door_opened = self:GetInternalVariable( "m_eDoorState" ) != 0
self.rb655_door_locked = self:GetInternalVariable( "m_bLocked" )
end
function door:OnDuplicated( table )
-- On duplicaton, if was opened, make it open
if ( table.rb655_door_opened ) then self:Fire( "Open" ) end
if ( table.rb655_door_locked ) then self:Fire( "Lock" ) end
end
end
function MakeDoorRotating( ply, model, pos, ang, _oSkin, keyOpen, keyClose, keyLock, keyUnlock, _oHardware, _oDistance, _oSpeed, _oReturnDelay, breakable, _oTargetName, data, mapCreationID )
if ( IsValid( ply ) and !ply:CheckLimit( "prop_doors" ) ) then return nil end
local prop_door_rotating = ents.Create( "prop_door_rotating" )
if ( !IsValid( prop_door_rotating ) ) then return false end
prop_door_rotating:SetModel( model )
prop_door_rotating:SetPos( pos )
if ( data and data.initialAngles ) then ang = data.initialAngles end
prop_door_rotating:SetAngles( ang )
RotatingDoorPostDupe( prop_door_rotating )
ApplyWireModSupport( prop_door_rotating, mapCreationID )
keyOpen = keyOpen or -1
keyClose = keyClose or -1
keyLock = keyLock or -1
keyUnlock = keyUnlock or -1
local targetname = _oTargetName or ""
if ( data and data.targetname ) then targetname = data.targetname end
local hardware = _oHardware or 1
if ( data and data.hardware ) then hardware = data.hardware end
local distance = _oDistance or 90
if ( data and data.distance ) then distance = data.distance end
local speed = _oSpeed or 100
if ( data and data.speed ) then speed = data.speed end
local returndelay = _oReturnDelay or 4
if ( data and data.returndelay ) then returndelay = data.returndelay end
local skin = _oSkin or 0
if ( data and data.skin ) then skin = data.skin end
local spawnflags = 8192
--if ( data and data.spawnflags ) then spawnflags = data.spawnflags end
local ajarangles
if ( data and data.ajarangles ) then ajarangles = data.ajarangles end
local axis
if ( data and data.axis ) then axis = data.axis end
local spawnpos
if ( data and data.spawnpos ) then spawnpos = data.spawnpos end
if ( targetname and targetname:len() > 0 ) then
-- We gotta make sure there are no more than 2 doors with the same name, because only 2 can be linked at a time.
targetname = EnsureNameIsUnique( targetname )
prop_door_rotating:SetKeyValue( "targetname", targetname )
end
prop_door_rotating:SetKeyValue( "hardware", hardware )
prop_door_rotating:SetKeyValue( "distance", distance )
prop_door_rotating:SetKeyValue( "speed", speed )
prop_door_rotating:SetKeyValue( "returndelay", returndelay )
prop_door_rotating:SetKeyValue( "spawnflags", spawnflags )
if ( ajarangles ) then prop_door_rotating:SetKeyValue( "ajarangles", ajarangles ) end
if ( axis ) then prop_door_rotating:SetKeyValue( "axis", axis ) end
if ( spawnpos ) then prop_door_rotating:SetKeyValue( "spawnpos", spawnpos ) end
prop_door_rotating:Spawn()
prop_door_rotating:Activate()
prop_door_rotating:SetSkin( skin )
if ( breakable ) then prop_door_rotating:Fire( "SetBreakable" ) end
numpad.OnDown( ply, keyOpen, "prop_door_open", prop_door_rotating )
numpad.OnDown( ply, keyClose, "prop_door_close", prop_door_rotating )
numpad.OnDown( ply, keyLock, "prop_door_lock", prop_door_rotating )
numpad.OnDown( ply, keyUnlock, "prop_door_unlock", prop_door_rotating )
table.Merge( prop_door_rotating:GetTable(), {
ply = ply,
keyOpen = keyOpen,
keyClose = keyClose,
keyLock = keyLock,
keyUnlock = keyUnlock,
breakable = breakable,
MapCreationID = mapCreationID,
rb655_dupe_data = {
spawnflags = spawnflags,
ajarangles = ajarangles,
skin = skin,
axis = axis,
initialAngles = ang,
spawnpos = spawnpos,
hardware = hardware,
distance = distance,
speed = speed,
returndelay = returndelay,
targetname = targetname,
--[[slavename = slavename,
state = 0,
opendir = opendir,
forceclosed = forceclosed,
soundopenoverride = soundopenoverride,
soundcloseoverride = soundcloseoverride,
soundmoveoverride = soundmoveoverride,
soundlockedoverride = soundlockedoverride,
soundunlockedoverride = soundunlockedoverride,]]
}
} )
if ( IsValid( ply ) ) then
ply:AddCount( "prop_doors", prop_door_rotating )
ply:AddCleanup( "prop_doors", prop_door_rotating )
end
DoPropSpawnedEffect( prop_door_rotating )
return prop_door_rotating
end
duplicator.RegisterEntityClass( "prop_door_rotating", MakeDoorRotating, "model", "pos", "ang", "skin", "keyOpen", "keyClose", "keyLock", "keyUnlock", "rHardware", "rDistance", "rSpeed", "auto_close_delay", "breakable", "targetname", "rb655_dupe_data", "MapCreationID" )
function MakeDoorDynamic( ply, model, pos, ang, keyOpen, keyClose, keyLock, keyUnlock, auto_close_delay, skin, mapCreationID )
if ( IsValid( ply ) and !ply:CheckLimit( "prop_doors" ) ) then return false end
local prop_door_dynamic = ents.Create( "prop_door_dynamic" )
if ( !IsValid( prop_door_dynamic ) ) then return false end
prop_door_dynamic:SetModel( model )
prop_door_dynamic:SetPos( pos )
prop_door_dynamic:SetAngles( ang )
ApplyWireModSupport( prop_door_dynamic, mapCreationID )
prop_door_dynamic:Spawn()
prop_door_dynamic:Activate()
prop_door_dynamic:SetSkin( skin or 0 )
prop_door_dynamic:SetCloseDelay( auto_close_delay )
numpad.OnDown( ply, keyOpen, "prop_door_open", prop_door_dynamic )
numpad.OnDown( ply, keyClose, "prop_door_close", prop_door_dynamic )
numpad.OnDown( ply, keyLock, "prop_door_lock", prop_door_dynamic )
numpad.OnDown( ply, keyUnlock, "prop_door_unlock", prop_door_dynamic )
table.Merge( prop_door_dynamic:GetTable(), {
ply = ply,
keyOpen = keyOpen,
keyClose = keyClose,
keyLock = keyLock,
keyUnlock = keyUnlock,
auto_close_delay = auto_close_delay,
skin = skin,
MapCreationID = mapCreationID
} )
if ( IsValid( ply ) ) then
ply:AddCount( "prop_doors", prop_door_dynamic )
ply:AddCleanup( "prop_doors", prop_door_dynamic )
end
DoPropSpawnedEffect( prop_door_dynamic )
return prop_door_dynamic
end
duplicator.RegisterEntityClass( "prop_door_dynamic", MakeDoorDynamic, "model", "pos", "ang", "keyOpen", "keyClose", "keyLock", "keyUnlock", "auto_close_delay", "skin", "MapCreationID" )
end
function TOOL:LeftClick( trace )
if ( trace.HitSky or !trace.HitPos ) then return false end
if ( IsValid( trace.Entity ) ) then return false end
if ( CLIENT ) then return true end
local ply = self:GetOwner()
local ang = Angle( 0, ply:GetAngles().y, 0 )
local auto_close_delay = self:GetClientNumber( "auto_close_delay" )
if ( self:GetClientNumber( "auto_close" ) <= 0 ) then auto_close_delay = -1 end
local mdl = self:GetClientInfo( "model" )
local kO = self:GetClientNumber( "key_open" )
local kC = self:GetClientNumber( "key_close" )
local kL = self:GetClientNumber( "key_lock" )
local kU = self:GetClientNumber( "key_unlock" )
local doorSkin = self:GetClientNumber( "skin" ) - 1
local rH = math.Clamp( self:GetClientNumber( "r_hardware" ), 1, 3 )
local rD = self:GetClientNumber( "r_distance" )
local rS = self:GetClientNumber( "r_speed" )
local breakable = self:GetClientNumber( "breakable", 0 ) > 0
local prop_door
local prop_door2
if ( self:GetClientNumber( "type" ) == 0 ) then
local pos, angD = self:FixDynamicPos( mdl, trace.HitPos, ang )
prop_door = MakeDoorDynamic( ply, mdl, pos, angD, kO, kC, kL, kU, auto_close_delay, doorSkin )
else
prop_door = MakeDoorRotating( ply, mdl, trace.HitPos, ang, doorSkin, kO, kC, kL, kU, rH, rD, rS, auto_close_delay, breakable )
self:FixRotatingPos( prop_door )
if ( self:GetClientNumber( "r_double" ) == 1 ) then
local ang2 = Angle( ang ) -- Make a copy
ang2:RotateAroundAxis( Vector( 0, 0, 1 ), 180 )
local name = "rb655_door_" .. gDoorUniqueID
gDoorUniqueID = gDoorUniqueID + 1
prop_door2 = MakeDoorRotating( ply, mdl, trace.HitPos, ang2, doorSkin, kO, kC, kL, kU, rH, rD, rS, auto_close_delay, breakable, name )
prop_door:SetKeyValue( "targetname", name )
prop_door.rb655_dupe_data.targetname = name
self:FixRotatingPos( prop_door2 )
end
end
undo.Create( "prop_door" )
undo.AddEntity( prop_door )
undo.AddEntity( prop_door2 )
undo.SetPlayer( ply )
undo.Finish()
return true
end
function TOOL:UpdateGhostEntity( ent, ply )
if ( !IsValid( ent ) or !IsValid( ply ) ) then return end
local trace = ply:GetEyeTrace()
if ( IsValid( trace.Entity ) or !trace.Hit ) then ent:SetNoDraw( true ) return end
ent:SetPos( trace.HitPos )
ent:SetAngles( Angle( 0, ply:GetAngles().y, 0 ) )
ent:SetSkin( self:GetClientNumber( "skin" ) - 1 )
ent:SetBodygroup( 1, self:GetClientNumber( "r_hardware" ) )
if ( self:GetClientNumber( "type" ) == 0 ) then
local pos, angD = self:FixDynamicPos( ent:GetModel(), ent:GetPos(), ent:GetAngles(), ent:OBBMins().z )
ent:SetPos( pos )
ent:SetAngles( angD )
else
self:FixRotatingPos( ent )
end
ent:SetNoDraw( false )
end
function TOOL:MakeGhostEntity( model, pos, angle )
util.PrecacheModel( model )
if ( SERVER and !game.SinglePlayer() ) then return end -- We do ghosting serverside in single player
if ( CLIENT and game.SinglePlayer() ) then return end -- It's done clientside in multiplayer
self:ReleaseGhostEntity() -- Release the old ghost entity
--if ( !util.IsValidProp( model ) ) then return end -- Don't allow ragdolls/effects to be ghosts
if ( CLIENT ) then self.GhostEntity = ents.CreateClientProp( model )
else self.GhostEntity = ents.Create( "prop_dynamic" ) end
if ( !IsValid( self.GhostEntity ) ) then self.GhostEntity = nil return end -- If there's too many entities we might not spawn..
self.GhostEntity:SetModel( model )
self.GhostEntity:SetPos( pos )
self.GhostEntity:SetAngles( angle )
self.GhostEntity:Spawn()
self.GhostEntity:SetSolid( SOLID_VPHYSICS )
self.GhostEntity:SetMoveType( MOVETYPE_NONE )
self.GhostEntity:SetNotSolid( true )
self.GhostEntity:SetRenderMode( RENDERMODE_TRANSALPHA )
self.GhostEntity:SetColor( Color( 255, 255, 255, 150 ) )
end
local OldMDL = GetConVarString( "prop_door_model" )
function TOOL:Think()
if ( CLIENT and OldMDL != GetConVarString( "prop_door_model" ) ) then
OldMDL = GetConVarString( "prop_door_model" )
if ( LocalPlayer():GetTool() and LocalPlayer():GetTool( "prop_door" ) ) then LocalPlayer():GetTool():UpdateControlPanel() end
end
if ( !IsValid( self.GhostEntity ) or self.GhostEntity:GetModel() != self:GetClientInfo( "model" ) ) then
self:MakeGhostEntity( self:GetClientInfo( "model" ), Vector( 0, 0, 0 ), Angle( 0, 0, 0 ) )
end
self:UpdateGhostEntity( self.GhostEntity, self:GetOwner() )
end
--[[
Types
0 - Dynamic door
1 - Normal door
2 - Normal slim door
3 - Normal door but with a 3rd option for door handle
]]
list.Set( "DoorModels", "models/props_c17/door01_left.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_c17/door02_double.mdl", { prop_door_type = 2 } )
list.Set( "DoorModels", "models/props_doors/door03_slotted_left.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_combine/combine_door01.mdl", { prop_door_type = 0 } )
list.Set( "DoorModels", "models/combine_gate_vehicle.mdl", { prop_door_type = 0 } )
list.Set( "DoorModels", "models/combine_gate_citizen.mdl", { prop_door_type = 0 } )
list.Set( "DoorModels", "models/props_lab/elevatordoor.mdl", { prop_door_type = 0 } )
list.Set( "DoorModels", "models/props_doors/doorklab01.mdl", { prop_door_type = 0 } )
if ( IsMounted( "episodic" ) ) then list.Set( "DoorModels", "models/props_c17/door03_left.mdl", { prop_door_type = 3 } ) end
if ( IsMounted( "zps" ) ) then list.Set( "DoorModels", "models/props_corpsington/doors/swingdoor01.mdl", { prop_door_type = 1 } ) end
--if ( IsMounted( "portal" ) ) then list.Set( "DoorModels", "models/props/round_elevator_doors.mdl", { prop_door_type = 0 } ) end -- Fucked up angles & collisions
if ( IsMounted( "portal2" ) ) then
list.Set( "DoorModels", "models/props/portal_door_combined.mdl", { prop_door_type = 0 } )
end
if ( IsMounted( "left4dead2" ) or IsMounted( "left4dead" ) ) then
list.Set( "DoorModels", "models/props_doors/doormainmetal01.mdl", { prop_door_type = 7 } )
list.Set( "DoorModels", "models/props_doors/doormainmetalsmall01.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_doors/doorfreezer01.mdl", { prop_door_type = 6 } )
list.Set( "DoorModels", "models/props_doors/doormainmetalwindow01.mdl", { prop_door_type = 10 } )
list.Set( "DoorModels", "models/props_doors/doormainmetalwindowsmall01.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_doors/doormain01.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_doors/doormain01_airport.mdl", { prop_door_type = 7 } )
list.Set( "DoorModels", "models/props_doors/doormain01_airport_small.mdl", { prop_door_type = 8 } )
list.Set( "DoorModels", "models/props_doors/doormain01_small.mdl", { prop_door_type = 9 } )
end
if ( IsMounted( "left4dead2" ) ) then
list.Set( "DoorModels", "models/props_downtown/door_interior_128_01.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_downtown/metal_door_112.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_doors/door_rotate_112.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_doors/door_sliding_112.mdl", { prop_door_type = 1 } )
-- Escape doors
list.Set( "DoorModels", "models/props_doors/checkpoint_door_-01.mdl", { prop_door_type = 4 } )
list.Set( "DoorModels", "models/props_doors/checkpoint_door_-02.mdl", { prop_door_type = 5 } )
list.Set( "DoorModels", "models/props_doors/checkpoint_door_01.mdl", { prop_door_type = 6 } )
list.Set( "DoorModels", "models/props_doors/checkpoint_door_02.mdl", { prop_door_type = 5 } )
-- Wood
list.Set( "DoorModels", "models/props_doors/doormain_rural01.mdl", { prop_door_type = 9 } )
list.Set( "DoorModels", "models/props_doors/doormain_rural01_small.mdl", { prop_door_type = 9 } )
end
if ( IsMounted( "left4dead2" ) or IsMounted( "csgo" ) ) then
list.Set( "DoorModels", "models/props_downtown/door_interior_112_01.mdl", { prop_door_type = 1 } )
list.Set( "DoorModels", "models/props_downtown/metal_door_112.mdl", { prop_door_type = 1 } )
end
if ( IsMounted( "left4dead2" ) or IsMounted( "left4dead" ) or IsMounted( "csgo" ) ) then
list.Set( "DoorModels", "models/props_doors/doorglassmain01.mdl", { prop_door_type = 10 } )
list.Set( "DoorModels", "models/props_doors/doorglassmain01_small.mdl", { prop_door_type = 10 } )
end
if ( IsMounted( "ep2" ) ) then
list.Set( "DoorModels", "models/props_mining/elevator01_cagedoor.mdl", { prop_door_type = 0 } )
list.Set( "DoorModels", "models/props_mining/techgate01.mdl", { prop_door_type = 0 } )
-- list.Set( "DoorModels", "models/props_mining/techgate01_outland03.mdl", { prop_door_type = 0 } )
-- list.Set( "DoorModels", "models/props_silo/silo_elevator_door.mdl", { prop_door_type = 0 } ) -- No collisions
end
if ( SERVER ) then return end
TOOL.Information = { { name = "left" } }
language.Add( "tool.prop_door", "Doors" )
language.Add( "tool.prop_door.name", "Door Tool" )
language.Add( "tool.prop_door.desc", "Spawn a variety of doors" )
language.Add( "tool.prop_door.left", "Spawn a door" )
language.Add( "tool.prop_door.model", "Door Model:" )
language.Add( "tool.prop_door.key_open", "Open door" )
language.Add( "tool.prop_door.key_close", "Close door" )
language.Add( "tool.prop_door.key_lock", "Lock door" )
language.Add( "tool.prop_door.key_unlock", "Unlock door" )
language.Add( "tool.prop_door.auto_close", "Auto close" )
language.Add( "tool.prop_door.auto_close_delay", "Auto close delay:" )
language.Add( "tool.prop_door.skin", "Door skin:" )
language.Add( "tool.prop_door.specific", "Door specific options" )
language.Add( "tool.prop_door.r_double", "Make double doors" )
language.Add( "tool.prop_door.breakable", "Make breakable (if model supports it)" )
language.Add( "tool.prop_door.r_hardware", "Hardware Type" )
language.Add( "tool.prop_door.r_distance", "Rotation distance:" )
language.Add( "tool.prop_door.r_speed", "Open speed:" )
language.Add( "tool.prop_door.lever", "Lever" )
language.Add( "tool.prop_door.pushbar", "Push Bar" )
language.Add( "tool.prop_door.keypad", "Lever with Keypad" )
language.Add( "Cleanup_prop_doors", "Doors" )
language.Add( "Cleaned_prop_doors", "Cleaned up all Doors" )
language.Add( "SBoxLimit_prop_doors", "You've hit the Door limit!" )
language.Add( "Undone_prop_door", "Door undone" )
language.Add( "max_prop_doors", "Max Doors:" )
function TOOL:UpdateControlPanel( index )
local panel = controlpanel.Get( "prop_door" )
if ( !panel ) then Msg( "Couldn't find prop_door panel!" ) return end
panel:ClearControls()
self.BuildCPanel( panel )
end
local ConVarsDefault = TOOL:BuildConVarList()
function TOOL.BuildCPanel( panel )
panel:AddControl( "ComboBox", { MenuButton = 1, Folder = "prop_door", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
panel:AddControl( "PropSelect", { Label = "#tool.prop_door.model", Height = 3, ConVar = "prop_door_model", Models = list.Get( "DoorModels" ) } )
panel:AddControl( "Numpad", { Label = "#tool.prop_door.key_open", Label2 = "#tool.prop_door.key_close", Command = "prop_door_key_open", Command2 = "prop_door_key_close" } )
panel:AddControl( "Numpad", { Label = "#tool.prop_door.key_lock", Label2 = "#tool.prop_door.key_unlock", Command = "prop_door_key_lock", Command2 = "prop_door_key_unlock" } )
panel:AddControl( "Checkbox", { Label = "#tool.prop_door.auto_close", Command = "prop_door_auto_close" } )
panel:AddControl( "Slider", { Label = "#tool.prop_door.auto_close_delay", Type = "Float", Min = 0, Max = 32, Command = "prop_door_auto_close_delay" } )
local typ = GetConVarNumber( "prop_door_type" )
local numSkins = NumModelSkins( GetConVarString( "prop_door_model" ) )
if ( typ == 0 and numSkins <= 1 ) then return end
panel:Help( "#tool.prop_door.specific" )
if ( numSkins > 1 ) then
panel:AddControl( "Slider", { Label = "#tool.prop_door.skin", Min = 1, Max = numSkins, Command = "prop_door_skin" } )
end
if ( typ == 0 ) then return end
panel:AddControl( "Checkbox", { Label = "#tool.prop_door.r_double", Command = "prop_door_r_double" } )
panel:AddControl( "Checkbox", { Label = "#tool.prop_door.breakable", Command = "prop_door_breakable" } )
local r_hard = GetConVarNumber( "prop_door_r_hardware" )
if ( ( typ != 3 and r_hard == 3 ) or ( typ == 2 and r_hard != 1 ) ) then LocalPlayer():ConCommand( "prop_door_r_hardware 1" ) end
local r_hardware = {
["#tool.prop_door.lever"] = { prop_door_r_hardware = "1" },
["#tool.prop_door.pushbar"] = { prop_door_r_hardware = "2" }
}
if ( typ == 3 ) then r_hardware["#tool.prop_door.keypad"] = { prop_door_r_hardware = "3" } end
if ( typ != 2 ) then
panel:AddControl( "ListBox", { Label = "#tool.prop_door.r_hardware", Height = 68, Options = r_hardware } )
end
panel:AddControl( "Slider", { Label = "#tool.prop_door.r_distance", Type = "Float", Min = 72, Max = 128, Command = "prop_door_r_distance" } )
panel:AddControl( "Slider", { Label = "#tool.prop_door.r_speed", Type = "Float", Min = 48, Max = 256, Command = "prop_door_r_speed" } )
end