mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
223
lua/stormfox2/functions/sv_mapio.lua
Normal file
223
lua/stormfox2/functions/sv_mapio.lua
Normal file
@@ -0,0 +1,223 @@
|
||||
--[[
|
||||
| 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)
|
||||
Reference in New Issue
Block a user