diff --git a/.gitignore b/.gitignore index 6ed18b3..77f2712 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ loom-cache/ *.bak __pycache__/ -*.pyc \ No newline at end of file +*.pyc + +run-*/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 677dedf..5e0b472 100644 --- a/build.gradle +++ b/build.gradle @@ -25,3 +25,21 @@ java { languageVersion = JavaLanguageVersion.of(17) } } + +loom { + runs { + server { + server() + runDir "run-server" + } + client1 { + client() + runDir "run-1" + } + client2 { + client() + runDir "run-2" + } + } +} + diff --git a/chipper b/chipper index 84fd3b7..b227baa 100755 --- a/chipper +++ b/chipper @@ -1,119 +1,226 @@ #!/usr/bin/env bash - -# Do NOT use `set -e` with Gradle set -u -RUN_DIR="run" -OPTIONS_SRC="./config/options.txt" -OPTIONS_DST="$RUN_DIR/options.txt" - GRADLE="./gradlew" -GRADLE_FLAGS=( +GRADLE_BASE_FLAGS=( "--console=plain" - "--configuration-cache" + "--no-daemon" + "-Dfabric.development=true" + "-Dminecraft.api.env=dev" + "-Dminecraft.session.disable=true" ) -# ---------- helpers ---------- +OPTIONS_SRC="./config/options.txt" + +ROLE="" +ROLE_INDEX="" +PASSTHROUGH=() + +# ---------- utils ---------- + +rand() { shuf -i 0-$(($1 - 1)) -n 1; } + +parse_args() { + local cleaned=() + for ((i=0; i<${#ARGS[@]}; i++)); do + case "${ARGS[$i]}" in + -s|--server) + ROLE="server" + ;; + -p1|--player1) + ROLE="client" + ROLE_INDEX=1 + ;; + -p2|--player2) + ROLE="client" + ROLE_INDEX=2 + ;; + --) + PASSTHROUGH=( "${ARGS[@]:$((i+1))}" ) + break + ;; + *) + cleaned+=( "${ARGS[$i]}" ) + ;; + esac + done + ARGS=( "${cleaned[@]}" ) +} + +# ---------- run-dir helpers ---------- + +prepare_run_dir() { + local dir="$1" + rm -rf "$dir" + mkdir -p "$dir" +} inject_options() { + local dir="$1" + + # options.txt if [[ -f "$OPTIONS_SRC" ]]; then - echo "[*] Injecting options.txt..." - cp "$OPTIONS_SRC" "$OPTIONS_DST" - else - echo "[!] Warning: $OPTIONS_SRC not found, skipping injection" + cp "$OPTIONS_SRC" "$dir/options.txt" + fi + + # servers.dat (client server list) + if [[ -f "./config/servers.dat" ]]; then + cp "./config/servers.dat" "$dir/servers.dat" fi } -ensure_run_dir() { - if [[ ! -d "$RUN_DIR" ]]; then - echo "[*] Creating run directory..." - mkdir -p "$RUN_DIR" +ensure_server_files() { + local dir="$1" + + [[ -f "$dir/eula.txt" ]] || echo "eula=true" > "$dir/eula.txt" + + if [[ ! -f "$dir/server.properties" ]]; then + cat > "$dir/server.properties" < ^ <' + +' /\_/\ + ( -.- ) + o_(")(")' + +' /\_/\ + ( @.@ ) + > ~ <' + ) -clean() { clear - echo "[*] Running gradle clean..." - $GRADLE clean "${GRADLE_FLAGS[@]}" + echo "${squirrels[$(rand ${#squirrels[@]})]}" + echo + case "$action" in + run) echo "🐿️ running chipper" ;; + clean) echo "🐿️ cleaning workspace" ;; + build) echo "🐿️ building project" ;; + tree) echo "🐿️ observing project tree" ;; + *) echo "🐿️ thinking..." ;; + esac + echo } -build() { - clear +# ---------- commands ---------- - ensure_run_dir - inject_options +cmd_run() { + header run - echo "[*] Running client..." - $GRADLE runClient "${GRADLE_FLAGS[@]}" + case "$ROLE" in + server) + run_dir="run-server" + prepare_run_dir "$run_dir" + inject_options "$run_dir" + ensure_server_files "$run_dir" + + echo "🖥️🐿️ starting dedicated server" + exec "$GRADLE" runServer "${GRADLE_BASE_FLAGS[@]}" "${PASSTHROUGH[@]}" + ;; + + client) + run_dir="run-$ROLE_INDEX" + task="runClient$ROLE_INDEX" + prepare_run_dir "$run_dir" + inject_options "$run_dir" + + echo "🎮🐿️ starting client $ROLE_INDEX" + exec "$GRADLE" "$task" "${GRADLE_BASE_FLAGS[@]}" "${PASSTHROUGH[@]}" + ;; + + *) + echo "❌🐿️ no role selected" + echo "👉🐿️ use one of:" + echo " --server" + echo " --player1" + echo " --player2" + exit 1 + ;; + esac } -show_tree() { - clear - echo "[*] Project tree (respecting .gitignore):" +cmd_clean() { + header clean + "$GRADLE" clean "${GRADLE_BASE_FLAGS[@]}" "${PASSTHROUGH[@]}" +} + +cmd_build() { + header build + "$GRADLE" build "${GRADLE_BASE_FLAGS[@]}" "${PASSTHROUGH[@]}" +} + +cmd_tree() { + header tree tree --gitignore } -ship() { - clear - echo "[*] Building project..." - $GRADLE build "${GRADLE_FLAGS[@]}" - echo "[+] Build ready to ship." -} - -# ---------- help ---------- - -help_menu() { +cmd_help() { cat <<'EOF' -🐿️ S Q U I R R E L B U I L D T O O L 🐿️ + /\_/\ + ( o.o ) + > ^ < + +🐿️ C H I P P E R Usage: - ./chipper [option] + ./chipper run [role] [-- passthrough] -Options: - --clean Run gradle clean - --build Run client (fast path) - --tree Show project tree only - --ship Build project - --help Show this help menu +Roles: + -s, --server Start ONLY server + -p1, --player1 Start ONLY client 1 + -p2, --player2 Start ONLY client 2 + +Other commands: + clean Gradle clean + build Gradle build + tree Show project tree + help Show this menu + +Examples: + ./chipper run --server + ./chipper run --player1 + ./chipper run --player2 + ./chipper run --player1 -- --debug + ./chipper build + ./chipper tree Notes: -- Uses Gradle configuration cache -- Plain console output (no fake progress) -- Safe to Ctrl+C after EXECUTION starts - -The squirrel believes in you. +- No legacy player spawning +- Each role has its own run directory +- options.txt injected per run dir +- Everything after `--` is forwarded +- The squirrel is mandatory EOF } -# ---------- argument parsing ---------- +# ---------- entry ---------- -if [[ $# -eq 0 ]]; then - help_menu - exit 0 -fi +ARGS=( "$@" ) +parse_args -case "$1" in - --clean) - clean - ;; - --build) - build - ;; - --tree) - show_tree - ;; - --ship) - ship - ;; - --help|-h) - help_menu - ;; +case "${ARGS[0]:-help}" in + run) cmd_run ;; + clean) cmd_clean ;; + build) cmd_build ;; + tree) cmd_tree ;; + help|-h) cmd_help ;; *) - echo "[!] Unknown option: $1" - echo "" - help_menu + echo "[!] Unknown command: ${ARGS[0]}" + cmd_help exit 1 ;; esac diff --git a/config/options.txt b/config/options.txt index 3e3dfc2..2b8bea0 100644 --- a/config/options.txt +++ b/config/options.txt @@ -72,8 +72,8 @@ tutorialStep:movement mouseWheelSensitivity:1.0 rawMouseInput:true glDebugVerbosity:1 -skipMultiplayerWarning:false -skipRealms32bitWarning:false +skipMultiplayerWarning:true +skipRealms32bitWarning:true hideMatchedNames:true joinedFirstServer:false hideBundleTutorial:false diff --git a/config/servers.dat b/config/servers.dat new file mode 100644 index 0000000..59e4dec Binary files /dev/null and b/config/servers.dat differ