Skip to content

Dedicated Server Testing and Validation

A map that passes local testing must be tested on a dedicated server before Workshop publication. Dedicated servers exercise several subsystems that the single-player client does not: network replication of entity state, server-authoritative loot table resolution, server-side navmesh validation, and the Workshop content download path. The 57 Studios cohort has documented multiple cases of maps that passed local testing with no errors and failed on a dedicated server within the first five minutes of a multiplayer session. The dedicated server test is the final quality gate before the map reaches players.

This article documents the 57 Studios™ workflow for dedicated server testing and asset validation. It covers installing and configuring a local dedicated server, copying the map to the server environment, running the comprehensive -ValidateAssets command-line check, interpreting server log output, and diagnosing the most common server-side failures: server not starting with the map, white textures on a clean server install, missing assets, navmesh validation errors, and spawn table resolution failures on the server.

Server console window showing Unturned dedicated server output with a map loading successfully

Documentation source: This article synthesizes the official Smartly Dressed Games modding documentation for dedicated server setup, asset validation, and server log interpretation, combined with empirical validation across 57 Studios cohort mapping projects.

Prerequisites

  • A map that has passed local testing in single-player. See the preceding article Local Map Testing for the local testing procedure.
  • The Unturned Dedicated Server tool (U3DS) installed from Steam. See Setting Up an Unturned Server for the installation procedure.
  • A text editor for reading log files and configuration files. The 57 Studios™ recommendation is Notepad++.
  • Familiarity with the server console and command-line interface.
  • A backup of the map's project folder before beginning the testing procedure.

What you will learn

  • How to install the Unturned Dedicated Server tool and generate the default configuration files.
  • How to copy the map to the server's Maps/ directory and configure Commands.dat.
  • How to run the server with the map and interpret the startup log output.
  • How to execute the -ValidateAssets command-line flag and resolve every validation error.
  • How to interpret server log entries for asset loading, navmesh validation, and spawn table resolution.
  • How to run multiplayer-specific test scenarios that single-player testing does not cover.
  • How to diagnose and fix server not starting with the map, white textures, and missing asset errors.

Installing and configuring a dedicated server

The dedicated server test environment must be set up on the same machine as the author's game client to eliminate the network variable. A local dedicated server eliminates the possibility that the server's installation or network configuration is causing the failure.

Step 1: Install U3DS

  1. Open the Steam Library.
  2. From the Library dropdown, select Tools.
  3. Find "Unturned Dedicated Server" (U3DS) in the tools list and install it.
  4. On Windows, the default install location is C:\Program Files (x86)\Steam\steamapps\common\U3DS\.
  5. The installer also places a server shortcut on the Steam Library's home page. This shortcut launches the server but must be configured first.

Step 2: Generate default configuration files

  1. Launch the dedicated server once to generate the default configuration files.
  2. From the Steam Library, select the "Unturned Dedicated Server" entry and click Play.
  3. A console window opens showing the server startup sequence. The server generates the Servers/ directory and a set of default configuration files inside it.
  4. Once the console reports "Server started successfully" and displays a server code, the configuration files are ready.
  5. Type Shutdown in the server console and press Enter. The server shuts down cleanly and saves its configuration state.

Step 3: Locate the server configuration directory

The server configuration files are in the Servers/ subdirectory of the U3DS installation.

U3DS/
├── Servers/
│   └── Default/
│       ├── Commands.dat
│       ├── Config.json
│       └── WorkshopDownloadConfig.json
├── Extras/
├── ServerHelper.bat
└── ServerHelper.sh

For a first-time setup, the server creates a single server instance named Default. If multiple instances are needed, additional directories can be created in Servers/.

Copying map files to the server

The map files must be copied to the server's Maps/ directory. The server loads maps from this directory, not from the game client's Maps/ directory.

Step 1: Create the server Maps directory

If the Servers/Default/Maps/ directory does not exist, create it:

U3DS/Servers/Default/Maps/

Step 2: Copy the map folder

  1. Navigate to the map's build output directory.
  2. Copy the entire map folder.
  3. Paste the folder into U3DS/Servers/Default/Maps/.
  4. The folder structure should look like this:
