diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a42299c..e3ad98e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,13 +32,13 @@ jobs: cd /tmp/MockBukkit && ./gradlew publishToMavenLocal -xtest -xjavadoc - name: Run unit tests - run: mvn -B -ntp -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report + run: mvn -B -ntp -pl ezafk-core -am -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report - name: Upload unit test coverage to Codecov uses: codecov/codecov-action@v5 with: use_oidc: true - files: ./target/site/jacoco/jacoco.xml + files: ezafk-core/target/site/jacoco/jacoco.xml flags: unit name: unit-tests @@ -66,338 +66,13 @@ jobs: cd /tmp/MockBukkit && ./gradlew publishToMavenLocal -xtest -xjavadoc - name: Run feature tests - run: mvn -B -ntp -Pfeature-tests -Dtest=*FeatureTest -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report + run: mvn -B -ntp -pl ezafk-core -am -Dtest=*FeatureTest -Dmockbukkit.version="$MOCKBUKKIT_VERSION" org.jacoco:jacoco-maven-plugin:0.8.14:prepare-agent test org.jacoco:jacoco-maven-plugin:0.8.14:report -Dsurefire.failIfNoSpecifiedTests=false - name: Upload feature test coverage to Codecov uses: codecov/codecov-action@v5 with: use_oidc: true - files: ./target/site/jacoco/jacoco.xml + files: ezafk-core/target/site/jacoco/jacoco.xml flags: feature name: feature-tests - # ────────────────────────────────────────────────────────────────────────── - # SMOKE TESTS — verify EzAfk loads without errors on each server platform. - # - # All smoke jobs build with JDK 25: - # paper-api 26.x uses Java 25 class files (version 69); older JDKs - # cannot read them and the build fails. - # maven.compiler.release=21 → plugin JAR targets Java 21 bytecode, - # compatible with every Minecraft 1.21+ server (Java 21+ required). - # - # Build uses -Dmaven.test.skip=true (avoids needing the MockBukkit install). - # ────────────────────────────────────────────────────────────────────────── - - spigot-smoke-test: - name: Spigot 1.21.4 (build JDK 25 / server JDK 21) - runs-on: ubuntu-latest - needs: [unit-tests, feature-tests] - # BuildTools for Spigot 1.21.4 requires Java 21–24 (javaVersions [65,68]). - # JDK 25 is rejected by BuildTools even though the server itself runs fine - # on any Java 21+ JVM. Strategy: compile the plugin with JDK 25 (paper-api - # 26.x needs it), then swap to JDK 21 for BuildTools and server launch. - - steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Set up build JDK 25 - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: '25' - cache: maven - - - name: Build plugin JAR (JDK 25) - run: mvn -B -ntp -Dmaven.test.skip=true package - - - name: Set up server JDK 21 - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: '21' - - - name: Cache Spigot 1.21.4 JAR - id: spigot-cache - uses: actions/cache@v4 - with: - path: spigot-1.21.4.jar - key: spigot-1.21.4-buildtools-v1 - - - name: Build Spigot 1.21.4 via BuildTools - if: steps.spigot-cache.outputs.cache-hit != 'true' - run: | - git config --global user.email "ci@ci.local" - git config --global user.name "CI" - curl -fsSL \ - https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar \ - -o BuildTools.jar - java -jar BuildTools.jar --rev 1.21.4 --compile SPIGOT - - - name: Configure server - run: | - mkdir -p smoke-server/plugins - cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar - cp spigot-1.21.4.jar smoke-server/ - echo "eula=true" > smoke-server/eula.txt - printf '%s\n' \ - "online-mode=false" \ - "level-type=flat" \ - "generate-structures=false" \ - "max-players=0" \ - > smoke-server/server.properties - - - name: Run server and wait for ready - run: | - cd smoke-server - java -Xms512m -Xmx1g -jar spigot-1.21.4.jar --nogui > server.log 2>&1 & - SERVER_PID=$! - ELAPSED=0 - while [ $ELAPSED -lt 120 ]; do - sleep 2; ELAPSED=$((ELAPSED + 2)) - if grep -q "Done (" server.log 2>/dev/null; then - echo "Server ready after ${ELAPSED}s"; break - fi - if ! kill -0 $SERVER_PID 2>/dev/null; then - echo "Server process exited after ${ELAPSED}s"; break - fi - done - kill $SERVER_PID 2>/dev/null || true - for _ in $(seq 1 15); do - if ! kill -0 $SERVER_PID 2>/dev/null; then - break - fi - sleep 1 - done - if kill -0 $SERVER_PID 2>/dev/null; then - echo "Server did not stop after SIGTERM; forcing shutdown" - kill -9 $SERVER_PID 2>/dev/null || true - fi - wait $SERVER_PID 2>/dev/null || true - - - name: Assert no EzAfk errors - run: | - LOG=smoke-server/server.log - if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then - echo "::error::EzAfk logged errors on Spigot 1.21.4 / Java 21 startup:" - grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG" - exit 1 - fi - if grep -qiE "Enabling EzAfk" "$LOG"; then - echo "Spigot 1.21.4 / Java 21 smoke test passed." - else - echo "::warning::EzAfk 'Enabling EzAfk' not found in log — plugin may not have loaded within the timeout" - fi - - - name: Upload server log - if: always() - uses: actions/upload-artifact@v4 - with: - name: spigot-1.21.4-java21-smoke-log - path: smoke-server/server.log - retention-days: 7 - - paper-smoke-test: - name: Paper 1.21.11 / Java 25 - runs-on: ubuntu-latest - needs: [unit-tests, feature-tests] - - steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Set up JDK 25 - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: '25' - cache: maven - - - name: Build plugin JAR - run: mvn -B -ntp -Dmaven.test.skip=true package - - - name: Resolve latest Paper 1.21.11 build - id: paper - run: | - USER_AGENT="EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" - BUILDS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/paper/versions/1.21.11/builds") - BUILD=$(printf '%s' "$BUILDS_JSON" | \ - python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Paper builds returned'; print(chosen['id'])") - DOWNLOAD_URL=$(printf '%s' "$BUILDS_JSON" | \ - python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Paper builds returned'; print(chosen['downloads']['server:default']['url'])") - echo "build=${BUILD}" >> "$GITHUB_OUTPUT" - echo "download_url=${DOWNLOAD_URL}" >> "$GITHUB_OUTPUT" - echo "Resolved: Paper 1.21.11 build ${BUILD}" - - - name: Download Paper 1.21.11 server JAR - run: | - mkdir -p smoke-server/plugins - curl -fsSL -H "User-Agent: EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" \ - "${{ steps.paper.outputs.download_url }}" \ - -o smoke-server/paper.jar - - - name: Copy plugin JAR - run: cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar - - - name: Configure server - run: | - echo "eula=true" > smoke-server/eula.txt - printf '%s\n' \ - "online-mode=false" \ - "level-type=flat" \ - "generate-structures=false" \ - "max-players=0" \ - > smoke-server/server.properties - - - name: Run server and wait for ready - run: | - cd smoke-server - java -Xms512m -Xmx1g -jar paper.jar --nogui > server.log 2>&1 & - SERVER_PID=$! - ELAPSED=0 - while [ $ELAPSED -lt 120 ]; do - sleep 2; ELAPSED=$((ELAPSED + 2)) - if grep -q "Done (" server.log 2>/dev/null; then - echo "Server ready after ${ELAPSED}s"; break - fi - if ! kill -0 $SERVER_PID 2>/dev/null; then - echo "Server process exited after ${ELAPSED}s"; break - fi - done - kill $SERVER_PID 2>/dev/null || true - for _ in $(seq 1 15); do - if ! kill -0 $SERVER_PID 2>/dev/null; then - break - fi - sleep 1 - done - if kill -0 $SERVER_PID 2>/dev/null; then - echo "Server did not stop after SIGTERM; forcing shutdown" - kill -9 $SERVER_PID 2>/dev/null || true - fi - wait $SERVER_PID 2>/dev/null || true - - - name: Assert no EzAfk errors - run: | - LOG=smoke-server/server.log - if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then - echo "::error::EzAfk logged errors on Paper 1.21.11 / Java 25 startup:" - grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG" - exit 1 - fi - if grep -qiE "Enabling EzAfk" "$LOG"; then - echo "Paper 1.21.11 / Java 25 smoke test passed." - else - echo "::warning::EzAfk 'Enabling EzAfk' not found in log — plugin may not have loaded within the timeout" - fi - - - name: Upload server log - if: always() - uses: actions/upload-artifact@v4 - with: - name: paper-1.21.11-java25-smoke-log - path: smoke-server/server.log - retention-days: 7 - - folia-smoke-test: - name: Folia 1.21.11 / Java 25 - runs-on: ubuntu-latest - needs: [unit-tests, feature-tests] - - steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Set up JDK 25 - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: '25' - cache: maven - - - name: Build plugin JAR - run: mvn -B -ntp -Dmaven.test.skip=true package - - - name: Resolve latest Folia 1.21.11 build - id: folia - run: | - USER_AGENT="EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" - BUILDS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/folia/versions/1.21.11/builds") - BUILD=$(printf '%s' "$BUILDS_JSON" | \ - python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Folia builds returned'; print(chosen['id'])") - DOWNLOAD_URL=$(printf '%s' "$BUILDS_JSON" | \ - python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No Folia builds returned'; print(chosen['downloads']['server:default']['url'])") - echo "build=${BUILD}" >> "$GITHUB_OUTPUT" - echo "download_url=${DOWNLOAD_URL}" >> "$GITHUB_OUTPUT" - echo "Resolved: Folia 1.21.11 build ${BUILD}" - - - name: Download Folia 1.21.11 server JAR - run: | - mkdir -p smoke-server/plugins - curl -fsSL -H "User-Agent: EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" \ - "${{ steps.folia.outputs.download_url }}" \ - -o smoke-server/folia.jar - - - name: Copy plugin JAR - run: cp target/ezafk-*.jar smoke-server/plugins/EzAfk.jar - - - name: Configure server - run: | - echo "eula=true" > smoke-server/eula.txt - printf '%s\n' \ - "online-mode=false" \ - "level-type=flat" \ - "generate-structures=false" \ - "max-players=0" \ - > smoke-server/server.properties - - - name: Run server and wait for ready - run: | - cd smoke-server - java -Xms512m -Xmx1g -jar folia.jar --nogui > server.log 2>&1 & - SERVER_PID=$! - ELAPSED=0 - while [ $ELAPSED -lt 120 ]; do - sleep 2; ELAPSED=$((ELAPSED + 2)) - if grep -q "Done (" server.log 2>/dev/null; then - echo "Server ready after ${ELAPSED}s"; break - fi - if ! kill -0 $SERVER_PID 2>/dev/null; then - echo "Server process exited after ${ELAPSED}s"; break - fi - done - kill $SERVER_PID 2>/dev/null || true - for _ in $(seq 1 15); do - if ! kill -0 $SERVER_PID 2>/dev/null; then - break - fi - sleep 1 - done - if kill -0 $SERVER_PID 2>/dev/null; then - echo "Server did not stop after SIGTERM; forcing shutdown" - kill -9 $SERVER_PID 2>/dev/null || true - fi - wait $SERVER_PID 2>/dev/null || true - - - name: Assert no EzAfk errors - run: | - LOG=smoke-server/server.log - if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then - echo "::error::EzAfk logged errors on Folia 1.21.11 / Java 25 startup:" - grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG" - exit 1 - fi - if grep -qiE "Enabling EzAfk" "$LOG"; then - echo "Folia 1.21.11 / Java 25 smoke test passed." - else - echo "::warning::EzAfk 'Enabling EzAfk' not found in log — server may not have finished loading within the timeout" - fi - - - name: Upload server log - if: always() - uses: actions/upload-artifact@v4 - with: - name: folia-1.21.11-java25-smoke-log - path: smoke-server/server.log - retention-days: 7 - diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 465196b..ee22121 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,7 +80,7 @@ jobs: -DgenerateBackupPoms=false - name: Build - run: mvn -B -ntp -DskipTests package + run: mvn -B -ntp -f pom.xml -DskipTests package # ────────────────────────────────────────────────────────────────────── # 5. EXTRACT CHANGELOG @@ -119,7 +119,7 @@ jobs: gh release create "${{ steps.meta.outputs.ref }}" \ --title "EzAfk ${{ steps.meta.outputs.version }}" \ --notes-file release-notes.md \ - "target/ezafk-${{ steps.meta.outputs.version }}.jar" + "ezafk/target/ezafk-${{ steps.meta.outputs.version }}.jar" # ────────────────────────────────────────────────────────────────────── # 7. MODRINTH RELEASE @@ -133,7 +133,7 @@ jobs: name: "EzAfk ${{ steps.meta.outputs.version }}" version: "${{ steps.meta.outputs.version }}" version-type: release - files: target/ezafk-${{ steps.meta.outputs.version }}.jar + files: ezafk/target/ezafk-${{ steps.meta.outputs.version }}.jar game-versions: ">=1.19" game-versions-filter: release loaders: | @@ -185,4 +185,4 @@ jobs: curl --fail -s -X POST "$DISCORD_WEBHOOK" \ -H "Content-Type: application/json" \ - -d "$PAYLOAD" + -d "$PAYLOAD" \ No newline at end of file diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml new file mode 100644 index 0000000..d78bb36 --- /dev/null +++ b/.github/workflows/smoke-tests.yml @@ -0,0 +1,253 @@ +name: Smoke Tests + +on: + pull_request: + branches: [ v2.x, v3.x ] + +permissions: + contents: read + +# ────────────────────────────────────────────────────────────────────────── +# SMOKE TESTS — verify EzAfk starts the server without errors across +# supported Minecraft server platforms and versions: +# Paper: 1.21.11, 26.1.x, 26.2.x +# Spigot: 1.21.11, 26.1.x, 26.2.x +# Folia: 1.21.11, 26.1.x +# +# The plugin JAR is built once (JDK 25, tests skipped) and shared as an +# artifact across all matrix jobs to avoid rebuilding it 9 times. +# +# Paper/Folia builds are resolved dynamically from fill.papermc.io. +# Spigot builds are compiled locally via BuildTools (cached per version) +# since Spigot has no prebuilt binary distribution. +# +# Each matrix entry runs (and, for Spigot, compiles) on the JDK matching +# what that server version actually supports: +# 1.21.11 → Java 21 +# 26.1.x / 26.2.x → Java 25 +# +# NOTE: Folia has no published 26.2 build yet upstream (only Paper does +# at time of writing), so that matrix entry is omitted entirely; add it +# back once Folia 26.2 ships. +# ────────────────────────────────────────────────────────────────────────── + +jobs: + build-plugin: + name: Build plugin JAR + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '25' + cache: maven + + - name: Build plugin JAR + run: mvn -B -ntp -f pom.xml -Dmaven.test.skip=true package + + - name: Upload plugin JAR + uses: actions/upload-artifact@v4 + with: + name: ezafk-plugin + path: ezafk/target/ezafk-*.jar + retention-days: 1 + + smoke-test: + name: ${{ matrix.platform }} ${{ matrix.version }} + runs-on: ubuntu-latest + needs: build-plugin + continue-on-error: ${{ matrix.allow-failure || false }} + + strategy: + fail-fast: false + matrix: + include: + - family: paper-api + platform: paper + version: "1.21.11" + java-version: "21" + - family: paper-api + platform: paper + version: "26.1" + java-version: "25" + - family: paper-api + platform: paper + version: "26.2" + java-version: "25" + - family: paper-api + platform: folia + version: "1.21.11" + java-version: "21" + - family: paper-api + platform: folia + version: "26.1" + java-version: "25" + - family: spigot + platform: spigot + version: "1.21.11" + java-version: "21" + - family: spigot + platform: spigot + version: "26.1" + java-version: "25" + - family: spigot + platform: spigot + version: "26.2" + java-version: "25" + + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Set up JDK ${{ matrix.java-version }} + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: ${{ matrix.java-version }} + + - name: Download plugin JAR + uses: actions/download-artifact@v4 + with: + name: ezafk-plugin + path: artifacts + + - name: Copy plugin JAR into server + run: | + mkdir -p smoke-server/plugins + cp artifacts/ezafk-*.jar smoke-server/plugins/EzAfk.jar + + # ── Paper / Folia: resolve and download a prebuilt server jar ── + # + # fill.papermc.io's /versions/{version}/builds endpoint requires a + # concrete version (e.g. "26.1.2"), not a version *group* key like + # "26.1" — that 404s. So first resolve matrix.version against the + # project's version groups: if it's already a concrete version, use + # it as-is; otherwise treat it as a group and pick the newest + # concrete version listed for that group. + - name: Resolve latest ${{ matrix.platform }} ${{ matrix.version }} build + if: matrix.family == 'paper-api' + id: resolve + run: | + USER_AGENT="EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" + VERSIONS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/${{ matrix.platform }}") + RESOLVED_VERSION=$(printf '%s' "$VERSIONS_JSON" | \ + python3 -c "import sys,json; groups=json.load(sys.stdin)['versions']; target='${{ matrix.version }}'; all_versions={v for vs in groups.values() for v in vs}; print(target if target in all_versions else groups[target][0] if target in groups else sys.exit(f'Version {target!r} not found for ${{ matrix.platform }}'))") + echo "Resolved matrix version '${{ matrix.version }}' -> concrete version '${RESOLVED_VERSION}'" + BUILDS_JSON=$(curl -fsSL -H "User-Agent: ${USER_AGENT}" "https://fill.papermc.io/v3/projects/${{ matrix.platform }}/versions/${RESOLVED_VERSION}/builds") + BUILD=$(printf '%s' "$BUILDS_JSON" | \ + python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No builds returned'; print(chosen['id'])") + DOWNLOAD_URL=$(printf '%s' "$BUILDS_JSON" | \ + python3 -c "import sys,json; builds=json.load(sys.stdin); chosen=next((b for b in builds if b.get('channel')=='STABLE'), None) or (builds[0] if builds else None); assert chosen, 'No builds returned'; print(chosen['downloads']['server:default']['url'])") + echo "download_url=${DOWNLOAD_URL}" >> "$GITHUB_OUTPUT" + echo "Resolved: ${{ matrix.platform }} ${RESOLVED_VERSION} build ${BUILD}" + + - name: Download ${{ matrix.platform }} server jar + if: matrix.family == 'paper-api' + run: | + curl -fsSL -H "User-Agent: EzAfk-CI/1.0 (https://github.com/ez-plugins/EzAfk)" \ + "${{ steps.resolve.outputs.download_url }}" \ + -o smoke-server/server.jar + + # ── Spigot: compile via BuildTools (cached per version) ── + # BuildTools names the output jar after the *concrete* Minecraft + # version it resolves --rev to (e.g. --rev 26.1 may resolve to + # 26.1.2, producing spigot-26.1.2.jar) rather than the literal + # --rev value, so cache path and copy step glob for it instead of + # assuming the filename matches matrix.version. + - name: Cache Spigot ${{ matrix.version }} JAR + if: matrix.family == 'spigot' + id: spigot-cache + uses: actions/cache@v4 + with: + path: spigot-*.jar + key: spigot-${{ matrix.version }}-buildtools-v1 + + - name: Build Spigot ${{ matrix.version }} via BuildTools + if: matrix.family == 'spigot' && steps.spigot-cache.outputs.cache-hit != 'true' + run: | + git config --global user.email "ci@ci.local" + git config --global user.name "CI" + curl -fsSL \ + https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar \ + -o BuildTools.jar + java -jar BuildTools.jar --rev ${{ matrix.version }} --compile SPIGOT + + - name: Copy Spigot server jar + if: matrix.family == 'spigot' + run: | + SPIGOT_JAR=$(ls spigot-*.jar | head -n1) + echo "Using Spigot jar: ${SPIGOT_JAR}" + cp "${SPIGOT_JAR}" smoke-server/server.jar + + - name: Configure server + run: | + echo "eula=true" > smoke-server/eula.txt + printf '%s\n' \ + "online-mode=false" \ + "level-type=flat" \ + "generate-structures=false" \ + "max-players=0" \ + > smoke-server/server.properties + + - name: Run server and wait for ready + run: | + cd smoke-server + java -Xms512m -Xmx1g -jar server.jar --nogui > server.log 2>&1 & + SERVER_PID=$! + ELAPSED=0 + while [ $ELAPSED -lt 120 ]; do + sleep 2; ELAPSED=$((ELAPSED + 2)) + if grep -q "Done (" server.log 2>/dev/null; then + echo "Server ready after ${ELAPSED}s"; break + fi + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server process exited after ${ELAPSED}s"; break + fi + done + kill $SERVER_PID 2>/dev/null || true + for _ in $(seq 1 15); do + if ! kill -0 $SERVER_PID 2>/dev/null; then + break + fi + sleep 1 + done + if kill -0 $SERVER_PID 2>/dev/null; then + echo "Server did not stop after SIGTERM; forcing shutdown" + kill -9 $SERVER_PID 2>/dev/null || true + fi + wait $SERVER_PID 2>/dev/null || true + + - name: Assert no EzAfk errors + run: | + LOG=smoke-server/server.log + FAILED=0 + if ! grep -q "Done (" "$LOG"; then + echo "::error::Server did not reach 'Done (' — startup failed or timed out" + FAILED=1 + fi + if grep -qE "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG"; then + echo "::error::EzAfk logged errors on ${{ matrix.platform }} ${{ matrix.version }} startup:" + grep -E "(SEVERE|ERROR).*EzAfk|Could not load.*EzAfk" "$LOG" + FAILED=1 + fi + if [ $FAILED -eq 1 ]; then + exit 1 + fi + if grep -qiE "Enabling EzAfk" "$LOG"; then + echo "${{ matrix.platform }} ${{ matrix.version }} smoke test passed." + else + echo "::warning::EzAfk 'Enabling EzAfk' not found in log — plugin may not have loaded within the timeout" + fi + + - name: Upload server log + if: always() + uses: actions/upload-artifact@v4 + with: + name: smoke-log-${{ matrix.platform }}-${{ matrix.version }} + path: smoke-server/server.log + retention-days: 7 diff --git a/.gitignore b/.gitignore index b425f09..75d9a06 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ target/ .factorypath .project .settings +.kilo .springBeans .sts4-cache diff --git a/.mvn/maven.config b/.mvn/maven.config index 4961335..e69de29 100644 --- a/.mvn/maven.config +++ b/.mvn/maven.config @@ -1 +0,0 @@ --Dmockbukkit.version=4.113.1 diff --git a/ezafk-api/pom.xml b/ezafk-api/pom.xml new file mode 100644 index 0000000..b5825f0 --- /dev/null +++ b/ezafk-api/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + com.gyvex + ezafk-parent + 3.1.1 + + + ezafk-api + jar + EzAfk API + + + + io.papermc.paper + paper-api + ${paper.version} + provided + + + org.jetbrains + annotations + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + true + + + + + \ No newline at end of file diff --git a/ezafk-api/src/main/java/com/gyvex/ezafk/version/VersionAdapter.java b/ezafk-api/src/main/java/com/gyvex/ezafk/version/VersionAdapter.java new file mode 100644 index 0000000..2d6f576 --- /dev/null +++ b/ezafk-api/src/main/java/com/gyvex/ezafk/version/VersionAdapter.java @@ -0,0 +1,14 @@ +package com.gyvex.ezafk.version; + +import org.bukkit.attribute.Attribute; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.potion.PotionEffectType; + +public interface VersionAdapter { + + Attribute getMaxHealthAttribute(); + + PotionEffectType getEffect(String minecraftKey); + + Enchantment getEnchantment(String minecraftKey); +} \ No newline at end of file diff --git a/ezafk-core/pom.xml b/ezafk-core/pom.xml new file mode 100644 index 0000000..658b75c --- /dev/null +++ b/ezafk-core/pom.xml @@ -0,0 +1,241 @@ + + + 4.0.0 + + + com.gyvex + ezafk-parent + 3.1.1 + + + ezafk-core + jar + EzAfk Core + + + + com.gyvex + ezafk-api + ${project.version} + + + io.papermc.paper + paper-api + ${paper.version} + provided + + + com.google.code.gson + gson + + + org.apache.commons + commons-lang3 + + + org.slf4j + slf4j-api + + + org.jetbrains + annotations + + + + + com.github.MilkBowl + VaultAPI + 1.7.1 + provided + + + me.clip + placeholderapi + 2.12.2 + provided + + + org.jetbrains + annotations + + + + + com.sk89q.worldguard + worldguard-bukkit + ${worldguard.version} + provided + + + org.bstats + bstats-bukkit + + + org.bstats + bstats-base + + + net.kyori + adventure-api + + + + + com.github.NEZNAMY + TAB-API + 5.5.0 + provided + + + org.jetbrains + annotations + + + + + com.google.code.gson + gson + 2.11.0 + provided + + + org.apache.logging.log4j + log4j-api + ${log4j.api.version} + provided + + + org.slf4j + slf4j-api + 2.0.17 + provided + + + org.bstats + bstats-bukkit + ${bstats.version} + compile + + + net.kyori + adventure-api + 5.2.0 + + + net.kyori + adventure-key + 5.2.0 + + + net.kyori + adventure-text-minimessage + 5.2.0 + + + net.kyori + adventure-text-serializer-legacy + 5.2.0 + + + net.kyori + examination-api + 1.3.0 + + + org.jetbrains + annotations + + + + + net.kyori + examination-string + 1.3.0 + + + org.jetbrains + annotations + + + + + javazoom + jlayer + 1.0.1 + + + de.maxhenkel.voicechat + voicechat-api + 2.2.5 + provided + + + com.github.EzFramework + Jaloquent + ${jaloquent.version} + compile + + + com.github.ez-plugins + ezcountdown + 2.0.1 + provided + + + io.papermc.paper + paper-api + + + net.kyori + adventure-api + + + net.kyori + adventure-key + + + net.kyori + adventure-text-minimessage + + + net.kyori + adventure-text-serializer-legacy + + + org.bstats + bstats-bukkit + + + org.bstats + bstats-base + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + true + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.plugin.version} + + ${maven.test.skip} + false + -Dnet.bytebuddy.experimental=true + + + + + \ No newline at end of file diff --git a/src/main/java/com/gyvex/ezafk/EzAfk.java b/ezafk-core/src/main/java/com/gyvex/ezafk/EzAfk.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/EzAfk.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/EzAfk.java diff --git a/src/main/java/com/gyvex/ezafk/bootstrap/Bootstrap.java b/ezafk-core/src/main/java/com/gyvex/ezafk/bootstrap/Bootstrap.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/bootstrap/Bootstrap.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/bootstrap/Bootstrap.java diff --git a/src/main/java/com/gyvex/ezafk/bootstrap/Registry.java b/ezafk-core/src/main/java/com/gyvex/ezafk/bootstrap/Registry.java similarity index 94% rename from src/main/java/com/gyvex/ezafk/bootstrap/Registry.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/bootstrap/Registry.java index b910449..df8b71a 100644 --- a/src/main/java/com/gyvex/ezafk/bootstrap/Registry.java +++ b/ezafk-core/src/main/java/com/gyvex/ezafk/bootstrap/Registry.java @@ -7,6 +7,8 @@ import com.gyvex.ezafk.repository.StorageFactory; import com.gyvex.ezafk.repository.StorageRepository; import com.gyvex.ezafk.task.TaskManager; +import com.gyvex.ezafk.version.VersionAdapter; +import com.gyvex.ezafk.version.VersionAdapterFactory; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.HandlerList; @@ -28,10 +30,10 @@ public class Registry { private Bootstrap bootstrap = null; private StorageRepository storageRepository; private SchedulerAdapter scheduler; + private VersionAdapter versionAdapter; private final ArrayList registeredListeners = new ArrayList<>(); private Registry() { - // plugin and logger are initialized in setPlugin(EzAfk) before init() is called. } public static void init(EzAfk plugin) { @@ -53,9 +55,9 @@ public void init() { this.configManager = new ConfigManager(plugin); this.scheduler = SchedulerAdapterFactory.create(plugin); + this.versionAdapter = VersionAdapterFactory.create(plugin, this.logger); this.bootstrap = new Bootstrap(plugin); - // initialize storage after Registry is available try { storageRepository = StorageFactory.create(); if (storageRepository != null) storageRepository.init(); @@ -103,6 +105,10 @@ public SchedulerAdapter getScheduler() { return scheduler; } + public VersionAdapter getVersionAdapter() { + return versionAdapter; + } + /** * Reload the storage repository based on current configuration. * This will create a new repository via StorageFactory, init it, diff --git a/src/main/java/com/gyvex/ezafk/command/AfkZoneCommand.java b/ezafk-core/src/main/java/com/gyvex/ezafk/command/AfkZoneCommand.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/command/AfkZoneCommand.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/command/AfkZoneCommand.java diff --git a/src/main/java/com/gyvex/ezafk/command/EzAfkCommand.java b/ezafk-core/src/main/java/com/gyvex/ezafk/command/EzAfkCommand.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/command/EzAfkCommand.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/command/EzAfkCommand.java diff --git a/src/main/java/com/gyvex/ezafk/command/EzAfkTabCompleter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/command/EzAfkTabCompleter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/command/EzAfkTabCompleter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/command/EzAfkTabCompleter.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java similarity index 98% rename from src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java index 28bd28d..bd988d1 100644 --- a/src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java +++ b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/LoreUtil.java @@ -69,13 +69,13 @@ public static boolean validateMiniMessage(String miniMessageString, String conte /** * Converts a raw message string to a legacy §-color string suitable for - * {@link ItemMeta#setDisplayName} / {@link ItemMeta#setLore}. + * {@link ItemMeta#setDisplayName} / {@link ItemMeta#setLore} and chat messages. * *

