Fade Screen
Screen fade transition system - fade to/from black with optional loading screen content.
Screen fade transition system - fade to/from black with optional loading screen content.
Overview
ui_fadeScreen provides fade-to-black and fade-from-black transitions used during level loading, mission starts, and scene changes. It communicates with the UI via LoadingScreen guihook and manages global audio fading.
Extension path: lua/ge/extensions/ui/fadeScreen.lua
Exports (M)
| Function | Signature | Description |
|---|---|---|
fadeToBlack / start | (fade?, screenData?, args?) | Fades to black over fade seconds. Shows optional screen content. |
fadeFromBlack / stop | (fade?, args?) | Fades from black over fade seconds. |
fadeSequence / cycle | (fadeIn?, pause?, fadeOut?, screenData?, args?) | Full fade cycle: in → pause → out. |
onScreenFadeStateDelayed | (state) | Receives UI fade state callbacks with frame delay. |
onGuiUpdate | () | Processes delayed fade state transitions. |
Internals
Fade To Black
local function fadeToBlack(fade, screenData, args)
fade = fade or 1
guihooks.trigger("LoadingScreen", {
active = true,
custom = {
fadeIn = fade,
pause = -1, -- infinite pause (stays black)
fadeOut = 0,
data = screenData -- optional {image, title, text}
}
})
-- Audio fade
SFXSystem.setGlobalParameter("g_FadeTimeMS", fade * 1000)
SFXSystem.setGlobalParameter("g_GameLoading", 1)
endFade From Black
local function fadeFromBlack(fade, args)
fade = fade or 1
guihooks.trigger("LoadingScreen", {
active = false,
custom = { fadeOut = fade }
})
SFXSystem.setGlobalParameter("g_FadeTimeMS", fade * 1000)
SFXSystem.setGlobalParameter("g_GameLoading", 0)
endFade Sequence
A full cycle (fade in → pause → fade out):
ui_fadeScreen.cycle(1, 2, 1, {title = "Loading..."})
-- Fades to black in 1s, pauses 2s, fades back in 1sThe pause phase triggers onScreenFadeState(1) → delayed callback → onScreenFadeState(2) → auto-calls fadeFromBlack.
Frame Delay
State transitions are delayed by delayFrames (default 3) to ensure the screen is fully black before proceeding:
local function onGuiUpdate()
if delayedData[1] then
if delayCounter <= 0 then
for _, state in ipairs(delayedData) do
extensions.hook("onScreenFadeState", state)
end
end
delayCounter = delayCounter - 1
end
endAudio Integration
Both fadeToBlack and fadeFromBlack control global audio:
g_FadeTimeMS- Fade duration in millisecondsg_GameLoading-1= mute during fade,0= unmute
Can be disabled with args.useGlobalAudioFade = false.
Headless Mode
In headless mode, fade states are triggered immediately without UI:
if headless_mode then
extensions.hook("onScreenFadeState", 1)
endonScreenFadeState Hook
Other extensions can listen for fade state changes by implementing onScreenFadeState in their own module (this is a hook, not an export of fadeScreen):
| State | Meaning | Triggered By |
|---|---|---|
| 1 | Fading to black (animation started) | fadeToBlack() (headless) or UI callback |
| 2 | Fully black (screen hidden) | UI callback via onScreenFadeStateDelayed (3-frame delay) |
| 3 | Fading from black (animation started) | fadeFromBlack() (headless) or UI callback |
-- Usage in your extension:
local function onScreenFadeState(state)
if state == 2 then
-- Screen is fully black - safe to do visual changes
-- (teleport, swap vehicles, change scene)
doHiddenWork()
end
end
M.onScreenFadeState = onScreenFadeStateReal-world examples from source:
career/modules/inventory.lua- Swaps vehicles while screen is blackcore/recoveryPrompt.lua- Teleports vehicle during recoveryui/vehicleSelector/vehicleOperations.lua- Spawns/changes vehicles
How It Works
- System calls
fadeToBlack(1)to start a 1-second fade - UI receives
LoadingScreenguihook and renders the fade overlay - When fully black, UI triggers
onScreenFadeStateDelayed(2)callback - After 3 frame delay,
onScreenFadeState(2)hook fires for gameplay code - For sequences,
fadeFromBlackis auto-called after the pause phase
Additional Exports
The following exports are available but not yet documented in detail:
M.cycleM.delayFramesM.fadeFromBlackM.fadeSequenceM.fadeToBlackM.onGuiUpdateM.onScreenFadeStateDelayedM.startM.stop