U3DS/Servers/Default/Maps/YourMap/
├── Bundles/
├── Level/
├── Config.json
└── [other map files]

Step 3: Configure Commands.dat

  1. Open U3DS/Servers/Default/Commands.dat in Notepad++.
  2. Find the Map command line (or add it if it does not exist).
  3. Set it to the map's folder name:
Map YourMap

The Map command value is case-sensitive and must match the folder name exactly. If the folder is named MyMap, the command must be Map MyMap.

  1. Optionally configure other startup commands:
Map YourMap
Port 27015
Name "Test Server - YourMap"
MaxPlayers 4
  1. Save the file. The server reads Commands.dat at startup and executes each line as a console command.

Step 4: Configure WorkshopDownloadConfig.json

For the local server test, the WorkshopDownloadConfig.json file should be empty or should not reference the map's Workshop entry. The goal is to test the map in isolation from the Workshop distribution pipeline.

json
{
  "File_IDs": []
}

Local map files are loaded directly from the Maps/ directory. The server does not need a Workshop entry to load them.

Running server tests

Step 1: Launch the server

  1. Navigate to the U3DS installation directory.
  2. Double-click ServerHelper.bat (Windows) or run ./ServerHelper.sh (Linux).
  3. The server console opens and displays the startup sequence.

Step 2: Observe the startup log

The server startup log shows the map loading process. The following key lines indicate a successful load:

Loading level: YourMap
Loading level: 100%
Server code: [code]
Server started successfully

The "Loading level: 100%" message indicates that the map's terrain and assets loaded without errors. The server code is the connection code that clients use to join the server.

Step 3: Join the server from the game client

  1. Launch the Unturned™ game client.
  2. Click Connect in the main menu.
  3. Select the LAN tab or click Connect Directly.
  4. Enter the server code displayed in the server console.
  5. Click Connect. The client downloads the map from the server and loads it.

Step 4: Execute the verification command sequence

Once connected to the server, repeat the verification command sequence from the local test:

CommandWhat it testsServer-specific behavior
/spawnPlayer spawn on serverPlayer appears at a random spawn point from the server's set
/zombieZombie spawn and navmeshZombie spawns and pathfinding is computed server-side
/give <table>Spawn table resolutionTable is resolved server-authoritatively
/vehicleVehicle spawn tableVehicle spawns on server and replicates to client
/cycle 0-7Time of day on serverTime is synchronized to all connected clients

Step 5: Test multiplayer-specific scenarios

After the command sequence passes, test the scenarios that single-player testing did not cover.

Test scenarioWhat it exercisesExpected result
Two players in adjacent regionsNetwork replication across zonesBoth players see each other; zombies are synchronized
Two players in the same regionNetwork replication within a single zoneBoth players see the same zombies at the same positions
Server restart with a player's saved positionSave and restore of player statePlayer respawns at the correct position on the same map
Player joins while another is activeLate-join network synchronizationJoining player sees the same world state as the active player
Player disconnected mid-sessionGraceful network interruption handlingRemaining players continue without visible errors
All players disconnect and reconnectWorld state integrity across empty-server periodsLootable containers have correctly regenerated items
Server run continuously for 4+ hoursMemory and resource leak detectionServer does not crash; framerate does not degrade

The cohort recommendation for dedicated server testing is to run the map for a minimum of 8 continuous hours with at least two concurrent players. Memory leak patterns that only surface after 3-6 hours of continuous runtime will not be caught by a 30-minute test session.

ValidateAssets command

The -ValidateAssets command-line flag instructs Unturned™ to run a comprehensive set of health checks on every asset in the map. It is the single most important quality gate before Workshop publication.

How to run ValidateAssets

  1. Locate the Unturned™ executable. On a default Windows installation, this is at C:\Program Files (x86)\Steam\steamapps\common\Unturned\Unturned.exe.
  2. Create a shortcut to Unturned.exe on the desktop.
  3. Right-click the shortcut and select Properties.
  4. In the Target field, append -ValidateAssets after the existing path. The full value should be similar to: "C:\Program Files (x86)\Steam\steamapps\common\Unturned\Unturned.exe" -ValidateAssets
  5. Launch Unturned™ through the modified shortcut.
  6. Load the map in single-player mode.
  7. The validation runs during the loading screen. Progress is visible in the log output.
  8. After the map loads, open the Asset Errors menu from the in-game menu or check Client.log at %LOCALAPPDATA%\Unturned\Logs\Client.log.

