Scripts/resources/[renewed]/Renewed-Weathersync/server/time.lua

167 lines
4.8 KiB
Lua
Raw Normal View History

2024-12-30 10:15:34 +00:00
local Config = require 'config.time'
local globalState = GlobalState
local useRealTime = Config.useRealTime
-- GlobalState checks here are to ensure that the if the script is being restarted live the time doesn't reset.
local configScale = useRealTime and 60000 or Config.timeScale
local currentScale = globalState.timeScale or configScale
local freezeTime = globalState.freezeTime
local startTime = useRealTime and { hour = tonumber(os.date('%H')), minute = tonumber(os.date('%M')) } or Config.startUpTime
local minute = startTime.minute
local hour = startTime.hour
-- Syncs the GlobalStates (does not replicate if the values are the same)
globalState.timeScale = currentScale
globalState.freezeTime = freezeTime
-- Loop that syncs the minute and hours of the servers to clients.
CreateThread(function()
while true do
if not freezeTime then
globalState.currentTime = {
minute = minute == 59 and 0 or minute + 1,
hour = minute == 59 and (hour == 23 and 0 or hour + 1) or hour,
}
end
Wait(currentScale)
end
end)
-- Add server side statebag change handlers so third party resources can set globalstates and we can replicate the data.
AddStateBagChangeHandler('freezeTime', 'global', function(_, _, value)
if value and next(value) then
freezeTime = value
end
end)
local nightScale = Config.timeScaleNight
local nightStart, nightEnd = Config.nightTime.beginning, Config.nightTime.ending
AddStateBagChangeHandler('currentTime', 'global', function(_, _, value)
if value then
hour = value.hour
minute = value.minute
if not useRealTime and Config.useNightScale then
if (hour > nightStart or hour < nightEnd) and currentScale ~= nightScale then
currentScale = nightScale
globalState.timeScale = currentScale
elseif (hour < nightStart and hour > nightEnd) and currentScale ~= configScale then
currentScale = configScale
globalState.timeScale = currentScale
end
end
end
end)
AddStateBagChangeHandler('timeScale', 'global', function(_, _, value)
if value then
currentScale = value
end
end)
if not useRealTime then
lib.addCommand('time', {
help = 'Set the current time',
restricted = 'group.admin',
params = {
{
name = 'hour',
type = 'number',
help = 'set the Hour',
},
{
name = 'minute',
type = 'number',
help = 'set the Minute',
optional = true
},
},
}, function(_, args) -- source, args
local newHours, newMinutes = args.hour, args.minute or 0
globalState.currentTime = {
hour = newHours > 23 and 0 or newHours < 0 and 0 or newHours,
minute = newMinutes > 59 and 59 or newMinutes < 0 and 0 or newMinutes,
}
end)
lib.addCommand('noon', {
help = 'Set the current time to noon (12:00)',
restricted = 'group.admin',
}, function(_, _)
globalState.currentTime = {
hour = 12,
minute = 0,
}
end)
lib.addCommand('morning', {
help = 'Set the current time to morning (9:00)',
restricted = 'group.admin',
}, function(_, _)
globalState.currentTime = {
hour = 9,
minute = 0,
}
end)
lib.addCommand('evening', {
help = 'Set the current time to evening (18:00)',
restricted = 'group.admin',
}, function(_, _)
globalState.currentTime = {
hour = 18,
minute = 0,
}
end)
lib.addCommand('night', {
help = 'Set the current time to night (23:00)',
restricted = 'group.admin',
}, function(_, _)
globalState.currentTime = {
hour = 23,
minute = 0,
}
end)
lib.addCommand('timescale', {
help = ('Set milliseconds per game second (default %s)'):format(currentScale),
restricted = 'group.admin',
params = {
{
name = 'scale',
type = 'number',
help = 'Milliseconds per game second',
},
},
}, function(_, args) -- source, args
if args.scale > 2000 then
globalState.timeScale = args.scale
end
end)
lib.addCommand('freezetime', {
help = 'Freeze / unfreeze time',
restricted = 'group.admin',
params = {
{
name = 'time',
type = 'number',
help = 'Freeze time? (1 = yes, 0 = no)',
},
},
}, function(_, args)
local newFreeze = args.time == 1 and true or false
globalState.freezeTime = newFreeze
end)
end