fix: strip the server-only log stack script that breaks client world load

The dedicated server (app 380870) and the client are packaged separately and
have drifted. Base.Log_Stack_01 was removed from the client in 42.16, but the
server package still ships entity_logstack.txt.

The server registers every script it can see into a new world's
WorldDictionary, so the entry lands in the save, and every client then fails at
world load with:

  WorldDictionaryException: [SpriteConfigs] Missing dictionary script on
  client: Base.Log_Stack_01

Nothing in multiplayer can legitimately reference a script that no client has,
so dropping it server-side costs nothing.

The strip runs after the SteamCMD update rather than once at install time on
purpose: validate restores the file on every boot, so it has to be removed on
every boot too.

Note this does not repair a world whose dictionary already records the entry --
that save still needs regenerating.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Bastian de Byl
2026-08-26 14:36:36 -04:00
co-authored by Claude Opus 5
parent 62c4015410
commit ea98d1b556
@@ -47,6 +47,33 @@ if [ "${AUTO_UPDATE:-true}" = "true" ]; then
echo "=== Update complete ===" echo "=== Update complete ==="
fi fi
# Strip scripts the dedicated-server package ships but the client no longer has.
#
# The two Steam apps are packaged separately and have drifted. Base.Log_Stack_01
# was removed from the client in 42.16, but app 380870 still ships
# entity_logstack.txt. The server registers every script it can see into a new
# world's WorldDictionary, so the entry lands in the save, and then every client
# fails at world load with:
#
# WorldDictionaryException: [SpriteConfigs] Missing dictionary script on
# client: Base.Log_Stack_01
#
# Nothing in multiplayer can legitimately use a script no client has, so
# removing it server-side costs nothing. This runs after the SteamCMD update on
# purpose: validate restores the file on every boot, so it has to be stripped
# each time, not once.
#
# Removing the file does not fix a world whose dictionary already records the
# entry -- that save needs regenerating.
strip_client_missing_scripts() {
local stale="${INSTALL_DIR}/media/scripts/generated/entities/misc/entity_logstack.txt"
if [ -f "${stale}" ]; then
echo "=== Removing ${stale##*/} (shipped by server, absent from client) ==="
rm -f "${stale}"
fi
}
strip_client_missing_scripts
# Configure JVM memory settings in ProjectZomboid64.json (Build 42 uses JSON config) # Configure JVM memory settings in ProjectZomboid64.json (Build 42 uses JSON config)
configure_memory() { configure_memory() {
local json_file="${INSTALL_DIR}/ProjectZomboid64.json" local json_file="${INSTALL_DIR}/ProjectZomboid64.json"