Configuration Reference
Every setting in oxide-weather, what it does, its default and allowed range — plus how database-backed settings, the /weather settings editor and restart-only values work.
Every setting in oxide-weather, what it does, and the value it ships with. Start with How configuration is stored — the resource saves its settings in your database, so editing the config files does not always do what you expect.
How Configuration Is Stored
This is the most important thing to understand before you change anything.
- Before the first start,
oxide-weatherreads its settings from the files in theshared/folder. - On the first start, it copies every setting from those files into a database table called
oxide_settings. - From then on, the database is the source of truth. Editing the files after the first start changes nothing, because the value already lives in the database and the database wins.
So there are two ways to work:
- First-time setup: edit the files in
shared/before you first start the resource. Your values are imported automatically. - Changing a setting later: run
/weather settingsin game as an admin. The menu edits the database directly, live. No file editing.
Your region shapes are stored separately from settings, in the world snapshot. Once you have saved a region in /weather zones, the shapes in shared/regions_config.lua are no longer used. They are starting points for a fresh database, not a map you are locked into.
If a saved value ever turns out to be unusable, oxide-weather falls back to the value that shipped, writes a warning to the console naming the setting, and repairs the stored value.
The Settings Menu
/weather settings opens a searchable editor with two tabs, Basic and Advanced, grouped like this:
| Group | Covers |
|---|---|
| Weather | Automatic weather, the change interval, the transition pattern, allowed weather types, forecast length |
| Clock | Timescale, freezing, clock mode and the night cycle |
| Broadcast | The weather app, widget, alerts and their timing, and the shared map mode |
| Exposure | Shelter detection and clothing insulation |
| Roads | Surface wetness and ice simulation |
| Real world | Mirroring the weather of a real city through Open-Meteo |
| Rendering | Snow visuals, wind, visibility effects, the transition time and whether blackouts affect vehicles |
| Climate | Seasons, temperature and snow accumulation |
| Fronts | Moving fronts, automatic routes and lightning |
| Regions | Regional blending and climate profiles |
| Runtime | Startup defaults, synchronisation and saving |
Region boundaries do not appear here. The menu shows a note pointing you at /weather zones, which is where you draw them.
Every field you have altered shows a Changed badge, and fields that only apply after a restart show a Restart required badge, so you can always see what you have changed and what is still waiting. Each field has a reset button that puts it back to the shipped value.
Which Settings Need a Restart
Most settings apply the moment you save them. Some rebuild the whole simulation and only take effect on a restart of the resource. The menu marks those clearly and tells you after you save.
Apply immediately:
| Setting | Group |
|---|---|
Config.DynamicWeather | Weather |
Config.WeatherInterval | Weather |
Config.TimeScale | Clock |
Config.FreezeTime | Clock |
Config.Clock | Clock |
Config.Broadcast | Broadcast |
Config.MapMode | Broadcast |
Config.Exposure | Exposure |
Config.Roads | Roads |
Config.RealWorld | Real world |
Everything else needs restart oxide-weather.
Some of these changes can conflict with the saved world. Examples are removing a weather type that is current or in a forecast, deleting a climate that a region uses, or lowering a limit below what already exists. When that happens, the saved world is set aside and the resource starts fresh. See My regions and weather reset after a restart.
shared/config.lua
The core clock and weather settings.
Time
| Setting | Type | Default | Description |
|---|---|---|---|
Config.DefaultTime.hour | number | 12 | The hour the world starts at when there is no saved world to restore. 0-23 |
Config.DefaultTime.minute | number | 0 | The minute it starts at. 0-59 |
Config.TimeScale | number | 30 | Game minutes per real minute during the day. At 30, a full day takes 48 real minutes. Allowed 0.01-1440 |
Config.FreezeTime | boolean | false | Start with the clock stopped |
Config.Clock.mode | string | 'game' | 'game' runs its own clock. 'realtime' mirrors real-world time |
Config.Clock.nightScale | number | 30 | Game minutes per real minute during the night. Set it higher than TimeScale to make nights pass quicker. Allowed 0.01-1440 |
Config.Clock.nightStart | number | 21 | The hour night begins. 0-23 |
Config.Clock.nightEnd | number | 6 | The hour night ends. 0-23. Must differ from nightStart |
Config.Clock.utcOffset | number | 0 | Minutes to add to UTC in real-time mode. -300 is UTC-5. There is no automatic daylight saving. Allowed -720 to 840 |
Config.DefaultTime = {
hour = 12,
minute = 0
}
-- Game minutes per real minute (default: 30 = 1 real minute = 30 game minutes)
Config.TimeScale = 30
-- Real-time mirror uses UTC plus this fixed minute offset (no automatic DST).
Config.Clock = { mode = 'game', nightScale = 30, nightStart = 21, nightEnd = 6, utcOffset = 0 }
-- Start with time frozen
Config.FreezeTime = falseTo make nights short, leave TimeScale at 30 and raise nightScale. At nightScale = 120, the nine-hour night passes in about 4.5 real minutes while the day still takes 30.
Weather
| Setting | Type | Default | Description |
|---|---|---|---|
Config.DefaultWeather | string | 'CLEAR' | The weather the world starts with when there is no saved world to restore |
Config.DynamicWeather | boolean | true | Whether weather changes on its own. Off means the weather stays where you set it |
Config.WeatherInterval | number | 15 | Real minutes between weather changes, in every region. Allowed 0.017-10080 |
Config.WeatherTransitionTime | number | 30 | Seconds a weather change takes to blend on screen. 0 snaps instantly. Allowed 0-600 |
Config.SyncInterval | number | 1000 | Milliseconds between server simulation ticks. Leave alone unless you know why you are changing it. Allowed 100-60000 |
Config.ClientSyncInterval | number | 1000 | Milliseconds between checks on each player's game. The clock runs at the server speed on its own between checks and is only rewritten if it has drifted. Never runs every frame. Allowed 100-60000 |
Config.ForecastSyncInterval | number | 10000 | Milliseconds between forecast countdown updates. Exports and the app calculate live values regardless. Allowed 1000-60000 |
Config.DefaultWeather = 'CLEAR'
Config.DynamicWeather = true
Config.WeatherInterval = 15
Config.WeatherTransitionTime = 30
Config.SyncInterval = 1000
Config.ClientSyncInterval = 1000
Config.ForecastSyncInterval = 10000Blackout
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Blackout | boolean | false | Start with the power out |
Config.BlackoutAffectsVehicles | boolean | true | Whether vehicle lights go out during a blackout too |
Config.Blackout = false
Config.BlackoutAffectsVehicles = trueWeather types and transitions
Config.WeatherTypes is the pool of weather the simulation may use. Remove anything you never want to see. CLEAR must stay in the list, because it is the fallback the resource falls back to if anything goes wrong.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.WeatherTypes | table | 15 types | The allowed weather pool. Must include CLEAR |
Config.WeatherTransitions | table | see file | For each weather, the list of what it can turn into next and how likely each is |
Config.WinterTransitions | table | see file | Extra snow-bound routes, added on top of the base pattern |
Config.DynamicSnow | boolean | false | Fold the winter routes into the base pattern all year round |
The 15 shipped types:
CLEAR, EXTRASUNNY, CLOUDS, OVERCAST, RAIN, CLEARING, THUNDER, SMOG, FOGGY, XMAS, SNOWLIGHT, BLIZZARD, SNOW, NEUTRAL, HALLOWEEN
A transition entry looks like this. The weight numbers are relative, so a weight of 30 next to a weight of 10 is three times as likely:
Config.WeatherTransitions = {
OVERCAST = {
{ weather = 'OVERCAST', weight = 20 }, -- stay overcast
{ weather = 'CLOUDS', weight = 25 },
{ weather = 'RAIN', weight = 30 }, -- most likely
{ weather = 'THUNDER', weight = 15 },
{ weather = 'CLEARING', weight = 10 },
},
-- ...one entry per weather type
}When seasons are on, Config.DynamicSnow is mostly redundant. A season that allows snow adds the winter routes automatically, and a season that does not strips every snow type out of the pool. Leave DynamicSnow off unless you have turned seasons off and still want snow to appear on its own.
Forecast
| Setting | Type | Default | Description |
|---|---|---|---|
Config.ForecastLength | number | 4 | How many weather changes ahead are decided and published. Higher gives longer warnings and a longer radar horizon. Allowed 1-24 |
Config.ForecastLength = 4Snow rendering
How snow looks. How much snow there is lives under Snow accumulation.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Snow.Ground | boolean | true | Draw snow-covered ground |
Config.Snow.VehicleTrails | boolean | true | Vehicles leave tracks in the snow |
Config.Snow.Footprints | boolean | true | Players leave footprints in the snow |
Config.Snow.EffectScale | number | 0.35 | How strong the falling-snow effect is, 0-1. The game's full strength is very heavy |
Config.Snow.NightMultiplier | number | 0.4 | The effect is scaled by this at night, easing in through dawn and dusk. 0-1 |
Config.Snow.RenderWeather | string or false | 'XMAS' | Which snow weather's visuals to use for all snow. XMAS avoids the heavy ground mist. false uses each weather's own look. The simulation still reports the real weather |
Config.Snow.XmasFallback | string or false | false | Substitute for XMAS if it causes problems. 'SNOW', 'SNOWLIGHT' or 'BLIZZARD'. The server still reports XMAS |
Config.Snow.ExcludeCayo | boolean | true | Keep snow off Cayo Perico |
Config.Snow.CayoWeather | string | 'CLEAR' | What Cayo Perico shows instead of snow. May not itself be a snow type |
Config.Snow.CayoBounds | table | see below | The box treated as Cayo Perico, by position. Works whether or not the island is loaded |
Config.Snow = {
Ground = true,
VehicleTrails = true,
Footprints = true,
EffectScale = 0.35,
NightMultiplier = 0.4,
RenderWeather = 'XMAS',
XmasFallback = false,
ExcludeCayo = true,
CayoWeather = 'CLEAR',
CayoBounds = { minX = 3000.0, maxX = 6500.0, minY = -7000.0, maxY = -3500.0 },
}Wind
The fallback wind, used where no region supplies its own.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Wind.Speed | number | 1.0 | Metres per second, 0-12 |
Config.Wind.Direction | number | 0.0 | Bearing in degrees. 0 north, 90 east, 180 south, 270 west |
Config.Wind = {
Speed = 1.0,
Direction = 0.0,
}Persistence
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Persistence.Enabled | boolean | true | Save the world to the database. Turning this off means every restart begins from the startup defaults, and the oxide_weather_state table is not needed |
Config.Persistence.Key | string | 'global' | The name this server's saved world is stored under. Give each server its own key if several share one database. Up to 64 characters |
Config.Persistence.SaveInterval | number | 30 | Seconds between checkpoints. Changes are also saved immediately as they happen. Allowed 1-3600 |
Config.Persistence.RetryInterval | number | 60 | Seconds to wait before trying again after a database error. Allowed 5-3600 |
Config.Persistence = {
Enabled = true,
Key = 'global',
SaveInterval = 30,
RetryInterval = 60,
}Trusted resources
Config.SetterResources is the list of other resources allowed to change the weather through the API. Anything not on this list can read but never write.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.SetterResources | table | one entry | Resource name to true. Only listed resources may change weather, time, seasons, fronts, blackouts or scene locks |
Config.SetterResources = {
['oxide-developer'] = true,
}It ships with a single entry for an Oxide admin tool. If you do not run that resource, the entry does nothing at all. Leave it or remove it as you prefer.
To let one of your own scripts change the weather, add its exact folder name:
Config.SetterResources = {
['oxide-developer'] = true,
['my-event-script'] = true,
}After the first start, add it in /weather settings instead: search for Trusted automation resources, add the resource with Allow weather setters on, save, then run restart oxide-weather. This list only applies after a restart.
Being on the list is not a free pass. If the call carries a player, that player must also be a server admin. See API Reference → Permissions for writes.
Shared map mode
Config.MapMode chooses which map the zone editor and the radar draw on. o-link owns the artwork and calibration, so this only picks a mode.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.MapMode | string | 'inherit' | inherit, combined, separate, or disabled (mainland only). inherit follows the server-wide default set with olink:mapmode |
Config.MapMode = 'inherit'This value is saved in oxide_settings like every other setting, and applies live. Change it under Broadcast in /weather settings, or with oxide-weather:mapmode <value> from the server console (prefix it with / in game as an admin). What each mode looks like is covered by o-link's shared map documentation.
shared/regions_config.lua
Weather regions and climates.
Regional blending
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Regional.Enabled | boolean | true | Turn regions on. Off means one weather for the whole map |
Config.Regional.BlendWidth | number | 200.0 | Metres either side of a boundary that blend, unless a region overrides it. Allowed 1-2000 |
Config.Regional.UpdateInterval | number | 100 | Milliseconds between blend updates on a player's game. Allowed 50-1000 |
Config.Regional.BlendSeconds | number | 6.0 | Seconds a full weather blend takes when crossing a region or a front. Allowed 0.1-60 |
Config.Regional.WindSmoothingSeconds | number | 2.0 | Seconds the wind takes to ease to a new value. Allowed 0.1-30 |
Config.Regional.MaxZones | number | 32 | The most regions you may have. Allowed 1-32 |
Config.Regional.MaxPoints | number | 64 | The most corners one region may have. Allowed 3-64 |
Config.Regional = {
Enabled = true,
BlendWidth = 200.0,
UpdateInterval = 100,
BlendSeconds = 6.0,
WindSmoothingSeconds = 2.0,
MaxZones = 32,
MaxPoints = 64,
}Climate profiles
A climate reweights how likely each weather is. A weight of 2.0 makes that weather twice as likely there. A weight of 0.25 makes it four times less likely. Anything not listed keeps its normal chance.
| Field | Type | Description |
|---|---|---|
label | string | The name shown to players and admins. Up to 60 characters |
defaultWeather | string | The weather a region using this climate starts with |
weights | table | Weather name to multiplier, 0-100 |
wind.speed | number | Metres per second, 0-12 |
wind.direction | number | Bearing in degrees, 0-360 |
WeatherTransitions | table | Optional. A completely separate transition pattern for this climate |
Five ship by default:
| Id | Label | Default weather | Wind | Character |
|---|---|---|---|---|
temperate | Temperate | CLEAR | 1.5 m/s at 225 | No adjustment |
arid | Dry inland | EXTRASUNNY | 2.5 m/s at 270 | Much more sun, much less rain, thunder and fog |
coastal | Cool coast | CLOUDS | 3.0 m/s at 240 | More cloud, overcast, rain and fog |
alpine | Alpine | OVERCAST | 4.0 m/s at 300 | More overcast, fog, rain and snow |
marine | Open water | CLEAR | 5.0 m/s at 250 | More cloud and fog, almost no smog |
Config.Climates = {
arid = {
label = locale("climate.arid"), defaultWeather = 'EXTRASUNNY',
weights = { CLEAR = 2.0, EXTRASUNNY = 3.0, RAIN = 0.25, THUNDER = 0.2, FOGGY = 0.3 },
wind = { speed = 2.5, direction = 270.0 },
},
-- ...
}A climate id must be lowercase letters, digits and hyphens, must start with a letter, can be up to 40 characters, and cannot be global. There must always be a temperate climate. If you delete it, one is recreated for you.
Starting regions
Config.Zones are the regions a fresh database starts with. Once you have saved anything in /weather zones, these are no longer read.
| Field | Type | Default | Description |
|---|---|---|---|
id | string | required | Unique name. Lowercase letters, digits and hyphens, starting with a letter, up to 40 characters. Cannot be global |
label | string | required | The name shown to players. 1 to 60 characters |
climate | string | required | Which climate profile this region uses |
color | string | '#57c6c5' | Colour on the map, as #rrggbb |
priority | number | 0 | Higher wins where regions overlap. Equal priorities blend. Allowed -1000 to 1000 |
polygon.points | table | required | The shape, as a list of { x, y } corners. 3 to 64 of them, no two the same, the shape may not cross itself, and it must enclose at least 25 square metres |
enabled | boolean | true | Turn a region off without deleting it |
blendWidth | number | Config.Regional.BlendWidth | This region's own soft edge, in metres. Allowed 1-2000 |
weatherInterval | number | Config.WeatherInterval | This region's own change interval, in real minutes |
dynamicWeather | boolean | Config.DynamicWeather | Whether this region changes weather on its own |
wind | table | the climate's wind | This region's own wind, overriding the climate's |
Six regions ship: city, sandy, paleto and cayo (priority 0), chiliad and zancudo (priority 10).
| Id | Label | Climate | Priority |
|---|---|---|---|
city | Los Santos | temperate | 0 |
sandy | Sandy Shores | arid | 0 |
paleto | Paleto Bay | coastal | 0 |
cayo | Cayo Perico | temperate | 0 |
chiliad | Mount Chiliad | alpine | 10 |
zancudo | Fort Zancudo | coastal | 10 |
Config.Zones = {
{ id = 'city', label = locale("region.city"), climate = 'temperate', color = '#57c6c5', priority = 0,
polygon = { points = { { x = -3200, y = -3800 }, { x = 2000, y = -3800 }, { x = 3400, y = 1200 },
{ x = -1400, y = 1200 }, { x = -2900, y = 900 } } } },
-- ...
}Anywhere no region covers, such as open ocean, uses the global weather. Draw a region in /weather zones if you want somewhere uncovered to have its own.
shared/climate_config.lua
Seasons, temperature and snow accumulation.
Season handling
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Climate.Enabled | boolean | true | Turn seasons, temperature and snow accumulation on. Off means no temperature readings and no snow build-up |
Config.Climate.Mode | string | 'game' | 'game' advances with the in-game calendar. 'calendar' follows the real-world month. 'manual' stays put |
Config.Climate.DefaultSeason | string | 'spring' | Which season a fresh world starts in |
Config.Climate.DaysPerSeason | table | 7 each | In-game days per season in game mode. Allowed 1-365 each |
Config.Climate.CalendarUTC | boolean | false | In calendar mode, follow UTC instead of the server machine's own clock |
Config.Climate.Hemisphere | string | 'north' | 'south' flips the calendar so December is summer |
Config.Climate.DisplayUnit | string | 'F' | 'C' or 'F'. Only changes what is shown. Other resources always receive Celsius |
Config.Climate = {
Enabled = true,
Mode = 'game',
DefaultSeason = 'spring',
DaysPerSeason = { spring = 7, summer = 7, autumn = 7, winter = 7 },
CalendarUTC = false,
Hemisphere = 'north',
DisplayUnit = 'F',
-- ...
}Season profiles
| Field | Type | Description |
|---|---|---|
temperature | number | The baseline temperature in Celsius for that season. Allowed -50 to 50 |
snow | boolean | Whether snow weather may appear at all. When false, every snow type is removed from the pool and anything already snowing clears |
weights | table | Weather name to multiplier, 0-100, applied on top of the region's own climate weights |
| Season | Baseline | Snow | Weights |
|---|---|---|---|
spring | 16.0 | false | Rain 1.5, clouds 1.3, extra sunny 0.8 |
summer | 28.0 | false | Clear 1.8, extra sunny 2.5, rain 0.4, fog 0.5 |
autumn | 13.0 | false | Overcast 1.6, rain 1.6, fog 1.4, extra sunny 0.5 |
winter | -2.0 | true | Overcast 1.6, snow 2.0, light snow 2.0, blizzard 1.2, extra sunny 0.3 |
Seasons = {
winter = { temperature = -2.0, snow = true,
weights = { OVERCAST = 1.6, SNOW = 2.0, SNOWLIGHT = 2.0, BLIZZARD = 1.2, EXTRASUNNY = 0.3 } },
-- ...
}Temperature model
| Setting | Type | Default | Description |
|---|---|---|---|
Temperature.DailyAmplitude | number | 5.0 | Degrees Celsius above and below the baseline across the day. Allowed 0-30 |
Temperature.WarmestHour | number | 14.0 | The hour of the day that is warmest. Allowed 0-23.99 |
Temperature.LapsePerKm | number | 6.5 | Degrees Celsius cooler per 1000 metres of altitude. Allowed 0-20 |
Temperature.ClimateOffsets | table | see below | Degrees added per climate. Allowed -30 to 30 each |
Temperature.ZoneAltitudes | table | see below | The reference altitude of each region, in metres, used for region-wide readings. Point queries use the real altitude instead. Allowed -500 to 3000 |
Temperature.ZoneOffsets | table | empty | Degrees added per region, on top of everything else. Allowed -30 to 30 |
Temperature.CayoTemperature | number | 26.0 | The tropical baseline used on Cayo Perico instead of the season baseline. Allowed 0-40 |
Temperature.WeatherOffsets | table | see below | Degrees added per weather type. Allowed -30 to 30 |
Shipped climate offsets: temperate 0, arid +5, coastal -2, alpine -6, marine -1.
Shipped region altitudes: city 30, sandy 45, paleto 20, chiliad 650, zancudo 20. A region without an entry, such as cayo, uses 0.
Shipped weather offsets:
| Weather | Offset | Weather | Offset |
|---|---|---|---|
CLEAR | 0.0 | FOGGY | -3.0 |
EXTRASUNNY | +2.0 | XMAS | -4.0 |
CLOUDS | -1.0 | SNOWLIGHT | -3.0 |
OVERCAST | -2.0 | SNOW | -4.0 |
RAIN | -3.0 | BLIZZARD | -7.0 |
CLEARING | -1.0 | NEUTRAL | 0.0 |
THUNDER | -5.0 | HALLOWEEN | -3.0 |
SMOG | +1.0 |
The final result is clamped between -80 °C and 65 °C.
Snow accumulation
| Setting | Type | Default | Description |
|---|---|---|---|
Snow.Enabled | boolean | true | Whether snow builds up at all. Off means snow weather still falls but nothing settles |
Snow.FullCoverMinutes | number | 30.0 | Real minutes to reach full cover while snowing at full rate, at or below freezing. Allowed 0.1-1440 |
Snow.MeltMinutesAt5C | number | 25.0 | Real minutes for full cover to melt away at +5 °C. Warmer melts faster, cooler slower. Allowed 0.1-1440 |
Snow.RainMeltMultiplier | number | 1.5 | How much faster rain melts snow. Allowed 1-10 |
Snow.Rates | table | see below | How fast each snow weather lays snow. Allowed 0-10 each |
Snow.TrackThreshold | number | 0.08 | Cover level at which vehicle tracks and footprints appear. 0-1 |
Snow.GroundThreshold | number | 0.01 | Cover level at which the ground turns white. 0-1 |
Snow.InterpolationSeconds | number | 5.0 | Seconds visible cover takes to ease to a new value. Allowed 0-60 |
Shipped rates: XMAS 1.0, SNOW 1.0, SNOWLIGHT 0.4, BLIZZARD 1.5.
Snow = {
Enabled = true,
FullCoverMinutes = 30.0,
MeltMinutesAt5C = 25.0,
RainMeltMultiplier = 1.5,
Rates = { XMAS = 1.0, SNOW = 1.0, SNOWLIGHT = 0.4, BLIZZARD = 1.5 },
TrackThreshold = 0.08,
GroundThreshold = 0.01,
InterpolationSeconds = 5.0,
}Holiday presets
| Field | Type | Description |
|---|---|---|
season | string | The season forced while the preset is on |
weather | string | The weather forced everywhere |
snowLevel | number | The snow cover forced, 0-1 |
| Preset | Season | Weather | Snow |
|---|---|---|---|
christmas | winter | XMAS | 1.0 |
halloween | autumn | HALLOWEEN | 0.0 |
Holidays = {
christmas = { season = 'winter', weather = 'XMAS', snowLevel = 1.0 },
halloween = { season = 'autumn', weather = 'HALLOWEEN', snowLevel = 0.0 },
}These are the only two presets. You can change what each one does, but other ids are ignored. Turning one on snapshots the world first, so turning it off restores everything exactly.
shared/fronts_config.lua
Moving storms, lightning, blackouts and screen effects.
Fronts
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Fronts.Enabled | boolean | true | Turn moving fronts, lightning and regional blackouts on |
Config.Fronts.SyncInterval | number | 1000 | Milliseconds between front position updates sent to players. Allowed 250-10000 |
Config.Fronts.MaxFronts | number | 8 | The most fronts active at once. Allowed 1-16 |
New front defaults
Used when you spawn a front without specifying everything, and as the automatic front template.
| Setting | Type | Default | Description |
|---|---|---|---|
Defaults.weather | string | 'THUNDER' | The weather the front carries |
Defaults.heading | number | 90.0 | Bearing it travels along. 0 north, 90 east, 180 south, 270 west |
Defaults.speed | number | 12.0 | Metres per second. Allowed 0-100 |
Defaults.radius | number | 900.0 | Metres from the centre where its weather fully applies. Allowed 100-5000 |
Defaults.blendWidth | number | 350.0 | Metres of soft edge. Cannot exceed the radius. Allowed 1-5000 |
Defaults.windLead | number | 500.0 | Metres ahead of the front where wind picks up. Allowed 0-5000 |
Defaults.windSpeed | number | 6.0 | Wind speed inside the front, in metres per second. Allowed 0-12 |
Defaults.duration | number | 1200.0 | Lifetime in seconds. 1200 is 20 real minutes. Allowed 10-7200 |
Defaults.fadeSeconds | number | 20.0 | Seconds to fade in and out. Cannot exceed half the lifetime. Allowed 0-60 |
Defaults.priority | number | 0 | Which front wins where two overlap. Allowed -1000 to 1000 |
Automatic fronts
| Setting | Type | Default | Description |
|---|---|---|---|
Auto.Enabled | boolean | true | Spawn fronts on their own |
Auto.MinMinutes | number | 30 | Shortest gap between automatic fronts, in real minutes. Allowed 1-1440 |
Auto.MaxMinutes | number | 60 | Longest gap. Allowed 1-1440 |
Auto.Weather | table | see below | The weighted pool of weather automatic fronts carry |
Auto.Routes | table | 3 routes | Where they start and which way they travel |
Auto = {
Enabled = true,
MinMinutes = 30, MaxMinutes = 60,
Weather = { { weather = 'RAIN', weight = 55 }, { weather = 'THUNDER', weight = 35 },
{ weather = 'FOGGY', weight = 10 } },
Routes = {
{ coords = { x = -5000.0, y = -1000.0, z = 30.0 }, heading = 90.0 },
{ coords = { x = -5000.0, y = 2800.0, z = 45.0 }, heading = 90.0 },
{ coords = { x = -4000.0, y = 6300.0, z = 20.0 }, heading = 90.0 },
},
},All three shipped routes start well off the west coast and head due east, so storms sweep across the map and off the other side. If you leave Auto.Weather or Auto.Routes empty, automatic fronts turn themselves off and say so in the console.
Lightning
| Setting | Type | Default | Description |
|---|---|---|---|
Lightning.Enabled | boolean | true | Whether lightning strikes at all |
Lightning.MinSeconds | number | 35 | Shortest gap between strikes. Allowed 5-3600 |
Lightning.MaxSeconds | number | 70 | Longest gap. Allowed 5-3600 |
Lightning.Radius | number | 2500.0 | Metres from a strike where players see the flash. Allowed 100-10000 |
Lightning.Flicker | boolean | true | Whether strikes flicker nearby street lights |
Lightning.FlickerMilliseconds | number | 400 | How long the flicker lasts. Allowed 100-3000 |
Lightning.BlackoutChance | number | 0.2 | Chance a strike knocks the region's power out. 0.2 is 20%. One roll per thunder front or exposed region. 0-1 |
Lightning.BlackoutSeconds | number | 120 | How long that outage lasts. Allowed 1-86400 |
Lightning.Exposure | number | 0.65 | How much of a region a front must cover before it can strike there. Allowed 0.01-1 |
Scheduled blackout limits
| Setting | Type | Default | Description |
|---|---|---|---|
Blackouts.MaxSchedules | number | 64 | The most outages queued at once. Allowed 1-128 |
Blackouts.MaxSeconds | number | 86400 | Longest a scheduled outage may last, in seconds. 86400 is 24 hours. Allowed 1-86400 |
Blackouts.MaxDelaySeconds | number | 604800 | Furthest ahead an outage may be scheduled. 604800 is 7 days. Allowed 1-604800 |
Visibility effects
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Visibility.Enabled | boolean | true | Apply a subtle screen filter in heavy weather |
Config.Visibility.FadeSeconds | number | 8.0 | Seconds to fade to about 95% of the target strength. Allowed 0.1-30 |
Config.Visibility.MaxStrength | number | 0.2 | Hardest the effect may ever get, before night and snow reductions. 0-1 |
Config.Visibility.NightMultiplier | number | 0.5 | Scale at night, eased through dawn (06-08) and dusk (18-20). 0-1 |
Config.Visibility.SnowMultiplier | number | 0.25 | Scale as snow blends in, so lingering fog does not wash the screen out. 0-1 |
Config.Visibility.Profiles | table | 3 profiles | Weather to screen filter and strength |
Config.Visibility = {
Enabled = true,
FadeSeconds = 8.0,
MaxStrength = 0.2,
NightMultiplier = 0.5,
SnowMultiplier = 0.25,
Profiles = {
FOGGY = { modifier = 'prologue_ending_fog', strength = 0.15 },
RAIN = { modifier = 'Yacht_Mission_ThunderRain', strength = 0.06 },
THUNDER = { modifier = 'Yacht_Mission_ThunderRain', strength = 0.12 },
},
}oxide-weather only takes the screen filter slot when it is free. If any other resource has claimed it, this feature backs off, and it never clears or adjusts a filter it does not own. If a filter name does not exist in a player's game, it is noted once and skipped.
shared/broadcast_config.lua
The public weather app, widget and alerts.
Public weather service
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Broadcast.Enabled | boolean | true | Master switch for everything public: the app, the widget, alerts and the news report |
Config.Broadcast.Tablet | boolean | true | Register the weather app on the tablet |
Config.Broadcast.Widget | boolean | true | Register the home-screen widget |
Config.Broadcast.Alerts | boolean | true | Issue severe weather alerts |
Config.Broadcast.NotificationSound | boolean | true | Play a sound with alert notifications |
Config.Broadcast.NotificationScope | string | 'local' | 'local' notifies only about a player's own region. 'all' notifies about every region |
Config.Broadcast.MinimumSeverity | number | 2 | Lowest level that notifies. 1 advisory and above, 2 watch and above, 3 warning only |
Config.Broadcast.LookAheadSeconds | number | 900 | How far ahead, in real seconds, an alert may be issued. 900 is 15 real minutes. Allowed 30-3600 |
Config.Broadcast = {
Enabled = true,
Tablet = true,
Widget = true,
Alerts = true,
NotificationSound = true,
NotificationScope = 'local',
MinimumSeverity = 2,
LookAheadSeconds = 900,
}The tablet app and widget need oxide-tablet. Without it, those two switches simply do nothing. Alerts, the radar data and the news report still work and are still readable by other resources.
Timing and limits
These control how often things refresh and how much history is kept. Changing them needs a restart.
| Setting | Type | Default | Description |
|---|---|---|---|
BroadcastLimits.AlertInterval | number | 2000 | Milliseconds between alert recalculations. Allowed 1000-30000 |
BroadcastLimits.AppInterval | number | 5000 | Milliseconds between weather app refreshes. Allowed 2000-60000 |
BroadcastLimits.WidgetInterval | number | 15000 | Milliseconds between widget refreshes. Allowed 5000-120000 |
BroadcastLimits.HistorySeconds | number | 3600 | How long ended alerts stay in the history. Allowed 60-86400 |
BroadcastLimits.MaxAlerts | number | 64 | The most alerts active at once. When more qualify, the weakest are dropped. Allowed 8-128 |
BroadcastLimits.RadarSeconds | number | 900 | How far ahead the radar may project. Allowed 30-3600 |
BroadcastLimits.FrontCoverage | number | 0.35 | How much of a region a storm must cover before it triggers an alert there. Allowed 0.05-0.95 |
Warning rules
Which weather deserves an alert, at what level, and what the alert says.
| Field | Type | Description |
|---|---|---|
severity | number | 1 advisory, 2 watch, 3 warning |
label | string | The short name in the alert title. Up to 60 characters |
advice | string | The line of advice below it. Up to 240 characters |
| Weather | Severity | Reads as |
|---|---|---|
THUNDER | 3 | Thunderstorm warning |
BLIZZARD | 3 | Blizzard warning |
SNOW | 2 | Snow watch |
XMAS | 2 | Snow watch |
RAIN | 1 | Rain advisory |
FOGGY | 1 | Fog advisory |
Config.WeatherWarnings = {
THUNDER = { severity = 3, label = locale("alert.thunder.label"),
advice = locale("alert.thunder.advice") },
-- ...
}Anything not listed never raises an alert. Remove RAIN and FOGGY if you only want alerts for serious weather.
A rule's severity applies in full only when the weather is happening now. Something forecast for later is capped at a watch and promoted to a warning when it actually starts. That is what makes them read like real weather alerts rather than spoilers.
shared/gameplay_config.lua
Shelter detection and road surfaces.
Neither of these does anything on its own. They supply data other resources read. See Features → Shelter and exposure.
Exposure
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Exposure.Radius | number | 80 | Metres. The furthest a player can be from a point and still be asked to check it. Allowed 5-150 |
Config.Exposure.FreshSeconds | number | 30 | How long a cover result stays valid before it is checked again. Allowed 5-120 |
Config.Exposure.LeaseSeconds | number | 5 | How long the server waits for a check to come back. Allowed 1-10 |
Config.Exposure.MaxPoints | number | 512 | The most points tracked at once. Allowed 16-2048 |
Config.Exposure.ProbesPerTick | number | 8 | Checks started per second. Allowed 1-32 |
Config.Exposure.CoveredAreas | table | empty | Shapes always treated as covered. Draw them in the settings menu |
Config.Exposure.Clothing | table | empty | Insulation per character model and torso item, 0-1 |
Config.Exposure = {
Radius = 80, FreshSeconds = 30, LeaseSeconds = 5, MaxPoints = 512, ProbesPerTick = 8,
CoveredAreas = {},
Clothing = {},
}Covered areas are the right fix for anywhere the automatic check gets wrong: interiors, tunnels, multi-storey car parks. Add them under Exposure in /weather settings. Each one is a shape you draw in the world, with a height range, an optional name, and an optional routing bucket if it only applies in one instance. They always beat the automatic check.
Clothing insulation maps a character model and the torso item worn to a value from 0 (no protection) to 1 (fully insulated). It ships empty. The value is decided on the server and handed to whichever resource asked, so a cold-damage script can use it. A player's game never supplies it.
Road surfaces
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Roads.CellSize | number | 500 | Metres per grid cell. Bigger is coarser and cheaper. Allowed 400-2000 |
Config.Roads.TickSeconds | number | 5 | Seconds between grid updates. Allowed 2-30 |
Config.Roads.WetMinutes | number | 8 | Real minutes of rain to fully saturate a road. Allowed 1-60 |
Config.Roads.DryMinutes | number | 25 | Real minutes for a soaked road to dry out. Allowed 1-180 |
Config.Roads.FreezeMinutes | number | 20 | Real minutes at or below 0 °C for full ice. Allowed 1-180 |
Config.Roads.MeltMinutes | number | 15 | Real minutes above freezing for ice to clear. Allowed 1-180 |
Config.Roads.MinX / MaxX | number | -4500 / 7000 | The east-west bounds of the simulated area |
Config.Roads.MinY / MaxY | number | -7500 / 8500 | The north-south bounds |
Config.Roads = { CellSize = 500, TickSeconds = 5, WetMinutes = 8, DryMinutes = 25,
FreezeMinutes = 20, MeltMinutes = 15, MinX = -4500, MaxX = 7000, MinY = -7500, MaxY = 8500 }The grid may not exceed 2048 cells in total. The shipped bounds and cell size produce well under that. If you widen the bounds, raise CellSize to compensate, or the menu refuses the change and the resource falls back to the shipped bounds. Changing CellSize rebuilds the grid, which resets current wetness and ice.
shared/realworld_config.lua
Mirror one real place through Open-Meteo.
Real-world weather
Off by default. When it is on, your server asks Open-Meteo for the current conditions and the next two days of hourly forecast at the location you chose, and every region follows it: the weather type, the temperature, the wind and the forecast queue. Everything here applies live from the settings menu or with /weather realworld.
| Setting | Type | Default | Description |
|---|---|---|---|
Config.RealWorld.Enabled | boolean | false | Mirror a real place. While on, the weather, forecast and front controls are read-only |
Config.RealWorld.Location | string | 'Los Angeles, US' | A city name, optionally followed by a comma and a country (Paris, FR), or coordinates as latitude, longitude (34.05, -118.24). 2 to 120 characters. City names are looked up once and remembered |
Config.RealWorld.PollMinutes | number | 15 | Real minutes between updates. Allowed 5-120. The default makes about 100 requests a day |
Config.RealWorld.SyncClock | boolean | false | Also mirror the location's local time. Switches the clock to the real-time mirror and keeps its UTC offset in step, including daylight saving |
Config.RealWorld = {
Enabled = false,
Location = 'Los Angeles, US',
PollMinutes = 15,
SyncClock = false,
}Open-Meteo reports a standard weather code, which maps to the closest weather type: clear and cloudy skies to EXTRASUNNY, CLEAR, CLOUDS and OVERCAST, drizzle and light rain to CLEARING, rain to RAIN, thunderstorms to THUNDER, fog to FOGGY, and snow to SNOWLIGHT, SNOW or BLIZZARD by intensity. If you removed a type from Config.WeatherTypes, the closest remaining type is used instead.
What is sent, and to whom
Your own server contacts api.open-meteo.com, or customer-api.open-meteo.com when you have set a commercial key, plus geocoding-api.open-meteo.com once for each new city name. The only things it sends are the location you configured and, on the commercial service, your key. No player data leaves the server.
The free service is for non-commercial use and allows 10,000 requests a day; one server at the default interval uses about 100. If your server needs Open-Meteo's commercial service, put your key in server.cfg and it is used automatically:
set openmeteo_api_key "your-key"The key is read from that convar only. It is never read from a config file, never stored in the database and never sent to players.
Attribution
Open-Meteo data is licensed CC BY 4.0. The tablet weather app shows "Weather data by Open-Meteo.com" whenever the mirror is on, which is what the licence asks for. Keep that line if you customise the app.
Weather changes on the real hour, so with the default 30x game clock the sky changes about once every 30 game hours. If you want the in-game day to move with the real one, turn on SyncClock or use /weather clock realtime. Snow still builds up and melts from the real temperature, and the seasons keep whatever mode you chose.
Starting Over
If you want to wipe your settings and re-import from the files in shared/:
stop oxide-weather in the server console.oxide_settings where resource is oxide-weather.start oxide-weather. Everything is re-imported from the files.To also reset the world itself (time, weather, season, snow, storms and your drawn regions), delete the row in oxide_weather_state whose state_key matches your simulation key, global unless you changed it. Do this while the resource is stopped.
Deleting the oxide_weather_state row also deletes any regions you drew in /weather zones.