What ValidateAssets checks

Validation checkWhat it testsCommon resolution
Navmesh ReadableObject navmeshes have CPU Readable flag in UnityEnable CPU Readable on the navmesh in Unity import settings; rebake and re-export
Mesh ReadableNon-navmesh meshes do not have CPU ReadableDisable CPU Readable on meshes that are not navmesh objects
Missing MeshesMesh filters reference a valid mesh; mesh renderers have a mesh filterLocate the object in the editor; assign the correct mesh to the mesh filter
Mesh Vertex CountsMeshes with unusually high vertex counts are flaggedReduce polygon count; apply LOD groups; remove unused faces
Missing MaterialsRenderers have at least one material assignedAssign a material to every renderer
Material CountsRenderers with excessive material counts are flaggedMerge materials where possible
Texture ReadableMost textures do not need CPU ReadableDisable CPU Readable on textures that are not shirt, pants, or UI textures
Texture NPOTTextures should have power-of-two dimensionsRescale or pad textures to the nearest power of two
Audio SamplesLong audio clips with high sample rates are flaggedReduce sample rate or clip length

How to fix validation errors

  1. Read the first error in the validation output. Each error includes the asset path and the specific issue.
  2. Open the referenced asset in the Unity Editor or the modeling tool, depending on the error type.
  3. Fix the specific issue. For a missing mesh, assign the correct mesh. For a CPU Readable flag, enable or disable it in the import settings.
  4. Rebuild the asset bundle and re-export the map.
  5. Re-run -ValidateAssets to confirm the fix succeeded.
  6. Repeat until all errors are resolved.

The cohort recommendation is to fix errors in the order they appear in the validation output, because a single broken reference can cascade into multiple dependent errors. A map that produces zero validation errors after the fix pass is ready for the local testing verification.

Server log interpretation

The server log (Server_<ID>.log) is the primary diagnostic tool for server-side failures. The log is located at U3DS/Servers/Default/Server_<ID>.log on Windows.

Key log message patterns

Log messageMeaningSeverityAction required
Loading level: 100%Map loaded successfullyInfoNone
Could not find asset for GUIDA .dat file references a GUID not present in any loaded modErrorOpen the referencing .dat; correct or remove the GUID reference
Map file not foundServer cannot locate the map folderErrorConfirm map folder exists in Servers/Default/Maps/; confirm Map command matches folder name
Failed to load level assetLevel .asset is missing or malformedErrorInspect level .asset; confirm all bundle references are valid
Bundle not foundMaster bundle or .unity3d file is missingErrorConfirm bundle file is present; confirm MasterBundle.dat is correct
Asset bundle GUID collisionTwo loaded bundles have duplicate GUIDsErrorRebuild one of the conflicting bundles to generate new GUIDs
Navmesh overlap detectedTwo navmesh bounds intersectWarningAdjust bounds to remove overlaps; rebake
Spawn table entry not foundSpawn table references non-existent item or vehicleWarningRemove or correct the non-existent ID reference
Config version mismatchConfig.json version differs between server and Workshop cacheWarningRe-upload map with incremented version number
MasterBundle.dat not foundExpected MasterBundle.dat in bundle directoryErrorCreate MasterBundle.dat with correct fields
Shader not found; applying fallbackCustom shader not available on server's rendering pathWarningReplace custom shader with vanilla-compatible shader; rebuild bundle

Reading the log for map-specific issues

  1. Open Server_<ID>.log in Notepad++.
  2. Search for the map's folder name. All log entries related to the map should appear in sequence during the startup phase.
  3. Search for "Error" and "Warning" strings. Each error and warning should be evaluated for impact on gameplay.
  4. Search for "missing" and "not found" strings. These indicate asset resolution failures.
  5. Pay particular attention to the sequence of log entries between "Loading level: [map name]" and "Loading level: 100%". Errors during this window indicate map-specific loading failures.

