Skip to content

FAQ

Short answers to the questions readers actually asked, each with the page that has the details. The words used here are defined in the glossary.

Is there a Play button or a hold button? A hold button: Hold to play, held for about a second. There is no separate Play. → Join a server

What is the difference between the launcher and the helper? The launcher is the window you see. The helper is the part of it that starts BeamNG.drive and holds the connection while you play - the same nodemp-launcher.exe, run a second time without a window. The toasts call the helper “the launcher”: The launcher stopped · … means that background process stopped, and its log is launcher.log. → Troubleshooting

Do I need an account to play? What is Test Drive? No. Test Drive is playing without an account: you get a fresh Guest… name at every join and cannot choose it, and some servers refuse guests (Account required in the panel; the No account needed filter hides them). An account gives you a fixed, verified name and works on every server. The website’s registration page talks to hosts, but it is the same account. Test Drive is not remembered between launcher starts; a sign-in is. → Install the launcher → Accounts

Which BeamNG version do I need? 0.39.4.0, the current release: client mod 1.4.0 is built for it, and a strict server’s reference describes one game version. A copy that is not from Steam works when Settings → Game points at its folder. → Install the launcher → Requirements

Windows warns about an unknown publisher. Is the installer genuine? The installer is not code-signed yet, so SmartScreen warns. Compare the file’s SHA-256 (Get-FileHash in PowerShell) with the published one in the .sha256 file next to the installer on the release page; the Download page shows the same value. → Install the launcher

Does the server check my game files? What about my mods? Every server checks your install, at the level its host chose; only a strict server also looks at your BeamNG user folder. Your packed mods in mods\ are never what refuses you - no level looks there - and they are switched off during a session unless you enable Use my local mods in multiplayer and the server allows it. What a strict server refuses is what a mod left outside mods\: unpacked files under the user folder’s vehicles\, levels\, lua\, ui\, art\, scripts\, or anything added to the game folder. Remove those; a zip in mods\ needs no moving. → Join a server → What the server checks on your PC

How do I see the whole list of what a strict server rejected? The refusal shows three examples; the diagnostic built into the launcher prints every one, with a reason per line (overlay, unlisted, hash, …) and what to do about each. The panel under the server’s card offers the command with a Copy button. → Troubleshooting → Strict servers

What do “Stock content” and “Required mods” mean? Both are about the content a server sends you before the game starts - its own mod zips, downloaded by the launcher for that session. Stock content means the server sends nothing extra. Neither says anything about your own install. The loading screen’s Downloading Resource 2/5 is the same content, file by file. → Join a server → The server list

Does the launcher update itself? No. The client mod is updated for you before every join; the launcher is not. When a server needs a newer one, the join stops with Could not join · This server needs a newer launcher — update from the Download page, and the Download page always offers the current version. → Install the launcher

Direct Connect “still works” while the server list is down - how? You join by address without a join ticket, so nobody verifies your name. A server without a server key takes names as they come anyway; a listed server that allows Test Drive admits you as an unverified guest; one with Account required refuses the join. → Troubleshooting → The server list is empty

My message says “Report this if the issue persists”. Is my message documented? Every text the launcher, the helper or a server can show is quoted on Troubleshooting and indexed on Error codes; search either page for the exact words. When you report a problem, attach launcher.log, the exact toast text and the server’s name.

Which server version do these pages describe? The current release, 1.2.1 for the server, 1.1.0 for the launcher, 1.4.0 for the client mod, wire protocol v18; the table on What is NodeMP is the reference. Where an older server behaved differently, a short before 1.2.1 sentence says how.

What do I need before my server can be listed? A NodeMP account with a verified e-mail and a linked Discord account (only such an account can create a server key), a machine reachable on port 30814 TCP and UDP, and the key set in the existing [Directory] table of server.toml. Without a key the server runs unlisted and is reachable through Direct Connect. → Quick start, Registering your server

