ref:main
#!/usr/bin/env bash
set -euo pipefail
# Launch a Huorn dedicated server + client connected to it.
#
# Usage:
# ./run_server_client.sh # Launch both (server in background)
# ./run_server_client.sh server # Launch server only
# ./run_server_client.sh client # Launch client only (assumes server running)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
export JAVA_HOME="${JAVA_HOME:-/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home}"
MODE="${1:-both}"
launch_server() {
echo "==> Starting dedicated server on localhost:25565..."
echo " Run directory: fabric/run/server"
echo " Stop with: Ctrl+C or type 'stop' in the server console"
echo ""
./gradlew :fabric:runServer "$@"
}
launch_client() {
echo "==> Starting client (connecting to localhost)..."
echo " Run directory: fabric/run/client"
echo ""
./gradlew :fabric:runClient "$@"
}
case "$MODE" in
server)
launch_server "${@:2}"
;;
client)
launch_client "${@:2}"
;;
both)
echo "==> Launching server in background, then client..."
echo " Server log: fabric/run/server/logs/latest.log"
echo ""
# Start server in background
./gradlew :fabric:runServer &
SERVER_PID=$!
# Wait for server to be ready (check for "Done" in log)
echo "==> Waiting for server to start..."
SERVER_LOG="fabric/run/server/logs/latest.log"
for i in $(seq 1 120); do
if [ -f "$SERVER_LOG" ] && grep -q "Done" "$SERVER_LOG" 2>/dev/null; then
echo "==> Server ready!"
break
fi
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
echo "ERROR: Server process died. Check $SERVER_LOG"
exit 1
fi
sleep 1
done
# Launch client (foreground)
launch_client
# When client exits, stop the server
echo "==> Client closed. Stopping server..."
kill "$SERVER_PID" 2>/dev/null || true
wait "$SERVER_PID" 2>/dev/null || true
echo "==> Done."
;;
*)
echo "Usage: $0 [server|client|both]"
exit 1
;;
esac