Server not starting with the map: diagnostic workflow

When the server fails to start or crashes immediately when the map is specified in Commands.dat, the cause is almost always in the map's file structure, asset references, or configuration.

Diagnostic flowchart

Common server startup failures

SymptomMost likely causeResolution
Server reports "Map file not found"Commands.dat Map value does not match folder nameCorrect the Map value to match the folder name exactly
Server reports "Failed to load level asset"Level .asset is corrupted or missing Bundle fieldRestore level .asset from backup; confirm Bundle field
Server reports "Bundle not found"Master bundle file is missing or misnamedRebuild bundle; confirm file name matches MasterBundle.dat
Server starts but immediately stops respondingMalformed .dat file in the map causes a parse error during asset loadingRun -ValidateAssets; check Server_[ID].log for parsing errors
Server starts but displays no map geometryServer-side asset loading failed and defaulted to empty levelCheck the server console for asset-load error messages
Server starts but clients cannot connectPort is blocked or server is not fully initializedCheck firewall settings; confirm server reports "Server started successfully"

White textures on server: diagnostic workflow

When custom assets have correct textures locally but appear white on the server, the server is missing the asset bundle or the bundle path is incorrect.

Root causes

CauseTypical scenarioFix
Asset bundle not copied to serverMap was copied to server's Maps/ without the Bundles/ directoryCopy the entire map folder including Bundles/
Wrong bundle path in level .assetLevel .asset references a bundle path that works on local machine but not on serverUse relative paths in the level .asset; confirm Asset_Prefix in MasterBundle.dat
Bundle rebuilt after copyMap was updated in the editor and the bundle was rebuilt, but the server still has the old bundleRe-copy the entire map folder to the server
MasterBundle.dat missingMap uses a master bundle but the server does not have MasterBundle.datCreate MasterBundle.dat with the correct Asset_Bundle_Name and Asset_Prefix

