[{"data":1,"prerenderedAt":1814},["ShallowReactive",2],{"/docs/base/weather-integrations":3,"/docs/base/weather-integrations-surround":1801,"/docs/base/weather-integrations-implemented-suggestions":1813},{"id":4,"title":5,"body":6,"description":1792,"extension":1793,"head":1794,"implementedSuggestions":1794,"meta":1795,"navigation":551,"path":1796,"schemaOrg":1794,"seo":1797,"sitemap":1798,"stem":1799,"__hash__":1800},"docs/1.docs/base/5.weather-integrations.md","Weather integrations",{"type":7,"value":8,"toc":1780},"minimark",[9,13,18,30,65,80,110,156,160,163,296,334,344,347,351,354,382,386,409,419,718,722,739,750,763,1485,1489,1492,1495,1499,1540,1543,1550,1611,1626,1630,1677,1687,1691,1750,1773,1776],[10,11,12],"p",{},"Use this tutorial when setting up local activity or interior lighting through Sky Base.\nComplete the common setup, then follow the section for your weather resource. The QB\nand CD sections contain the required source changes; no patch files are installed with\nSky Base.",[14,15,17],"h2",{"id":16},"select-the-provider","Select the provider",[10,19,20,21,25,26,29],{},"In the existing ",[22,23,24],"code",{},"Config = { ... }"," table in ",[22,27,28],{},"sky_base/config/config.lua",", set:",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","weather = \"auto\",\n","lua","",[22,38,39],{"__ignoreMap":36},[40,41,44,48,52,55,59,62],"span",{"class":42,"line":43},"line",1,[40,45,47],{"class":46},"sTEyZ","weather ",[40,49,51],{"class":50},"sMK4o","=",[40,53,54],{"class":50}," \"",[40,56,58],{"class":57},"sfazB","auto",[40,60,61],{"class":50},"\"",[40,63,64],{"class":46},",\n",[10,66,67,68,71,72,75,76,79],{},"Start your chosen weather resource before ",[22,69,70],{},"sky_base",", followed by ",[22,73,74],{},"sky_jobs_base"," and\n",[22,77,78],{},"sky_activities",". For example, after your framework and the provider setup below:",[31,81,85],{"className":82,"code":83,"language":84,"meta":36,"style":36},"language-cfg shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ensure qb-weathersync\nensure sky_base\nensure sky_jobs_base\nensure sky_activities\n","cfg",[22,86,87,92,98,104],{"__ignoreMap":36},[40,88,89],{"class":42,"line":43},[40,90,91],{},"ensure qb-weathersync\n",[40,93,95],{"class":42,"line":94},2,[40,96,97],{},"ensure sky_base\n",[40,99,101],{"class":42,"line":100},3,[40,102,103],{},"ensure sky_jobs_base\n",[40,105,107],{"class":42,"line":106},4,[40,108,109],{},"ensure sky_activities\n",[10,111,112,115,116,119,120,119,123,119,126,119,129,132,133,136,137,139,140,143,144,147,148,151,152,155],{},[22,113,114],{},"Config.weather = \"auto\""," selects the first started resource in this order:\n",[22,117,118],{},"cd_easytime",", ",[22,121,122],{},"Renewed-Weathersync",[22,124,125],{},"esx_weather",[22,127,128],{},"qb-weathersync",[22,130,131],{},"weathersync",".\nWithout a match it uses ",[22,134,135],{},"native",". Codesign and Renewed precede their QB compatibility\nname. Run one actual synchronization provider. Explicit selections use the resource\nname, ",[22,138,135],{},", or ",[22,141,142],{},"custom",". Like fuel and vehiclekeys, auto-detection runs once in\n",[22,145,146],{},"source/shared/set_config.lua",". Each adapter uses ",[22,149,150],{},"if Sky.Config.weather == \"...\" then","\nand defines its ",[22,153,154],{},"Sky.Functions"," integration functions only when selected. Start the provider before Base;\nrestart Base to select a different integration. An explicitly unavailable provider fails visibly.",[14,157,159],{"id":158},"use-the-local-override","Use the local override",[10,161,162],{},"This client API never changes global server weather/time:",[31,164,166],{"className":33,"code":165,"language":35,"meta":36,"style":36},"local success, reason = Sky.Functions.SetWeatherOverride(\"my-interior\", \"CLEAR\", 12)\nSky.Functions.SetWeatherOverride(\"my-interior\", \"CLEAR\", 0)\nSky.Functions.ClearWeatherOverride(\"my-interior\")\nlocal current = Sky.Functions.GetWeatherOverride()\n",[22,167,168,220,254,275],{"__ignoreMap":36},[40,169,170,173,176,178,181,185,188,192,195,197,200,202,204,206,209,211,213,217],{"class":42,"line":43},[40,171,172],{"class":50},"local",[40,174,175],{"class":46}," success, reason ",[40,177,51],{"class":50},[40,179,180],{"class":46}," Sky.",[40,182,184],{"class":183},"sBMFI","Functions",[40,186,187],{"class":46},".",[40,189,191],{"class":190},"s2Zo4","SetWeatherOverride",[40,193,194],{"class":46},"(",[40,196,61],{"class":50},[40,198,199],{"class":57},"my-interior",[40,201,61],{"class":50},[40,203,119],{"class":46},[40,205,61],{"class":50},[40,207,208],{"class":57},"CLEAR",[40,210,61],{"class":50},[40,212,119],{"class":46},[40,214,216],{"class":215},"sbssI","12",[40,218,219],{"class":46},")\n",[40,221,222,225,227,229,231,233,235,237,239,241,243,245,247,249,252],{"class":42,"line":94},[40,223,224],{"class":46},"Sky.",[40,226,184],{"class":183},[40,228,187],{"class":46},[40,230,191],{"class":190},[40,232,194],{"class":46},[40,234,61],{"class":50},[40,236,199],{"class":57},[40,238,61],{"class":50},[40,240,119],{"class":46},[40,242,61],{"class":50},[40,244,208],{"class":57},[40,246,61],{"class":50},[40,248,119],{"class":46},[40,250,251],{"class":215},"0",[40,253,219],{"class":46},[40,255,256,258,260,262,265,267,269,271,273],{"class":42,"line":100},[40,257,224],{"class":46},[40,259,184],{"class":183},[40,261,187],{"class":46},[40,263,264],{"class":190},"ClearWeatherOverride",[40,266,194],{"class":46},[40,268,61],{"class":50},[40,270,199],{"class":57},[40,272,61],{"class":50},[40,274,219],{"class":46},[40,276,277,279,282,284,286,288,290,293],{"class":42,"line":106},[40,278,172],{"class":50},[40,280,281],{"class":46}," current ",[40,283,51],{"class":50},[40,285,180],{"class":46},[40,287,184],{"class":183},[40,289,187],{"class":46},[40,291,292],{"class":190},"GetWeatherOverride",[40,294,295],{"class":46},"()\n",[10,297,298,301,302,305,306,309,310,313,314,317,318,321,322,325,326,329,330,333],{},[22,299,300],{},"SetWeatherOverride(scope, weather, hour)"," freezes an integer hour 0–23, with minutes/seconds\nzero. Weather names are the standard GTA types listed in ",[22,303,304],{},"source/client/weather.lua",".\nIt returns ",[22,307,308],{},"true"," or ",[22,311,312],{},"false, reason",". Updating the same scope preserves its original\nrestoration snapshot. ",[22,315,316],{},"ClearWeatherOverride(scope)"," has the same result shape and is idempotent\nwhen no scope exists. ",[22,319,320],{},"GetWeatherOverride()"," returns ",[22,323,324],{},"false"," or\n",[22,327,328],{},"{scope, owner, weather, hour, provider, active}",". One resource/scope owns the environment;\nanother receives ",[22,331,332],{},"override_in_use"," and cannot clear it. Cfx invocation context identifies\nthe owner. Base releases automatically when that owner or Base stops.",[10,335,336,337,339,340,343],{},"Weather now uses ",[22,338,154],{},", like fuel. Replace former ",[22,341,342],{},"Sky.Weather"," calls with\nthe three functions above. Custom provider tables are replaced by the direct integration\nfunctions described below. Update Base and its consumers together.",[10,345,346],{},"The selected provider's restart rebinds outstanding requests, including unavailable ones.\nA stopping provider is not called. Renewed's initial clock application runs after its\nstate handlers, and is cancelled on release. Stable targets do not repeat native writes.",[14,348,350],{"id":349},"prepare-your-weather-resource","Prepare your weather resource",[10,352,353],{},"The following changes address writers that continue after a pause request. They were\nchecked against the linked upstream revisions. Compare your installed files first and\npreserve your own customizations. Only modify the provider you use.",[10,355,356,357,361,362,365,366,369,370,373,374,377,378,381],{},"Each block is a ",[358,359,360],"strong",{},"unified diff",": remove lines starting with ",[22,363,364],{},"-",", add lines starting with\n",[22,367,368],{},"+",", and keep the surrounding context. Do not paste the diff markers or ",[22,371,372],{},"@@"," headings into\nLua. The ",[22,375,376],{},"sky_weather_pause '1'"," manifest entry belongs to the ",[358,379,380],{},"weather resource",", not\nSky Base. Add it only after applying all corresponding client changes: Base checks this\nentry before using the provider.",[383,384,385],"h3",{"id":128},"QB WeatherSync",[387,388,389,397,403],"ol",{},[390,391,392,393,396],"li",{},"Open ",[22,394,395],{},"qb-weathersync/client.lua"," and apply the two loop checks below. Rechecking the\ndisabled state after each wait prevents an already running transition from writing\ninto the local override.",[390,398,399,400,187],{},"Add the shown metadata to ",[22,401,402],{},"qb-weathersync/fxmanifest.lua",[390,404,405,406,408],{},"Restart ",[22,407,128],{},", then Sky Base and its consumers in the configured start order.",[10,410,411,412,187],{},"Source: ",[413,414,418],"a",{"href":415,"rel":416},"https://github.com/qbcore-fivem/qb-weathersync/tree/f7ae442137ff0cd2e62fee75e2f963465c5429be",[417],"nofollow","qbcore-fivem/qb-weathersync at f7ae442137ff0cd2e62fee75e2f963465c5429be",[31,420,424],{"className":421,"code":422,"language":423,"meta":36,"style":36},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight has-diff","--- a/client.lua\n+++ b/client.lua\n@@ -45,6 +45,7 @@\n                 Wait(15000)\n             end\n             Wait(100) -- Wait 0 seconds to prevent crashing.\n+            if disable then goto continue end\n             SetArtificialLightsState(blackout)\n             SetArtificialLightsStateAffectsVehicles(blackoutVehicle)\n             ClearOverrideWeather()\n@@ -69,6 +70,7 @@\n         else\n             Wait(1000)\n         end\n+        ::continue::\n     end\n end)\n\n@@ -82,6 +84,7 @@\n     while true do\n         if not disable then\n             Wait(0)\n+            if disable then goto continue end\n             local _, _, _, hours, minutes, _ = GetLocalTime()\n             local newBaseTime = baseTime\n             if tick - (Config.RealTimeSync and 500 or 22) > tick then\n@@ -107,5 +110,6 @@\n         else\n             Wait(1000)\n         end\n+        ::continue::\n     end\n end)\n--- a/fxmanifest.lua\n+++ b/fxmanifest.lua\n@@ -14,3 +14,6 @@\n\n server_script 'server.lua'\n client_script 'client.lua'\n+\n+-- Local pause fixes required by Sky.Functions weather overrides (see the weather integration tutorial).\n+sky_weather_pause '1'\n","diff",[22,425,426,434,442,452,457,463,469,479,485,491,497,507,513,519,525,534,540,546,553,563,569,575,581,589,595,601,607,617,622,627,632,640,645,650,658,666,676,681,687,693,700,709],{"__ignoreMap":36},[40,427,428,431],{"class":42,"line":43},[40,429,430],{"class":50},"---",[40,432,433],{"class":46}," a/client.lua\n",[40,435,436,439],{"class":42,"line":94},[40,437,438],{"class":50},"+++",[40,440,441],{"class":46}," b/client.lua\n",[40,443,444,446,449],{"class":42,"line":100},[40,445,372],{"class":50},[40,447,448],{"class":46}," -45,6 +45,7 ",[40,450,451],{"class":50},"@@\n",[40,453,454],{"class":42,"line":106},[40,455,456],{"class":46},"                 Wait(15000)\n",[40,458,460],{"class":42,"line":459},5,[40,461,462],{"class":46},"             end\n",[40,464,466],{"class":42,"line":465},6,[40,467,468],{"class":46},"             Wait(100) -- Wait 0 seconds to prevent crashing.\n",[40,470,474,476],{"class":471,"line":473},[42,423,472],"add",7,[40,475,368],{"class":50},[40,477,478],{"class":57},"            if disable then goto continue end\n",[40,480,482],{"class":42,"line":481},8,[40,483,484],{"class":46},"             SetArtificialLightsState(blackout)\n",[40,486,488],{"class":42,"line":487},9,[40,489,490],{"class":46},"             SetArtificialLightsStateAffectsVehicles(blackoutVehicle)\n",[40,492,494],{"class":42,"line":493},10,[40,495,496],{"class":46},"             ClearOverrideWeather()\n",[40,498,500,502,505],{"class":42,"line":499},11,[40,501,372],{"class":50},[40,503,504],{"class":46}," -69,6 +70,7 ",[40,506,451],{"class":50},[40,508,510],{"class":42,"line":509},12,[40,511,512],{"class":46},"         else\n",[40,514,516],{"class":42,"line":515},13,[40,517,518],{"class":46},"             Wait(1000)\n",[40,520,522],{"class":42,"line":521},14,[40,523,524],{"class":46},"         end\n",[40,526,529,531],{"class":527,"line":528},[42,423,472],15,[40,530,368],{"class":50},[40,532,533],{"class":57},"        ::continue::\n",[40,535,537],{"class":42,"line":536},16,[40,538,539],{"class":46},"     end\n",[40,541,543],{"class":42,"line":542},17,[40,544,545],{"class":46}," end)\n",[40,547,549],{"class":42,"line":548},18,[40,550,552],{"emptyLinePlaceholder":551},true,"\n",[40,554,556,558,561],{"class":42,"line":555},19,[40,557,372],{"class":50},[40,559,560],{"class":46}," -82,6 +84,7 ",[40,562,451],{"class":50},[40,564,566],{"class":42,"line":565},20,[40,567,568],{"class":46},"     while true do\n",[40,570,572],{"class":42,"line":571},21,[40,573,574],{"class":46},"         if not disable then\n",[40,576,578],{"class":42,"line":577},22,[40,579,580],{"class":46},"             Wait(0)\n",[40,582,585,587],{"class":583,"line":584},[42,423,472],23,[40,586,368],{"class":50},[40,588,478],{"class":57},[40,590,592],{"class":42,"line":591},24,[40,593,594],{"class":46},"             local _, _, _, hours, minutes, _ = GetLocalTime()\n",[40,596,598],{"class":42,"line":597},25,[40,599,600],{"class":46},"             local newBaseTime = baseTime\n",[40,602,604],{"class":42,"line":603},26,[40,605,606],{"class":46},"             if tick - (Config.RealTimeSync and 500 or 22) > tick then\n",[40,608,610,612,615],{"class":42,"line":609},27,[40,611,372],{"class":50},[40,613,614],{"class":46}," -107,5 +110,6 ",[40,616,451],{"class":50},[40,618,620],{"class":42,"line":619},28,[40,621,512],{"class":46},[40,623,625],{"class":42,"line":624},29,[40,626,518],{"class":46},[40,628,630],{"class":42,"line":629},30,[40,631,524],{"class":46},[40,633,636,638],{"class":634,"line":635},[42,423,472],31,[40,637,368],{"class":50},[40,639,533],{"class":57},[40,641,643],{"class":42,"line":642},32,[40,644,539],{"class":46},[40,646,648],{"class":42,"line":647},33,[40,649,545],{"class":46},[40,651,653,655],{"class":42,"line":652},34,[40,654,430],{"class":50},[40,656,657],{"class":46}," a/fxmanifest.lua\n",[40,659,661,663],{"class":42,"line":660},35,[40,662,438],{"class":50},[40,664,665],{"class":46}," b/fxmanifest.lua\n",[40,667,669,671,674],{"class":42,"line":668},36,[40,670,372],{"class":50},[40,672,673],{"class":46}," -14,3 +14,6 ",[40,675,451],{"class":50},[40,677,679],{"class":42,"line":678},37,[40,680,552],{"emptyLinePlaceholder":551},[40,682,684],{"class":42,"line":683},38,[40,685,686],{"class":46}," server_script 'server.lua'\n",[40,688,690],{"class":42,"line":689},39,[40,691,692],{"class":46}," client_script 'client.lua'\n",[40,694,697],{"class":695,"line":696},[42,423,472],40,[40,698,699],{"class":50},"+\n",[40,701,704,706],{"class":702,"line":703},[42,423,472],41,[40,705,368],{"class":50},[40,707,708],{"class":57},"-- Local pause fixes required by Sky.Functions weather overrides (see the weather integration tutorial).\n",[40,710,713,715],{"class":711,"line":712},[42,423,472],42,[40,714,368],{"class":50},[40,716,717],{"class":57},"sky_weather_pause '1'\n",[383,719,721],{"id":720},"cd-easytime","CD EasyTime",[387,723,724,730,735],{},[390,725,392,726,729],{},[22,727,728],{},"cd_easytime/client/client.lua"," and apply all changes below. They update the local\ntarget during a pause, cancel old pause/release coroutines and suspend clock/rain\nwriters, including a time transition already in progress.",[390,731,399,732,187],{},[22,733,734],{},"cd_easytime/fxmanifest.lua",[390,736,405,737,408],{},[22,738,118],{},[10,740,741,742,745,746,749],{},"The optional third argument of ",[22,743,744],{},"cd_easytime:PauseSync(boolean, hours, weather)"," is added\nby these changes. Existing callers retain their default hour/weather. Release requests\nthe full state through ",[22,747,748],{},"cd_easytime:SyncMe"," so an already frozen server clock resumes its\nfreeze loop. Base rejects an already paused CD provider because the existing getter does\nnot expose its previous pause target.",[10,751,411,752,757,758,187],{},[413,753,756],{"href":754,"rel":755},"https://github.com/dsheedes/cd_easytime/tree/174ddc1e823d1aad54361988ea54c302c08b980a",[417],"dsheedes/cd_easytime at 174ddc1e823d1aad54361988ea54c302c08b980a",".\nCodesign documents the pause-state getter in its ",[413,759,762],{"href":760,"rel":761},"https://docs.codesign.pro/free-scripts/easytime-time-and-weather-management/keys-chat-events-exports",[417],"exports reference",[31,764,766],{"className":421,"code":765,"language":423,"meta":36,"style":36},"--- a/client/client.lua\n+++ b/client/client.lua\n@@ -6,6 +6,7 @@\n local my_source = GetPlayerServerId(PlayerId())\n PauseSync = {}\n PauseSync.state = false\n+local pause_generation = 0\n\n\n RegisterNetEvent('cd_easytime:OpenUI', function(values)\n@@ -17,22 +18,29 @@\n     SendNUIMessage({action = 'open', values = values})\n end)\n\n-RegisterNetEvent('cd_easytime:PauseSync', function(boolean, hours)\n-    if boolean == PauseSync.state then return end\n+RegisterNetEvent('cd_easytime:PauseSync', function(boolean, hours, weather)\n     if boolean then\n+        PauseSync.hours = hours or 20\n+        ChangeWeather(weather or 'EXTRASUNNY', true)\n+        if PauseSync.state then return end\n         PauseSync.state = true\n-        ChangeWeather('EXTRASUNNY', true)\n-        while PauseSync.state do\n+        pause_generation = pause_generation + 1\n+        local generation = pause_generation\n+        while PauseSync.state and generation == pause_generation do\n+            NetworkOverrideClockTime(PauseSync.hours, 0, 0)\n             Wait(0)\n-            NetworkOverrideClockTime(hours or 20, 00, 00)\n-        end\n-    else\n+        end\n+    else\n+        if not PauseSync.state then return end\n         PauseSync.state = false\n+        pause_generation = pause_generation + 1\n+        local generation = pause_generation\n         Wait(300)\n-        TriggerServerEvent('cd_easytime:SyncMe_basics', {weather = true, time = true})\n-    end\n-end)\n-\n+        if not PauseSync.state and generation == pause_generation then\n+            TriggerServerEvent('cd_easytime:SyncMe')\n+        end\n+    end\n+end)\n RegisterNetEvent('cd_easytime:ForceUpdate', function(data, source)\n     if not PauseSync.state then\n         if data.weather ~= nil and data.weather ~= self.weather then\n@@ -64,6 +72,7 @@\n     CreateThread(function()\n         while self.freeze and not PauseSync.state do\n             Wait(0)\n+            if PauseSync.state then break end\n             NetworkOverrideClockTime(data.hours, data.mins, 0)\n         end\n     end)\n@@ -113,7 +122,7 @@\n     CreateThread(function()\n         while true do\n             Wait(5) --increase this timer to reduce resource usage. but this may cause jumping clouds.\n-            if not time_transition and not self.freeze and not forcedInstantTimeUpdate then\n+            if not PauseSync.state and not time_transition and not self.freeze and not forcedInstantTimeUpdate then\n                 NetworkOverrideClockTime(self.hours, self.mins, 0)\n             end\n         end\n@@ -146,6 +155,7 @@\n\n     local start_time = GetGameTimer()\n     while GetGameTimer() - start_time \u003C (transition_speed*1000) do\n+        if PauseSync.state then return end\n         local progress = (GetGameTimer() - start_time) / (transition_speed*1000)\n         local total_seconds = (current_total_seconds + ((target_total_seconds - current_total_seconds) * progress)) % 86400\n\n@@ -157,6 +167,7 @@\n         if forcedInstantTimeUpdate then break end\n         Wait(0)\n     end\n+    if PauseSync.state then return end\n     if forcedInstantTimeUpdate then NetworkOverrideClockTime(self.hours, self.mins, 0) return end\n     NetworkOverrideClockTime(data.hours, data.mins, data.seconds or 0)\n end\n@@ -263,7 +274,7 @@\n CreateThread(function()\n     while true do\n         Wait(2000)\n-        if self.weather then\n+        if self.weather and not PauseSync.state then\n             if RainWeathers[self.weather] then\n                 SetRainLevel(1.0)\n             else\n--- a/fxmanifest.lua\n+++ b/fxmanifest.lua\n@@ -61,4 +61,6 @@\n\n provide 'vSync'\n provide 'qb-weathersync'\n-provide 'qbx_weathersync'\n\\ No newline at end of file\n+provide 'qbx_weathersync'\n+-- Local pause fixes required by Sky.Functions weather overrides (see the weather integration tutorial).\n+sky_weather_pause '1'\n",[22,767,768,775,782,791,796,801,806,814,818,822,827,836,841,845,849,859,867,875,880,888,896,904,909,917,925,933,941,949,957,961,969,977,985,992,999,1007,1012,1019,1026,1031,1039,1047,1055,1062,1071,1080,1088,1096,1104,1110,1116,1122,1132,1138,1144,1149,1158,1164,1169,1175,1185,1190,1196,1202,1211,1220,1226,1231,1236,1246,1251,1257,1263,1271,1277,1283,1288,1298,1304,1310,1315,1324,1330,1336,1342,1352,1358,1363,1369,1378,1387,1393,1399,1405,1412,1419,1429,1434,1440,1446,1455,1461,1469,1477],{"__ignoreMap":36},[40,769,770,772],{"class":42,"line":43},[40,771,430],{"class":50},[40,773,774],{"class":46}," a/client/client.lua\n",[40,776,777,779],{"class":42,"line":94},[40,778,438],{"class":50},[40,780,781],{"class":46}," b/client/client.lua\n",[40,783,784,786,789],{"class":42,"line":100},[40,785,372],{"class":50},[40,787,788],{"class":46}," -6,6 +6,7 ",[40,790,451],{"class":50},[40,792,793],{"class":42,"line":106},[40,794,795],{"class":46}," local my_source = GetPlayerServerId(PlayerId())\n",[40,797,798],{"class":42,"line":459},[40,799,800],{"class":46}," PauseSync = {}\n",[40,802,803],{"class":42,"line":465},[40,804,805],{"class":46}," PauseSync.state = false\n",[40,807,809,811],{"class":808,"line":473},[42,423,472],[40,810,368],{"class":50},[40,812,813],{"class":57},"local pause_generation = 0\n",[40,815,816],{"class":42,"line":481},[40,817,552],{"emptyLinePlaceholder":551},[40,819,820],{"class":42,"line":487},[40,821,552],{"emptyLinePlaceholder":551},[40,823,824],{"class":42,"line":493},[40,825,826],{"class":46}," RegisterNetEvent('cd_easytime:OpenUI', function(values)\n",[40,828,829,831,834],{"class":42,"line":499},[40,830,372],{"class":50},[40,832,833],{"class":46}," -17,22 +18,29 ",[40,835,451],{"class":50},[40,837,838],{"class":42,"line":509},[40,839,840],{"class":46},"     SendNUIMessage({action = 'open', values = values})\n",[40,842,843],{"class":42,"line":515},[40,844,545],{"class":46},[40,846,847],{"class":42,"line":521},[40,848,552],{"emptyLinePlaceholder":551},[40,850,853,855],{"class":851,"line":528},[42,423,852],"remove",[40,854,364],{"class":50},[40,856,858],{"class":857},"swJcz","RegisterNetEvent('cd_easytime:PauseSync', function(boolean, hours)\n",[40,860,862,864],{"class":861,"line":536},[42,423,852],[40,863,364],{"class":50},[40,865,866],{"class":857},"    if boolean == PauseSync.state then return end\n",[40,868,870,872],{"class":869,"line":542},[42,423,472],[40,871,368],{"class":50},[40,873,874],{"class":57},"RegisterNetEvent('cd_easytime:PauseSync', function(boolean, hours, weather)\n",[40,876,877],{"class":42,"line":548},[40,878,879],{"class":46},"     if boolean then\n",[40,881,883,885],{"class":882,"line":555},[42,423,472],[40,884,368],{"class":50},[40,886,887],{"class":57},"        PauseSync.hours = hours or 20\n",[40,889,891,893],{"class":890,"line":565},[42,423,472],[40,892,368],{"class":50},[40,894,895],{"class":57},"        ChangeWeather(weather or 'EXTRASUNNY', true)\n",[40,897,899,901],{"class":898,"line":571},[42,423,472],[40,900,368],{"class":50},[40,902,903],{"class":57},"        if PauseSync.state then return end\n",[40,905,906],{"class":42,"line":577},[40,907,908],{"class":46},"         PauseSync.state = true\n",[40,910,912,914],{"class":911,"line":584},[42,423,852],[40,913,364],{"class":50},[40,915,916],{"class":857},"        ChangeWeather('EXTRASUNNY', true)\n",[40,918,920,922],{"class":919,"line":591},[42,423,852],[40,921,364],{"class":50},[40,923,924],{"class":857},"        while PauseSync.state do\n",[40,926,928,930],{"class":927,"line":597},[42,423,472],[40,929,368],{"class":50},[40,931,932],{"class":57},"        pause_generation = pause_generation + 1\n",[40,934,936,938],{"class":935,"line":603},[42,423,472],[40,937,368],{"class":50},[40,939,940],{"class":57},"        local generation = pause_generation\n",[40,942,944,946],{"class":943,"line":609},[42,423,472],[40,945,368],{"class":50},[40,947,948],{"class":57},"        while PauseSync.state and generation == pause_generation do\n",[40,950,952,954],{"class":951,"line":619},[42,423,472],[40,953,368],{"class":50},[40,955,956],{"class":57},"            NetworkOverrideClockTime(PauseSync.hours, 0, 0)\n",[40,958,959],{"class":42,"line":624},[40,960,580],{"class":46},[40,962,964,966],{"class":963,"line":629},[42,423,852],[40,965,364],{"class":50},[40,967,968],{"class":857},"            NetworkOverrideClockTime(hours or 20, 00, 00)\n",[40,970,972,974],{"class":971,"line":635},[42,423,852],[40,973,364],{"class":50},[40,975,976],{"class":857},"        end\n",[40,978,980,982],{"class":979,"line":642},[42,423,852],[40,981,364],{"class":50},[40,983,984],{"class":857},"    else\n",[40,986,988,990],{"class":987,"line":647},[42,423,472],[40,989,368],{"class":50},[40,991,976],{"class":57},[40,993,995,997],{"class":994,"line":652},[42,423,472],[40,996,368],{"class":50},[40,998,984],{"class":57},[40,1000,1002,1004],{"class":1001,"line":660},[42,423,472],[40,1003,368],{"class":50},[40,1005,1006],{"class":57},"        if not PauseSync.state then return end\n",[40,1008,1009],{"class":42,"line":668},[40,1010,1011],{"class":46},"         PauseSync.state = false\n",[40,1013,1015,1017],{"class":1014,"line":678},[42,423,472],[40,1016,368],{"class":50},[40,1018,932],{"class":57},[40,1020,1022,1024],{"class":1021,"line":683},[42,423,472],[40,1023,368],{"class":50},[40,1025,940],{"class":57},[40,1027,1028],{"class":42,"line":689},[40,1029,1030],{"class":46},"         Wait(300)\n",[40,1032,1034,1036],{"class":1033,"line":696},[42,423,852],[40,1035,364],{"class":50},[40,1037,1038],{"class":857},"        TriggerServerEvent('cd_easytime:SyncMe_basics', {weather = true, time = true})\n",[40,1040,1042,1044],{"class":1041,"line":703},[42,423,852],[40,1043,364],{"class":50},[40,1045,1046],{"class":857},"    end\n",[40,1048,1050,1052],{"class":1049,"line":712},[42,423,852],[40,1051,364],{"class":50},[40,1053,1054],{"class":857},"end)\n",[40,1056,1059],{"class":1057,"line":1058},[42,423,852],43,[40,1060,1061],{"class":50},"-\n",[40,1063,1066,1068],{"class":1064,"line":1065},[42,423,472],44,[40,1067,368],{"class":50},[40,1069,1070],{"class":57},"        if not PauseSync.state and generation == pause_generation then\n",[40,1072,1075,1077],{"class":1073,"line":1074},[42,423,472],45,[40,1076,368],{"class":50},[40,1078,1079],{"class":57},"            TriggerServerEvent('cd_easytime:SyncMe')\n",[40,1081,1084,1086],{"class":1082,"line":1083},[42,423,472],46,[40,1085,368],{"class":50},[40,1087,976],{"class":57},[40,1089,1092,1094],{"class":1090,"line":1091},[42,423,472],47,[40,1093,368],{"class":50},[40,1095,1046],{"class":57},[40,1097,1100,1102],{"class":1098,"line":1099},[42,423,472],48,[40,1101,368],{"class":50},[40,1103,1054],{"class":57},[40,1105,1107],{"class":42,"line":1106},49,[40,1108,1109],{"class":46}," RegisterNetEvent('cd_easytime:ForceUpdate', function(data, source)\n",[40,1111,1113],{"class":42,"line":1112},50,[40,1114,1115],{"class":46},"     if not PauseSync.state then\n",[40,1117,1119],{"class":42,"line":1118},51,[40,1120,1121],{"class":46},"         if data.weather ~= nil and data.weather ~= self.weather then\n",[40,1123,1125,1127,1130],{"class":42,"line":1124},52,[40,1126,372],{"class":50},[40,1128,1129],{"class":46}," -64,6 +72,7 ",[40,1131,451],{"class":50},[40,1133,1135],{"class":42,"line":1134},53,[40,1136,1137],{"class":46},"     CreateThread(function()\n",[40,1139,1141],{"class":42,"line":1140},54,[40,1142,1143],{"class":46},"         while self.freeze and not PauseSync.state do\n",[40,1145,1147],{"class":42,"line":1146},55,[40,1148,580],{"class":46},[40,1150,1153,1155],{"class":1151,"line":1152},[42,423,472],56,[40,1154,368],{"class":50},[40,1156,1157],{"class":57},"            if PauseSync.state then break end\n",[40,1159,1161],{"class":42,"line":1160},57,[40,1162,1163],{"class":46},"             NetworkOverrideClockTime(data.hours, data.mins, 0)\n",[40,1165,1167],{"class":42,"line":1166},58,[40,1168,524],{"class":46},[40,1170,1172],{"class":42,"line":1171},59,[40,1173,1174],{"class":46},"     end)\n",[40,1176,1178,1180,1183],{"class":42,"line":1177},60,[40,1179,372],{"class":50},[40,1181,1182],{"class":46}," -113,7 +122,7 ",[40,1184,451],{"class":50},[40,1186,1188],{"class":42,"line":1187},61,[40,1189,1137],{"class":46},[40,1191,1193],{"class":42,"line":1192},62,[40,1194,1195],{"class":46},"         while true do\n",[40,1197,1199],{"class":42,"line":1198},63,[40,1200,1201],{"class":46},"             Wait(5) --increase this timer to reduce resource usage. but this may cause jumping clouds.\n",[40,1203,1206,1208],{"class":1204,"line":1205},[42,423,852],64,[40,1207,364],{"class":50},[40,1209,1210],{"class":857},"            if not time_transition and not self.freeze and not forcedInstantTimeUpdate then\n",[40,1212,1215,1217],{"class":1213,"line":1214},[42,423,472],65,[40,1216,368],{"class":50},[40,1218,1219],{"class":57},"            if not PauseSync.state and not time_transition and not self.freeze and not forcedInstantTimeUpdate then\n",[40,1221,1223],{"class":42,"line":1222},66,[40,1224,1225],{"class":46},"                 NetworkOverrideClockTime(self.hours, self.mins, 0)\n",[40,1227,1229],{"class":42,"line":1228},67,[40,1230,462],{"class":46},[40,1232,1234],{"class":42,"line":1233},68,[40,1235,524],{"class":46},[40,1237,1239,1241,1244],{"class":42,"line":1238},69,[40,1240,372],{"class":50},[40,1242,1243],{"class":46}," -146,6 +155,7 ",[40,1245,451],{"class":50},[40,1247,1249],{"class":42,"line":1248},70,[40,1250,552],{"emptyLinePlaceholder":551},[40,1252,1254],{"class":42,"line":1253},71,[40,1255,1256],{"class":46},"     local start_time = GetGameTimer()\n",[40,1258,1260],{"class":42,"line":1259},72,[40,1261,1262],{"class":46},"     while GetGameTimer() - start_time \u003C (transition_speed*1000) do\n",[40,1264,1267,1269],{"class":1265,"line":1266},[42,423,472],73,[40,1268,368],{"class":50},[40,1270,903],{"class":57},[40,1272,1274],{"class":42,"line":1273},74,[40,1275,1276],{"class":46},"         local progress = (GetGameTimer() - start_time) / (transition_speed*1000)\n",[40,1278,1280],{"class":42,"line":1279},75,[40,1281,1282],{"class":46},"         local total_seconds = (current_total_seconds + ((target_total_seconds - current_total_seconds) * progress)) % 86400\n",[40,1284,1286],{"class":42,"line":1285},76,[40,1287,552],{"emptyLinePlaceholder":551},[40,1289,1291,1293,1296],{"class":42,"line":1290},77,[40,1292,372],{"class":50},[40,1294,1295],{"class":46}," -157,6 +167,7 ",[40,1297,451],{"class":50},[40,1299,1301],{"class":42,"line":1300},78,[40,1302,1303],{"class":46},"         if forcedInstantTimeUpdate then break end\n",[40,1305,1307],{"class":42,"line":1306},79,[40,1308,1309],{"class":46},"         Wait(0)\n",[40,1311,1313],{"class":42,"line":1312},80,[40,1314,539],{"class":46},[40,1316,1319,1321],{"class":1317,"line":1318},[42,423,472],81,[40,1320,368],{"class":50},[40,1322,1323],{"class":57},"    if PauseSync.state then return end\n",[40,1325,1327],{"class":42,"line":1326},82,[40,1328,1329],{"class":46},"     if forcedInstantTimeUpdate then NetworkOverrideClockTime(self.hours, self.mins, 0) return end\n",[40,1331,1333],{"class":42,"line":1332},83,[40,1334,1335],{"class":46},"     NetworkOverrideClockTime(data.hours, data.mins, data.seconds or 0)\n",[40,1337,1339],{"class":42,"line":1338},84,[40,1340,1341],{"class":46}," end\n",[40,1343,1345,1347,1350],{"class":42,"line":1344},85,[40,1346,372],{"class":50},[40,1348,1349],{"class":46}," -263,7 +274,7 ",[40,1351,451],{"class":50},[40,1353,1355],{"class":42,"line":1354},86,[40,1356,1357],{"class":46}," CreateThread(function()\n",[40,1359,1361],{"class":42,"line":1360},87,[40,1362,568],{"class":46},[40,1364,1366],{"class":42,"line":1365},88,[40,1367,1368],{"class":46},"         Wait(2000)\n",[40,1370,1373,1375],{"class":1371,"line":1372},[42,423,852],89,[40,1374,364],{"class":50},[40,1376,1377],{"class":857},"        if self.weather then\n",[40,1379,1382,1384],{"class":1380,"line":1381},[42,423,472],90,[40,1383,368],{"class":50},[40,1385,1386],{"class":57},"        if self.weather and not PauseSync.state then\n",[40,1388,1390],{"class":42,"line":1389},91,[40,1391,1392],{"class":46},"             if RainWeathers[self.weather] then\n",[40,1394,1396],{"class":42,"line":1395},92,[40,1397,1398],{"class":46},"                 SetRainLevel(1.0)\n",[40,1400,1402],{"class":42,"line":1401},93,[40,1403,1404],{"class":46},"             else\n",[40,1406,1408,1410],{"class":42,"line":1407},94,[40,1409,430],{"class":50},[40,1411,657],{"class":46},[40,1413,1415,1417],{"class":42,"line":1414},95,[40,1416,438],{"class":50},[40,1418,665],{"class":46},[40,1420,1422,1424,1427],{"class":42,"line":1421},96,[40,1423,372],{"class":50},[40,1425,1426],{"class":46}," -61,4 +61,6 ",[40,1428,451],{"class":50},[40,1430,1432],{"class":42,"line":1431},97,[40,1433,552],{"emptyLinePlaceholder":551},[40,1435,1437],{"class":42,"line":1436},98,[40,1438,1439],{"class":46}," provide 'vSync'\n",[40,1441,1443],{"class":42,"line":1442},99,[40,1444,1445],{"class":46}," provide 'qb-weathersync'\n",[40,1447,1450,1452],{"class":1448,"line":1449},[42,423,852],100,[40,1451,364],{"class":50},[40,1453,1454],{"class":857},"provide 'qbx_weathersync'\n",[40,1456,1458],{"class":42,"line":1457},101,[40,1459,1460],{"class":46},"\\ No newline at end of file\n",[40,1462,1465,1467],{"class":1463,"line":1464},[42,423,472],102,[40,1466,368],{"class":50},[40,1468,1454],{"class":57},[40,1470,1473,1475],{"class":1471,"line":1472},[42,423,472],103,[40,1474,368],{"class":50},[40,1476,708],{"class":57},[40,1478,1481,1483],{"class":1479,"line":1480},[42,423,472],104,[40,1482,368],{"class":50},[40,1484,717],{"class":57},[14,1486,1488],{"id":1487},"check-the-setup","Check the setup",[10,1490,1491],{},"Enter the Activities center, start and leave a night activity, return to the center,\nand leave it. Check noon in the center, midnight during the night activity, clear local\nweather and normal server synchronization after leaving. Repeat during a weather\ntransition and with server time already frozen. Another player outside Activities\nshould retain ordinary server weather/time.",[10,1493,1494],{},"If the console asks you to complete this tutorial, verify both the client edits and the\nmetadata in the selected provider. Changing the metadata alone does not fix its writers.\nReview these changes again when updating that provider.",[14,1496,1498],{"id":1497},"existing-adapters-and-restoration","Existing adapters and restoration",[1500,1501,1502,1513,1527,1537],"ul",{},[390,1503,1504,1505,1508,1509,1512],{},"ESX pauses via ",[22,1506,1507],{},"ToggleWeatherSync"," / ",[22,1510,1511],{},"ToggleTimeSync",". A removable native weather\nlayer preserves the persistent baseline. ESX does not reapply unchanged-zone time\non resume, so Base restores the captured clock plus elapsed game time. Administrator\nchanges during the override are not represented in that snapshot.",[390,1514,1515,1516,1508,1519,1522,1523,1526],{},"Kibook uses ",[22,1517,1518],{},"setMyWeather",[22,1520,1521],{},"setMyTime","; release enables sync and requests\n",[22,1524,1525],{},"weathersync:init"," for current state.",[390,1528,1529,1530,1508,1533,1536],{},"Renewed preserves ",[22,1531,1532],{},"syncWeather",[22,1534,1535],{},"playerWeather",", changes them without replication,\nand restores them plus the captured clock rate on release.",[390,1538,1539],{},"Native uses removable weather/clock overrides and elapsed-clock restoration. There\nis no authoritative server clock when no provider is present.",[10,1541,1542],{},"ESX, Kibook and QB lack prior-pause getters: these adapters assume normal sync on entry\nand enable it on release. Unrelated scripts must not independently own the same clock\nor weather. Native clock pause has no verified getter; Base unpauses on release.",[10,1544,1545,1546,1549],{},"Customer adapters belong in ",[22,1547,1548],{},"sky_base/config/integration/weather/custom.lua"," and define\nthese client-side functions directly, like the fuel adapters:",[1500,1551,1552,1577,1590],{},[390,1553,1554,1557,1558,1561,1562,1565,1566,1568,1569,1572,1573,1576],{},[22,1555,1556],{},"Sky.Functions.AcquireWeatherOverride(weather, hour)"," captures the clock with\n",[22,1559,1560],{},"Sky.Functions.CaptureWeatherState()",", pauses local provider sync and returns that state.\nStore the provider's restoration token in ",[22,1563,1564],{},"state.token",". Return ",[22,1567,312],{}," before\nchanging provider state when acquisition fails. Set ",[22,1570,1571],{},"state.targets = true"," if the provider\nhandles both weather and time; set ",[22,1574,1575],{},"state.deferred = true"," if its initial apply must wait\nfor the provider's state handlers.",[390,1578,1579,1582,1583,1586,1587,187],{},[22,1580,1581],{},"Sky.Functions.ApplyWeatherOverride(weather, hour, state)"," updates the target while\nretaining the same restoration state. Call ",[22,1584,1585],{},"Sky.Functions.ApplyNativeWeatherOverride(weather, hour)","\nfor removable native weather/time overrides, or apply both targets through the provider\nand call ",[22,1588,1589],{},"PauseClock(true)",[390,1591,1592,1595,1596,1599,1600,1602,1603,1606,1607,1610],{},[22,1593,1594],{},"Sky.Functions.ReleaseWeatherOverride(state)"," calls ",[22,1597,1598],{},"Sky.Functions.RestoreWeatherState(state)","\nbefore restoring provider sync from ",[22,1601,1564],{},". The shared helper clears native\noverrides and restores the elapsed clock when ",[22,1604,1605],{},"state.targets"," is absent, and always\nunpauses the clock. Base uses ",[22,1608,1609],{},"RestoreWeatherState(state, true)"," for a stopped provider\nwithout calling its unavailable exports.",[10,1612,1613,1614,1617,1618,119,1620,1622,1623,1625],{},"Acquire/apply must not yield. The manifest loads ",[22,1615,1616],{},"native.lua"," first so its shared helpers\nare available to every adapter. Native-only integrations reuse those functions directly;\nthe custom template fails explicitly until implemented. Consumer resources continue to use\n",[22,1619,191],{},[22,1621,264],{}," and ",[22,1624,292],{},", which own validation,\nscope ownership and resource cleanup.",[14,1627,1629],{"id":1628},"activities-migration-and-editor-ownership","Activities migration and editor ownership",[10,1631,1632,1633,1636,1637,1640,1641,1644,1645,119,1648,1622,1651,1654,1655,1657,1658,1660,1661,1664,1665,1668,1669,1672,1673,1676],{},"Move Activities' old ",[22,1634,1635],{},"Config.Environment.provider"," value to Base's ",[22,1638,1639],{},"Config.weather",".\nMove customer ",[22,1642,1643],{},"ActivityEnvironmentProviders.custom"," callbacks to the direct\n",[22,1646,1647],{},"Sky.Functions.AcquireWeatherOverride",[22,1649,1650],{},"ApplyWeatherOverride",[22,1652,1653],{},"ReleaseWeatherOverride","\nfunctions in ",[22,1656,1548],{},". Acquisition now returns the\ncaptured clock state with the former provider token in ",[22,1659,1564],{},"; apply receives\n",[22,1662,1663],{},"(weather, hour, state)"," and release receives that same state.\nActivities no longer loads ",[22,1666,1667],{},"config/environment.lua",". Update Base and Activities together.\n",[22,1670,1671],{},"Environment.enabled"," remains in ",[22,1674,1675],{},"/activitiesconfig"," with unchanged persistence/defaults.",[10,1678,1679,1680,1683,1684,1686],{},"Job Configurator impact: provider selection/callbacks are plaintext-only bootstrap\nintegration settings. Base has no ",[22,1681,1682],{},"/jobconfig"," registration; Activities keeps its existing\nfeature switch in ",[22,1685,1675],{},". No persisted setting key or SQL migration changes.",[14,1688,1690],{"id":1689},"source-and-test-boundary","Source and test boundary",[10,1692,1693,1694,1697,1698,119,1701,64,1704,1707,1708,119,1711,1714,1715,1718,1719,1714,1722,1718,1725,1714,1728,1731,1732,1735,1736,1707,1739,1742,1743,1746,1747,187],{},"Cfx revision ",[358,1695,1696],{},"e34d12cd9a39cc223548a5be1ab09f60e9183051"," inspected:\n",[22,1699,1700],{},"ext/natives/natives_stash/gta_universal.lua",[22,1702,1703],{},"ext/natives/codegen_out_lua.lua",[22,1705,1706],{},"code/components/citizen-scripting-lua/src/LuaScriptNatives.cpp","\n(",[22,1709,1710],{},"LuaScriptNativeContext::PushArgument",[22,1712,1713],{},"Lua_DoInvokeNative","),\n",[22,1716,1717],{},"code/components/scripting-gta/src/ScriptEngine.cpp"," (",[22,1720,1721],{},"CallNativeHandlerRage",[22,1723,1724],{},"code/components/extra-natives-five/src/TimeExtraNatives.cpp",[22,1726,1727],{},"SetMillisecondsPerGameMinute",[22,1729,1730],{},"code/components/citizen-scripting-core/src/ResourceScriptFunctions.cpp",", and\n",[22,1733,1734],{},"code/components/citizen-scripting-core/src/MetadataScriptFunctions.cpp"," (metadata lookup),\n",[22,1737,1738],{},"code/components/citizen-scripting-core/src/ResourceScriptingComponent.cpp",[22,1740,1741],{},"CreateEnvironments"," loads shared scripts before the ordered client script list),\n",[22,1744,1745],{},"data/shared/citizen/scripting/lua/scheduler.lua"," (event/export dispatch and state bags).\nOfficial client weather/clock signatures and shared resource lookup/metadata/invocation\nsignatures were checked. Lua booleans marshal as 0/1, clock arguments as integers,\nrain as a float; these calls have no pointer outputs. Native overrides are client-local,\nwith no server RPC. Renewed uses explicit ",[22,1748,1749],{},"state:set(..., false)",[10,1751,1752,1753,1755,1756,1707,1759,119,1762,1765,1766,1707,1769,1772],{},"For the ",[22,1754,154],{}," migration, ",[22,1757,1758],{},"ResourceScriptFunctions.cpp",[22,1760,1761],{},"GET_INVOKING_RESOURCE",[22,1763,1764],{},"GET_CURRENT_RESOURCE_NAME",") and ",[22,1767,1768],{},"scheduler.lua",[22,1770,1771],{},"funcref_mt"," packing/invocation) were rechecked at that revision. The functions remain\nin Base's runtime and retain the caller's resource context after the namespace change.\nThe existing environment contracts pass for all six providers using the manifest's\nactual adapter load order. The local ESX server is reachable, but no client is connected\nfor a live weather/rendering check.",[10,1774,1775],{},"Observed server: FXServer 36897. The cached Cfx revision is not proven to match that\nartifact or the connected client. GTA weather/clock internals are proprietary; source\nand mocked contracts do not prove engine rendering. Activities contracts exercise all\nsix adapters and lifecycle/ownership. Actual upstream coroutine reproductions fail\nbefore and pass after the provider changes shown above. No performance claim or profiler measurement is made.",[1777,1778,1779],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":36,"searchDepth":43,"depth":94,"links":1781},[1782,1783,1784,1788,1789,1790,1791],{"id":16,"depth":94,"text":17},{"id":158,"depth":94,"text":159},{"id":349,"depth":94,"text":350,"children":1785},[1786,1787],{"id":128,"depth":100,"text":385},{"id":720,"depth":100,"text":721},{"id":1487,"depth":94,"text":1488},{"id":1497,"depth":94,"text":1498},{"id":1628,"depth":94,"text":1629},{"id":1689,"depth":94,"text":1690},"Configure local weather and time in Sky Base, prepare QB WeatherSync or CD EasyTime, and migrate Activities settings.","md",null,{},"/docs/base/weather-integrations",{"title":5,"description":1792},{"loc":1796},"1.docs/base/5.weather-integrations","NOOD6yhI1O_n7y6pPTDq6e-pPZaDhE7oRwl1HN2GJbU",[1802,1807],{"title":1803,"path":1804,"stem":1805,"description":1806,"children":-1},"Callbacks","/docs/base/api/callbacks","1.docs/base/5.api/7.callbacks","Register server callbacks in the existing Sky callback owner.",{"title":1808,"path":1809,"stem":1810,"description":1811,"icon":1812,"children":-1},"Customization","/docs/base/customization","1.docs/base/customization","Configure Sky Base interfaces and use inventory images in Sky resources.","i-lucide-puzzle",[],1792607401796]