diff --git a/vrp/cfg/control.lua b/vrp/cfg/control.lua deleted file mode 100644 index 8c330bea..00000000 --- a/vrp/cfg/control.lua +++ /dev/null @@ -1,45 +0,0 @@ --- client-side vRP configuration --- (loaded client-side) - -local cfg = {} - -cfg.clock = true --set clock format to 12 hr -cfg.holiday = true --allows for holliday weather halloween, xmas - -cfg.time = { - ['Morning'] = 9, - ['Noon'] = 12, - ['Evening'] = 18, - ['Night'] = 23 -} - -cfg.types = { - 'EXTRASUNNY', - 'CLEAR', - 'SMOG', - 'FOGGY', - 'OVERCAST', - 'CLOUDS', - 'CLEARING', - 'RAIN', - 'THUNDER', - 'SNOW', - 'BLIZZARD', - 'SNOWLIGHT' -} - -cfg.holidays = { - 'XMAS', - 'NEUTRAL', --makes sky green - 'HALLOWEEN' -} - -cfg.blackout_types = { - 'THUNDER', - 'SNOW', - 'BLIZZARD', - 'NEUTRAL', - 'HALLOWEEN' -} - -return cfg diff --git a/vrp/cfg/groups.lua b/vrp/cfg/groups.lua index 5d2d38db..16532ca5 100644 --- a/vrp/cfg/groups.lua +++ b/vrp/cfg/groups.lua @@ -16,9 +16,9 @@ function police_init(user) weapons["WEAPON_NIGHTSTICK"] = {ammo=0} weapons["WEAPON_FLASHLIGHT"] = {ammo=0} - vRP.EXT.PlayerState.remote._giveWeapons(user.source,weapons,true) - vRP.EXT.Police.remote._setCop(user.source,true) - vRP.EXT.PlayerState.remote._setArmour(user.source,100) + --vRP.EXT.PlayerState.remote._giveWeapons(user.source,weapons,true) + --vRP.EXT.Police.remote._setCop(user.source,true) + --vRP.EXT.PlayerState.remote._setArmour(user.source,100) end function police_onjoin(user) diff --git a/vrp/cfg/modules.lua b/vrp/cfg/modules.lua index 96431f9e..3c524df0 100644 --- a/vrp/cfg/modules.lua +++ b/vrp/cfg/modules.lua @@ -8,7 +8,7 @@ local modules = { group = true, gui = true, map = true, - control = true -- weather and time controls + weather = true, } return modules diff --git a/vrp/cfg/weather.lua b/vrp/cfg/weather.lua new file mode 100644 index 00000000..85303ef1 --- /dev/null +++ b/vrp/cfg/weather.lua @@ -0,0 +1,29 @@ +local cfg = {} + +cfg.time = { + ['Morning'] = 9, + ['Noon'] = 12, + ['Evening'] = 18, + ['Night'] = 23 +} + +cfg.types = { + 'EXTRASUNNY', + 'CLEAR', + 'SMOG', + 'FOGGY', + 'OVERCAST', + 'CLOUDS', + 'CLEARING', + 'RAIN', + 'THUNDER', + 'SNOW', + 'BLIZZARD', + 'SNOWLIGHT' + + --'XMAS', + --'NEUTRAL', --makes sky green + --'HALLOWEEN' +} + +return cfg \ No newline at end of file diff --git a/vrp/client/control.lua b/vrp/client/control.lua deleted file mode 100644 index e3515327..00000000 --- a/vrp/client/control.lua +++ /dev/null @@ -1,126 +0,0 @@ --- https://github.com/ImagicTheCat/vRP --- MIT license (see LICENSE or vrp/vRPShared.lua) - -if not vRP.modules.control then return end - -local Control = class("Control", vRP.Extension) -local cfg = module("vrp", "cfg/control") - -function Control:__construct() - vRP.Extension.__construct(self) - - -- load config - --self.cfg = module("vrp", "cfg/control") - - --default weather condition - self.current = "EXTRASUNNY" - self.last = self.current - - self.time = 0 - self.offset = 0 - self.timer = 0 - self.newTimer = 10 - - self.freeze = false - self.blackout = false - self.suggestion = false - - self.b_chance = math.random(0,5) -- chance for a random blackout - self.b_timer = math.random(0,5) -- how long a blackout will last - - -- random blackouts based off of specific weather conditions - Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - for _,v in pairs(cfg.blackout_types) do - if self.current == v then - if self.b_chance >= 0 then - notification(self.current) - notification("Its a Blackout") - self.blackout = not self.blackout - notification('Power should be fixed in about '..self.b_timer..' Minutes.') - Citizen.Wait(self.b_timer * 60000) - notification("Power is back on") - self.blackout = not self.blackout - - self.remote._update() - end - end - end - end - end) - - Citizen.CreateThread(function() - local hour = 0 - local minute = 0 - while true do - Citizen.Wait(0) - local newTime = self.time - - if GetGameTimer() - 500 > self.timer then - newTime = newTime + 0.25 - self.timer = GetGameTimer() - end - if self.freeze then - self.offset = self.offset + self.time - newTime - end - - self.time = newTime - hour = math.floor(((self.time + self.offset)/60)%24) - minute = math.floor((self.time + self.offset)%60) - NetworkOverrideClockTime(hour, minute, 0) - end - end) - - Citizen.CreateThread(function() - while true do - if self.last ~= self.current then - self.last = self.current - SetWeatherTypeOverTime(self.current, 1.0) -- default 15 - Citizen.Wait(1000) - end - Citizen.Wait(100) -- Wait 0 seconds to prevent crashing. - SetArtificialLightsState(self.blackout) - --SetArtificialLightsStateAffectsVehicles(self.veh_blackout) - ClearOverrideWeather() - ClearWeatherTypePersist() - SetWeatherTypePersist(self.last) - SetWeatherTypeNow(self.last) - SetWeatherTypeNowPersist(self.last) - - if self.last == 'XMAS' then - SetForceVehicleTrails(true) - SetForcePedFootstepsTracks(true) - else - SetForceVehicleTrails(false) - SetForcePedFootstepsTracks(false) - end - end - end) -end - ---Client side notification -function notification(msg) - SetNotificationTextEntry("STRING") - AddTextComponentString(msg) - DrawNotification(false, false) -end - -function Control:time() - notification(GetGameTimer()) -end - -function Control:update(base, offset, freeze, current, blackout) - self.time = base - self.offset = offset - self.freeze = freeze - self.current = current - self.blackout = blackout -end - -Control.tunnel = {} - -Control.tunnel.time = Control.time -Control.tunnel.update = Control.update - -vRP:registerExtension(Control) \ No newline at end of file diff --git a/vrp/client/weather.lua b/vrp/client/weather.lua new file mode 100644 index 00000000..d5b094ae --- /dev/null +++ b/vrp/client/weather.lua @@ -0,0 +1,116 @@ +-- https://github.com/ImagicTheCat/vRP +-- MIT license (see LICENSE or vrp/vRPShared.lua) +if not vRP.modules.weather then return end + +local Weather = class("Weather", vRP.Extension) + +-- METHODS + +function Weather:__construct() + vRP.Extension.__construct(self) + + self.current = nil + self.freeze = false + self.blackout = false + + self.time = 0 + self.newTime = 0 + self.offset = 0 + + self.timer = 0 + self.newTimer = 10 + + self.normal = 2000 -- normal ms per minute + self.alteredTime = 0 -- altered ms per minute + self.speedTime = 1 -- time speed increase default + self.slowTime = 1 -- time speed decrease default + +end + +function Weather:sync() + if not self.current then self.current = 'CLEAR' end + self.remote._setWeather(self.current) + + if self.alteredTime >= 0 then self.alteredTime = 2000 end -- prevents time issue + SetMillisecondsPerGameMinute(self.alteredTime) +end + +function Weather:setWeather(weather) + local current = string.upper(weather) + if not current then current = 'CLEAR' end + + self.current = current + ClearOverrideWeather() + ClearWeatherTypePersist() + SetWeatherTypePersist(current) + SetWeatherTypeNow(current) + SetWeatherTypeNowPersist(current) +end + +function Weather:setHour(hour) + self.offset = self.offset - ((((self.time + self.offset) / 60) % 24 ) - tonumber(hour)) * 60 +end + +function Weather:setTime(hour) + if not hour then hour = 12 end + self:setHour(hour) + + local newTime = self.time + if GetGameTimer() - 500 > self.timer then + newTime = newTime + 0.25 + self.timer = GetGameTimer() + end + + self.time = newTime + hour = math.floor(((self.time + self.offset)/60)%24) + minute = math.floor((self.time + self.offset)%60) + NetworkOverrideClockTime(hour, minute, 0) +end + +function Weather:speedUpTime(inc) + SetMillisecondsPerGameMinute(self.normal) + + if not inc then inc = self.speedTime end + local minute = math.floor(GetMillisecondsPerGameMinute() / inc) + + SetMillisecondsPerGameMinute(minute) + self.alteredTime = minute +end + +function Weather:slowTime(dec) + SetMillisecondsPerGameMinute(self.normal) + + if not dec then dec = self.slowTime end + local minute = math.floor(GetMillisecondsPerGameMinute() * dec) + + SetMillisecondsPerGameMinute(minute) + self.alteredTime = minute +end + +function Weather:toggleFreeze() + self.freeze = not self.freeze + local hours, minutes, seconds = GetClockHours(), GetClockMinutes(), GetClockSeconds() + + while self.freeze do + Wait(1) + NetworkOverrideClockTime(GetClockHours(), GetClockMinutes(), GetClockSeconds()) + end +end + +function Weather:toggleBlackout() + self.blackout = not self.blackout + SetArtificialLightsState(self.blackout) +end + +-- TUNNEL + +Weather.tunnel = {} +Weather.tunnel.sync = Weather.sync +Weather.tunnel.setWeather = Weather.setWeather +Weather.tunnel.setTime = Weather.setTime +Weather.tunnel.toggleFreeze = Weather.toggleFreeze +Weather.tunnel.toggleBlackout = Weather.toggleBlackout +Weather.tunnel.speedUpTime = Weather.speedUpTime +Weather.tunnel.slowTime = Weather.slowTime + +vRP:registerExtension(Weather) \ No newline at end of file diff --git a/vrp/modules/control.lua b/vrp/modules/control.lua deleted file mode 100644 index 8e2f0627..00000000 --- a/vrp/modules/control.lua +++ /dev/null @@ -1,313 +0,0 @@ --- https://github.com/ImagicTheCat/vRP --- MIT license (see LICENSE or vrp/vRPShared.lua) - -if not vRP.modules.control then return end - -local Control = class("Control", vRP.Extension) - --- menu: time -local function menu_control_time(self) - - local function m_time(menu) - -- Gets current system time of user - if tonumber(os.date("%H")) >= 12 then ending = "pm" else ending = "am" end - - if self.cfg.clock then - vRP.EXT.Base.remote._notify(menu.user.source, 'Time is ~y~'..tonumber(os.date("%I"))..':'..tonumber(os.date("%M"))..' '..ending) - else - vRP.EXT.Base.remote._notify(menu.user.source, 'Time is ~y~'..tonumber(os.date("%H"))..':'..tonumber(os.date("%M"))) - end - end - - local function m_update(menu) vRP:triggerEvent("update") end - - -- toggles freeze time - local function m_freeze(menu) vRP:triggerEvent("toggleFreeze") end - - local function m_setTime(menu, k) vRP:triggerEvent("setTime", k) end - - - vRP.EXT.GUI:registerMenuBuilder("control.time", function(menu) - local user = menu.user - - menu.title = "Time" - menu.css.header_color = "rgba(200,0,0,0.75)" - - menu:addOption("Your Current Time", m_time, "Get your current time") - - menu:addOption("Update Time", m_update) - menu:addOption("Freeze Time", m_freeze, "Freeze at current time") - - for i=1,#self.times do - local k = self.times[i][1] --time of days name - menu:addOption(""..k.."", m_setTime, nil, k) - end - end) -end - --- menu: admin user user -local function menu_control_weather_types(self) - - local function m_types(menu, v) - if not self.blackout then - self.current = v - - vRP:triggerEvent("update") - else - vRP.EXT.Base.remote._notify(menu.user.source, 'Blackout is ~b~enabled.~y~ disable before weather change~s~..') - end - end - - vRP.EXT.GUI:registerMenuBuilder("control.weather.types", function(menu) - local user = menu.user - - menu.title = "Weather Types" - menu.css.header_color = "rgba(200,0,0,0.75)" - - for _,v in pairs(self.cfg.types) do - menu:addOption(v, m_types, nil, v) - end - end) -end - --- menu: weather -local function menu_control_weather(self) - - local function m_update(menu) - vRP:triggerEvent("update") - end - - local function m_dyamic(menu) - -- toggles Dynamic weather - vRP:triggerEvent("toggleDynamic") - end - - local function m_get(menu) menu.user:openMenu("control.weather.types") end - - local function m_set(menu) - local user = menu.user - local weatherType = user:prompt("Weather types: Not case Sensitive", "") - - vRP:triggerEvent("setWeather", weatherType) - end - - local function m_blackout(menu) vRP:triggerEvent("toggleBlackout") end - - vRP.EXT.GUI:registerMenuBuilder("control.weather", function(menu) - local user = menu.user - - menu.title = "Weather" - menu.css.header_color = "rgba(200,0,0,0.75)" - - menu:addOption("Update Weather", m_update) - menu:addOption("Dynamic Weather", m_dyamic, "toggles dynamic weather") - - menu:addOption("Set Weather", m_set, "Manually set Weather Type") - menu:addOption("Weather types", m_get, "list of Weather Type") - - menu:addOption("Blackout", m_blackout, "turns off all artificial light sources in the map: buildings, street lights, etc.") - end) -end - --- menu: admin -local function menu_control(self) - - local function m_weather(menu) - menu.user:openMenu("control.weather") - end - - local function m_time(menu) - menu.user:openMenu("control.time") - end - - - vRP.EXT.GUI:registerMenuBuilder("control", function(menu) - local user = menu.user - - menu.title = "Control" - menu.css.header_color = "rgba(200,0,0,0.75)" - - menu:addOption("Weather control", m_weather, "Change server weather") - menu:addOption("Time control", m_time, "Change server Time") - end) -end - -function Control:__construct() - vRP.Extension.__construct(self) - - self.cfg = module("vrp", "cfg/control") - - --default weather condition - self.current = "EXTRASUNNY" - - self.time = 0 - self.offset = 0 - self.timer = 0 - self.newTimer = 10 - - self.freeze = false - self.blackout = false - self.dynamic = true --Set to false and weather will change automatically every 10 minutes. - - self.types = {} - self.times = {} - - --menu - menu_control(self) - menu_control_weather(self) - menu_control_weather_types(self) - menu_control_time(self) - - -- main menu - vRP.EXT.GUI:registerMenuBuilder("admin", function(menu) - menu:addOption("Control", function(menu) - menu.user:openMenu("control") - end) - end) - - -- adds all weather types to self.types excluding hollidays - for _,v in pairs(self.cfg.types) do table.insert(self.types, v) end - - -- adds all times to self.times - for k,v in pairs(self.cfg.time) do table.insert(self.times, {k, v}) end - - -- sorts self.times by value - table.sort(self.times, function (a, b) return a[2] < b[2] end) - - -- adds hollidays to weather types - if self.cfg.holiday then - for _,v in pairs(self.cfg.holidays) do - table.insert(self.types, v) - end - end - - -- randomyly sets weather condions - if not self.dynamic then - local new = self:randomizer() - local getNew = self:randomizer() - if new ~= self.current then - self.current = choice - else - self.current = getNew - end - vRP:triggerEvent("update") - end - - -- Registers a commands. - RegisterCommand("setWeather", function(source, args, rawCommand) - vRP:triggerEvent("setWeather", args[1]) - end, false) - - RegisterCommand("setTime", function(source, args, rawCommand) - vRP:triggerEvent("setTime", args[1]) - end, false) - - RegisterCommand("freezeTime", function(source, args, rawCommand) - vRP:triggerEvent("toggleFreeze") - end, false) - - RegisterCommand("blackout", function(source, args, rawCommand) - vRP:triggerEvent("toggleBlackout") - end, false) - - RegisterCommand("dynamic", function(source, args, rawCommand) - vRP:triggerEvent("toggleDynamic") - end, false) -end - --- randomly selects weather from self.types -function Control:randomizer() - local choice = "F" - local n = 0 - for i, o in pairs(self.types) do - n = n + 1 - if math.random() < (1/n) then - choice = o - end - end - return choice -end - -Control.event = {} -Control.tunnel = {} - -function Control.event:update() - for id, user in pairs(vRP.users) do - if user:hasPermission("player.noclip") then - self.remote._update(user.source, self.time, self.offset, self.freeze, self.current, self.blackout) - end - end -end - -function Control.event:setWeather(name) - local user = vRP.users_by_source[source] - local types = self.types - - for types in string.gmatch(string.upper(name),"[^%s]+") do - if self.dynamic then - self.current = types - vRP:triggerEvent("update") - else - vRP.EXT.Base.remote._notify(source, '~b~Disabled~s~ Dynamic before changing the weather.') - end - end -end - -function Control.event:setTime(name) - local user = vRP.users_by_source[source] - if not self.freeze then - for i=1,#self.times do - local k = self.times[i][1] local v = self.times[i][2] - if string.upper(name) == string.upper(k) then - self.offset = self.offset - ( ( ((self.time + self.offset) / 60) % 24 ) - v ) * 60 - end - end - vRP:triggerEvent("update") - else - vRP.EXT.Base.remote._notify(user.source, '~b~Disabled~s~ time freeze before changing the time.') - end -end - -function Control.event:toggleBlackout() - local user = vRP.users_by_source[source] - self.blackout = not self.blackout - if self.blackout then - vRP.EXT.Base.remote._notify(user.source, 'Blackout is now ~r~enabled~s~.') - else - vRP.EXT.Base.remote._notify(user.source, 'Blackout is now ~b~disabled~s~.') - end - vRP:triggerEvent("update") -end - -function Control.event:toggleFreeze() - for id, user in pairs(vRP.users) do - self.freeze = not self.freeze - if self.freeze then - local newTime = os.time(os.date("!*t"))/2 + 360 - self.offset = self.offset + self.time - newTime - vRP.EXT.Base.remote._notify(user.source, 'Time is now ~b~frozen~s~.') - else - vRP.EXT.Base.remote._notify(user.source, 'Time is ~y~no longer frozen~s~.') - end - vRP:triggerEvent("update") - end -end - -function Control.event:toggleDynamic() - for id, user in pairs(vRP.users) do - self.dynamic = not self.dynamic - if self.dynamic then - vRP.EXT.Base.remote._notify(source, 'Dynamic weather is now ~r~enabled~s~.') - else - vRP.EXT.Base.remote._notify(source, 'Dynamic weather is now ~b~disabled~s~.') - end - vRP:triggerEvent("update") - end -end - -function Control.tunnel:update() - self.blackout = not self.blackout - vRP:triggerEvent("update") -end - -vRP:registerExtension(Control) \ No newline at end of file diff --git a/vrp/modules/weather.lua b/vrp/modules/weather.lua new file mode 100644 index 00000000..2f8911f1 --- /dev/null +++ b/vrp/modules/weather.lua @@ -0,0 +1,147 @@ +-- https://github.com/ImagicTheCat/vRP +-- MIT license (see LICENSE or vrp/vRPShared.lua) +if not vRP.modules.weather then return end + +local Weather = class("Weather", vRP.Extension) +Weather.event = {} + +local function menu_types(self) + + vRP.EXT.GUI:registerMenuBuilder("types", function(menu) + local user = menu.user + menu.title = "Forcast Types" + menu.css.header_color = "rgba(200,0,0,0.75)" + + for _,v in pairs(self.cfg.types) do + menu:addOption(v, function(menu) + self.remote._setWeather(source, v) + end) + end + end) +end + +local function menu_forcast(self) + + vRP.EXT.GUI:registerMenuBuilder("forcast", function(menu) + local user = menu.user + menu.title = "Forcast" + menu.css.header_color = "rgba(200,0,0,0.75)" + + menu:addOption("Blackout", function(menu) + self.remote._toggleBlackout(source) + end) + + menu:addOption("Set Weather", function(menu) + local weather = user:prompt("Weather types: Not case Sensitive", "") + self.remote._setWeather(source, string.upper(weather)) + end) + + menu:addOption("Types", function(menu) + menu.user:openMenu("types") + end) + end) +end + +local function menu_timeOfDay(self) + + vRP.EXT.GUI:registerMenuBuilder("timeOfDay", function(menu) + local user = menu.user + menu.title = "Time of Day" + menu.css.header_color = "rgba(200,0,0,0.75)" + + for i=1, #self.times do + local name, hour = self.times[i][1], self.times[i][2] -- time of day name, hour + menu:addOption(name, function(menu) + self.remote._setTime(source, hour) + end) + end + end) +end + +local function menu_time(self) + + vRP.EXT.GUI:registerMenuBuilder("time", function(menu) + local user = menu.user + menu.title = "Time" + menu.css.header_color = "rgba(200,0,0,0.75)" + + menu:addOption("Freeze Time", function(menu) + self.remote._toggleFreeze(source) + end) + + menu:addOption("Set Time", function(menu) + local timeChange = user:prompt("Set Time: 24 hour format from 0 - 23", "") + self.remote._setTime(source, timeChange) + end) + + menu:addOption("Speed Up Time", function(menu) + local timeChange = user:prompt("Set Multiplyer: recomended 2 - 6 (1 is default speed)", "") + self.remote._speedUpTime(source, timeChange) + end) + + menu:addOption("Slow Down Time", function(menu) + local timeChange = user:prompt("Set Divider: recomended 2 - 6. (1 is default speed)", "") + self.remote._slowTime(source, timeChange) + end) + + menu:addOption("Time of Day", function(menu) + menu.user:openMenu("timeOfDay") + end) + end) +end + +local function menu_weather(self) + + vRP.EXT.GUI:registerMenuBuilder("weather", function(menu) + local user = menu.user + menu.title = "Weather" + menu.css.header_color = "rgba(200,0,0,0.75)" + + menu:addOption("Forcast", function(menu) + menu.user:openMenu("forcast") + end) + + menu:addOption("Time", function(menu) + menu.user:openMenu("time") + end) + end) +end + +function Weather:__construct() + vRP.Extension.__construct(self) + + self.cfg = module("vrp", "cfg/weather") + + self.types = {} + self.times = {} + + --menu + menu_weather(self) + menu_forcast(self) + menu_types(self) + menu_time(self) + menu_timeOfDay(self) + + -- main menu + vRP.EXT.GUI:registerMenuBuilder("admin", function(menu) + menu:addOption("Weather", function(menu) + menu.user:openMenu("weather") + end) + end) + + for _,v in pairs(self.cfg.types) do table.insert(self.types, v) end -- adds all weather types to self.types + + for k,v in pairs(self.cfg.time) do table.insert(self.times, {k, v}) end -- adds all times to self.times + + table.sort(self.times, function (a, b) return a[2] < b[2] end) -- sorts self.times by value + + table.sort(self.types, function (a, b) return string.upper(a) < string.upper(b) end) -- sorts self.types alphabetically +end + +function Weather.event:playerSpawn(user, first_spawn) + if first_spawn then + self.remote._sync(user.source) + end +end + +vRP:registerExtension(Weather) \ No newline at end of file