Resolution procedure

  1. Confirm that the map folder on the server includes the Bundles/ directory (or Level/Bundles/ depending on the map's structure).
  2. Confirm the MasterBundle.dat file exists in the bundle directory and has correct fields:
    • Asset_Bundle_Name: The filename of the master bundle (e.g., mymap.masterbundle).
    • Asset_Prefix: The file path to the folder selected as an AssetBundle in Unity (e.g., Assets/MyMapBundles).
  3. Rebuild the asset bundle in Unity Editor.
  4. Copy the rebuilt bundle to the server's bundle directory.
  5. Restart the server.
  6. If textures are still white, run -ValidateAssets and check for missing material or texture errors.

Multiplayer-specific validation

The multiplayer test covers network replication and server-authoritative validation paths that single-player testing does not exercise.

Network replication validation

TestProcedureExpected result
Player visibilityTwo players stand in the same area. Both players move.Each player sees the other player's movement in real time
Zombie synchronizationOne player aggroes a zombie. The other player observes the zombie's behavior.Both players see the zombie at the same position with the same behavior
Loot synchronizationOne player loots a container. The other player inspects the same container.The second player sees the container as empty or partially looted
Vehicle synchronizationOne player enters a vehicle and drives. The other player observes.Both players see the vehicle at the same position with the same velocity
Weather synchronizationThe time of day advances on the server.Both players see the same lighting and weather conditions

Server-authoritative validation

TestProcedureExpected result
Spawn table authorityA player requests an item from a spawn point. The server resolves the table and spawns the item.The item appears at the spawn point on both the requesting player's and all other players' clients
Navmesh authorityA zombie paths to a player. The server computes the navmesh path.The zombie follows the same path as observed on all connected clients
Config.json authorityThe server applies Config.json overrides.All connected players experience the same gravity, HUD visibility, and gameplay parameters

Frequently asked questions

Why does my server fail to start with the map?

The most common causes are: the Commands.dat Map value does not match the folder name exactly (case-sensitive), the level .asset file is missing or malformed, or the master bundle file is missing from the server's Bundles/ directory. Check the Server_[ID].log file for the specific error message.

Why are my custom assets white on the server?

The asset bundle containing the custom textures was not copied to the server, or the bundle was rebuilt after it was copied. Rebuild the asset bundle, copy the entire map folder to the server's Maps/ directory, and restart the server.

How do I run ValidateAssets on the dedicated server?

The -ValidateAssets flag is a client-side operation. It must be run by launching the game client with the flag, not by passing it to the dedicated server executable. Load the map in single-player through the ValidateAssets-enabled client to run the checks against the map's assets.

My server starts but shows no map geometry. What is wrong?

The server-side asset loading failed and defaulted to an empty level. Check the server console for asset-load error messages during the startup sequence. The most common cause is a missing or broken master bundle reference in the level .asset file.

Everything works locally but fails on the server. Why?

The most common cause is a path difference between the local Maps/ directory and the server's Maps/ directory. The map's level .asset file may reference asset bundle paths that resolve correctly on the local machine but not on the server. Use relative paths in all asset references.

How long should I test my map on a dedicated server before publishing?

The 57 Studios cohort recommendation is a minimum of 8 continuous hours with at least two concurrent players. Memory leak patterns and network replication issues surface only under sustained use.

Can I test the map on a server without installing the full U3DS tool?

The dedicated server test must be performed using the U3DS tool. Hosting from the game client is not an adequate substitute because the game client's server hosting mode does not exercise all the subsystems that the dedicated server does.

How do I test with Workshop dependencies on the server?

If the map depends on other Workshop items, add their file IDs to WorkshopDownloadConfig.json on the server. The server will download the dependent items from the Workshop when it starts. The 57 Studios cohort recommendation is to test once without dependencies and once with dependencies to isolate dependency-related issues.

My server log shows "Could not find asset for GUID" errors. What should I do?

Each "Could not find asset for GUID" error indicates that a .dat file in the map references a GUID that is not present in any loaded mod or asset bundle. Open the referencing .dat file, find the GUID entry, and verify that the GUID exists in the referenced asset bundle. If the GUID is incorrect, correct it. If the asset is missing, add it to the bundle or remove the reference.

What is the difference between client-side and server-side asset validation?

Client-side validation (-ValidateAssets) checks mesh, material, texture, and audio quality. Server-side validation (the checks performed when the server loads the map) checks asset resolution, GUID matching, bundle existence, and spawn table integrity. Both must pass for the map to be considered validated.

Best practices

  • Test on a dedicated server before every Workshop publication, not only the first publication. Game updates can break server-side compatibility even if the map has not changed.
  • Run -ValidateAssets before every major build and fix all reported errors before proceeding to server testing.
  • Test with at least two concurrent players for a minimum of 8 continuous hours. Memory leaks and network replication issues surface only under sustained use.
  • Keep the server's map files synchronized with the editor's build output. A mismatch between the editor version and the server version produces confusing diagnostic results.
  • Maintain a dedicated test server separate from the production server. The test server allows iterative testing without disrupting live players.
  • Document the server configuration (Commands.dat, Config.json settings) in the map project file so that the configuration can be reproduced on any server.
  • Check the server log after every test session. Errors that do not produce visible in-game symptoms are still recorded in the log.
  • Test with a clean Workshop install (subscribed from a separate Steam account) to confirm the Workshop distribution pipeline works correctly.
  • Increment the Config.json version number for every Workshop update. The server uses the version number to detect stale cached versions.
  • Communicate with server operators about configuration requirements in the Workshop description.

Advanced considerations

Workshop distribution pipeline testing

After the map passes local and dedicated server testing, the Workshop distribution pipeline must be tested. Subscribe to the map through a separate Steam account (or a clean Workshop cache) and confirm the map downloads and loads correctly from the Workshop rather than from a local file copy.

The Workshop distribution test catches issues that local server testing does not: compressed file extraction errors, missing file references in the Workshop package, and cache invalidation problems.

Procedure:

  1. Set the Workshop entry visibility to Friends-only or Unlisted.
  2. From a separate Steam account, navigate to the Workshop entry and subscribe.
  3. Launch Unturned and confirm the map appears in the level list.
  4. Install the map on the dedicated server through the WorkshopDownloadConfig.json mechanism.
  5. Join the server and confirm the map loads from the Workshop download.

Multi-server testing

For maps intended to run on a network of multiple servers (a hub-and-spoke configuration or a server cluster), test the map on a representative subset of the server cluster. Issues that appear on one server configuration (Windows server, Linux server, server with specific mods loaded) may not appear on another configuration.

Server startup time benchmarking

Record the time from the moment the server executable starts to the moment the server reports "Server started successfully." This total startup time includes:

  1. The Unity engine initialization phase (5-15 seconds).
  2. The asset bundle loading phase (varies by bundle size; 10-60 seconds for a typical custom map).
  3. The navmesh validation phase (1-5 seconds).
  4. The spawn table registration phase (1-3 seconds).
  5. The world save loading phase (if a previous save exists; 1-10 seconds).

A map that takes more than 120 seconds to start on a mid-range server machine (2020-era CPU, SSD storage, 16 GB RAM) may have performance issues that affect gameplay beyond the startup phase. The two most common causes of slow startup are oversized asset bundles (over 500 MB) and excessive spawn point counts (over 10,000 item spawn points).

Server log archiving

The server log (Server_<ID>.log) is overwritten each time the server starts. To preserve a record of test sessions, archive the log file after each test session before starting a new one.

The 57 Studios cohort recommendation for log archiving is:

  1. After each test session, copy Server_<ID>.log to a dedicated archive location: YourMap/Testing/Logs/Server_<ID>_YYYY-MM-DD.log.
  2. Rename the archived log to include the test date and map version.
  3. Keep the archived logs for the map's entire development lifecycle. When a regression appears in a later version, the archived logs provide a baseline for comparison.

Performance benchmarking

Record the server's CPU usage, memory usage, and tick rate during the 8-hour test session. Compare the results against a baseline of a vanilla official map running on the same server hardware. A custom map that consumes significantly more server resources than the vanilla baseline may need optimization before publication.

Appendix A: Server configuration reference

FileLocationPurpose
Commands.datServers/Default/Commands.datStartup command sequence for the server instance
Config.jsonServers/Default/Config.jsonServer-wide configuration settings
WorkshopDownloadConfig.jsonServers/Default/WorkshopDownloadConfig.jsonWorkshop file IDs for automatic download
Server_<ID>.logServers/Default/Server_<ID>.logPrimary log file for server diagnostics

Appendix B: ValidateAssets error resolution reference

Error typeResolution
Navmesh not readableEnable CPU Readable on the navmesh in Unity import settings; rebake
Mesh not readableDisable CPU Readable on non-navmesh meshes
Missing meshAssign a valid mesh to the mesh filter component
Mesh vertex count too highReduce polygon count; apply LOD groups
Missing materialAssign a material to every renderer that needs one
Material count too highMerge materials where possible
Texture readable should be disabledDisable CPU Readable on non-UI textures
Texture not power-of-twoRescale or pad textures to power-of-two dimensions
Audio sample rate too highReduce sample rate or clip length

Appendix C: Server log error message reference

Error messageMeaningResolution
Could not find asset for GUID.dat file references a GUID not in any loaded mod or bundleCorrect or remove the GUID reference in the .dat file
Map file not foundServer cannot locate the map folderConfirm folder exists in Servers/Default/Maps/; check Map command
Failed to load level assetLevel .asset is missing or malformedRestore or fix the level .asset file
Bundle not foundMaster bundle or .unity3d file missingConfirm bundle file is present; check MasterBundle.dat
Asset bundle GUID collisionTwo loaded bundles have duplicate GUIDsRebuild one of the conflicting bundles
Navmesh overlap detectedTwo navmesh bounds intersectSeparate bounds and rebake
Spawn table entry not foundSpawn table references non-existent itemRemove or correct the invalid reference
MasterBundle.dat not foundMasterBundle.dat missing from bundle directoryCreate MasterBundle.dat with correct fields
Shader not found; applying fallbackCustom shader not availableReplace with vanilla-compatible shader

Cross-references

Document history

VersionDateAuthorNotes
1.02026-07-2657 StudiosInitial publication. Complete dedicated server testing and validation guide with server setup, ValidateAssets, log interpretation, multiplayer testing, and diagnostic procedures.