Temporary Self-Fix / Workaround
If you are using Project Zomboid Build 42 on AMP/Linux and AMP always shows:
Active Users: 0 / 32
even though people are connected, this workaround restores AMP’s Active Users / @UserCount tracking.
Important: This is a temporary community workaround, not an official CubeCoders fix.
It has been tested on AMP 2.8.0.4, Debian Linux, Podman and Project Zomboid Build 42.
The installer performs compatibility checks before changing AMP and creates a timestamped backup of the AMP configuration.
Before you start
You need:
- SSH/terminal access to the Linux machine running AMP
- an account that can use
sudo - your Project Zomboid AMP instance name
You can see the instance name in AMP.
For example:
ProjectZomboid01
Easy install
At the top of the command below is:
INSTANCE="ProjectZomboid01"
If your instance is called ProjectZomboid01, leave it alone.
If your instance has a different name, for example:
PZServer01
change only:
INSTANCE="ProjectZomboid01"
to:
INSTANCE="PZServer01"
Then copy the entire block below into your Linux terminal and press Enter.
The installer will:
- locate the AMP instance;
- check the Project Zomboid Build 42 logs exist;
- create a timestamped backup of
GenericModule.kvp; - change only the AMP settings required for player tracking;
- create a stable connection log for AMP;
- install a separate bridge service for this specific AMP instance;
- verify the bridge is working;
- restart only the Project Zomboid AMP instance;
- automatically restore
GenericModule.kvpif installation fails before completion.
sudo bash <<'PZB42FIX'
set -u
INSTANCE="ProjectZomboid01"
echo "=================================================="
echo " Project Zomboid B42 - AMP Active Users Workaround"
echo "=================================================="
echo
echo "Instance requested: $INSTANCE"
echo
# --------------------------------------------------
# Basic safety checks
# --------------------------------------------------
for CMD in \
python3 systemctl journalctl find stat grep sed getent \
date cp cut bash runuser mkdir touch chmod chown
do
if ! command -v "$CMD" >/dev/null 2>&1; then
echo "ERROR: Required command '$CMD' was not found."
exit 1
fi
done
SAFE_INSTANCE="$(printf '%s' "$INSTANCE" | sed 's/[^A-Za-z0-9_.-]/_/g')"
if [ -z "$SAFE_INSTANCE" ]; then
echo "ERROR: Invalid AMP instance name."
exit 1
fi
echo "1/9 - Finding AMP instance..."
mapfile -t CFG_MATCHES < <(
find /home /opt /srv /root \
-type f \
-path "*/.ampdata/instances/$INSTANCE/GenericModule.kvp" \
-print 2>/dev/null
)
if [ "${#CFG_MATCHES[@]}" -eq 0 ]; then
echo
echo "ERROR: Could not find GenericModule.kvp for:"
echo " $INSTANCE"
echo
echo "Check INSTANCE= at the top of the installer."
echo "No AMP files have been changed."
exit 1
fi
if [ "${#CFG_MATCHES[@]}" -gt 1 ]; then
echo
echo "ERROR: More than one matching AMP instance was found:"
printf ' %s\n' "${CFG_MATCHES[@]}"
echo
echo "The installer will not guess which one to modify."
echo "No AMP files have been changed."
exit 1
fi
CFG="${CFG_MATCHES[0]}"
INSTANCE_DIR="$(dirname "$CFG")"
echo "Found:"
echo " $INSTANCE_DIR"
# --------------------------------------------------
# Determine AMP owner and PZ application directory
# --------------------------------------------------
echo
echo "2/9 - Checking AMP configuration..."
AMP_USER="$(stat -c '%U' "$CFG")"
AMP_GROUP="$(stat -c '%G' "$CFG")"
CFG_MODE="$(stat -c '%a' "$CFG")"
if [ -z "$AMP_USER" ] || [ "$AMP_USER" = "UNKNOWN" ]; then
echo "ERROR: Could not determine the AMP file owner."
exit 1
fi
if ! getent passwd "$AMP_USER" >/dev/null; then
echo "ERROR: AMP owner '$AMP_USER' is not a valid local user."
exit 1
fi
APP_BASE_RAW="$(grep -m1 '^App.BaseDirectory=' "$CFG" | cut -d= -f2-)"
if [ -z "$APP_BASE_RAW" ]; then
echo
echo "ERROR: App.BaseDirectory was not found in:"
echo " $CFG"
echo
echo "No files have been changed."
exit 1
fi
case "$APP_BASE_RAW" in
/*)
PZBASE="${APP_BASE_RAW%/}"
;;
*'{{'*|*'}}'*|*'$('*|*'`'*)
echo
echo "ERROR: App.BaseDirectory contains an unsupported expression:"
echo " $APP_BASE_RAW"
echo
echo "The installer will not guess how to resolve it."
echo "No files have been changed."
exit 1
;;
*)
APP_BASE_RAW="${APP_BASE_RAW#./}"
APP_BASE_RAW="${APP_BASE_RAW%/}"
PZBASE="$INSTANCE_DIR/$APP_BASE_RAW"
;;
esac
LOGDIR="$PZBASE/Zomboid/Logs"
BRIDGEDIR="$PZBASE/amp-connections"
BRIDGEFILE="$BRIDGEDIR/current_connections.txt"
STATEFILE="$BRIDGEDIR/bridge-state.json"
SCRIPT="/usr/local/libexec/pz-amp-connection-bridge-$SAFE_INSTANCE.py"
SERVICE_NAME="pz-amp-connection-bridge-$SAFE_INSTANCE.service"
SERVICE="/etc/systemd/system/$SERVICE_NAME"
if [ ! -d "$PZBASE" ]; then
echo
echo "ERROR: Project Zomboid application directory does not exist:"
echo " $PZBASE"
echo
echo "No files have been changed."
exit 1
fi
if [ ! -d "$LOGDIR" ]; then
echo
echo "ERROR: Project Zomboid Logs directory was not found:"
echo " $LOGDIR"
echo
echo "Start the Project Zomboid server at least once, then try again."
echo "No files have been changed."
exit 1
fi
echo "AMP user: $AMP_USER"
echo "Instance folder: $INSTANCE_DIR"
echo "PZ folder: $PZBASE"
echo "B42 logs: $LOGDIR"
mapfile -t CONNECTION_LOGS < <(
find "$LOGDIR" \
-maxdepth 1 \
-type f \
-name '*_connections.txt' \
-print 2>/dev/null
)
if [ "${#CONNECTION_LOGS[@]}" -eq 0 ]; then
echo
echo "WARNING: No Build 42 *_connections.txt logs were found."
echo
echo "Start Project Zomboid and allow it to reach Ready,"
echo "then run this installer again."
echo
echo "No files have been changed."
exit 1
fi
echo "Found ${#CONNECTION_LOGS[@]} Build 42 connection log(s)."
# --------------------------------------------------
# Refuse conflicting/previous bridge installations
# --------------------------------------------------
echo
echo "Checking for an existing workaround..."
if systemctl is-active --quiet "pz-amp-connection-bridge.service" 2>/dev/null \
|| [ -f "/etc/systemd/system/pz-amp-connection-bridge.service" ]; then
echo
echo "ERROR: An older PZ B42 bridge installation was detected:"
echo " pz-amp-connection-bridge.service"
echo
echo "Remove the older workaround before running this installer."
echo "No AMP files have been changed."
exit 1
fi
if systemctl is-active --quiet "$SERVICE_NAME" 2>/dev/null \
|| [ -f "$SERVICE" ] \
|| [ -f "$SCRIPT" ]; then
echo
echo "ERROR: This workaround already appears to be installed for:"
echo " $INSTANCE"
echo
echo "Existing service:"
echo " $SERVICE_NAME"
echo
echo "The installer will not overwrite an existing installation."
echo "No AMP files have been changed."
exit 1
fi
# --------------------------------------------------
# Backup
# --------------------------------------------------
echo
echo "3/9 - Creating timestamped configuration backup..."
TIMESTAMP="$(date '+%Y%m%d-%H%M%S')"
BACKUP="$CFG.b42-active-users-backup-$TIMESTAMP"
cp -a -- "$CFG" "$BACKUP"
if [ ! -f "$BACKUP" ]; then
echo "ERROR: Configuration backup could not be created."
exit 1
fi
echo "Backup:"
echo " $BACKUP"
INSTALL_OK=0
SERVICE_CREATED=0
SCRIPT_CREATED=0
BRIDGEDIR_CREATED=0
BRIDGEFILE_CREATED=0
if [ ! -d "$BRIDGEDIR" ]; then
BRIDGEDIR_CREATED=1
fi
if [ ! -e "$BRIDGEFILE" ]; then
BRIDGEFILE_CREATED=1
fi
rollback() {
RESULT=$?
if [ "$INSTALL_OK" -eq 0 ]; then
echo
echo "=================================================="
echo " INSTALLATION FAILED - ROLLING BACK"
echo "=================================================="
if [ -f "$BACKUP" ]; then
cp -a -- "$BACKUP" "$CFG"
echo "Restored GenericModule.kvp."
fi
if [ "$SERVICE_CREATED" -eq 1 ]; then
systemctl disable --now "$SERVICE_NAME" >/dev/null 2>&1 || true
rm -f "$SERVICE"
systemctl daemon-reload
systemctl reset-failed "$SERVICE_NAME" >/dev/null 2>&1 || true
echo "Removed new bridge service."
fi
if [ "$SCRIPT_CREATED" -eq 1 ]; then
rm -f "$SCRIPT"
echo "Removed new bridge script."
fi
if [ "$BRIDGEFILE_CREATED" -eq 1 ]; then
rm -f "$BRIDGEFILE" "$STATEFILE"
fi
if [ "$BRIDGEDIR_CREATED" -eq 1 ]; then
rmdir "$BRIDGEDIR" 2>/dev/null || true
fi
echo
echo "Original AMP configuration restored."
fi
exit "$RESULT"
}
trap rollback EXIT
# --------------------------------------------------
# Modify only AMP player-tracking settings
# --------------------------------------------------
echo
echo "4/9 - Updating AMP player tracking..."
python3 - "$CFG" <<'PY'
from pathlib import Path
import os
import sys
import tempfile
path = Path(sys.argv[1])
original = path.read_text()
settings = {
"App.AdminMethod":
"TailLogFile",
"App.TailLogFilePath":
"{{$FullBaseDir}}amp-connections/current_connections.txt",
"Console.UserJoinRegex":
r'^\[.*\] event="fully-connected" message="".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$',
"Console.UserLeaveRegex":
r'^\[.*\] event="disconnect" message="receive-disconnect".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$',
}
lines = original.splitlines()
for key, value in settings.items():
prefix = key + "="
matches = [
i for i, line in enumerate(lines)
if line.startswith(prefix)
]
if len(matches) > 1:
raise RuntimeError(
f"Refusing to modify {key}: "
f"it occurs more than once in GenericModule.kvp"
)
if matches:
lines[matches[0]] = prefix + value
else:
lines.append(prefix + value)
new_data = "\n".join(lines) + "\n"
fd, temp_name = tempfile.mkstemp(
prefix=path.name + ".b42fix-",
dir=str(path.parent)
)
try:
with os.fdopen(fd, "w") as f:
f.write(new_data)
f.flush()
os.fsync(f.fileno())
os.replace(temp_name, path)
except Exception:
try:
os.unlink(temp_name)
except FileNotFoundError:
pass
raise
PY
chown "$AMP_USER:$AMP_GROUP" "$CFG"
chmod "$CFG_MODE" "$CFG"
grep -Fqx \
'App.AdminMethod=TailLogFile' "$CFG" || {
echo "ERROR: App.AdminMethod validation failed."
exit 1
}
grep -Fqx \
'App.TailLogFilePath={{$FullBaseDir}}amp-connections/current_connections.txt' "$CFG" || {
echo "ERROR: TailLogFilePath validation failed."
exit 1
}
grep -Fqx \
'Console.UserJoinRegex=^\[.*\] event="fully-connected" message="".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$' "$CFG" || {
echo "ERROR: Join regex validation failed."
exit 1
}
grep -Fqx \
'Console.UserLeaveRegex=^\[.*\] event="disconnect" message="receive-disconnect".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$' "$CFG" || {
echo "ERROR: Leave regex validation failed."
exit 1
}
echo "AMP configuration validated."
# --------------------------------------------------
# Create stable connection log
# --------------------------------------------------
echo
echo "5/9 - Creating stable AMP connection log..."
mkdir -p "$BRIDGEDIR"
touch "$BRIDGEFILE"
chown "$AMP_USER:$AMP_GROUP" "$BRIDGEDIR"
chown "$AMP_USER:$AMP_GROUP" "$BRIDGEFILE"
# --------------------------------------------------
# Python bridge
# --------------------------------------------------
echo
echo "6/9 - Installing Build 42 connection bridge..."
mkdir -p /usr/local/libexec
cat > "$SCRIPT" <<PY
#!/usr/bin/env python3
import json
import logging
import os
import time
from pathlib import Path
LOGDIR = Path(${LOGDIR@Q})
OUTDIR = Path(${BRIDGEDIR@Q})
OUTFILE = OUTDIR / "current_connections.txt"
STATEFILE = OUTDIR / "bridge-state.json"
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s"
)
def load_state():
try:
data = json.loads(STATEFILE.read_text())
return {
"source": str(data.get("source", "")),
"offset": int(data.get("offset", 0))
}
except FileNotFoundError:
return {"source": "", "offset": 0}
except Exception as exc:
logging.warning("Could not read state: %s", exc)
return {"source": "", "offset": 0}
def save_state(source, offset):
tmp = STATEFILE.with_suffix(".tmp")
tmp.write_text(
json.dumps({
"source": str(source),
"offset": int(offset)
})
)
os.replace(tmp, STATEFILE)
OUTDIR.mkdir(parents=True, exist_ok=True)
OUTFILE.touch(exist_ok=True)
state = load_state()
current_source = state["source"]
offset = state["offset"]
logging.info("Watching %s", LOGDIR)
logging.info("Stable AMP log: %s", OUTFILE)
while True:
try:
files = [
p for p in LOGDIR.glob("*_connections.txt")
if p.is_file()
]
if not files:
time.sleep(1)
continue
newest = max(
files,
key=lambda p: p.stat().st_mtime_ns
)
newest_str = str(newest)
if newest_str != current_source:
logging.info(
"Following connection log: %s",
newest
)
current_source = newest_str
offset = 0
save_state(current_source, offset)
size = newest.stat().st_size
if size < offset:
logging.info(
"Connection log truncated; resetting offset"
)
offset = 0
if size > offset:
with newest.open("rb") as src:
src.seek(offset)
data = src.read()
if data:
with OUTFILE.open("ab") as dst:
dst.write(data)
dst.flush()
os.fsync(dst.fileno())
offset += len(data)
save_state(current_source, offset)
except FileNotFoundError:
# Expected briefly during PZ log rotation/restart.
time.sleep(1)
except PermissionError as exc:
logging.error("Permission error: %s", exc)
time.sleep(5)
except Exception:
logging.exception("Unexpected bridge error")
time.sleep(5)
time.sleep(0.5)
PY
chmod 755 "$SCRIPT"
chown root:root "$SCRIPT"
SCRIPT_CREATED=1
if ! python3 -m py_compile "$SCRIPT"; then
echo "ERROR: Python bridge validation failed."
exit 1
fi
echo "Bridge script validated."
# --------------------------------------------------
# systemd service
# --------------------------------------------------
echo
echo "7/9 - Installing automatic bridge service..."
cat > "$SERVICE" <<EOF
[Unit]
Description=Project Zomboid B42 AMP connection bridge ($INSTANCE)
After=local-fs.target
[Service]
Type=simple
User=$AMP_USER
Group=$AMP_GROUP
ExecStart=/usr/bin/python3 $SCRIPT
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
EOF
SERVICE_CREATED=1
systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME"
sleep 2
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
echo
echo "ERROR: Bridge service failed to start."
echo
journalctl \
-u "$SERVICE_NAME" \
-n 30 \
--no-pager
exit 1
fi
echo "Bridge service is running."
# --------------------------------------------------
# Verify bridge
# --------------------------------------------------
echo
echo "8/9 - Verifying Build 42 bridge..."
sleep 2
if [ ! -f "$BRIDGEFILE" ]; then
echo "ERROR: Stable connection file does not exist."
exit 1
fi
if [ ! -f "$STATEFILE" ]; then
echo
echo "ERROR: Bridge is running but state file was not created."
echo
journalctl \
-u "$SERVICE_NAME" \
-n 30 \
--no-pager
exit 1
fi
SOURCE_LOG="$(
python3 - "$STATEFILE" <<'PY'
import json
import sys
try:
with open(sys.argv[1]) as f:
print(json.load(f).get("source", ""))
except Exception:
print("")
PY
)"
if [ -z "$SOURCE_LOG" ]; then
echo "ERROR: Bridge did not select a connection log."
exit 1
fi
if [ ! -f "$SOURCE_LOG" ]; then
echo
echo "ERROR: Selected connection log does not exist:"
echo " $SOURCE_LOG"
exit 1
fi
echo "Bridge is following:"
echo " $SOURCE_LOG"
echo
echo "Stable AMP log:"
echo " $BRIDGEFILE"
# --------------------------------------------------
# Restart AMP instance
# --------------------------------------------------
echo
echo "9/9 - Restarting Project Zomboid AMP instance..."
AMP_HOME="$(getent passwd "$AMP_USER" | cut -d: -f6)"
if [ -z "$AMP_HOME" ] || [ ! -d "$AMP_HOME" ]; then
echo
echo "WARNING: Could not determine the AMP user's home."
echo "The workaround itself has installed successfully."
echo "Restart the Project Zomboid instance manually in AMP."
else
if [ -x "$AMP_HOME/ampinstmgr" ]; then
runuser -u "$AMP_USER" -- \
bash -c "cd $(printf '%q' "$AMP_HOME") && ./ampinstmgr --RestartInstance $(printf '%q' "$INSTANCE")"
elif command -v ampinstmgr >/dev/null 2>&1; then
runuser -u "$AMP_USER" -- \
bash -c "cd $(printf '%q' "$AMP_HOME") && ampinstmgr --RestartInstance $(printf '%q' "$INSTANCE")"
else
echo
echo "WARNING: ampinstmgr could not be found."
echo "The workaround itself has installed successfully."
echo "Restart Project Zomboid manually from the AMP web interface."
fi
fi
INSTALL_OK=1
trap - EXIT
echo
echo "=================================================="
echo " INSTALL COMPLETE"
echo "=================================================="
echo
echo "Instance:"
echo " $INSTANCE"
echo
echo "Bridge service:"
echo " $SERVICE_NAME"
echo
echo "Configuration backup:"
echo " $BACKUP"
echo
echo "PZ connection log:"
echo " $SOURCE_LOG"
echo
echo "Stable AMP connection log:"
echo " $BRIDGEFILE"
echo
echo "Wait until Project Zomboid is Ready."
echo "Then fully connect one player and refresh AMP."
echo
echo "Active Users should change:"
echo " 0 / 32 -> 1 / 32"
echo
echo "Diagnostics:"
echo " sudo journalctl -u $SERVICE_NAME -n 50 --no-pager"
echo
PZB42FIX
What should happen afterwards?
Wait until Project Zomboid has completely started again.
Then have one player fully join the server.
Open the Project Zomboid instance in AMP and look at:
Metrics and Status
The Active Users value should change from:
0 / 32
to:
1 / 32
If a second player joins it should become:
2 / 32
When a player disconnects, the number should decrease again.
If it still shows 0 / 32
For an instance called:
ProjectZomboid01
the helper service will be called:
pz-amp-connection-bridge-ProjectZomboid01.service
Check whether it is running with:
sudo systemctl status \
pz-amp-connection-bridge-ProjectZomboid01.service
You want to see:
active (running)
For more detailed diagnostics:
sudo journalctl \
-u pz-amp-connection-bridge-ProjectZomboid01.service \
-n 50 \
--no-pager
The log should show which Build 42 *_connections.txt file the helper is currently following.
Undo / Roll Back
The installer creates a new timestamped backup of GenericModule.kvp.
For example:
GenericModule.kvp.b42-active-users-backup-20260814-050312
The exact backup path is displayed when installation finishes.
If you later want to remove the workaround, first stop and disable its service.
For ProjectZomboid01:
sudo systemctl disable --now \
pz-amp-connection-bridge-ProjectZomboid01.service
Then restore the GenericModule.kvp backup that was printed when the workaround was installed.
Do not use the example backup filename above unless it is actually the backup created on your machine.
After restoring the backup, restart the Project Zomboid instance.
If an official AMP fix becomes available, I recommend removing this workaround and returning to the official configuration.
Important Notes
This is a temporary community workaround, not an official CubeCoders fix.
Tested with:
AMP 2.8.0.4
Debian GNU/Linux 13
Podman
Project Zomboid Build 42
GenericModule
The workaround counts a player only when Build 42 reports:
event="fully-connected"
It deliberately does not use:
client-connect
because Build 42 can emit client-connect before the player has actually completed the connection process.
A normal disconnect is detected from:
event="disconnect" message="receive-disconnect"
The installer also creates a separate bridge service for each AMP instance, so multiple Project Zomboid instances do not share the same bridge process.
AMP/template updates may overwrite GenericModule.kvp.
If Active Users stops working after an AMP update, first check whether the official AMP template has fixed the problem. If not, the workaround may need to be reapplied.
Why This Workaround Is Needed
Project Zomboid Build 42 no longer appears to expose player join/leave information in stdout in the format expected by the current AMP Project Zomboid configuration.
Project Zomboid itself still knows the correct players.
For example, running:
players
in the Project Zomboid console reports the connected players correctly, while AMP can remain at:
Active Users: 0 / 32
Build 42 writes useful connection events into timestamped files under:
Zomboid/Logs/YYYY-MM-DD_HH-MM_connections.txt
For example:
Zomboid/Logs/2026-08-14_02-20_connections.txt
Zomboid/Logs/2026-08-14_03-27_connections.txt
A successful connection contains:
event="fully-connected" ... steam-id="765..." ... username="Player Name"
A normal disconnect contains:
event="disconnect" message="receive-disconnect" ... steam-id="765..." ... username="Player Name"
I confirmed that the following AMP regexes correctly track those events:
Console.UserJoinRegex=^\[.*\] event="fully-connected" message="".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$
Console.UserLeaveRegex=^\[.*\] event="disconnect" message="receive-disconnect".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$
AMP Active Users also works correctly when these events are supplied through a stable TailLogFile using:
App.AdminMethod=TailLogFile
App.TailLogFilePath={{$FullBaseDir}}amp-connections/current_connections.txt
I tested this directly and confirmed that a matching fully-connected event changes AMP from:
0 / 32
to:
1 / 32
So the player event parsing itself works.
The remaining problem is the filename.
Root Problem
Project Zomboid Build 42 creates a new timestamped connections log when the server starts.
For example:
2026-08-14_02-20_connections.txt
2026-08-14_03-27_connections.txt
AMP currently uses a fixed:
App.TailLogFilePath
so it cannot directly follow whichever *_connections.txt file becomes the current log after a Project Zomboid restart.
The workaround above therefore does this:
Project Zomboid B42
|
v
Zomboid/Logs/
*_connections.txt
|
v
small bridge service
|
v
amp-connections/current_connections.txt
|
v
AMP TailLogFile
|
v
Active Users / @UserCount
The bridge automatically detects when Project Zomboid creates a newer *_connections.txt file and begins following it.
Suggested AMP Fix
Would it be possible for the Project Zomboid Build 42 template or GenericModule to natively support following the newest file matching a wildcard/glob such as:
Zomboid/Logs/*_connections.txt
and automatically switch to the new matching file when Project Zomboid rotates/creates its connection log?
That would allow the Build 42 events to be parsed directly using:
Console.UserJoinRegex=^\[.*\] event="fully-connected" message="".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$
Console.UserLeaveRegex=^\[.*\] event="disconnect" message="receive-disconnect".*steam-id="(?<userid>\d+)".*username="(?<username>[^"]+)".*$
and would remove the need for the external bridge workaround.
A native solution which obtains the current player list from Project Zomboid’s players command would potentially solve the same issue as well.
System Information
| Field | Value |
|---|---|
| Operating System | Debian GNU/Linux 13 on x86_64 |
| Product | AMP ‘Proteus’ v2.8.0.4 (Mainline) |
| Virtualization | Podman |
| Application | Project Zomboid |
| Module | GenericModule |
| Running in Container | Yes |
| Current State | Ready |
Reproduction Steps
-
Run a Project Zomboid Build 42 server using AMP 2.8.0.4 / GenericModule on Linux with Podman.
-
Connect one or more players.
-
Run:
players
in the Project Zomboid console.
- Confirm Project Zomboid reports the connected player(s), while AMP still displays:
Active Users: 0 / 32
- Check:
Zomboid/Logs/
and observe that Build 42 writes player connection information into a timestamped:
*_connections.txt
file.
- Confirm a completed player connection produces:
event="fully-connected"
including steam-id and username.
- Confirm a normal disconnect produces:
event="disconnect" message="receive-disconnect"
-
Configure GenericModule to use
TailLogFilewith a stable file and the join/leave regexes shown above. -
Feed the same Build 42 connection events into the stable file.
-
Confirm AMP Active Users updates correctly.
-
Restart Project Zomboid.
-
Observe that Build 42 creates a new timestamped
*_connections.txtfile. -
Because
App.TailLogFilePathpoints to one fixed path, AMP cannot automatically switch to the newly-created Build 42 connection log without an external bridge or similar workaround.