When the bundled MiniMessage library is available (always, since it is shaded into the * JAR), MiniMessage tags such as {@code } are parsed and the result is serialized back * to a legacy color string. Otherwise, {@code &}-color codes are translated directly.

*/ - private static String toDisplayString(String text, Logger logger) { + public static String toDisplayString(String text, Logger logger) { try { Object component = deserializeToComponent(text); if (component != null) { diff --git a/src/main/java/com/gyvex/ezafk/compatibility/ParticleCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/ParticleCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/ParticleCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/ParticleCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/inventory/InventoryCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/inventory/InventoryCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/inventory/InventoryCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/inventory/InventoryCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/item/HeadCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/HeadCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/item/HeadCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/HeadCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/item/ItemMetaCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/ItemMetaCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/item/ItemMetaCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/ItemMetaCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/item/MaterialCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/MaterialCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/item/MaterialCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/item/MaterialCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/platform/PlatformDetector.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/platform/PlatformDetector.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/platform/PlatformDetector.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/platform/PlatformDetector.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerDisplayCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerDisplayCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/player/PlayerDisplayCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerDisplayCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerKickCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerKickCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/player/PlayerKickCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/player/PlayerKickCompat.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/BukkitSchedulerAdapter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/BukkitSchedulerAdapter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/scheduler/BukkitSchedulerAdapter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/BukkitSchedulerAdapter.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapter.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java similarity index 64% rename from src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java index 9025442..5c6d200 100644 --- a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java +++ b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/SchedulerAdapterFactory.java @@ -22,13 +22,21 @@ private SchedulerAdapterFactory() {} public static SchedulerAdapter create(Plugin plugin) { if (PlatformDetector.isFolia()) { try { - return new FoliaSchedulerAdapter(plugin); + return createFoliaSchedulerAdapter(plugin); } catch (NoClassDefFoundError e) { plugin.getLogger().warning("[EzAfk] Folia classes not found, falling back to Bukkit scheduler: " + e.getMessage()); + } catch (ClassNotFoundException e) { + plugin.getLogger().warning("[EzAfk] FoliaSchedulerAdapter class not found, falling back to Bukkit scheduler."); } catch (Throwable e) { - plugin.getLogger().warning("[EzAfk] Folia detected but Folia scheduler API unavailable — falling back to Bukkit scheduler."); + plugin.getLogger().warning("[EzAfk] Folia detected but Folia scheduler API unavailable — falling back to Bukkit scheduler: " + e.getMessage()); } } return new BukkitSchedulerAdapter(plugin); } + + private static SchedulerAdapter createFoliaSchedulerAdapter(Plugin plugin) throws ClassNotFoundException, ReflectiveOperationException { + Class clazz = Class.forName("com.gyvex.ezafk.compatibility.scheduler.FoliaSchedulerAdapter"); + java.lang.reflect.Constructor ctor = clazz.getConstructor(Plugin.class); + return (SchedulerAdapter) ctor.newInstance(plugin); + } } diff --git a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/TaskHandle.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/TaskHandle.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/scheduler/TaskHandle.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/scheduler/TaskHandle.java diff --git a/src/main/java/com/gyvex/ezafk/compatibility/sound/SoundCompat.java b/ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/sound/SoundCompat.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/compatibility/sound/SoundCompat.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/compatibility/sound/SoundCompat.java diff --git a/src/main/java/com/gyvex/ezafk/config/ConfigManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/config/ConfigManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/config/ConfigManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/config/ConfigManager.java diff --git a/src/main/java/com/gyvex/ezafk/event/PlayerAfkStatusChangeEvent.java b/ezafk-core/src/main/java/com/gyvex/ezafk/event/PlayerAfkStatusChangeEvent.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/event/PlayerAfkStatusChangeEvent.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/event/PlayerAfkStatusChangeEvent.java diff --git a/src/main/java/com/gyvex/ezafk/gui/GuiAction.java b/ezafk-core/src/main/java/com/gyvex/ezafk/gui/GuiAction.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/gui/GuiAction.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/gui/GuiAction.java diff --git a/src/main/java/com/gyvex/ezafk/gui/GuiActionFactory.java b/ezafk-core/src/main/java/com/gyvex/ezafk/gui/GuiActionFactory.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/gui/GuiActionFactory.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/gui/GuiActionFactory.java diff --git a/src/main/java/com/gyvex/ezafk/integration/EconomyIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/EconomyIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/EconomyIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/EconomyIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/Integration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/Integration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/Integration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/Integration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/MetricsIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/MetricsIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/MetricsIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/MetricsIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/PlaceholderApiIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/PlaceholderApiIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/PlaceholderApiIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/PlaceholderApiIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/PlayerListNameAdapter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/PlayerListNameAdapter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/PlayerListNameAdapter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/PlayerListNameAdapter.java diff --git a/src/main/java/com/gyvex/ezafk/integration/SimpleVoiceChatIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/SimpleVoiceChatIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/SimpleVoiceChatIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/SimpleVoiceChatIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/SpigotIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/SpigotIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/SpigotIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/SpigotIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/TabIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/TabIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/TabIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/TabIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/VoiceChatIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/VoiceChatIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/VoiceChatIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/VoiceChatIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/WorldEditIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/WorldEditIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/WorldEditIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/WorldEditIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/WorldGuardIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/WorldGuardIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/WorldGuardIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/WorldGuardIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/ezcountdown/EzCountdownIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/ezcountdown/EzCountdownIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/ezcountdown/EzCountdownIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/ezcountdown/EzCountdownIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/placeholder/EzAfkPlaceholderExpansion.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/placeholder/EzAfkPlaceholderExpansion.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/placeholder/EzAfkPlaceholderExpansion.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/placeholder/EzAfkPlaceholderExpansion.java diff --git a/src/main/java/com/gyvex/ezafk/integration/spigot/UpdateChecker.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/spigot/UpdateChecker.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/spigot/UpdateChecker.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/spigot/UpdateChecker.java diff --git a/src/main/java/com/gyvex/ezafk/integration/tab/PlayerListNameAdapter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/tab/PlayerListNameAdapter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/tab/PlayerListNameAdapter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/tab/PlayerListNameAdapter.java diff --git a/src/main/java/com/gyvex/ezafk/integration/tab/TabApiPlayerListNameAdapter.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/tab/TabApiPlayerListNameAdapter.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/tab/TabApiPlayerListNameAdapter.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/tab/TabApiPlayerListNameAdapter.java diff --git a/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatPlugin.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatPlugin.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatPlugin.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatPlugin.java diff --git a/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatServiceRegistrar.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatServiceRegistrar.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatServiceRegistrar.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/EzAfkVoicechatServiceRegistrar.java diff --git a/src/main/java/com/gyvex/ezafk/integration/voicechat/SimpleVoiceChatIntegration.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/SimpleVoiceChatIntegration.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/voicechat/SimpleVoiceChatIntegration.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/voicechat/SimpleVoiceChatIntegration.java diff --git a/src/main/java/com/gyvex/ezafk/integration/worldedit/LegacyWorldEditHelper.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldedit/LegacyWorldEditHelper.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/worldedit/LegacyWorldEditHelper.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldedit/LegacyWorldEditHelper.java diff --git a/src/main/java/com/gyvex/ezafk/integration/worldedit/WorldEditHelper.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldedit/WorldEditHelper.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/worldedit/WorldEditHelper.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldedit/WorldEditHelper.java diff --git a/src/main/java/com/gyvex/ezafk/integration/worldguard/FlagRegistrar.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/FlagRegistrar.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/worldguard/FlagRegistrar.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/FlagRegistrar.java diff --git a/src/main/java/com/gyvex/ezafk/integration/worldguard/WorldGuardSupport.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/WorldGuardSupport.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/worldguard/WorldGuardSupport.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/WorldGuardSupport.java diff --git a/src/main/java/com/gyvex/ezafk/integration/worldguard/flag/AfkBypassFlag.java b/ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/flag/AfkBypassFlag.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/integration/worldguard/flag/AfkBypassFlag.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/integration/worldguard/flag/AfkBypassFlag.java diff --git a/src/main/java/com/gyvex/ezafk/listener/AfkPlayerActionsGUI.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/AfkPlayerActionsGUI.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/AfkPlayerActionsGUI.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/AfkPlayerActionsGUI.java diff --git a/src/main/java/com/gyvex/ezafk/listener/AfkPlayerOverviewGUI.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/AfkPlayerOverviewGUI.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/AfkPlayerOverviewGUI.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/AfkPlayerOverviewGUI.java diff --git a/src/main/java/com/gyvex/ezafk/listener/EconomyServiceListener.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/EconomyServiceListener.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/EconomyServiceListener.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/EconomyServiceListener.java diff --git a/src/main/java/com/gyvex/ezafk/listener/MoveListener.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/MoveListener.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/MoveListener.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/MoveListener.java diff --git a/src/main/java/com/gyvex/ezafk/listener/PlayerActivityListener.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/PlayerActivityListener.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/PlayerActivityListener.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/PlayerActivityListener.java diff --git a/src/main/java/com/gyvex/ezafk/listener/PlayerQuitListener.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/PlayerQuitListener.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/PlayerQuitListener.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/PlayerQuitListener.java diff --git a/src/main/java/com/gyvex/ezafk/listener/SimpleVoiceChatAfkListener.java b/ezafk-core/src/main/java/com/gyvex/ezafk/listener/SimpleVoiceChatAfkListener.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/listener/SimpleVoiceChatAfkListener.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/listener/SimpleVoiceChatAfkListener.java diff --git a/src/main/java/com/gyvex/ezafk/manager/AfkTimeManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkTimeManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/AfkTimeManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkTimeManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/AfkZoneManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkZoneManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/AfkZoneManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkZoneManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/AfkZoneRewardManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkZoneRewardManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/AfkZoneRewardManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/AfkZoneRewardManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/BypassList.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/BypassList.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/BypassList.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/BypassList.java diff --git a/src/main/java/com/gyvex/ezafk/manager/BypassListManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/BypassListManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/BypassListManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/BypassListManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/EconomyManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/EconomyManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/EconomyManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/EconomyManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/IntegrationManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/IntegrationManager.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/manager/IntegrationManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/IntegrationManager.java diff --git a/src/main/java/com/gyvex/ezafk/manager/MessageManager.java b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/MessageManager.java similarity index 96% rename from src/main/java/com/gyvex/ezafk/manager/MessageManager.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/manager/MessageManager.java index 13979b4..8377b4a 100644 --- a/src/main/java/com/gyvex/ezafk/manager/MessageManager.java +++ b/ezafk-core/src/main/java/com/gyvex/ezafk/manager/MessageManager.java @@ -2,9 +2,9 @@ import com.gyvex.ezafk.EzAfk; import com.gyvex.ezafk.bootstrap.Registry; +import com.gyvex.ezafk.compatibility.LoreUtil; import com.gyvex.ezafk.state.AfkState; import com.gyvex.ezafk.util.PlaceholderUtil; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -71,7 +71,7 @@ public static String getMessage(String path, String fallback, Map 1 || (major == 1 && minor > 21) || (major == 1 && minor == 21 && patch >= 1); + } catch (Exception e) { + return false; + } + } + + public static VersionAdapter create(Plugin plugin, Logger logger) { + if (isRegistryAccessSupported()) { + try { + Class clazz = VersionAdapterFactory.class.getClassLoader() + .loadClass("com.gyvex.ezafk.version.Paper261PlusVersionAdapter"); + java.lang.reflect.Constructor ctor = clazz.getDeclaredConstructor(); + return (VersionAdapter) ctor.newInstance(); + } catch (ClassNotFoundException e) { + logger.warning("[EzAfk] Paper261PlusVersionAdapter not found, using fallback"); + } catch (Exception e) { + logger.warning("[EzAfk] Failed to load Paper261PlusVersionAdapter: " + e.getMessage()); + } + } + + return new FallbackVersionAdapter(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gyvex/ezafk/zone/Zone.java b/ezafk-core/src/main/java/com/gyvex/ezafk/zone/Zone.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/zone/Zone.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/zone/Zone.java diff --git a/src/main/java/com/gyvex/ezafk/zone/ZoneCache.java b/ezafk-core/src/main/java/com/gyvex/ezafk/zone/ZoneCache.java similarity index 100% rename from src/main/java/com/gyvex/ezafk/zone/ZoneCache.java rename to ezafk-core/src/main/java/com/gyvex/ezafk/zone/ZoneCache.java diff --git a/src/main/resources/config.yml b/ezafk-core/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to ezafk-core/src/main/resources/config.yml diff --git a/src/main/resources/gui.yml b/ezafk-core/src/main/resources/gui.yml similarity index 100% rename from src/main/resources/gui.yml rename to ezafk-core/src/main/resources/gui.yml diff --git a/src/main/resources/messages/messages.yml b/ezafk-core/src/main/resources/messages/messages.yml similarity index 100% rename from src/main/resources/messages/messages.yml rename to ezafk-core/src/main/resources/messages/messages.yml diff --git a/src/main/resources/messages/messages_de.yml b/ezafk-core/src/main/resources/messages/messages_de.yml similarity index 100% rename from src/main/resources/messages/messages_de.yml rename to ezafk-core/src/main/resources/messages/messages_de.yml diff --git a/src/main/resources/messages/messages_en.yml b/ezafk-core/src/main/resources/messages/messages_en.yml similarity index 100% rename from src/main/resources/messages/messages_en.yml rename to ezafk-core/src/main/resources/messages/messages_en.yml diff --git a/src/main/resources/messages/messages_es.yml b/ezafk-core/src/main/resources/messages/messages_es.yml similarity index 100% rename from src/main/resources/messages/messages_es.yml rename to ezafk-core/src/main/resources/messages/messages_es.yml diff --git a/src/main/resources/messages/messages_ja.yml b/ezafk-core/src/main/resources/messages/messages_ja.yml similarity index 100% rename from src/main/resources/messages/messages_ja.yml rename to ezafk-core/src/main/resources/messages/messages_ja.yml diff --git a/src/main/resources/messages/messages_nl.yml b/ezafk-core/src/main/resources/messages/messages_nl.yml similarity index 100% rename from src/main/resources/messages/messages_nl.yml rename to ezafk-core/src/main/resources/messages/messages_nl.yml diff --git a/src/main/resources/messages/messages_ru.yml b/ezafk-core/src/main/resources/messages/messages_ru.yml similarity index 100% rename from src/main/resources/messages/messages_ru.yml rename to ezafk-core/src/main/resources/messages/messages_ru.yml diff --git a/src/main/resources/messages/messages_zh.yml b/ezafk-core/src/main/resources/messages/messages_zh.yml similarity index 100% rename from src/main/resources/messages/messages_zh.yml rename to ezafk-core/src/main/resources/messages/messages_zh.yml diff --git a/src/main/resources/mp3/ezafk-sound.mp3 b/ezafk-core/src/main/resources/mp3/ezafk-sound.mp3 similarity index 100% rename from src/main/resources/mp3/ezafk-sound.mp3 rename to ezafk-core/src/main/resources/mp3/ezafk-sound.mp3 diff --git a/src/main/resources/mysql.yml b/ezafk-core/src/main/resources/mysql.yml similarity index 100% rename from src/main/resources/mysql.yml rename to ezafk-core/src/main/resources/mysql.yml diff --git a/src/main/resources/plugin.yml b/ezafk-core/src/main/resources/plugin.yml similarity index 100% rename from src/main/resources/plugin.yml rename to ezafk-core/src/main/resources/plugin.yml diff --git a/src/main/resources/zones.yml b/ezafk-core/src/main/resources/zones.yml similarity index 100% rename from src/main/resources/zones.yml rename to ezafk-core/src/main/resources/zones.yml diff --git a/ezafk-folia/pom.xml b/ezafk-folia/pom.xml new file mode 100644 index 0000000..80694ab --- /dev/null +++ b/ezafk-folia/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + com.gyvex + ezafk-parent + 3.1.1 + + + ezafk-folia + jar + EzAfk Folia Adapter + + + + com.gyvex + ezafk-core + ${project.version} + + + io.papermc.paper + paper-api + ${paper.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + true + + + + + \ No newline at end of file diff --git a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java b/ezafk-folia/src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java similarity index 81% rename from src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java rename to ezafk-folia/src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java index ca9a5dd..4736768 100644 --- a/src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java +++ b/ezafk-folia/src/main/java/com/gyvex/ezafk/compatibility/scheduler/FoliaSchedulerAdapter.java @@ -11,12 +11,7 @@ * {@link SchedulerAdapter} backed by Folia's {@link GlobalRegionScheduler} and * {@link AsyncScheduler}. * - *

This class directly imports Folia API types — it must never be - * instantiated on servers that do not provide those types (Spigot, pre-1.19.4 - * Paper). {@link SchedulerAdapterFactory} guards instantiation so that the JVM - * only class-loads this type when Folia is actually detected at runtime; if the - * Folia classes are unexpectedly absent the resulting {@link NoClassDefFoundError} - * is caught and a {@link BukkitSchedulerAdapter} is used as a fallback. + *

This class directly imports Folia API types.

*/ public final class FoliaSchedulerAdapter implements SchedulerAdapter { @@ -66,4 +61,4 @@ private static TaskHandle wrap(ScheduledTask task) { @Override public boolean isCancelled() { return task.isCancelled(); } }; } -} +} \ No newline at end of file diff --git a/ezafk-paper-26.1/pom.xml b/ezafk-paper-26.1/pom.xml new file mode 100644 index 0000000..237913f --- /dev/null +++ b/ezafk-paper-26.1/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + + com.gyvex + ezafk-parent + 3.1.1 + + + ezafk-paper-26.1 + jar + EzAfk Paper 26.1 Adapter + + + + com.gyvex + ezafk-api + ${project.version} + + + io.papermc.paper + paper-api + ${paper.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + true + + + + + \ No newline at end of file diff --git a/ezafk-paper-26.1/src/main/java/com/gyvex/ezafk/version/Paper261PlusVersionAdapter.java b/ezafk-paper-26.1/src/main/java/com/gyvex/ezafk/version/Paper261PlusVersionAdapter.java new file mode 100644 index 0000000..347f2f5 --- /dev/null +++ b/ezafk-paper-26.1/src/main/java/com/gyvex/ezafk/version/Paper261PlusVersionAdapter.java @@ -0,0 +1,28 @@ +package com.gyvex.ezafk.version; + +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; +import org.bukkit.NamespacedKey; +import org.bukkit.attribute.Attribute; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.potion.PotionEffectType; + +public final class Paper261PlusVersionAdapter implements VersionAdapter { + + @Override + public Attribute getMaxHealthAttribute() { + return Attribute.MAX_HEALTH; + } + + @Override + public PotionEffectType getEffect(String minecraftKey) { + RegistryAccess registryAccess = RegistryAccess.registryAccess(); + return registryAccess.getRegistry(RegistryKey.MOB_EFFECT).get(NamespacedKey.minecraft(minecraftKey)); + } + + @Override + public Enchantment getEnchantment(String minecraftKey) { + RegistryAccess registryAccess = RegistryAccess.registryAccess(); + return registryAccess.getRegistry(RegistryKey.ENCHANTMENT).get(NamespacedKey.minecraft(minecraftKey)); + } +} \ No newline at end of file diff --git a/ezafk/pom.xml b/ezafk/pom.xml new file mode 100644 index 0000000..e7fa59c --- /dev/null +++ b/ezafk/pom.xml @@ -0,0 +1,136 @@ + + + 4.0.0 + + + com.gyvex + ezafk-parent + 3.1.1 + + + ezafk + jar + EzAfk Distribution + + + + github + GitHub Packages + https://maven.pkg.github.com/${github.repository} + + + + + + com.gyvex + ezafk-api + ${project.version} + + + com.gyvex + ezafk-core + ${project.version} + + + com.gyvex + ezafk-paper-26.1 + ${project.version} + + + com.gyvex + ezafk-folia + ${project.version} + + + + + + + ${project.basedir}/../ezafk-core/src/main/resources + true + + plugin.yml + config.yml + gui.yml + mysql.yml + zones.yml + messages/** + + + + ${project.basedir}/../ezafk-core/src/main/resources + false + + mp3/ezafk-sound.mp3 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + true + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven.shade.plugin.version} + + + package + + shade + + + false + + + org.bstats:bstats-bukkit + org.bstats:bstats-base + net.kyori:adventure-api + net.kyori:adventure-key + net.kyori:adventure-text-minimessage + net.kyori:adventure-text-serializer-legacy + net.kyori:examination-api + net.kyori:examination-string + javazoom:jlayer + com.github.EzFramework:Jaloquent + com.github.EzFramework:JavaQueryBuilder + + com.gyvex:ezafk-api + com.gyvex:ezafk-core + com.gyvex:ezafk-paper-26.1 + com.gyvex:ezafk-folia + + + + + org.bstats + com.gyvex.ezafk.bstats + + + net.kyori + com.gyvex.ezafk.libs.net.kyori + + + javazoom + com.gyvex.ezafk.libs.javazoom + + + com.github.ezframework + com.gyvex.ezafk.libs.ezframework + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ba8fe37..a7bdbd8 100644 --- a/pom.xml +++ b/pom.xml @@ -1,17 +1,19 @@ - 4.0.0 com.gyvex - ezafk + ezafk-parent 3.1.1 + pom UTF-8 provided 21 + 3.5.5 26.1.2.build.57-stable 3.1.0 7.0.13 @@ -28,6 +30,14 @@ true + + ezafk-api + ezafk-core + ezafk-paper-26.1 + ezafk-folia + ezafk + + papermc-repo @@ -59,402 +69,7 @@ maxhenkel-public https://maven.maxhenkel.de/repository/public - - - - - io.papermc.paper - paper-api - ${paper.version} - provided - - - com.google.code.gson - gson - - - org.apache.commons - commons-lang3 - - - org.slf4j - slf4j-api - - - org.jetbrains - annotations - - - - - - com.google.code.gson - gson - 2.11.0 - provided - - - com.google.errorprone - error_prone_annotations - - - - - com.google.errorprone - error_prone_annotations - ${errorprone.annotations.version} - provided - - - org.jetbrains - annotations - ${jetbrains.annotations.version} - provided - - - org.apache.logging.log4j - log4j-api - ${log4j.api.version} - provided - - - org.slf4j - slf4j-api - 2.0.17 - provided - - - org.bstats - bstats-bukkit - ${bstats.version} - compile - - - com.sk89q.worldguard - worldguard-bukkit - ${worldguard.version} - provided - - - it.unimi.dsi - fastutil - - - org.yaml - snakeyaml - - - com.google.guava - guava - - - com.google.code.gson - gson - - - org.bstats - bstats-bukkit - - - org.apache.logging.log4j - log4j-api - - - - - - net.kyori - adventure-api - 4.26.1 - - - net.kyori - adventure-key - 4.26.1 - - - net.kyori - adventure-text-minimessage - 4.26.1 - - - net.kyori - adventure-text-serializer-legacy - 4.26.1 - - - net.kyori - examination-api - 1.3.0 - - - org.jetbrains - annotations - - - - - net.kyori - examination-string - 1.3.0 - - - org.jetbrains - annotations - - - - - javazoom - jlayer - 1.0.1 - - - - de.maxhenkel.voicechat - voicechat-api - 2.2.5 - provided - - - - com.github.ez-plugins - ezcountdown - 2.0.1 - provided - - - io.papermc.paper - paper-api - - - net.kyori - adventure-api - - - net.kyori - adventure-key - - - net.kyori - adventure-text-minimessage - - - net.kyori - adventure-text-serializer-legacy - - - org.bstats - bstats-bukkit - - - org.bstats - bstats-base - - - - - com.github.NEZNAMY - TAB-API - 5.5.0 - provided - - - org.jetbrains - annotations - - - - - com.github.MilkBowl - VaultAPI - 1.7.1 - provided - - - me.clip - placeholderapi - 2.11.5 - provided - - - org.jetbrains - annotations - - - org.bstats - bstats-bukkit - - - org.bstats - bstats-base - - - net.kyori - adventure-api - - - net.kyori - adventure-text-serializer-legacy - - - net.kyori - adventure-text-serializer-gson - - - - - com.github.EzFramework - Jaloquent - ${jaloquent.version} - compile - - - com.github.EzFramework - jaker - 1.0.6 - test - - - org.yaml - snakeyaml - - - org.apache.commons - commons-lang3 - - - - - com.github.EzFramework.Jaker - jaker-data-en-US - 1.0.6 - test - - - org.junit.jupiter - junit-jupiter - 5.10.2 - test - - - org.mockito - mockito-core - 5.5.0 - test - - - - - - - src/main/resources - true - - plugin.yml - config.yml - gui.yml - mysql.yml - zones.yml - messages/** - - - - src/main/resources - false - - mp3/ezafk-sound.mp3 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven.compiler.plugin.version} - - ${maven.compiler.release} - true - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven.shade.plugin.version} - - - package - - shade - - - false - - - org.bstats:bstats-bukkit - org.bstats:bstats-base - net.kyori:adventure-api - net.kyori:adventure-key - net.kyori:adventure-text-minimessage - net.kyori:adventure-text-serializer-legacy - net.kyori:examination-api - net.kyori:examination-string - javazoom:jlayer - com.github.EzFramework:Jaloquent - com.github.EzFramework:JavaQueryBuilder - - - - - org.bstats - com.gyvex.ezafk.bstats - - - net.kyori - com.gyvex.ezafk.libs.net.kyori - - - javazoom - com.gyvex.ezafk.libs.javazoom - - - com.github.ezframework - com.gyvex.ezafk.libs.ezframework - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.5.5 - - false - ${argLine} -Dnet.bytebuddy.experimental=true - - - - - - - - github - GitHub Packages - https://maven.pkg.github.com/${github.repository} - - +