diff --git a/build.gradle b/build.gradle index 4ad4f96..87ac43e 100644 --- a/build.gradle +++ b/build.gradle @@ -16,23 +16,37 @@ repositories { } dependencies { - compileOnly 'com.majinnaibu.minecraft.plugins:ScoreKeeper:0.2.1-SNAPSHOT' + compileOnly 'com.majinnaibu.minecraft.plugins:ScoreKeeper:0.2.2-SNAPSHOT' compileOnly 'io.papermc.paper:paper-api:1.21.7-R0.1-SNAPSHOT' - compileOnly 'net.kyori:adventure-api:4.14.0' testImplementation libs.junit.junit } + group = 'com.majinnaibu.minecraft.plugins' version = '0.2.1-SNAPSHOT' description = 'MobScores' java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + // Paper 26.1+ requires Java 25. + languageVersion = JavaLanguageVersion.of(25) } } +tasks.named('wrapper') { + gradleVersion = '9.8.0' + distributionType = Wrapper.DistributionType.BIN + distributionBase = Wrapper.PathBase.PROJECT + distributionPath = '.gradle/wrapper/dists' + archiveBase = Wrapper.PathBase.PROJECT + archivePath = '.gradle/wrapper/dists' +} + +tasks.named('updateDaemonJvm') { + languageVersion = JavaLanguageVersion.of(25) +} + publishing { publications { maven(MavenPublication) { diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..6c7b086 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.java.installations.auto-download=true +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.fromEnv=JAVA_HOME diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23..d4a297e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,8 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionBase=PROJECT +distributionPath=.gradle/wrapper/dists +distributionSha256Sum=bafd5ce9cfaea0fbccfdc8439a1ac42fbd4cd9c89dc9a988228d8a2639a58e6c +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.0-bin.zip networkTimeout=10000 validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStoreBase=PROJECT +zipStorePath=.gradle/wrapper/dists diff --git a/settings.gradle b/settings.gradle index adce674..b4ed128 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} + rootProject.name = 'MobScores' diff --git a/src/main/java/com/majinnaibu/minecraft/plugins/mobscores/MobScoresPlugin.java b/src/main/java/com/majinnaibu/minecraft/plugins/mobscores/MobScoresPlugin.java index 28dd3cf..354e2a0 100644 --- a/src/main/java/com/majinnaibu/minecraft/plugins/mobscores/MobScoresPlugin.java +++ b/src/main/java/com/majinnaibu/minecraft/plugins/mobscores/MobScoresPlugin.java @@ -137,8 +137,11 @@ public class MobScoresPlugin extends JavaPlugin { for(pair = i.next(); i.hasNext(); pair = i.next()){ if(pair.getValue() != 0){ EntityType type = pair.getKey(); - Component entityName = Component.translatable(type.translationKey()); - sendPlayerMessage(player, entityName + " = " + pair.getValue().toString()); + Component message = Component.translatable(type.translationKey()) + .append(Component.text(" = ")) + .append(Component.text(String.valueOf(pair.getValue())) + .color(NamedTextColor.GREEN)); + sendPlayerMessage(player, message); } } } @@ -170,6 +173,10 @@ public class MobScoresPlugin extends JavaPlugin { return serializable; } + public void sendPlayerMessage(Player player, Component message) { + player.sendMessage(_messagePrefix.append(message)); + } + public void sendPlayerMessage(Player player, String message) { player.sendMessage(_messagePrefix.append(Component.text(message))); } diff --git a/tools/build-plugin.sh b/tools/build-plugin.sh index 4cc24bf..527a26f 100755 --- a/tools/build-plugin.sh +++ b/tools/build-plugin.sh @@ -1,10 +1,44 @@ #!/usr/bin/env bash -set -e +set -euo pipefail -# Find project root (one directory above this script) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -cd "$PROJECT_ROOT" +export GRADLE_USER_HOME="${GRADLE_USER_HOME:-$PROJECT_ROOT/.gradle/user-home}" +mkdir -p "$GRADLE_USER_HOME/jdks" -./gradlew build \ No newline at end of file +ensure_java_25() { + local version="25" + local os arch archive java_bin actual_home + + case "$(uname -s)" in + Darwin) os="mac" ;; + Linux) os="linux" ;; + *) echo "Unsupported OS: $(uname -s)" >&2; exit 1 ;; + esac + + case "$(uname -m)" in + arm64|aarch64) arch="aarch64" ;; + x86_64|amd64) arch="x64" ;; + *) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;; + esac + + java_bin=$(find "$GRADLE_USER_HOME/jdks" -path '*/bin/java' -type f 2>/dev/null | head -n 1 || true) + if [[ -z "$java_bin" ]]; then + echo "Downloading Temurin JDK $version into $GRADLE_USER_HOME/jdks..." + archive="$GRADLE_USER_HOME/jdks/temurin-$version.tar.gz" + curl -fsSL "https://api.adoptium.net/v3/binary/latest/$version/ga/${os}/${arch}/jdk/hotspot/normal/eclipse" -o "$archive" + tar -xzf "$archive" -C "$GRADLE_USER_HOME/jdks" + rm -f "$archive" + java_bin=$(find "$GRADLE_USER_HOME/jdks" -path '*/bin/java' -type f 2>/dev/null | head -n 1 || true) + fi + + [[ -n "$java_bin" ]] || { echo "Error: could not locate installed JDK 25." >&2; exit 1; } + actual_home="$(dirname "$(dirname "$java_bin")")" + export JAVA_HOME="$actual_home" + export PATH="$JAVA_HOME/bin:$PATH" +} + +ensure_java_25 +cd "$PROJECT_ROOT" +./gradlew build "$@" diff --git a/tools/deploy-plugin.sh b/tools/deploy-plugin.sh index 403245c..5844528 100755 --- a/tools/deploy-plugin.sh +++ b/tools/deploy-plugin.sh @@ -12,7 +12,7 @@ if [[ -z "$MINECRAFT_SERVER_PATH" ]]; then exit 1 fi -PLUGIN_JAR=$(ls -t "$PROJECT_ROOT"/build/libs/*.jar 2>/dev/null | head -n1) +PLUGIN_JAR=$(ls -t "$PROJECT_ROOT"/build/libs/*.jar 2>/dev/null | grep -v -- '-all\.jar$' | head -n1) if [[ ! -f "$PLUGIN_JAR" ]]; then echo "Error: No plugin jar found in $PROJECT_ROOT/build/libs. Build the plugin first." exit 1 diff --git a/tools/publish-local.sh b/tools/publish-local.sh new file mode 100755 index 0000000..6c6f57f --- /dev/null +++ b/tools/publish-local.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +export GRADLE_USER_HOME="${GRADLE_USER_HOME:-$PROJECT_ROOT/.gradle/user-home}" +mkdir -p "$GRADLE_USER_HOME/jdks" + +ensure_java_25() { + local version="25" + local os arch archive java_bin actual_home + + case "$(uname -s)" in + Darwin) os="mac" ;; + Linux) os="linux" ;; + *) echo "Unsupported OS: $(uname -s)" >&2; exit 1 ;; + esac + + case "$(uname -m)" in + arm64|aarch64) arch="aarch64" ;; + x86_64|amd64) arch="x64" ;; + *) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;; + esac + + java_bin=$(find "$GRADLE_USER_HOME/jdks" -path '*/bin/java' -type f 2>/dev/null | head -n 1 || true) + if [[ -z "$java_bin" ]]; then + echo "Downloading Temurin JDK $version into $GRADLE_USER_HOME/jdks..." + archive="$GRADLE_USER_HOME/jdks/temurin-$version.tar.gz" + curl -fsSL "https://api.adoptium.net/v3/binary/latest/$version/ga/${os}/${arch}/jdk/hotspot/normal/eclipse" -o "$archive" + tar -xzf "$archive" -C "$GRADLE_USER_HOME/jdks" + rm -f "$archive" + java_bin=$(find "$GRADLE_USER_HOME/jdks" -path '*/bin/java' -type f 2>/dev/null | head -n 1 || true) + fi + + [[ -n "$java_bin" ]] || { echo "Error: could not locate installed JDK 25." >&2; exit 1; } + actual_home="$(dirname "$(dirname "$java_bin")")" + export JAVA_HOME="$actual_home" + export PATH="$JAVA_HOME/bin:$PATH" +} + +ensure_java_25 +cd "$PROJECT_ROOT" +./gradlew publishToMavenLocal "$@" diff --git a/tools/publish-modrinth.sh b/tools/publish-modrinth.sh new file mode 100755 index 0000000..8c3450a --- /dev/null +++ b/tools/publish-modrinth.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +# shellcheck source=setup-env.sh +source "$SCRIPT_DIR/setup-env.sh" + +MODRINTH_TOKEN="${MODRINTH_TOKEN:-}" +MODRINTH_PROJECT_ID="${MODRINTH_PROJECT_ID:-${MODRINTH_PROJECT_SLUG:-mob-scores}}" +MODRINTH_VERSION="${MODRINTH_VERSION:-${VERSION:-$(grep -E '^version=' gradle.properties | head -n1 | cut -d= -f2-)}}" +MODRINTH_CHANGELOG="${MODRINTH_CHANGELOG:-Auto release via publish-modrinth.sh}" +MODRINTH_GAME_VERSIONS="${MODRINTH_GAME_VERSIONS:-1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7}" +MODRINTH_LOADERS="${MODRINTH_LOADERS:-paper}" +MODRINTH_FILE="${MODRINTH_FILE:-}" +MODRINTH_DEPENDENCIES="${MODRINTH_DEPENDENCIES:-}" + +if [[ -z "$MODRINTH_TOKEN" ]]; then + echo "Error: MODRINTH_TOKEN is not set in $PROJECT_ROOT/.env" >&2 + exit 1 +fi + +if [[ -z "$MODRINTH_FILE" ]]; then + MODRINTH_FILE=$(ls -t "$PROJECT_ROOT"/build/libs/*.jar 2>/dev/null | grep -v -- '-all\.jar$' | head -n1 || true) +fi +if [[ -z "$MODRINTH_FILE" || ! -f "$MODRINTH_FILE" ]]; then + echo "Error: no jar found for Modrinth upload. Build the project first or set MODRINTH_FILE." >&2 + exit 1 +fi + +csv_to_json_array() { + jq -cn --arg csv "$1" '$csv | split(",") | map(gsub("^\\s+|\\s+$"; "")) | map(select(length > 0))' +} +MODRINTH_GAME_VERSIONS_JSON=$(csv_to_json_array "$MODRINTH_GAME_VERSIONS") +MODRINTH_LOADERS_JSON=$(csv_to_json_array "$MODRINTH_LOADERS") + +if [[ -n "$MODRINTH_DEPENDENCIES" ]]; then + MODRINTH_DEPENDENCIES_ARG=(--form "dependencies=$MODRINTH_DEPENDENCIES") +else + MODRINTH_DEPENDENCIES_ARG=() +fi + +curl -fsSL \ + -X POST "https://api.modrinth.com/v2/version" \ + -H "Authorization: $MODRINTH_TOKEN" \ + -F "project_id=$MODRINTH_PROJECT_ID" \ + -F "version_number=$MODRINTH_VERSION" \ + -F "changelog=$MODRINTH_CHANGELOG" \ + -F "game_versions=${MODRINTH_GAME_VERSIONS_JSON}" \ + -F "loaders=${MODRINTH_LOADERS_JSON}" \ + -F "file=@$MODRINTH_FILE" \ + "${MODRINTH_DEPENDENCIES_ARG[@]}" \ + | jq .