dobrograd-13-06-2022/garrysmod/addons/feature-wire/lua/entities/gmod_wire_lamp.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

179 lines
5.3 KiB
Lua

AddCSLuaFile()
DEFINE_BASECLASS( "base_wire_entity" )
ENT.PrintName = "Wire Lamp"
ENT.RenderGroup = RENDERGROUP_BOTH
ENT.WireDebugName = "Lamp"
function ENT:SetupDataTables()
self:NetworkVar( "Bool", 0, "On" )
end
if CLIENT then
local matLight = Material( "sprites/light_ignorez" )
local matBeam = Material( "effects/lamp_beam" )
function ENT:Initialize()
self.PixVis = util.GetPixelVisibleHandle()
end
function ENT:DrawTranslucent()
BaseClass.DrawTranslucent( self )
-- No glow if we're not switched on!
if not self:GetOn() then return end
local LightNrm = self:GetAngles():Forward()
local ViewNormal = self:GetPos() - EyePos()
local Distance = ViewNormal:Length()
ViewNormal:Normalize()
local ViewDot = ViewNormal:Dot( LightNrm * -1 )
local LightPos = self:GetPos() + LightNrm * 5
-- glow sprite
--[[
render.SetMaterial( matBeam )
local BeamDot = BeamDot = 0.25
render.StartBeam( 3 )
render.AddBeam( LightPos + LightNrm * 1, 128, 0.0, Color( r, g, b, 255 * BeamDot) )
render.AddBeam( LightPos - LightNrm * 100, 128, 0.5, Color( r, g, b, 64 * BeamDot) )
render.AddBeam( LightPos - LightNrm * 200, 128, 1, Color( r, g, b, 0) )
render.EndBeam()
--]]
if ViewDot >= 0 then
render.SetMaterial( matLight )
local Visibile = util.PixelVisible( LightPos, 16, self.PixVis )
if (!Visibile) then return end
local Size = math.Clamp( Distance * Visibile * ViewDot * 2, 64, 512 )
Distance = math.Clamp( Distance, 32, 800 )
local Alpha = math.Clamp( (1000 - Distance) * Visibile * ViewDot, 0, 100 )
local Col = self:GetColor()
Col.a = Alpha
render.DrawSprite( LightPos, Size, Size, Col, Visibile * ViewDot )
render.DrawSprite( LightPos, Size*0.4, Size*0.4, Color(255, 255, 255, Alpha), Visibile * ViewDot )
end
end
return -- No more client
end
-- Server
function ENT:Initialize()
self:PhysicsInit( SOLID_VPHYSICS )
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS )
local phys = self:GetPhysicsObject()
if (phys:IsValid()) then
phys:Wake()
end
self.Inputs = WireLib.CreateSpecialInputs(self, {"Red", "Green", "Blue", "RGB", "FOV", "Distance", "Brightness", "On", "Texture"}, {"NORMAL", "NORMAL", "NORMAL", "VECTOR", "NORMAL", "NORMAL", "NORMAL", "NORMAL", "STRING"})
end
function ENT:OnTakeDamage( dmginfo )
self:TakePhysicsDamage( dmginfo )
end
function ENT:TriggerInput(iname, value)
if (iname == "Red") then
self.r = math.Clamp(value,0,255)
elseif (iname == "Green") then
self.g = math.Clamp(value,0,255)
elseif (iname == "Blue") then
self.b = math.Clamp(value,0,255)
elseif (iname == "RGB") then
self.r, self.g, self.b = math.Clamp(value[1],0,255), math.Clamp(value[2],0,255), math.Clamp(value[3],0,255)
elseif (iname == "FOV") then
self.FOV = value
elseif (iname == "Distance") then
self.Dist = value
elseif (iname == "Brightness") then
self.Brightness = math.Clamp(value,0,10)
elseif (iname == "On") then
self:Switch( value ~= 0 )
elseif (iname == "Texture") then
if value != "" then self.Texture = value else self.Texture = "effects/flashlight001" end
end
self:UpdateLight()
end
function ENT:Switch( on )
if on ~= not self.flashlight then return end
self.on = on
if not on then
SafeRemoveEntity( self.flashlight )
self.flashlight = nil
self:SetOn( false )
return
end
self:SetOn( true )
local angForward = self:GetAngles()
self.flashlight = ents.Create( "env_projectedtexture" )
self.flashlight:SetParent( self )
-- The local positions are the offsets from parent..
self.flashlight:SetLocalPos( Vector( 0, 0, 0 ) )
self.flashlight:SetLocalAngles( Angle(0,0,0) )
-- Looks like only one flashlight can have shadows enabled!
self.flashlight:SetKeyValue( "enableshadows", 1 )
self.flashlight:SetKeyValue( "farz", self.Dist )
self.flashlight:SetKeyValue( "nearz", 12 )
self.flashlight:SetKeyValue( "lightfov", self.FOV )
local c = self:GetColor()
local b = self.Brightness
self.flashlight:SetKeyValue( "lightcolor", Format( "%i %i %i 255", c.r * b, c.g * b, c.b * b ) )
self.flashlight:Spawn()
self.flashlight:Input( "SpotlightTexture", NULL, NULL, self.Texture )
end
function ENT:UpdateLight()
self:SetColor( Color( self.r, self.g, self.b, self:GetColor().a ) )
if ( !IsValid( self.flashlight ) ) then return end
self.flashlight:Input( "SpotlightTexture", NULL, NULL, self.Texture )
self.flashlight:Input( "FOV", NULL, NULL, tostring( self.FOV ) )
self.flashlight:SetKeyValue( "farz", self.Dist )
local c = self:GetColor()
local b = self.Brightness
self.flashlight:SetKeyValue( "lightcolor", Format( "%i %i %i 255", c.r*b, c.g*b, c.b*b ) )
self:SetOverlayText( "Red: " .. c.r .. " Green: " .. c.g .. " Blue: " .. c.b .. "\n" ..
"FoV: " .. self.FOV .. " Distance: " .. self.Dist .. " Brightness: " .. self.Brightness )
end
function ENT:Setup( r, g, b, Texture, fov, dist, brightness, on )
self.r, self.g, self.b = math.Clamp(r or 255,0,255), math.Clamp(g or 255,0,255), math.Clamp(b or 255,0,255)
self.Texture = Texture or "effects/flashlight001"
self.FOV = fov or 90
self.Dist = dist or 1024
self.Brightness = math.Clamp(brightness or 8,0,10)
self.on = on or false
self:Switch( self.on )
self:UpdateLight()
end
duplicator.RegisterEntityClass( "gmod_wire_lamp", WireLib.MakeWireEnt, "Data", "r", "g", "b", "Texture", "FOV", "Dist", "Brightness", "on" )