I pasted the [Directory] block from the website and the server exits. Why? server.toml already had a [Directory] table, so the file now defines it twice, which TOML rejects. Delete the pasted block and set Url, HostId and HostSecret in the existing table. The server says so itself: the table [Directory] appears twice. Put the keys into the existing [Directory] table …. → Registering → Put the key into the server

On Windows the log says TLS handshake failed: certificate verify failed towards api.nodemp.com. Is the key wrong? No - the server found no trusted root certificates. On the current server that means the Windows certificate store is empty and cacert.pem is no longer next to Node-Server.exe (put it back); on 1.2.0 and 1.1.0 it happened on every Windows machine, and the way out until the update is SSL_CERT_FILE pointed at a PEM bundle of public roots. Do not pin [Directory] Fingerprint. → Registering → Windows

How do I know the directory’s probe reached my port? The server’s log does not say. The server appears in the launcher’s list and at nodemp.com/servers once it did, and a TCP connection to your public address on port 30814 from outside your network succeeds. → Registering → What the server does with it

The server says Cannot listen on port 30814 … the port is already in use and quits. Why? Almost always a previous instance of the server is still running; stop it, or give this one another port. The server exits with code 1 so a supervisor notices. (A 1.2.0 server printed bind() failed and even server is ready before it quit.) → Running → Logs

How do I lift a ban? Stop the server, then Node-Server --bans list shows the entries and Node-Server --bans remove <ip | account id> removes one (both entries, address and account, for a player banned in a session); start again. Editing bans.json by hand with the server stopped does the same. A running server can also lift one through a resource (node.bans.remove). → Running → Bans

Where are the example resources (chat, demo-numbers, …)? In the release archive under examples/, next to Node-Server; examples/README.txt says what each one does. Copy one into resources/ and restart. (The 1.2.0 and older archives did not contain them.) → Resources and content → Installing a resource

Do I need a Windows PC for strict? For generating the reference manifest, yes: the generator reads a clean BeamNG install, so it runs where the game is installed. The manifest file is then copied to the server, Linux or Docker included. → Strict verification

Where are the release notes? In the release body on GitHub, from 1.2.1 on (the server repository’s RELEASE_NOTES.md section for the tag): what changed, whether a default changed, whether the wire protocol moved. Older releases have a one-sentence body; these pages describe the current release. A server release that keeps the wire protocol needs no launcher update from your players. → Updating

What is the event naming rule, and what happens to the old names? A notification is <subject><Verb-ed> (playerJoined, vehicleSpawned, serverShutdown); a request a handler can deny is <subject><Action>Request (vehicleSpawnRequest, relayRequest); there is no on prefix. Wire events are <domain>:<verb> in lowercase (chat:send). The spellings servers before 1.2.0 used - playerJoin, onVehicleSpawnRequest, canRelay and the rest - are deprecated aliases: they still subscribe to the same event, log one [deprecated] warning per resource per name, and will be removed in 2.0. → Events → Naming

Which HTTP methods exist? node.http.request(method, url, opts?, cb) takes any method; node.http.get, post, put, patch, delete and head are it with the method fixed, and node.http.fetch(url, { method = … }) is the coroutine form inside node.async (the methods other than get and post were added in server 1.2.0; before it fetch sent anything but POST as GET). Response headers arrive with lowercased names (headers["content-type"]). TLS peer verification is off unless the host sets [Http] CaFile, and then every https:// request is checked against that bundle. → Concurrency → HTTP

Are there sockets - a node.net? Not yet. The server has no socket API for resources: what exists is node.http towards the outside and wire events, the bus and the module channel inside. A socket API is on the platform’s list, without a date; nothing on these pages describes one, and nothing should be built on it yet.

What survives a resource reload, and what is resourceUnload? A reload drops everything the server half registered - handlers, timers, coroutines, bus and module subscriptions, relay filters, log sinks - and the whole Lua state, then runs main.lua again. node.storage, the files in your folder and the other resources survive; a background job or HTTP request already in flight is not cancelled, and client files are not re-packaged until a restart. node.on("resourceUnload", fn(reason)) runs in the old instance right before the drop, with "reload" or, at a server stop, "shutdown": write what you must and return - nothing started there runs again. → Resources → Reload

