F.A.Q
Setup
1Config.Locale = 'en'Only if Config.EnableDB = true (default). With the database enabled, the server temperature persists across restarts. Set Config.EnableDB = false to run without it, temperature resets to Config.DefaultTemperature on each restart.
Yes. The system reads GTA's native weather state via GetPrevWeatherTypeHashName(). Any script that changes the game weather (vSync, qb-weathersync, cd_easytime, renewed-weathersync, etc.) works without any integration.
Set Config.RequiredItem to an inventory item name:
1Config.RequiredItem = 'survival_watch'The HUD only appears when the player has the item in inventory. Set to false for always visible.
Add an entry to Config.ItemBuffs in shared/config.lua:
1['hot_chocolate'] = {
2 buff = 6.0,
3 duration = 8,
4 notification = "item_buff_bag",
5 progressBar = {
6 duration = 4000,
7 label = 'Drinking Hot Chocolate...',
8 useWhileDead = false,
9 canCancel = true,
10 disable = { move = false, car = true, combat = true },
11 anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle' },
12 prop = { model = `prop_fib_coffee`, pos = vec3(0.01, 0.01, -0.06), rot = vec3(5.0, 5.0, -180.5) }
13 }
14},The item name must match the inventory item name. Registered as usable automatically on resource start.
Edit Config.ClothesBonus in shared/config.lua. Enable Config.Debug and use /tempclothes in-game to see each drawable ID and its current bonus:
1Config.ClothesBonus["male"]["torso"][17] = 8 -- heavy jacket = +8 warmth
2Config.ClothesBonus["male"]["tops"][15] = -2 -- light t-shirt = -2 coolingTemperature
Ambient is the raw weather-based value calculated by the server. Perceived is what the player feels, ambient plus all modifiers: clothing, vehicle insulation, interior bonus, wetness, fire/AC proximity, zones, items, night time, and vehicle climate control.
Instead of a flat offset, the interior bonus pulls perceived temp towards Config.InteriorBonus.targetTemp (default 22.0). The strength controls how hard it pulls, at 0.5, perceived temp moves halfway to the target. So if it's freezing outside, being indoors warms you up; if it's scorching, indoors cools you down.
Between 21:00 and 06:00 (game time), a flat -4 degree penalty is applied to perceived temperature.
Players get wet from rain (when not sheltered, in an interior, or in a closed vehicle) and from swimming. Wetness scales from 0.0 to 1.0. At 100% wetness, Config.Wetness.TemperatureMalus (-8.0 by default) is applied. Drying is faster near heat sources or with the vehicle heater active.
Health damage starts when perceived temperature exceeds Config.DamageThresholds.hot (42.0) or drops below Config.DamageThresholds.cold (-5.0). Damage ticks every Config.DamageInterval ms (15s). Hunger and thirst also drain, computed server-side with a 10-second per-player rate limit.
Vehicle Climate
Press J (default) while in a vehicle with the engine running. The vehicle must not be blacklisted. Rebindable in FiveM keybind settings.
Priority: model override > vehicle class > default. Available themes: 'utility', 'minimal', 'luxury', 'retro'.
Add the vehicle class to Config.VehicleClimateBlacklist.classes or the model hash to Config.VehicleClimateBlacklist.models:
1Config.VehicleClimateBlacklist.models[`golf`] = trueZones
Add an entry to Config.TemperatureZones. Three shapes available:
1-- Sphere
2{ type = 'sphere', modifier = -12.0, coords = vec3(x, y, z), radius = 50.0, dynamic = true, debug = false, showNotification = true, showBlip = true, blipName = "Ice Lake" }
3
4-- Box
5{ type = 'box', modifier = 15.0, coords = vec3(x, y, z), size = vec3(20, 20, 10), rotation = 0, dynamic = true, debug = false, showNotification = true, showBlip = false, blipName = "Foundry" }
6
7-- Polygon
8{ type = 'poly', modifier = -10.0, points = { vec3(...), vec3(...), ... }, thickness = 20.0, dynamic = true, debug = false, showNotification = true, showBlip = false, blipName = "Mountain" }Set debug = true to visualize zone boundaries during testing.
Integration
1exports.ml_climaticvitals:hideweatherhud(true) -- hide
2exports.ml_climaticvitals:hideweatherhud(false) -- showIf Config.ForceShowWidget = true, hide requests are blocked.
1exports.ml_climaticvitals:SetClimaticState(false) -- pause everything
2exports.ml_climaticvitals:SetClimaticState(true) -- resumeUpdates
- Download latest from CFX Portal
- Backup
shared/config.luaandopen/*.lua - Replace all files except config and open folder
- Restart the resource
The database table uses CREATE TABLE IF NOT EXISTS: no migration needed. The script checks for updates on startup and prints the changelog if a new version is available.