mirror of
				https://github.com/chev2/gmod-addons.git
				synced 2025-10-30 06:31:35 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --
 | |
| -- Localization stuff
 | |
| --
 | |
| language.Add("spawnmenu.options.autoflashlight", "Auto-Flashlight")
 | |
| 
 | |
| language.Add("spawnmenu.options.autoflashlight.cvar.enabled", "Enabled")
 | |
| language.Add(
 | |
|     "spawnmenu.options.autoflashlight.cvartooltip.enabled",
 | |
|     "Whether or not auto-flashlight is enabled."
 | |
| )
 | |
| 
 | |
| language.Add("spawnmenu.options.autoflashlight.cvar.threshold", "Light Threshold")
 | |
| language.Add(
 | |
|     "spawnmenu.options.autoflashlight.cvartooltip.threshold",
 | |
|     "The threshold for the automatic flashlight to trigger. Higher values mean the flashlight will activate in brighter areas. Default: 0.0055"
 | |
| )
 | |
| 
 | |
| language.Add("spawnmenu.options.autoflashlight.cvar.frequency", "Checking Frequency")
 | |
| language.Add(
 | |
|     "spawnmenu.options.autoflashlight.cvartooltip.frequency",
 | |
|     "How often Auto-Flashlight should check to see if the player is in darkness. Default: 0.4"
 | |
| )
 | |
| 
 | |
| --
 | |
| -- ConVars, variables & functions
 | |
| --
 | |
| local CVAR_AUTO_FLASHLIGHT_ENABLED = CreateClientConVar(
 | |
|     "cl_flashlight_auto",
 | |
|     1,
 | |
|     true,
 | |
|     false,
 | |
|     language.GetPhrase("#spawnmenu.options.autoflashlight.cvartooltip.enabled")
 | |
| )
 | |
| 
 | |
| local CVAR_AUTO_FLASHLIGHT_THRESHOLD = CreateClientConVar(
 | |
|     "cl_flashlight_auto_threshold",
 | |
|     0.0055,
 | |
|     true,
 | |
|     false,
 | |
|     language.GetPhrase("#spawnmenu.options.autoflashlight.cvartooltip.threshold"),
 | |
|     0,
 | |
|     0.5
 | |
| )
 | |
| 
 | |
| local CVAR_AUTO_FLASHLIGHT_FREQUENCY = CreateClientConVar(
 | |
|     "cl_flashlight_auto_frequency",
 | |
|     0.4,
 | |
|     true,
 | |
|     false,
 | |
|     language.GetPhrase("#spawnmenu.options.autoflashlight.cvartooltip.frequency"),
 | |
|     0.05,
 | |
|     2
 | |
| )
 | |
| 
 | |
| local wasInDarkness = false
 | |
| 
 | |
| autoflashlight = autoflashlight or {}
 | |
| 
 | |
| --
 | |
| -- This function is designed to be overwritten by other developers who
 | |
| -- might want their custom flashlight implementation to support Auto-Flashlight.
 | |
| --
 | |
| -- I'm assuming that not all flashlight implementations make use of "impulse 100",
 | |
| -- but who knows
 | |
| --
 | |
| function autoflashlight.SetFlashlightEnabled(isEnabled)
 | |
|     -- If isEnabled is not provided, just assume the flashlight is being enabled
 | |
|     isEnabled = Either(isEnabled ~= nil, isEnabled, true)
 | |
| 
 | |
|     local ply = LocalPlayer()
 | |
|     if not IsValid(ply) then return end
 | |
| 
 | |
|     if (isEnabled and not ply:FlashlightIsOn()) or (not isEnabled and ply:FlashlightIsOn()) then
 | |
|         RunConsoleCommand("impulse", "100")
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Returns whether or not we were in darkness the last time we checked it
 | |
| function autoflashlight.GetWasInDarkness()
 | |
|     return wasInDarkness
 | |
| end
 | |
| 
 | |
| function autoflashlight.GetEnabled()
 | |
|     return CVAR_AUTO_FLASHLIGHT_ENABLED:GetBool()
 | |
| end
 | |
| 
 | |
| function autoflashlight.GetThreshold()
 | |
|     return CVAR_AUTO_FLASHLIGHT_THRESHOLD:GetFloat()
 | |
| end
 | |
| 
 | |
| --
 | |
| -- Main calculation/execution script
 | |
| --
 | |
| local function AutoFlashlightDoToggle()
 | |
|     if not CVAR_AUTO_FLASHLIGHT_ENABLED:GetBool() then return end
 | |
| 
 | |
|     local ply = LocalPlayer()
 | |
|     -- If player isn't valid for any reason
 | |
|     if not IsValid(ply) then return end
 | |