What does a strict server check, and what does it not? It compares the whole game folder, every archive’s table of contents and the player’s user folder with a reference of a clean install, before the join and again during the session. It does not hash archive contents (CRC-32 tables only), does not check the launcher itself, and does not look into mods\. A strict session is a different thing: in-game rules your resource switches on per player with session:config.strict. → Strict verification, Client scripting → Strict sessions

How do I test a plugin without the game? Everything server-side runs without a player. A chat command is exercised through the bus contract chat speaks: publish chat:command with { pid, name, args, raw } (lowercase name) and watch the reply on chat:say. A wire event handler needs a client, and client files run only inside the game. → Getting started → Testing without the game

Why does /HELLO not reach my handler when I publish chat:command myself? chat lowercases the typed word before it publishes and node.commands.add lowercases the registered name; the lookup itself is exact. A chat:command you publish must carry the lowercase name. → Recipes → A chat command

node.on with the same function twice - once or twice? Once: the second call replaces the first, and node.off(name, fn) removes it. Two different functions are two handlers. → Conventions → Return shapes

Why did my 600 ms timer callback not trigger the stall warning? On the current server it does: every handler, timer callback, coroutine slice and completion callback is timed on its own, and the line names the resource and the kind ((resource race, timer)). Before 1.2.1 only whole worker jobs were timed, which left timer callbacks and node.async slices unreported. → Concurrency → One worker thread

Is a syntax error in my client file reported by the server? Yes, at load: every client file is parsed when it is packaged, and one that does not parse gets an Error line naming the resource, the file and the Lua message, whatever the obfuscation setting. The file still ships (the server runs no client code), and the game’s own compile error is in the player’s beamng.log. Before 1.2.1 the only sign was Prometheus’s warning, with obfuscation on. → Resources → Obfuscation

Where are the examples, and where is chat? Under examples/ in the release archive, next to the server executable (examples/README.txt lists them). chat’s protocol - chat:send and chat:msg on the wire, chat:command and chat:say on the bus - is documented, so a stand-in is a few lines. → Events → node.bus

Can a resource overwrite a file of the game or of the client mod with a client file of its own? No. Streamed client files are compiled in memory under the resource’s own name and never written to the player’s disk, so they add modules and hooks beside the originals and shadow nothing. Change behaviour at run time instead: the same events, a ge extension of your own, the module manifest that switches a built-in client module off. → Client scripting → What a client file can and cannot do

How do I check that a file exists, create a folder, rename or copy a file with node.fs? node.fs has read, write, writeAsync and list, nothing else. Exists: look the name up in node.fs.list(folder). A folder: node.fs.write creates the parents of the path it writes. Copy: node.fs.write(to, node.fs.read(from)). Rename and delete: the standard os.rename and os.remove, with an absolute path built from the resource folder. Write paths with / on Windows and Linux alike. → Resources → What node.fs does not have

Is there a fileChanged event? No, and the server watches no files. Poll with node.every, comparing the sizes node.fs.list reports or a hash of the content. → Events → No file-watch event

Random numbers, execution time, memory use, the operating system - where? Standard Lua for the first three: math.random() and math.random(a, b) (seeded for you), node.server.uptime() before and after a section, collectgarbage("count") for this resource’s state. There is no total over all states, no per-handler statistics and no OS name or version in node. → Conventions → The Lua environment

Can node.json pretty-print, or diff and patch two documents? No. node.json.encode writes compact JSON and takes no options; there is no diff, patch or flatten. → Conventions → The Lua environment

Can the server call my language host from several threads? No. Every delivery to a hosted resource arrives on the single framework worker, one at a time; NodeLanguageHost has no flag for anything else, and none is scheduled. A host with its own event loop hands callbacks over itself, as js-host does; NodeApi calls, the relay filter and submit_job work run off the worker already. → Native modules → Language hosts