mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
300 lines
10 KiB
Lua
300 lines
10 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/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
TOOL.Category = "Construction"
|
||
|
|
TOOL.Name = "#tool.lamp.name"
|
||
|
|
|
||
|
|
TOOL.ClientConVar[ "r" ] = "255"
|
||
|
|
TOOL.ClientConVar[ "g" ] = "255"
|
||
|
|
TOOL.ClientConVar[ "b" ] = "255"
|
||
|
|
TOOL.ClientConVar[ "key" ] = "37"
|
||
|
|
TOOL.ClientConVar[ "fov" ] = "90"
|
||
|
|
TOOL.ClientConVar[ "distance" ] = "1024"
|
||
|
|
TOOL.ClientConVar[ "brightness" ] = "4"
|
||
|
|
TOOL.ClientConVar[ "texture" ] = "effects/flashlight001"
|
||
|
|
TOOL.ClientConVar[ "model" ] = "models/lamps/torch.mdl"
|
||
|
|
TOOL.ClientConVar[ "toggle" ] = "1"
|
||
|
|
|
||
|
|
TOOL.Information = {
|
||
|
|
{ name = "left" },
|
||
|
|
{ name = "right" },
|
||
|
|
}
|
||
|
|
|
||
|
|
cleanup.Register( "lamps" )
|
||
|
|
|
||
|
|
local function IsValidLampModel( model )
|
||
|
|
for mdl, _ in pairs( list.Get( "LampModels" ) ) do
|
||
|
|
if ( mdl:lower() == model:lower() ) then return true end
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function TOOL:LeftClick( trace )
|
||
|
|
|
||
|
|
if ( IsValid( trace.Entity ) and trace.Entity:IsPlayer() ) then return false end
|
||
|
|
if ( CLIENT ) then return true end
|
||
|
|
|
||
|
|
local ply = self:GetOwner()
|
||
|
|
local pos = trace.HitPos
|
||
|
|
|
||
|
|
local r = math.Clamp( self:GetClientNumber( "r" ), 0, 255 )
|
||
|
|
local g = math.Clamp( self:GetClientNumber( "g" ), 0, 255 )
|
||
|
|
local b = math.Clamp( self:GetClientNumber( "b" ), 0, 255 )
|
||
|
|
local key = self:GetClientNumber( "key" )
|
||
|
|
local mdl = self:GetClientInfo( "model" )
|
||
|
|
local fov = self:GetClientNumber( "fov" )
|
||
|
|
local distance = self:GetClientNumber( "distance" )
|
||
|
|
local bright = self:GetClientNumber( "brightness" )
|
||
|
|
local toggle = self:GetClientNumber( "toggle" ) != 1
|
||
|
|
|
||
|
|
local tex = self:GetClientInfo( "texture" )
|
||
|
|
local mat = Material( tex )
|
||
|
|
local texture = mat:GetString( "$basetexture" )
|
||
|
|
|
||
|
|
if ( IsValid( trace.Entity ) and trace.Entity:GetClass() == "gmod_lamp" and trace.Entity:GetPlayer() == ply ) then
|
||
|
|
|
||
|
|
trace.Entity:SetColor( Color( r, g, b, 255 ) )
|
||
|
|
trace.Entity:SetFlashlightTexture( texture )
|
||
|
|
trace.Entity:SetLightFOV( fov )
|
||
|
|
trace.Entity:SetDistance( distance )
|
||
|
|
trace.Entity:SetBrightness( bright )
|
||
|
|
trace.Entity:SetToggle( !toggle )
|
||
|
|
trace.Entity:UpdateLight()
|
||
|
|
|
||
|
|
numpad.Remove( trace.Entity.NumDown )
|
||
|
|
numpad.Remove( trace.Entity.NumUp )
|
||
|
|
|
||
|
|
trace.Entity.NumDown = numpad.OnDown( ply, key, "LampToggle", trace.Entity, 1 )
|
||
|
|
trace.Entity.NumUp = numpad.OnUp( ply, key, "LampToggle", trace.Entity, 0 )
|
||
|
|
|
||
|
|
-- For duplicator
|
||
|
|
trace.Entity.Texture = texture
|
||
|
|
trace.Entity.fov = fov
|
||
|
|
trace.Entity.distance = distance
|
||
|
|
trace.Entity.r = r
|
||
|
|
trace.Entity.g = g
|
||
|
|
trace.Entity.b = b
|
||
|
|
trace.Entity.brightness = bright
|
||
|
|
trace.Entity.KeyDown = key
|
||
|
|
|
||
|
|
return true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( !util.IsValidModel( mdl ) or !util.IsValidProp( mdl ) or !IsValidLampModel( mdl ) ) then return false end
|
||
|
|
if ( !self:GetWeapon():CheckLimit( "lamps" ) ) then return false end
|
||
|
|
|
||
|
|
local lamp = MakeLamp( ply, r, g, b, key, toggle, texture, mdl, fov, distance, bright, !toggle, { Pos = pos, Angle = angle_zero } )
|
||
|
|
if ( !IsValid( lamp ) ) then return false end
|
||
|
|
|
||
|
|
local CurPos = lamp:GetPos()
|
||
|
|
local NearestPoint = lamp:NearestPoint( CurPos - ( trace.HitNormal * 512 ) )
|
||
|
|
local LampOffset = CurPos - NearestPoint
|
||
|
|
|
||
|
|
lamp:SetPos( trace.HitPos + LampOffset )
|
||
|
|
|
||
|
|
undo.Create( "Lamp" )
|
||
|
|
undo.AddEntity( lamp )
|
||
|
|
undo.SetPlayer( self:GetOwner() )
|
||
|
|
undo.Finish()
|
||
|
|
|
||
|
|
return true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function TOOL:RightClick( trace )
|
||
|
|
|
||
|
|
if ( !IsValid( trace.Entity ) or trace.Entity:GetClass() != "gmod_lamp" ) then return false end
|
||
|
|
if ( CLIENT ) then return true end
|
||
|
|
|
||
|
|
local ent = trace.Entity
|
||
|
|
local ply = self:GetOwner()
|
||
|
|
|
||
|
|
ply:ConCommand( "lamp_fov " .. ent:GetLightFOV() )
|
||
|
|
ply:ConCommand( "lamp_distance " .. ent:GetDistance() )
|
||
|
|
ply:ConCommand( "lamp_brightness " .. ent:GetBrightness() )
|
||
|
|
ply:ConCommand( "lamp_texture " .. ent:GetFlashlightTexture() )
|
||
|
|
|
||
|
|
if ( ent:GetToggle() ) then
|
||
|
|
ply:ConCommand( "lamp_toggle 1" )
|
||
|
|
else
|
||
|
|
ply:ConCommand( "lamp_toggle 0" )
|
||
|
|
end
|
||
|
|
|
||
|
|
local clr = ent:GetColor()
|
||
|
|
ply:ConCommand( "lamp_r " .. clr.r )
|
||
|
|
ply:ConCommand( "lamp_g " .. clr.g )
|
||
|
|
ply:ConCommand( "lamp_b " .. clr.b )
|
||
|
|
|
||
|
|
return true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( SERVER ) then
|
||
|
|
|
||
|
|
function MakeLamp( ply, r, g, b, KeyDown, toggle, texture, model, fov, distance, brightness, on, Data )
|
||
|
|
|
||
|
|
if ( IsValid( ply ) and !ply:CheckLimit( "lamps" ) ) then return false end
|
||
|
|
if ( !IsValidLampModel( model ) ) then return false end
|
||
|
|
|
||
|
|
local lamp = ents.Create( "gmod_lamp" )
|
||
|
|
if ( !IsValid( lamp ) ) then return false end
|
||
|
|
|
||
|
|
duplicator.DoGeneric( lamp, Data )
|
||
|
|
lamp:SetModel( model ) -- Backwards compatible for addons directly calling this function
|
||
|
|
lamp:SetFlashlightTexture( texture )
|
||
|
|
lamp:SetLightFOV( fov )
|
||
|
|
lamp:SetColor( Color( r, g, b, 255 ) )
|
||
|
|
lamp:SetDistance( distance )
|
||
|
|
lamp:SetBrightness( brightness )
|
||
|
|
lamp:Switch( on )
|
||
|
|
lamp:SetToggle( !toggle )
|
||
|
|
|
||
|
|
lamp:Spawn()
|
||
|
|
|
||
|
|
DoPropSpawnedEffect( lamp )
|
||
|
|
|
||
|
|
duplicator.DoGenericPhysics( lamp, ply, Data )
|
||
|
|
|
||
|
|
lamp:SetPlayer( ply )
|
||
|
|
|
||
|
|
if ( IsValid( ply ) ) then
|
||
|
|
ply:AddCount( "lamps", lamp )
|
||
|
|
ply:AddCleanup( "lamps", lamp )
|
||
|
|
end
|
||
|
|
|
||
|
|
lamp.Texture = texture
|
||
|
|
lamp.KeyDown = KeyDown
|
||
|
|
lamp.fov = fov
|
||
|
|
lamp.distance = distance
|
||
|
|
lamp.r = r
|
||
|
|
lamp.g = g
|
||
|
|
lamp.b = b
|
||
|
|
lamp.brightness = brightness
|
||
|
|
|
||
|
|
lamp.NumDown = numpad.OnDown( ply, KeyDown, "LampToggle", lamp, 1 )
|
||
|
|
lamp.NumUp = numpad.OnUp( ply, KeyDown, "LampToggle", lamp, 0 )
|
||
|
|
|
||
|
|
return lamp
|
||
|
|
|
||
|
|
end
|
||
|
|
duplicator.RegisterEntityClass( "gmod_lamp", MakeLamp, "r", "g", "b", "KeyDown", "Toggle", "Texture", "Model", "fov", "distance", "brightness", "on", "Data" )
|
||
|
|
|
||
|
|
numpad.Register( "LampToggle", function( ply, ent, onoff )
|
||
|
|
|
||
|
|
if ( !IsValid( ent ) ) then return false end
|
||
|
|
if ( !ent:GetToggle() ) then ent:Switch( onoff == 1 ) return end
|
||
|
|
|
||
|
|
if ( numpad.FromButton() ) then
|
||
|
|
|
||
|
|
ent:Switch( onoff == 1 )
|
||
|
|
return
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( onoff == 0 ) then return end
|
||
|
|
|
||
|
|
return ent:Toggle()
|
||
|
|
|
||
|
|
end )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function TOOL:UpdateGhostLamp( ent, ply )
|
||
|
|
|
||
|
|
if ( !IsValid( ent ) ) then return end
|
||
|
|
|
||
|
|
local trace = ply:GetEyeTrace()
|
||
|
|
if ( !trace.Hit or IsValid( trace.Entity ) and ( trace.Entity:IsPlayer() or trace.Entity:GetClass() == "gmod_lamp" ) ) then
|
||
|
|
|
||
|
|
ent:SetNoDraw( true )
|
||
|
|
return
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
local CurPos = ent:GetPos()
|
||
|
|
local NearestPoint = ent:NearestPoint( CurPos - ( trace.HitNormal * 512 ) )
|
||
|
|
local LampOffset = CurPos - NearestPoint
|
||
|
|
|
||
|
|
ent:SetPos( trace.HitPos + LampOffset )
|
||
|
|
|
||
|
|
ent:SetNoDraw( false )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function TOOL:Think()
|
||
|
|
|
||
|
|
local mdl = self:GetClientInfo( "model" )
|
||
|
|
if ( !IsValidLampModel( mdl ) ) then self:ReleaseGhostEntity() return end
|
||
|
|
|
||
|
|
if ( !IsValid( self.GhostEntity ) or self.GhostEntity:GetModel() != mdl ) then
|
||
|
|
self:MakeGhostEntity( mdl, vector_origin, angle_zero )
|
||
|
|
end
|
||
|
|
|
||
|
|
self:UpdateGhostLamp( self.GhostEntity, self:GetOwner() )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
local ConVarsDefault = TOOL:BuildConVarList()
|
||
|
|
|
||
|
|
function TOOL.BuildCPanel( CPanel )
|
||
|
|
|
||
|
|
CPanel:AddControl( "Header", { Description = "#tool.lamp.desc" } )
|
||
|
|
|
||
|
|
CPanel:AddControl( "ComboBox", { MenuButton = 1, Folder = "lamp", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
|
||
|
|
|
||
|
|
CPanel:AddControl( "Numpad", { Label = "#tool.lamp.key", Command = "lamp_key" } )
|
||
|
|
|
||
|
|
CPanel:AddControl( "Slider", { Label = "#tool.lamp.fov", Command = "lamp_fov", Type = "Float", Min = 10, Max = 170 } )
|
||
|
|
CPanel:AddControl( "Slider", { Label = "#tool.lamp.distance", Command = "lamp_distance", Min = 64, Max = 2048 } )
|
||
|
|
CPanel:AddControl( "Slider", { Label = "#tool.lamp.brightness", Command = "lamp_brightness", Type = "Float", Min = 0, Max = 8 } )
|
||
|
|
|
||
|
|
CPanel:AddControl( "Checkbox", { Label = "#tool.lamp.toggle", Command = "lamp_toggle" } )
|
||
|
|
|
||
|
|
CPanel:AddControl( "Color", { Label = "#tool.lamp.color", Red = "lamp_r", Green = "lamp_g", Blue = "lamp_b" } )
|
||
|
|
|
||
|
|
local MatSelect = CPanel:MatSelect( "lamp_texture", nil, false, 0.33, 0.33 )
|
||
|
|
MatSelect.Height = 4
|
||
|
|
|
||
|
|
for k, v in pairs( list.Get( "LampTextures" ) ) do
|
||
|
|
MatSelect:AddMaterial( v.Name or k, k )
|
||
|
|
end
|
||
|
|
|
||
|
|
CPanel:AddControl( "PropSelect", { Label = "#tool.lamp.model", ConVar = "lamp_model", Height = 0, Models = list.Get( "LampModels" ) } )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
list.Set( "LampTextures", "effects/flashlight001", { Name = "#lamptexture.default" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/slit", { Name = "#lamptexture.slit" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/circles", { Name = "#lamptexture.circles" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/window", { Name = "#lamptexture.window" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/logo", { Name = "#lamptexture.logo" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/gradient", { Name = "#lamptexture.gradient" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/bars", { Name = "#lamptexture.bars" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/tech", { Name = "#lamptexture.techdemo" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/soft", { Name = "#lamptexture.soft" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/hard", { Name = "#lamptexture.hard" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/caustics", { Name = "#lamptexture.caustics" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/square", { Name = "#lamptexture.square" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/camera", { Name = "#lamptexture.camera" } )
|
||
|
|
list.Set( "LampTextures", "effects/flashlight/view", { Name = "#lamptexture.view" } )
|
||
|
|
|
||
|
|
list.Set( "LampModels", "models/lamps/torch.mdl", {} )
|
||
|
|
list.Set( "LampModels", "models/maxofs2d/lamp_flashlight.mdl", { Offset = Vector( 8.5, 0, 0 ) } )
|
||
|
|
list.Set( "LampModels", "models/maxofs2d/lamp_projector.mdl", { Offset = Vector( 8.5, 0, 0 ) } )
|
||
|
|
list.Set( "LampModels", "models/props_wasteland/light_spotlight01_lamp.mdl", { Offset = Vector( 9, 0, 4 ), Skin = 1, Scale = 3 } )
|
||
|
|
list.Set( "LampModels", "models/props_wasteland/light_spotlight02_lamp.mdl", { Offset = Vector( 5.5, 0, 0 ), Skin = 1 } )
|
||
|
|
list.Set( "LampModels", "models/props_c17/light_decklight01_off.mdl", { Offset = Vector( 3, 0, 0 ), Skin = 1, Scale = 3 } )
|
||
|
|
list.Set( "LampModels", "models/props_wasteland/prison_lamp001c.mdl", { Offset = Vector( 0, 0, -5 ), Angle = Angle( 90, 0, 0 ) } )
|
||
|
|
|
||
|
|
-- This works, but the ghost entity is invisible due to $alphatest...
|
||
|
|
--list.Set( "LampModels", "models/props_c17/lamp_standard_off01.mdl", { Offset = Vector( 5.20, 0.25, 8 ), Angle = Angle( 90, 0, 0 ), NearZ = 6 } )
|