Files
wnsrc/lua/stormfox2/functions/sv_mapio.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

224 lines
6.2 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/
--]]
--[[-------------------------------------------------------------------------
Light entities: ( env_projectedtexture , light_dynamic, light, light_spot )
Requirements:
- Named "night" or "1" or "day".
- Not have the name "indoor".
logic_relays support and map lights.
dusk / night_events
dawn / day_events
weather_<type> Called when a weathertype gets applied
weather_onchange Called when a weathertype changes
weather_<type>_off Called when a weathertype gets removed
---------------------------------------------------------------------------]]
-- Special Relays
local special_relays = {}
special_relays.day_relays = {}
special_relays.daytime_relays = {}
special_relays.night_relays = {}
special_relays.nighttime_relays = {}
special_relays.weather_on = {}
special_relays.weather_off = {}
local scanned = false
local startingQ = {}
hook.Add("StormFox2.InitPostEntity", "StormFox2.MapInteractions.SRelays", function()
for _, ent in ipairs( ents.GetAll() ) do
if not ent:IsValid() then continue end
local class = ent:GetClass()
if class == "logic_day_relay" then
if ent:GetTriggerType() == 0 then -- Light change
table.insert(special_relays.day_relays, ent)
else
table.insert(special_relays.daytime_relays, ent)
end
elseif class == "logic_night_relay" then
if ent:GetTriggerType() == 0 then -- Light change
table.insert(special_relays.night_relays, ent)
else
table.insert(special_relays.nighttime_relays, ent)
end
elseif class == "logic_weather_relay" then
table.insert(special_relays.weather_on, ent)
elseif class == "logic_weather_off_relay" then
table.insert(special_relays.weather_off, ent)
end
end
scanned = true
for k, ent in ipairs( startingQ ) do
if not ent:IsValid() then continue end
ent:Trigger()
end
startingQ = {}
end)
local function triggerAll(tab)
if not scanned then -- Wait until all entities are loaded
for _, ent in ipairs(tab) do
if not ent:IsValid() then continue end
table.insert(startingQ, ent)
end
return
end
for _, ent in ipairs(tab) do
if not ent:IsValid() then continue end
ent:Trigger()
end
end
local night_lights = {{}, {}, {}, {}, {}, {}}
local relays = {}
local switch
-- local functions
local function setELight( ent, bTurnOn )
local sOnOff = bTurnOn and "TurnOn" or "TurnOff"
ent:Fire( sOnOff )
end
local function setLights( bTurnOn )
if timer.Exists("StormFox2.mi.lights") then
timer.Remove("StormFox2.mi.lights")
end
local i = 1
timer.Create("StormFox2.mi.lights", 0.5, 6, function()
for _,ent in ipairs(night_lights[i] or {}) do
if not IsValid(ent) then continue end
setELight(ent, bTurnOn)
end
i = i + 1
end)
end
local function SetRelay(fMapLight)
local lights_on = fMapLight < 20
if switch ~= nil and lights_on == switch then return end -- Nothing changed
if lights_on then
StormFox2.Map.CallLogicRelay("night_events")
triggerAll(special_relays.night_relays)
setLights( true )
else
StormFox2.Map.CallLogicRelay("day_events")
triggerAll(special_relays.day_relays)
setLights( false )
end
switch = lights_on
end
local includeNames = {
["1"] = true,
["streetlight"] = true,
["streetlights"] = true
}
local includeSearch = {
["night"] = true,
["day"] = true,
-- ["lake"] = true, Used indoors .. for some reason
["outdoor"] = true
}
local excludeSearch = {
["indoor"] = true,
["ind_"] = true,
["apt_"] = true
}
local function Search(name, tab)
for _, str in ipairs( tab ) do
if string.format(name, str) then return true end
end
return false
end
local t = {"env_projectedtexture", "light_dynamic", "light", "light_spot"}
hook.Add("StormFox2.InitPostEntity", "StormFox2.lightioinit", function()
-- Locate lights on the map
for i,ent in ipairs( ents.GetAll() ) do
local c = ent:GetClass()
if not table.HasValue(t, c) then continue end
local name = ent:GetName()
-- Unnamed entities
if not name then
if c == "light_spot" then
table.insert(night_lights[ 1 + i % 6 ],ent)
end
continue
end
name = name:lower()
-- Check for include
if includeNames[name] then
table.insert(night_lights[ 1 + i % 6 ],ent)
continue
end
-- Check exclude
if Search(name, excludeSearch) then
continue
end
-- Check include
if not Search(name, includeSearch) then
continue
end
table.insert(night_lights[ 1 + i % 6 ],ent)
end
-- Update on launch
timer.Simple(5, function()
SetRelay(StormFox2.Map.GetLight())
end)
end)
-- Call day and night relays
hook.Add("StormFox2.lightsystem.new", "StormFox2.mapinteractions.light", SetRelay)
-- Call day andn ight time-related relays
hook.Add("StormFox2.Time.OnDay", "StormFox2.mapinteractions.day", function()
triggerAll( special_relays.daytime_relays )
end)
hook.Add("StormFox2.Time.OnNight", "StormFox2.mapinteractions.night", function()
triggerAll( special_relays.nighttime_relays )
end)
local function getRelayName( )
local c_weather = StormFox2.Weather.GetCurrent()
local relay = c_weather.Name
if c_weather.LogicRelay then
relay = c_weather.LogicRelay() or relay
end
return relay
end
-- StormFox2.Map.w_CallLogicRelay( name )
local lastWeather
local function checkWRelay()
local relay = getRelayName()
relay = string.lower(relay)
if lastWeather and lastWeather == relay then return end -- Nothing changed
StormFox2.Map.w_CallLogicRelay( relay )
local wP = StormFox2.Data.GetFinal("w_Percentage") or 0
for k,ent in ipairs(special_relays.weather_on) do
if ent:GetRequiredWeather() ~= relay then continue end
if not ent:HasRequredAmount() then continue end
ent:Trigger()
end
for k,ent in ipairs(special_relays.weather_off) do
if ent:GetRequiredWeather() ~= lastWeather then continue end
ent:Trigger()
end
lastWeather = relay
end
hook.Add("StormFox2.weather.postchange", "StormFox2.mapinteractions" , function( sName ,nPercentage )
timer.Simple(1, checkWRelay)
end)
hook.Add("StormFox2.data.change", "StormFox2.mapinteractions.w_logic", function(sKey, nDay)
if sKey ~= "Temp" then return end
timer.Simple(1, checkWRelay)
end)