# Configuration > Configuration reference for ML Radiation Category: RADIATION ZONES · Source: https://miciomods.it/docs/ml-radiation-configuration · Last updated: 2026-07-09 ## Overview - `shared/config.lua`: Core settings, geiger items, battery, player effects, zones, vehicle/clothing protection, cure/immunity items - `server/config_server.lua`: Discord webhooks, admin permissions, rate limiting ## Core Settings **shared/config.lua** ```lua Config.Locale = 'en' Config.Movegeiger = 'movegeiger' Config.Debug = false Config.UseRealTime = false Config.ShowZoneNotifications = true Config.ZoneNotificationDuration = 15000 Config.RequireGameplayReadyGate = false Config.HealthSystemIntegration = false Config.RealTerminalItem = false ``` - `Locale`: Language code for translations - `Movegeiger`: Command to reposition the Geiger Counter HUD on screen - `Debug`: Enable debug prints in console - `UseRealTime`: Use real-world time instead of GTA game time on the Geiger display - `ShowZoneNotifications`: Show notifications when entering/leaving radiation zones (duration set by Config.ZoneNotificationDuration, default 15000 ms). Config.RequireGameplayReadyGate (default false) is an opt-in gate that suspends radiation processing during multicharacter/intro while ml_start reports that gameplay is not yet ready - `HealthSystemIntegration`: Delegate radiation damage and visual effects to `ml_healthsystem`. When true AND ml_healthsystem is running, the export handshake stays active; Config.HealthSystemSettings (disableDamage/disableVisuals) decides whether ml_radiation also cedes damage and visuals to ml_healthsystem. Default false = fully standalone - `RealTerminalItem`: `true` = Advanced mode (multiple Geiger items). Default `false` = Simple mode (single Geiger item), the shipped default ## Geiger Counter Items ### Advanced Mode When `Config.RealTerminalItem = true`, each item opens a different Geiger Counter model and theme: **shared/config.lua** ```lua Config.AdvancedItems = { { item = "geiger_modern_green", model = "model-modern", theme = "theme-green", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_modern_blue", model = "model-modern", theme = "theme-blue", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_modern_orange", model = "model-modern", theme = "theme-orange", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_standard_green", model = "model-standard", theme = "theme-green", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_standard_blue", model = "model-standard", theme = "theme-blue", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_standard_orange", model = "model-standard", theme = "theme-orange", batteryMax = 100, batteryDrain = 0.5 }, { item = "geiger_retro_green", model = "model-retro", theme = "theme-green", batteryMax = 120, batteryDrain = 0.8 }, { item = "geiger_retro_blue", model = "model-retro", theme = "theme-blue", batteryMax = 120, batteryDrain = 0.8 }, { item = "geiger_retro_orange", model = "model-retro", theme = "theme-orange", batteryMax = 120, batteryDrain = 0.8 }, } ``` - `model`: Display mode. Options: - `'model-modern'`, `'model-standard'`, `'model-retro'`: **Overlay mode**: the interface renders as a screen overlay. Player can move freely, no prop or animation. - `'dgm_geiger'`: **DUI Prop mode**: A physical 3D Geiger Counter object spawns and attaches to the player's chest. The interface renders directly onto the prop's texture via DUI texture replacement. The player plays a cellphone animation while holding the device. - `theme`: Color theme. Options: `'theme-green'`, `'theme-blue'`, `'theme-orange'` - `batteryMax`: Maximum battery capacity (default 100, retro models use 120) - `batteryDrain`: Battery units consumed per real-time minute while the Geiger is active ### Simple Mode When `Config.RealTerminalItem = false`, only a single item is used: **shared/config.lua** ```lua Config.SimpleMode = { item = "dgm_geiger", model = "dgm_geiger", theme = "theme-green", batteryMax = 100, batteryDrain = 0.5, } ``` ### Display Modes The `model` field determines how the Geiger Counter is displayed: **Overlay mode** (`model-modern`, `model-standard`, `model-retro`): The Geiger UI renders as a screen overlay positioned via `/movegeiger`. No physical prop is created. The player can move and interact freely. **DUI Prop mode** (`dgm_geiger`): A custom 3D model (`dgm_geiger`) spawns and attaches to the player's chest bone. The interface is rendered in real-time onto the prop's texture using DUI texture replacement. The player plays a holding animation while the Geiger is active. The prop is removed when the Geiger is closed. ## Geiger UI **shared/config.lua** ```lua Config.GeigerUI = { ShowPlayerContaminationOnScreen = true, StatusThresholds = { Warning = 1.0, Danger = 5.0, }, } ``` - `ShowPlayerContaminationOnScreen`: Display the player's personal contamination level on the Geiger UI - `StatusThresholds.Warning`: Radiation level at which the UI shows a warning state - `StatusThresholds.Danger`: Radiation level at which the UI shows a danger state ## Battery System **shared/config.lua** ```lua Config.Battery = { enabled = true, drainPerMinute = 0.5, lowThreshold = 20, rechargeItem = 'battery', rechargeAmount = 50, } ``` - `enabled`: Enable/disable the battery system. When disabled, the Geiger runs indefinitely - `drainPerMinute`: Fallback drain rate (used when the item's `batteryDrain` is not set). Each item in `Config.AdvancedItems` can override this with its own `batteryDrain` - `lowThreshold`: Battery percentage at which a low battery warning notification appears - `rechargeItem`: Inventory item consumed to recharge the battery - `rechargeAmount`: Battery percentage restored per use (capped at 100) Battery level is stored in item metadata (`meta.battery`) and persists across sessions. Drain ticks every 60 seconds while the Geiger is active, and auto-saves every 30 seconds. At 0 battery, the Geiger Counter closes automatically and a notification is shown. Players recharge by using the `rechargeItem` from their inventory. ## Player Effects **shared/config.lua** ```lua Config.PlayerEffects = { Enabled = true, MaxRadiation = 1000.0, IncreaseSpeed = 200, AutoRemove = { Enabled = true, Rate = 1.0, SafeThreshold = 150.0, GracePeriod = 12000, }, Damage = { Enabled = true, Interval = 5000, Thresholds = { { level = 500.0, damage = 1 }, { level = 700.0, damage = 2 }, { level = 850.0, damage = 4 }, { level = 950.0, damage = 8 }, }, }, } ``` - `MaxRadiation`: Maximum radiation a player can accumulate - `IncreaseSpeed`: Higher = slower accumulation (used as a divisor) - `AutoRemove.Enabled`: Radiation decreases naturally when outside zones, but only below `SafeThreshold` and after the `GracePeriod` elapses with no new exposure. Default `true` - `AutoRemove.Rate`: Decrease rate per cycle when auto-remove is enabled. `SafeThreshold` = radiation only decays below this level (lower it for anti-abuse). `GracePeriod` = milliseconds of no new exposure before decay starts (default 12000) - `Damage.Enabled`: Enable periodic health damage from radiation - `Damage.Interval`: Milliseconds between damage ticks - `Damage.Thresholds`: Damage applied at each radiation level. Checked highest-first. ### Visual Effects Screen effects intensify as radiation increases: **shared/config.lua** ```lua Config.PlayerEffects.Visuals = { Enabled = true, Thresholds = { { level = 5.0, effect = "MP_Bull_tost", force = 0.20 }, { level = 25.0, effect = "MP_Bull_tost", force = 0.50 }, { level = 75.0, effect = "MP_Bull_tost", force = 0.85 }, { level = 175.0, effect = "torpedo", force = 0.55 }, { level = 350.0, effect = "torpedo", force = 0.90 }, { level = 550.0, effect = "DRUG_gas_huffin", force = 0.65 }, { level = 800.0, effect = "DRUG_gas_huffin", force = 1.00 }, }, } ``` ### Radiation Sounds The Geiger Counter plays audio based on zone radiation level: **shared/config.lua** ```lua Config.RadiationSounds = { Enabled = true, Thresholds = { { level = 100.0, sound = 'rad_high', volume = 0.4 }, { level = 20.0, sound = 'rad_medium', volume = 0.3 }, { level = 1.0, sound = 'rad_low', volume = 0.2 }, }, } ``` ## Vehicle Protection **shared/config.lua** ```lua Config.VehicleProtection = { Enabled = true, DefaultMultiplier = 0.6, ExcludedClasses = { [8] = true, [13] = true, [14] = true, [15] = true, [16] = false }, SpecificVehicles = { ['insurgent'] = 0.1, ['apc'] = 0.05, ['zentorno'] = 0.5, }, } ``` - `DefaultMultiplier`: Radiation multiplier inside vehicles. `0.4` = player receives that fraction of radiation. Default is 0.6 (player receives 60% = 40% protection); lower it for stronger shielding - `ExcludedClasses`: Vehicle classes with no protection. Default excludes 8 (Motorcycles), 13 (Cycles), 14 (Boats), 15 (Helicopters); 16 (Planes) is set to `false` so planes do protect - `SpecificVehicles`: Override multiplier per vehicle model. `0.1` = 90% protection, `0.05` = 95% protection ## Clothing Protection **shared/config.lua** ```lua Config.ClothingProtection = { Enabled = true, RespectWear = true, Suits = { ['AntiRadSuit660'] = { protection = 0.90, male = { { component = 11, drawable = 660, texture = 0 } }, }, ['AntiRadMask244'] = { protection = 0.60, male = { { component = 1, drawable = 244, texture = 0 } }, }, }, } ``` - `protection`: Percentage of radiation blocked (0.70 = 70% protection) - `male` / `female`: Component/drawable/texture combinations that activate this suit. Add entries for both genders. `RespectWear = true` stops a worn-out suit/mask from protecting (ml_clothing wear). The default config ships AntiRad masks and suits already mapped ## Cure Items **shared/config.lua** ```lua Config.CureItems = { Enabled = true, Items = { { name = "radaway", removeAmount = 550, animation = { duration = 5000, label = 'Taking pills...', dict = 'mp_player_intdrink', clip = 'loop_bottle', prop = { model = `prop_pill_container_01a`, bone = 60309, pos = vec3(0.1, -0.01, 0.0), rot = vec3(0.0, 0.0, -1.0), }, }, }, }, } ``` - `name`: Inventory item name - `removeAmount`: Radiation points removed on use - `animation`: Optional animation with attached prop played during use ## Immunity Items **shared/config.lua** ```lua Config.ImmunityItems = { Enabled = false, Items = { -- { -- name = "iodine_pill", -- protection = 1.0, -- duration = 10, -- animation = { ... }, -- }, }, } ``` - `protection`: Percentage of radiation blocked. `1.0` = 100% protection - `duration`: Duration in minutes. Item is consumed on use. ## Radiation Zones Three zone types are supported. All use `ox_lib` zones internally. ### Sphere Zone **shared/config.lua** ```lua { type = 'sphere', coords = vec3(3559.61, 3775.89, 30.06), radius = 300.0, maxRadiation = 1000.0, dynamic = true, force = 2.5, debug = false, } ``` ### Box Zone **shared/config.lua** ```lua { type = 'box', coords = vec3(447.12, -983.86, 30.68), size = vec3(4.0, 4.0, 10.0), rotation = 45.0, maxRadiation = 8.5, dynamic = false, force = 2.5, debug = false, } ``` ### Poly Zone **shared/config.lua** ```lua { type = 'poly', points = { vec3(-2048.81, 3128.59, 32.81), vec3(-2045.18, 3140.89, 32.81), vec3(-2058.42, 3145.24, 32.81), vec3(-2061.85, 3132.88, 32.81), }, thickness = 15.0, maxRadiation = 50.0, dynamic = true, force = 1.0, debug = false, } ``` - `type`: Zone shape: `'sphere'`, `'box'`, or `'poly'` - `dynamic`: `true` = radiation increases closer to center, `false` = flat radiation throughout - `maxRadiation`: Maximum radiation level inside the zone - `force`: Accumulation speed multiplier - `debug`: Show zone wireframe in-game ## Server Configuration **server/config_server.lua** ```lua ServerConfig.DiscordWebhook = '' ServerConfig.AdminWebhook = '' ServerConfig.AdminPermissions = { 'command', 'admin', 'god' } ``` - `DiscordWebhook`: Webhook URL for player radiation events - `AdminWebhook`: Webhook URL for admin actions - `AdminPermissions`: ACE groups allowed to use admin commands - Rate limiting is applied per-event inside server/main.lua; there is no global cooldown key in config_server.lua. Leave a webhook empty, or set it to the literal `false`, to disable that log. AdminPermissions ACE groups gate the admin notification path.