A RuneTek3 client (377) that is deobfuscated, converted to Kotlin, and includes QoL improvements.
0

Configure Feed

Select the types of activity you want to include in your feed.

feat: update ci;

+140 -16
+22 -16
.forgejo/workflows/ci.yml
··· 8 8 9 9 jobs: 10 10 build: 11 - runs-on: kotlin # sickday/kotlin:latest (JDK 21; Gradle via ./gradlew wrapper) 11 + runs-on: kotlin # sickday/kotlin:latest (JDK 21 + kotlinc + jar) 12 12 steps: 13 13 - uses: actions/checkout@v4 14 14 15 - - name: Cache Gradle 16 - uses: actions/cache@v4 17 - with: 18 - path: | 19 - ~/.gradle/caches 20 - ~/.gradle/wrapper 21 - key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 22 - restore-keys: gradle-${{ runner.os }}- 15 + # build-client.sh runs `kotlinc src/main/kotlin -include-runtime 16 + # -jvm-target 21` then sets the Main-Class via `jar`. Both tools are in the 17 + # image. It exports JAVA_OPTS=-Xmx3g by default (fine on the runner). No 18 + # Gradle: the client has no third-party deps (config is java.util.Properties). 19 + - name: Build the client jar 20 + run: bash build-client.sh 23 21 24 - # The wrapper self-downloads Gradle 9.0; the image only provides JDK 21. 25 - - name: Build jar 26 - run: ./gradlew --no-daemon clean jar 22 + # Testers get the jar + a launcher for their OS + a default config, zipped 23 + # into one folder — they double-click run.command (macOS) / run.bat 24 + # (Windows) or ./run.sh (Linux); nobody has to know how to launch a jar. 25 + # config/server.properties is gitignored (local), so ship the committed 26 + # EXAMPLE as the default — testers edit net.address to point at the server. 27 + - name: Bundle jar + launch scripts + config 28 + run: | 29 + mkdir -p dist/hla-client/config 30 + cp hla-client.jar run.sh run.command run.bat dist/hla-client/ 31 + cp config/EXAMPLE-server.properties dist/hla-client/config/server.properties 32 + chmod +x dist/hla-client/run.sh dist/hla-client/run.command 33 + (cd dist && zip -r hla-client.zip hla-client) 27 34 28 - - name: Publish jar to the package registry 35 + - name: Publish bundle to the package registry 29 36 if: github.ref == 'refs/heads/main' 30 37 run: | 31 - JAR=$(ls build/libs/*.jar | head -1) 32 38 curl -fsSL --user "${{ github.actor }}:${{ secrets.REGISTRY_TOKEN }}" \ 33 - --upload-file "$JAR" \ 34 - "https://git.dunk.works/api/packages/${{ github.repository_owner }}/generic/hla-client/${{ github.sha }}/$(basename "$JAR")" 39 + --upload-file dist/hla-client.zip \ 40 + "https://git.dunk.works/api/packages/${{ github.repository_owner }}/generic/hla-client/${{ github.sha }}/hla-client.zip" 35 41 # REGISTRY_TOKEN = a Forgejo PAT with write:package (org/repo Actions secret).
+49
build-client.sh
··· 1 + #!/usr/bin/env bash 2 + # 3 + # Build the High Level Alchemy RS377 client into a single self-contained jar. 4 + # 5 + # Compiles every .kt under src/main/kotlin with kotlinc, bundling the Kotlin 6 + # runtime so the jar runs with a bare `java -jar`. The Main-Class is set to 7 + # com.jagex.runescape.Game (its companion `@JvmStatic fun main` is exposed as a 8 + # static method on that class). 9 + # 10 + # The client has no third-party runtime dependencies — configuration is parsed 11 + # with the JDK's java.util.Properties — so a clean kotlinc build needs nothing on 12 + # the classpath. The jars under lib/ are test-only and not used here. 13 + # 14 + # A full kotlinc build from src/ every time keeps "what you run" identical to 15 + # "what's in src/", sidestepping stale IDE/Gradle incremental-build surprises. 16 + # 17 + # Usage: ./build-client.sh 18 + set -euo pipefail 19 + 20 + CLIENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 21 + SRC_DIR="$CLIENT_DIR/src/main/kotlin" 22 + OUT_JAR="$CLIENT_DIR/hla-client.jar" 23 + MAIN_CLASS="com.jagex.runescape.Game" 24 + 25 + KOTLINC="${KOTLINC:-kotlinc}" 26 + JAR="${JAR_BIN:-jar}" 27 + 28 + # kotlinc can be memory-hungry compiling the full client; give it room. 29 + export JAVA_OPTS="${JAVA_OPTS:-"-Xmx3g"}" 30 + 31 + command -v "$KOTLINC" >/dev/null 2>&1 || { echo "error: kotlinc not found (set \$KOTLINC)"; exit 1; } 32 + command -v "$JAR" >/dev/null 2>&1 || { echo "error: jar not found (set \$JAR_BIN)"; exit 1; } 33 + [ -d "$SRC_DIR" ] || { echo "error: src dir not found at $SRC_DIR"; exit 1; } 34 + 35 + echo "[build] compiling $(find "$SRC_DIR" -name '*.kt' | wc -l | tr -d ' ') Kotlin files from $SRC_DIR ..." 36 + echo "[build] this is a full (non-incremental) compile; expect ~1-2 min." 37 + 38 + # -include-runtime bundles kotlin-stdlib so the jar is standalone. 39 + # -jvm-target matches the JDK the run scripts use. 40 + "$KOTLINC" "$SRC_DIR" \ 41 + -include-runtime \ 42 + -jvm-target 21 \ 43 + -d "$OUT_JAR" 44 + 45 + # kotlinc doesn't write a Main-Class; set it so `java -jar` works. 46 + "$JAR" --update --file "$OUT_JAR" --main-class "$MAIN_CLASS" 47 + 48 + echo "[build] done -> $OUT_JAR" 49 + echo "[build] run it with: ./run.sh"
gradlew
+19
run.bat
··· 1 + @echo off 2 + REM High Level Alchemy client launcher — Windows. Double-click to run. 3 + setlocal 4 + cd /d "%~dp0" 5 + 6 + where java >nul 2>nul 7 + if errorlevel 1 ( 8 + echo Java isn't installed. Install Java 21+ from https://adoptium.net and try again. 9 + pause 10 + exit /b 1 11 + ) 12 + if not exist "hla-client.jar" ( 13 + echo hla-client.jar not found next to this script. 14 + pause 15 + exit /b 1 16 + ) 17 + 18 + java -jar hla-client.jar %* 19 + pause
+26
run.command
··· 1 + #!/bin/bash 2 + # 3 + # High Level Alchemy client launcher for macOS — double-click in Finder. 4 + # 5 + # First time, macOS may block it ("unidentified developer"): right-click the 6 + # file -> Open -> Open, just once. (Or in Terminal: xattr -d com.apple.quarantine run.command) 7 + # 8 + # Finder launches double-clicked scripts from your home folder, so we cd to the 9 + # script's own folder first to find the jar and ./config/server.properties next to it. 10 + cd "$(dirname "$0")" || exit 1 11 + 12 + JAR="hla-client.jar" 13 + 14 + if ! command -v java >/dev/null 2>&1; then 15 + echo "Java isn't installed. Install Java 21+ (https://adoptium.net) and try again." 16 + read -r -p "Press Return to close..." 17 + exit 1 18 + fi 19 + if [ ! -f "$JAR" ]; then 20 + echo "hla-client.jar not found next to this script." 21 + read -r -p "Press Return to close..." 22 + exit 1 23 + fi 24 + 25 + java -jar "$JAR" "$@" 26 + read -r -p "Client closed. Press Return to close this window..."
+24
run.sh
··· 1 + #!/usr/bin/env bash 2 + # 3 + # High Level Alchemy client launcher — Linux / macOS (terminal). 4 + # macOS users double-clicking in Finder: use run.command instead. 5 + # 6 + # Just run it: ./run.sh 7 + # Custom args: ./run.sh <args...> (Game.main ignores args; everything comes 8 + # from ./config/server.properties) 9 + set -euo pipefail 10 + 11 + DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 12 + cd "$DIR" || exit 1 # so the client finds ./config/server.properties beside the jar 13 + JAR="$DIR/hla-client.jar" 14 + 15 + if ! command -v java >/dev/null 2>&1; then 16 + echo "Java isn't installed. Install Java 21+ (https://adoptium.net) and try again." 17 + exit 1 18 + fi 19 + if [ ! -f "$JAR" ]; then 20 + echo "hla-client.jar not found next to this script." 21 + exit 1 22 + fi 23 + 24 + exec java -jar "$JAR" "$@"