| 
 | |
|     local col = render.GetLightColor(ply:EyePos())
 | |
|     -- Determine luminance from the R, G, B values of the light
 | |
|     local luminance = (col.x * 0.299) + (col.y * 0.587) + (col.z * 0.114)
 | |
| 
 | |
|     local darknessThreshold = CVAR_AUTO_FLASHLIGHT_THRESHOLD:GetFloat()
 | |
| 
 | |
|     -- Allow controlling the auto-flashlight through hooks
 | |
|     -- If the hook returns false, the auto-flashlight will be disabled
 | |
|     if hook.Run("AutoFlashlight.ShouldAllow", luminance, darknessThreshold, wasInDarkness) == false then return end
 | |
| 
 | |
|     local isInDarkness = luminance < darknessThreshold
 | |
| 
 | |
|     -- If we're in a dark area, and weren't previously in a dark area
 | |
|     if isInDarkness and not wasInDarkness then
 | |
|         -- Allow developers to control if auto-flashlight can turn on
 | |
|         -- Returning false will stop it from turning on
 | |
|         local flashlightAllowedToTurnOn = hook.Run("AutoFlashlight.CanFlashlightTurnOn", luminance, darknessThreshold, wasInDarkness)
 | |
| 
 | |
|         -- ...and the flashlight isn't on yet, and can be turned on
 | |
|         if not ply:FlashlightIsOn() and flashlightAllowedToTurnOn ~= false then
 | |
|             -- ...then turn it on
 | |
|             autoflashlight.SetFlashlightEnabled(true)
 | |
|         end
 | |
|     -- If we're not in a dark area, but we were previously
 | |
|     elseif not isInDarkness and wasInDarkness then
 | |
|         -- Allow developers to control if auto-flashlight can turn off
 | |
|         -- Returning false will stop it from turning off
 | |
|         local flashlightAllowedToTurnOff = hook.Run("AutoFlashlight.CanFlashlightTurnOff", luminance, darknessThreshold, wasInDarkness)
 | |
| 
 | |
|         -- ...and the flashlight is on, and can be turned off
 | |
|         if ply:FlashlightIsOn() and flashlightAllowedToTurnOff ~= false then
 | |
|             -- ...then turn it of
 | |
|             autoflashlight.SetFlashlightEnabled(false)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     wasInDarkness = isInDarkness
 | |
| end
 | |
| 
 | |
| timer.Create("AutoFlashlight.DoToggle", CVAR_AUTO_FLASHLIGHT_FREQUENCY:GetFloat(), 0, AutoFlashlightDoToggle)
 | |
| 
 | |
| -- Recreate timer whenever flashlight frequency setting is adjusted
 | |
| cvars.AddChangeCallback("cl_flashlight_auto_frequency", function(convar, oldVal, newVal)
 | |
|     if not tonumber(newVal) then return end
 | |
| 
 | |
|     timer.Create("AutoFlashlight.DoToggle", tonumber(newVal), 0, AutoFlashlightDoToggle)
 | |
|     AutoFlashlightDoToggle()
 | |
| end, "AutoFlashlight.RefreshFrequencyCVar")
 | |
| 
 | |
| --
 | |
| -- Add Sandbox options menu
 | |
| --
 | |
| hook.Add("AddToolMenuCategories", "AutoFlashlight.AddSpawnmenuCategory", function()
 | |
|     spawnmenu.AddToolCategory("Options", "AutoFlashlight", "#spawnmenu.options.autoflashlight")
 | |
| end)
 | |
| 
 | |
| hook.Add("PopulateToolMenu", "AutoFlashlight.PopulateSpawnmenuCategory", function()
 | |
|     spawnmenu.AddToolMenuOption("Options", "AutoFlashlight", "AutoFlashlightSettingsMain", "Settings", "", "", function(pnl)
 | |
|         pnl:Help("Main Settings")
 | |
| 
 | |
|         pnl:CheckBox("#spawnmenu.options.autoflashlight.cvar.enabled", "cl_flashlight_auto")
 | |
| 
 | |
|         pnl:NumSlider("#spawnmenu.options.autoflashlight.cvar.threshold", "cl_flashlight_auto_threshold", 0, 0.5, 4)
 | |
|         pnl:ControlHelp("#spawnmenu.options.autoflashlight.cvartooltip.threshold")
 | |
| 
 | |
|         pnl:NumSlider("#spawnmenu.options.autoflashlight.cvar.frequency", "cl_flashlight_auto_frequency", 0.05, 2, 2)
 | |
|         pnl:ControlHelp("#spawnmenu.options.autoflashlight.cvartooltip.frequency")
 | |
|     end)
 | |
| end)
 |