Docs

X3D Loading Screen

A terminal-style loading screen with an ENTER WORLD button the player presses before spawning. One HTML file, no build step.

Buy / Get free

Installation

  1. Remove esx_loadingscreen (or whatever loading screen you run) from server.cfg — both claim the same loadscreen slot and cannot coexist
  2. Drop the x3d_loadingscreen folder into resources/
  3. Add it to server.cfg:
ensure x3d_loadingscreen

That is all. No build step, no SQL.

Changing the server name

Open loadscreen.html and find this block (around line 270):

// ══ CONFIG ═════════════════════════════════════════════════
var BRAND = 'SERVER';                      // the big name
var SUBTITLE = '// SERVER BOOT SEQUENCE';  // the line under it
var BUILD = 'v1.0.2';                      // top right corner
// ═══════════════════════════════════════════════════════════

Then restart x3d_loadingscreen. Anyone connecting after that sees it.

Adding backgrounds

Drop the files next to loadscreen.html. No code change.

File Result
bg.png one image, shown statically
bg.png … bg6.png a crossfading slideshow every 7 seconds
.jpg works too bg.jpg … bg6.jpg

The slideshow probes which files actually load and skips the rest — a missing one is not an error.

Size: 1920×1080 is plenty, it is scaled with object-fit: cover. Anything over 2 MB per image just makes players wait longer.

Video instead of images

Drop bg.mp4 and change the <body> tag in loadscreen.html:

<body class="has-vid">

(the default is class="has-img")

Adding music

Drop loop.mp3 next to loadscreen.html. The mute button and volume slider start working on their own, and the level is remembered in the player's localStorage.

audio/loading_music.mp3 also works — the old esx_loadingscreen location.

How ENTER WORLD works

assets reach 100%
        ↓
wait for the core to report that the player data is ready
        ↓
ready → the button lights up (click, or press Enter)
        ↓
fade to black → shut the loading screen down → fire esx:playerReadyToSpawn

The client accepts two signals — esx:playerDataReady (from the es_extended X3D Build) and esx:playerLoaded (stock ESX). Whichever arrives first enables the button.

If a player ends up on a black screen

This happens when the core already put the player in the world without waiting for the button, and the player then presses it: the screen fades out with nothing left to fade it back in.

The es_extended X3D Build sends esx:spawnedWithoutEnterWorld, and the loading screen takes itself down and fades in. Nothing to configure.

On another core, fire that event server-side when you release a player without the handshake:

TriggerClientEvent('esx:spawnedWithoutEnterWorld', playerId)

Previewing in a browser

Open loadscreen.html in an ordinary browser. It drops into a simulation that mounts a sample resource list so you can see the layout. That mode never runs in game.

What is in the folder

x3d_loadingscreen/
├── fxmanifest.lua
├── loadscreen.html      ← everything lives here
├── client/client.lua    ← the ENTER WORLD handshake
├── cursors/*.png
└── README.md
View product page