diff --git a/.github/labeler.yml b/.github/labeler.yml deleted file mode 100644 index 0de407b5..00000000 --- a/.github/labeler.yml +++ /dev/null @@ -1,2 +0,0 @@ -prerelease: - - '*' diff --git a/.github/workflows/call.github_release.yml b/.github/workflows/call.github_release.yml new file mode 100644 index 00000000..334cb70e --- /dev/null +++ b/.github/workflows/call.github_release.yml @@ -0,0 +1,34 @@ +name: 'Call: GitHub Release' + +on: + workflow_call: + inputs: + release_mode: + description: 'Release mode' + required: true + type: string + version_bump: + description: 'Version bump' + required: false + type: string + promote_from: + description: 'Promote from' + required: false + type: string + outputs: + release_created: + description: 'Release created' + value: ${{ jobs.github_release.outputs.release_created }} + tag_name: + description: 'Tag name' + value: ${{ jobs.github_release.outputs.tag_name }} + +jobs: + github_release: + uses: ./.github/workflows/generic.github_release.yml + secrets: inherit + with: + plugin_name: multiverse-core + release_mode: ${{ inputs.release_mode }} + version_bump: ${{ inputs.version_bump }} + promote_from: ${{ inputs.promote_from }} diff --git a/.github/workflows/call.platform_uploads.yml b/.github/workflows/call.platform_uploads.yml new file mode 100644 index 00000000..9ab04ef2 --- /dev/null +++ b/.github/workflows/call.platform_uploads.yml @@ -0,0 +1,83 @@ +name: 'Call: Platform Uploads' + +on: + workflow_call: + inputs: + target_tag: + description: 'Version to upload' + required: true + type: string + upload_modrinth: + description: 'Upload to modrinth.com' + required: true + type: string + upload_dbo: + description: 'Upload to dev.bukkit.org' + required: true + type: string + upload_hangar: + description: 'Upload to hangar.papermc.io' + required: true + type: string + secrets: + MODRINTH_TOKEN: + required: true + DBO_UPLOAD_API_TOKEN: + required: true + HANGAR_UPLOAD_TOKEN: + required: true + +jobs: + platform_uploads: + uses: ./.github/workflows/generic.platform_uploads.yml + secrets: inherit + with: + plugin_name: multiverse-core + modrinth_project_id: 3wmN97b8 + modrinth_dependencies: > + [ + {"project_id": "qvdtDX3s", "dependency_type": "optional"}, + {"project_id": "8VMk6P0I", "dependency_type": "optional"}, + {"project_id": "vtawPsTo", "dependency_type": "optional"}, + {"project_id": "WuErDeI1", "dependency_type": "optional"} + ] + + dbo_project_id: 30765 + dbo_project_relations: > + [ + {"slug": "multiverse-inventories", "type": "optionalDependency"}, + {"slug": "multiverse-portals", "type": "optionalDependency"}, + {"slug": "multiverse-netherportals", "type": "optionalDependency"}, + {"slug": "multiverse-signportals", "type": "optionalDependency"}, + {"slug": "vault", "type": "optionalDependency"} + ] + + hangar_slug: Multiverse-Core + hangar_plugin_dependencies: > + { "PAPER": [ + { + "name": "Multiverse-Inventories", + "required": false, + "platforms": ["PAPER"] + }, + { + "name": "Multiverse-Portals", + "required": false, + "platforms": ["PAPER"] + }, + { + "name": "Multiverse-NetherPortals", + "required": false, + "platforms": ["PAPER"] + }, + { + "name": "Multiverse-SignPortals", + "required": false, + "platforms": ["PAPER"] + } + ]} + + target_tag: ${{ inputs.target_tag }} + upload_modrinth: ${{ inputs.upload_modrinth }} + upload_dbo: ${{ inputs.upload_dbo }} + upload_hangar: ${{ inputs.upload_hangar }} diff --git a/.github/workflows/dispatch.platform_uploads.yml b/.github/workflows/dispatch.platform_uploads.yml new file mode 100644 index 00000000..2eb99cb5 --- /dev/null +++ b/.github/workflows/dispatch.platform_uploads.yml @@ -0,0 +1,31 @@ +name: 'Dispatch: Platform Uploads' + +on: + workflow_dispatch: + inputs: + target_tag: + description: 'Version to upload' + required: true + type: string + upload_modrinth: + description: 'Upload to modrinth.com' + required: true + type: boolean + upload_dbo: + description: 'Upload to dev.bukkit.org' + required: true + type: boolean + upload_hangar: + description: 'Upload to hangar.papermc.io' + required: true + type: boolean + +jobs: + dispatch_platform_uploads: + uses: ./.github/workflows/call.platform_uploads.yml + secrets: inherit + with: + target_tag: ${{ github.event.inputs.target_tag }} + upload_modrinth: ${{ github.event.inputs.upload_modrinth }} + upload_dbo: ${{ github.event.inputs.upload_dbo }} + upload_hangar: ${{ github.event.inputs.upload_hangar }} diff --git a/.github/workflows/dispatch.promote_release.yml b/.github/workflows/dispatch.promote_release.yml new file mode 100644 index 00000000..0a59ca46 --- /dev/null +++ b/.github/workflows/dispatch.promote_release.yml @@ -0,0 +1,38 @@ +name: 'Dispatch: Promote Release' + +on: + workflow_dispatch: + inputs: + target_tag: + description: 'Version to promote' + required: true + +jobs: + check_version: + runs-on: ubuntu-latest + steps: + - name: Verify input version is prerelease + run: | + if [[ "${{ github.event.inputs.target_tag }}" != *"pre"* ]]; then + echo "Version must be a prerelease" + exit 1 + fi + + github_release: + needs: check_version + uses: ./.github/workflows/call.github_release.yml + secrets: inherit + with: + release_mode: promote + promote_from: ${{ github.event.inputs.target_tag }} + + platform_uploads: + needs: github_release + if: needs.github_release.outputs.release_created == 'true' + uses: ./.github/workflows/call.platform_uploads.yml + secrets: inherit + with: + target_tag: ${{ needs.github_release.outputs.tag_name }} + upload_modrinth: 'true' + upload_dbo: 'true' + upload_hangar: 'true' diff --git a/.github/workflows/generic.github_release.yml b/.github/workflows/generic.github_release.yml new file mode 100644 index 00000000..6210d1ed --- /dev/null +++ b/.github/workflows/generic.github_release.yml @@ -0,0 +1,91 @@ +name: 'Generic: GitHub Release' + +on: + workflow_call: + inputs: + # Plugin specific + plugin_name: + description: 'Plugin name' + required: true + type: string + + # Common params + release_mode: + description: 'Release mode' + required: true + type: string + version_bump: + description: 'Version bump' + required: false + type: string + promote_from: + description: 'Promote from' + required: false + type: string + outputs: + release_created: + description: 'Release created' + value: ${{ jobs.github_release.outputs.release_created }} + tag_name: + description: 'Tag name' + value: ${{ jobs.github_release.outputs.tag_name }} + +jobs: + github_release: + runs-on: ubuntu-latest + outputs: + release_created: ${{ steps.release.outputs.release_created }} + tag_name: ${{ steps.release.outputs.tag_name }} + steps: + - name: Echo inputs + run: | + echo "release_mode: ${{ inputs.release_mode }}" + echo "version_bump: ${{ inputs.version_bump }}" + echo "promote_from: ${{ inputs.promote_from }}" + + - uses: actions/checkout@v3 + with: + ref: ${{ inputs.promote_from }} + + - uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'adopt' + cache: gradle + + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Build and test + uses: gradle/gradle-build-action@v2 + with: + arguments: clean build -x assemble -x shadowJar -x checkStyleMain -x checkStyleTest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release + id: release + uses: benwoo1110/semantic-release-action@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + release_mode: ${{ inputs.release_mode }} + version_bump: ${{ inputs.version_bump }} + promote_from: ${{ inputs.promote_from }} + + - name: Publish package + if: steps.release.outputs.release_created == 'true' + uses: gradle/gradle-build-action@v2 + with: + arguments: publish -x checkStyleMain -x checkStyleTest -x test + env: + GITHUB_VERSION: ${{ steps.release.outputs.publish_version }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload release artifact + if: steps.release.outputs.release_created == 'true' + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: build/libs/${{ inputs.plugin_name }}-${{ steps.release.outputs.publish_version }}.jar + asset_name: ${{ inputs.plugin_name }}-${{ steps.release.outputs.tag_name }}.jar + tag: ${{ steps.release.outputs.tag_name }} diff --git a/.github/workflows/generic.platform_uploads.yml b/.github/workflows/generic.platform_uploads.yml new file mode 100644 index 00000000..ccd31a40 --- /dev/null +++ b/.github/workflows/generic.platform_uploads.yml @@ -0,0 +1,140 @@ +name: 'Generic: Platform Uploads' + +on: + workflow_call: + inputs: + # Plugin specific params + plugin_name: + description: 'Plugin name' + required: true + type: string + + modrinth_project_id: + description: 'modrinth.com project ID' + required: true + type: string + modrinth_dependencies: + description: 'modrinth.com project dependencies' + required: false + type: string + default: '[]' + + dbo_project_id: + description: 'dev.bukkit.org project ID' + required: true + type: string + dbo_project_relations: + description: 'dev.bukkit.org project relations' + required: false + type: string + default: '[]' + + hangar_slug: + description: 'hangar.papermc.io project slug' + required: true + type: string + hangar_plugin_dependencies: + description: 'hangar.papermc.io project dependencies' + required: false + type: string + default: '{}' + + # Common params + target_tag: + description: 'Version to upload' + required: true + type: string + + upload_modrinth: + description: 'Upload to modrinth.com' + required: true + type: string + upload_dbo: + description: 'Upload to dev.bukkit.org' + required: true + type: string + upload_hangar: + description: 'Upload to hangar.papermc.io' + required: true + type: string + + secrets: + MODRINTH_TOKEN: + required: true + DBO_UPLOAD_API_TOKEN: + required: true + HANGAR_UPLOAD_TOKEN: + required: true + +jobs: + platform_uploads: + runs-on: ubuntu-latest + steps: + - name: Get release info + id: release-info + uses: cardinalby/git-get-release-action@1.2.4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag: ${{ inputs.target_tag }} + + - name: Download release artifact + id: release-artifact + uses: dsaltares/fetch-gh-release-asset@1.1.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + version: tags/${{ steps.release-info.outputs.tag_name }} + file: ${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar + + - name: Parse release type + id: parse-release-type + run: | + if [[ "${{ steps.release-info.outputs.prerelease }}" == "true" ]]; then + echo Setting release_type to Beta + echo "release_type=Beta" >> $GITHUB_OUTPUT + else + echo Setting release_type to Release + echo "release_type=Release" >> $GITHUB_OUTPUT + fi + + - name: Upload to Modrinth + if: ${{ !cancelled() && inputs.upload_modrinth == 'true' }} + uses: benwoo1110/modrinth-upload-action@v1 + with: + api_token: ${{ secrets.MODRINTH_TOKEN }} + project_id: ${{ inputs.modrinth_project_id }} + version_number: ${{ steps.release-info.outputs.tag_name }} + files: '["${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar"]' + name: ${{ steps.release-info.outputs.tag_name }} + changelog: ${{ steps.release-artifact.outputs.body }} + game_versions: 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13 + version_type: ${{ steps.parse-release-type.outputs.release_type }} + loaders: bukkit, spigot, paper + dependencies: ${{ inputs.modrinth_dependencies }} + + - name: Upload to DBO + if: ${{ !cancelled() && inputs.upload_dbo == 'true' }} + uses: benwoo1110/dbo-upload-action@v1 + with: + api_token: ${{ secrets.DBO_UPLOAD_API_TOKEN }} + project_id: ${{ inputs.dbo_project_id }} + changelog: ${{ steps.release-artifact.outputs.body }} + changelog_type: markdown + display_name: ${{ steps.release-info.outputs.tag_name }} + game_versions: 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17, 1.16, 1.15, 1.14, 1.13 + release_type: ${{ steps.parse-release-type.outputs.release_type }} + project_relations: ${{ inputs.dbo_project_relations }} + file_path: ${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar + + - name: Upload to Hangar + if: ${{ !cancelled() && inputs.upload_hangar == 'true' }} + uses: benwoo1110/hangar-upload-action@v1 + with: + api_token: ${{ secrets.HANGAR_UPLOAD_TOKEN }} + slug: ${{ inputs.hangar_slug }} + version: ${{ steps.release-info.outputs.tag_name }} + channel: ${{ steps.parse-release-type.outputs.release_type }} + files: '[{"path": "${{ github.workspace }}/${{ inputs.plugin_name }}-${{ steps.release-info.outputs.tag_name }}.jar", "platforms": ["PAPER"]}]' + description: ${{ steps.release-artifact.outputs.body }} + platform_dependencies: '{"PAPER": ["1.13-1.20.1"]}' + plugin_dependencies: ${{ inputs.hangar_plugin_dependencies }} diff --git a/.github/workflows/test.yml b/.github/workflows/generic.test.yml similarity index 68% rename from .github/workflows/test.yml rename to .github/workflows/generic.test.yml index a2e31a29..b6871d66 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/generic.test.yml @@ -1,8 +1,12 @@ -name: Run unit tests against all PRs +name: 'Generic: Test' on: - pull_request: - types: [opened, synchronize] + workflow_call: + inputs: + plugin_name: + description: 'Plugin name' + required: true + type: string jobs: test: @@ -32,5 +36,5 @@ jobs: - name: Artifact output uses: actions/upload-artifact@v3 with: - name: multiverse-core-pr${{ github.event.pull_request.number }} - path: build/libs/multiverse-core-pr${{ github.event.pull_request.number }}.jar + name: ${{ inputs.plugin_name }}-pr${{ github.event.pull_request.number }} + path: build/libs/${{ inputs.plugin_name }}-pr${{ github.event.pull_request.number }}.jar diff --git a/.github/workflows/main.prerelease.yml b/.github/workflows/main.prerelease.yml new file mode 100644 index 00000000..a3b474b6 --- /dev/null +++ b/.github/workflows/main.prerelease.yml @@ -0,0 +1,24 @@ +name: 'Main: Prerelease' + +on: + push: + branches: [main] + +jobs: + github_release_on_push: + uses: ./.github/workflows/call.github_release.yml + secrets: inherit + with: + release_mode: prerelease + version_bump: prlabel + + platform_uploads_on_push: + needs: github_release_on_push + if: needs.github_release_on_push.outputs.release_created == 'true' + uses: ./.github/workflows/call.platform_uploads.yml + secrets: inherit + with: + target_tag: ${{ needs.github_release_on_push.outputs.tag_name }} + upload_modrinth: 'true' + upload_dbo: 'false' + upload_hangar: 'false' diff --git a/.github/workflows/require_label.yml b/.github/workflows/pr.require_label.yml similarity index 90% rename from .github/workflows/require_label.yml rename to .github/workflows/pr.require_label.yml index 13922340..b7315848 100644 --- a/.github/workflows/require_label.yml +++ b/.github/workflows/pr.require_label.yml @@ -1,4 +1,4 @@ -name: Require PR Labels +name: 'PR: Require Label' on: pull_request: @@ -15,4 +15,4 @@ jobs: with: mode: exactly count: 1 - labels: "release:major, release:minor, release:patch, no version bump" + labels: "release:major, release:minor, release:patch, no release" diff --git a/.github/workflows/pr.test.yml b/.github/workflows/pr.test.yml new file mode 100644 index 00000000..721785b1 --- /dev/null +++ b/.github/workflows/pr.test.yml @@ -0,0 +1,11 @@ +name: 'PR: Test' + +on: + pull_request: + types: [opened, synchronize] + +jobs: + test: + uses: ./.github/workflows/generic.test.yml + with: + plugin_name: multiverse-core diff --git a/.github/workflows/pr_labeler.yml b/.github/workflows/pr_labeler.yml deleted file mode 100644 index 69387def..00000000 --- a/.github/workflows/pr_labeler.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: "Pull Request Labeler" - -on: - pull_request_target: - types: [opened] - branches: [main] - -jobs: - prerelease_labeler: - permissions: - contents: read - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: actions/labeler@v4 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/promote_release.yml b/.github/workflows/promote_release.yml deleted file mode 100644 index f1c20c7e..00000000 --- a/.github/workflows/promote_release.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Manually promote last prerelease to release - -on: - workflow_dispatch: - inputs: - version: - description: 'Version to promote' - required: true - version-bump: - description: 'Version bump to apply - should usually match the version bump used for the prerelease since last release' - required: true - type: choice - options: - - 'patch' - - 'minor' - - 'major' - -jobs: - manually_promote_release: - runs-on: ubuntu-latest - steps: - - name: Verify input version is prerelease - run: | - if [[ "${{ github.event.inputs.version }}" != *"pre"* ]]; then - echo "Version must be a prerelease" - exit 1 - fi - - - name: Get release info - id: get-release - uses: cardinalby/git-get-release-action@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - tag: ${{ github.event.inputs.version }} - - - uses: actions/checkout@v3 - with: - ref: ${{ steps.get-release.outputs.tag_name }} - - - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' - cache: gradle - - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Remove prerelease tag - run: | - echo "Removing prerelease tag from version" - echo "VERSION=$(echo ${{ steps.get-release.outputs.tag_name }} | sed -E 's/-pre.*//')" >> $GITHUB_ENV - - - name: Build - uses: gradle/gradle-build-action@v2 - with: - arguments: clean build -x test -x checkstyleMain -x checkstyleTest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_VERSION: ${{ env.VERSION }} - - - name: Create release - id: release - uses: Multiverse/release-on-push-action@skip_prs - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - bump_version_scheme: ${{ github.event.inputs.version-bump }} - tag_prefix: '' - release_name: "" - use_github_release_notes: true - ref: ${{ steps.get-release.outputs.target_commitish }} - skip_prs: true - - - name: Publish package - uses: gradle/gradle-build-action@v2 - with: - arguments: publish - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_VERSION: ${{ env.VERSION }} - - - name: Upload release artifact - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: build/libs/multiverse-core-${{ env.VERSION }}.jar - asset_name: multiverse-core-${{ steps.release.outputs.tag_name }}.jar - tag: ${{ steps.release.outputs.tag_name }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index c023a1b6..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Create Release Version & Publish Package - -on: - push: - branches: [main] - -jobs: - release_on_push: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' - cache: gradle - - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - - name: Test & Build - uses: gradle/gradle-build-action@v2 - with: - arguments: clean build -x assemble -x shadowJar - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Create release - id: release - uses: Multiverse/release-on-push-action@support_prerelease - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - bump_version_scheme: norelease - tag_prefix: '' - release_name: "" - use_github_release_notes: true - - - name: Modify version scheme - run: | - if [[ "${{ steps.release.outputs.tag_name }}" == *"pre"* ]]; then - echo "Replacing prerelease version scheme with SNAPSHOT" - echo "VERSION=$(echo ${{ steps.release.outputs.tag_name }} | sed -E 's/-pre.*/-SNAPSHOT/')" >> $GITHUB_ENV - else - echo "Using release version scheme" - echo "VERSION=${{ steps.release.outputs.tag_name }}" >> $GITHUB_ENV - fi - - - name: Publish package - uses: gradle/gradle-build-action@v2 - with: - arguments: publish - env: - GITHUB_VERSION: ${{ env.VERSION }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload release artifact - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: build/libs/multiverse-core-${{ env.VERSION }}.jar - asset_name: multiverse-core-${{ steps.release.outputs.tag_name }}.jar - tag: ${{ steps.release.outputs.tag_name }} diff --git a/README.md b/README.md index a884097a..4fb48bc2 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,33 @@ -![Multiverse 2](config/multiverse2-long.png) +

+Multiverse Logo +

+ +[![Modrinth](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/modrinth_vector.svg)](https://modrinth.com/plugin/multiverse-core) +[![hangar](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/hangar_vector.svg)](https://hangar.papermc.io/Multiverse/Multiverse-Core) +[![bukkit](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/supported/bukkit_vector.svg)](https://dev.bukkit.org/projects/multiverse-core) +[![Spigot](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/supported/spigot_vector.svg)](https://www.spigotmc.org/resources/multiverse-core.390/) -[![Maven CI/CD](https://github.com/Multiverse/Multiverse-Core/actions/workflows/build.yml/badge.svg)](https://github.com/Multiverse/Multiverse-Core/actions/workflows/build.yml) [![Release](https://img.shields.io/nexus/r/com.onarandombox.multiversecore/Multiverse-Core?label=release&server=https%3A%2F%2Frepo.onarandombox.com%2F)](https://dev.bukkit.org/projects/multiverse-core) [![Dev builds](https://img.shields.io/nexus/s/com.onarandombox.multiversecore/Multiverse-Core?label=dev%20builds&server=http%3A%2F%2Frepo.onarandombox.com%2F)](https://ci.onarandombox.com/job/Multiverse-Core/) [![Discord](https://img.shields.io/discord/325459248047980545?label=discord&logo=discord)](https://discord.gg/NZtfKky) -[![Support me on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Ddumptruckman%26type%3Dpatrons&style=flat)](https://patreon.com/dumptruckman) +[![Support us on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Ddumptruckman%26type%3Dpatrons&style=flat)](https://patreon.com/dumptruckman) [![License](https://img.shields.io/github/license/Multiverse/Multiverse-Core)](LICENSE.md) -About -======== + +# About + [Multiverse](https://dev.bukkit.org/projects/multiverse-core) was created at the dawn of Bukkit multiworld support. It has since then grown into a **complete world management solution!** Multiverse provides the easiest to use world management solution for your Minecraft server, big or small, and with great addons like [Portals](https://dev.bukkit.org/projects/multiverse-portals) and [NetherPortals](https://dev.bukkit.org/projects/multiverse-netherportals/), what's not to love! -

+ Now it's time to create your very own Multiverse server, do check out our [Wiki](https://github.com/Multiverse/Multiverse-Core/wiki) and [Usage Guide](https://github.com/Multiverse/Multiverse-Core/wiki/Basics) to get started. Feel free to hop onto our [Discord](https://discord.gg/NZtfKky) if you have any question or just want to have a chat with us! -### Amazing sub-modules available: +## Amazing sub-modules available: + * [Multiverse-NetherPortals](https://github.com/Multiverse/Multiverse-NetherPortals) -> Have separate nether and end worlds for each of your overworlds! * [Multiverse-Portals](https://github.com/Multiverse/Multiverse-Portals) -> Make custom portals to go to any destination! * [Multiverse-Inventories](https://github.com/Multiverse/Multiverse-Inventories) -> Have separated players stats and inventories per world or per group of worlds. -* [Multiverse-SignPortals](https://github.com/Multiverse/Multiverse-SignPortals) -> Signs as teleprompters! +* [Multiverse-SignPortals](https://github.com/Multiverse/Multiverse-SignPortals) -> Signs as teleporters! -Building -======== +## Building Simply build the source with Gradle: ``` ./gradlew build @@ -28,17 +35,16 @@ Simply build the source with Gradle: More details are available on the [build instructions wiki page](https://github.com/Multiverse/Multiverse-Core/wiki/Building). -Contributing -======= +## Contributing + **Want to help improve Multiverse?** There are several ways you can support and contribute to the project. * Take a look at our "Bug: Unconfirmed" issues, where you can find issues that need extra testing and investigation. * Want others to love Multiverse too? You can join the [Multiverse Discord community](https://discord.gg/NZtfKky) and help others with issues and setup! * A Multiverse guru? You can update our [Wiki](https://github.com/Multiverse/Multiverse-Core/wiki) with your latest tip, tricks and guides! The wiki open for all to edit and improve. * Love coding? You could look at ["State: Open to PR"](https://github.com/Multiverse/Multiverse-Core/labels/State%3A%20Open%20to%20PR) and ["Resolution: Accepted"](https://github.com/Multiverse/Multiverse-Core/labels/Resolution%3A%20Accepted) issues. We're always happy to receive bug fixes and feature additions as [pull requests](https://www.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github-3/). -* If you'd like to make a financial contribution to the project, do consider joining our [patreon](https://www.patreon.com/dumptruckman) or make a one-time donation [here](https://paypal.me/dumptruckman)! +* If you'd like to make a financial contribution to the project, do consider joining our [Patreon](https://www.patreon.com/dumptruckman) or make a one-time donation [here](https://paypal.me/dumptruckman)! Additionally, we would like to give a big thanks to everyone that has supported Multiverse over the years, as well as those in the years to come. Thank you! -License -======= +## License Multiverse-Core is licensed under BSD-3-Clause License. Please see [LICENSE.md](LICENSE.md) for more info. diff --git a/build.gradle b/build.gradle index 8f86f3b2..334e27d8 100644 --- a/build.gradle +++ b/build.gradle @@ -62,50 +62,58 @@ repositories { } configurations { + // Add configuration for server API + compileOnly.extendsFrom serverApi + runtimeClasspath.extendsFrom serverApi + + // Add configuration for external plugins + implementation.extendsFrom externalPlugin + + // Add configuration for dependencies that will be included in fat jar + compileClasspath.extendsFrom shadowed + testCompileClasspath.extendsFrom shadowed + testRuntimeClasspath.extendsFrom shadowed + oldTestCompileClasspath.extendsFrom shadowed + oldTestRuntimeClasspath.extendsFrom shadowed + + // Add configuration for old tests oldTestImplementation.extendsFrom implementation oldTestRuntime.extendsFrom runtime - relocatedApi - compileClasspath.extendsFrom relocatedApi - runtimeClasspath.extendsFrom relocatedApi - testCompileClasspath.extendsFrom relocatedApi - testRuntimeClasspath.extendsFrom relocatedApi - oldTestCompileClasspath.extendsFrom relocatedApi - oldTestRuntimeClasspath.extendsFrom relocatedApi } dependencies { - compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' + serverApi 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' // Economy - implementation('com.github.MilkBowl:VaultAPI:1.7.1') { + externalPlugin('com.github.MilkBowl:VaultAPI:1.7.1') { exclude group: 'org.bukkit', module: 'bukkit' } // PlaceholderAPI - implementation 'me.clip:placeholderapi:2.11.3' + externalPlugin 'me.clip:placeholderapi:2.11.3' // Command Framework - relocatedApi 'co.aikar:acf-paper:0.5.1-SNAPSHOT' + shadowed 'co.aikar:acf-paper:0.5.1-SNAPSHOT' // Config - relocatedApi('me.main__.util:SerializationConfig:1.7') { + shadowed('me.main__.util:SerializationConfig:1.7') { exclude group: 'org.bukkit', module: 'bukkit' } - relocatedApi('io.github.townyadvanced.commentedconfiguration:CommentedConfiguration:1.0.1') { + shadowed('io.github.townyadvanced.commentedconfiguration:CommentedConfiguration:1.0.1') { exclude group: 'org.spigotmc', module: 'spigot-api' } // Utils - relocatedApi 'io.vavr:vavr:0.10.4' - relocatedApi 'org.glassfish.hk2:hk2-locator:3.0.3' - relocatedApi('com.dumptruckman.minecraft:Logging:1.1.1') { + shadowed 'io.vavr:vavr:0.10.4' + shadowed 'org.glassfish.hk2:hk2-locator:3.0.3' + shadowed('com.dumptruckman.minecraft:Logging:1.1.1') { exclude group: 'junit', module: 'junit' } - relocatedApi 'de.themoep.idconverter:mappings:1.2-SNAPSHOT' - relocatedApi 'org.bstats:bstats-bukkit:2.2.1' - relocatedApi 'net.minidev:json-smart:2.4.8' - relocatedApi 'org.jetbrains:annotations:22.0.0' - relocatedApi 'io.papermc:paperlib:1.0.8' + shadowed 'de.themoep.idconverter:mappings:1.2-SNAPSHOT' + shadowed 'org.bstats:bstats-bukkit:2.2.1' + shadowed 'net.minidev:json-smart:2.4.8' + shadowed 'org.jetbrains:annotations:22.0.0' + shadowed 'io.papermc:paperlib:1.0.8' // Tests testImplementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10' @@ -170,6 +178,34 @@ publishing { publications { maven(MavenPublication) { from components.java + + pom.withXml { + Node pomNode = asNode() + + // Remove Kotlin dependency + pomNode.dependencies.'*'.findAll() { + it.groupId.text() == 'org.jetbrains.kotlin' + }.each() { + it.parent().remove(it) + } + + // Switch runtime deps to provided + pomNode.dependencies.'*'.findAll() { + it.scope.text() == 'runtime' + }.each() { + it.scope*.value = 'provided' + } + + // Add spigot api to pom + project.configurations.serverApi.allDependencies.each { dependency -> + pomNode.dependencies[0].appendNode("dependency").with { + it.appendNode("groupId", dependency.group) + it.appendNode("artifactId", dependency.name) + it.appendNode("version", dependency.version) + it.appendNode("scope", "provided") + } + } + } } } repositories { @@ -243,7 +279,7 @@ javadoc { project.configurations.api.canBeResolved = true shadowJar { - relocate 'co.aikar.commands', 'com.onarandombox.acf' + relocate 'co.aikar', 'com.onarandombox.acf' relocate 'com.dumptruckman.minecraft.util.Logging', 'com.onarandombox.MultiverseCore.utils.CoreLogging' relocate 'com.dumptruckman.minecraft.util.DebugLog', 'com.onarandombox.MultiverseCore.utils.DebugFileLogger' relocate 'de.themoep.idconverter', 'com.onarandombox.idconverter' @@ -263,7 +299,7 @@ shadowJar { relocate 'org.jetbrains', 'com.onarandombox.jetbrains' relocate 'io.papermc.lib', 'com.onarandombox.paperlib' - configurations = [project.configurations.api, project.configurations.relocatedApi] + configurations = [project.configurations.shadowed] archiveFileName = "$baseName-$version.$extension" @@ -272,6 +308,7 @@ shadowJar { it.moduleGroup == 'org.jetbrains.kotlin' }) } + //classifier = '' } build.dependsOn shadowJar diff --git a/settings.gradle b/settings.gradle index 588b697b..70e6b153 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,10 @@ * This file was generated by the Gradle 'init' task. */ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + rootProject.name = 'multiverse-core' diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index c027d0de..ffdfdb9a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -7,14 +7,6 @@ package com.onarandombox.MultiverseCore; -import java.io.File; -import java.lang.annotation.Annotation; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import java.util.stream.Collectors; - import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.anchor.AnchorManager; import com.onarandombox.MultiverseCore.api.Destination; @@ -47,6 +39,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jvnet.hk2.annotations.Service; +import java.io.File; +import java.lang.annotation.Annotation; +import java.util.List; +import java.util.logging.Logger; +import java.util.stream.Collectors; + /** * The implementation of the Multiverse-{@link MVCore}. */ @@ -377,7 +375,7 @@ public class MultiverseCore extends JavaPlugin implements MVCore { * Gets the best service from this plugin that implements the given contract or has the given implementation. * * @param contractOrImpl The contract or concrete implementation to get the best instance of - * @param qualifiers The set of qualifiers that must match this service definition + * @param qualifiers The set of qualifiers that must match this service definition * @return An instance of the contract or impl if it is a service and is already instantiated, null otherwise * @throws MultiException if there was an error during service lookup */ @@ -395,7 +393,7 @@ public class MultiverseCore extends JavaPlugin implements MVCore { * the provided qualifiers. * * @param contractOrImpl The contract or concrete implementation to get the best instance of - * @param qualifiers The set of qualifiers that must match this service definition + * @param qualifiers The set of qualifiers that must match this service definition * @return A list of services implementing this contract or concrete implementation. May not return null, but may * return an empty list * @throws MultiException if there was an error during service lookup @@ -415,10 +413,10 @@ public class MultiverseCore extends JavaPlugin implements MVCore { /** * This is for unit testing ONLY. Do not use this constructor. * - * @param loader The PluginLoader to use. + * @param loader The PluginLoader to use. * @param description The Description file to use. - * @param dataFolder The folder that other datafiles can be found in. - * @param file The location of the plugin. + * @param dataFolder The folder that other datafiles can be found in. + * @param file The location of the plugin. */ public MultiverseCore(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { super(loader, description, dataFolder, file); diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/node/NodeGroup.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/node/NodeGroup.java index ffac0065..b5d11491 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/node/NodeGroup.java +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/node/NodeGroup.java @@ -1,15 +1,15 @@ package com.onarandombox.MultiverseCore.configuration.node; +import io.github.townyadvanced.commentedconfiguration.setting.CommentedNode; +import io.vavr.control.Option; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import io.github.townyadvanced.commentedconfiguration.setting.CommentedNode; -import io.vavr.control.Option; -import org.jetbrains.annotations.NotNull; - /** * A collection of {@link CommentedNode}s, with mappings to nodes by name. */ @@ -52,7 +52,7 @@ public class NodeGroup implements Collection { /** * Gets the node with the given name. * - * @param name The name of the node to get. + * @param name The name of the node to get. * @return The node with the given name, or {@link Option.None} if no node with the given name exists. */ public Option findNode(String name) { diff --git a/src/main/java/com/onarandombox/MultiverseCore/world/SimpleMVWorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/world/SimpleMVWorldManager.java index 209a40a0..836a98f4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/world/SimpleMVWorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/world/SimpleMVWorldManager.java @@ -7,29 +7,12 @@ package com.onarandombox.MultiverseCore.world; -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.Stack; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; - import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.BlockSafety; import com.onarandombox.MultiverseCore.api.LocationManipulation; -import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MVWorld; +import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.api.WorldPurger; import com.onarandombox.MultiverseCore.config.MVCoreConfig; @@ -56,6 +39,22 @@ import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.Plugin; import org.jvnet.hk2.annotations.Service; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.Stack; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + /** * Public facing API to add/remove Multiverse worlds. */ @@ -179,7 +178,7 @@ public class SimpleMVWorldManager implements MVWorldManager { } this.server.getWorld(oldName).setAutoSave(false); } - + // Grab a bit of metadata from the old world. MVWorld oldWorld = getMVWorld(oldName); @@ -207,7 +206,7 @@ public class SimpleMVWorldManager implements MVWorldManager { if (oldWorld != null && wasAutoSave) { oldWorld.getCBWorld().setAutoSave(true); } - + if (newWorldFile.exists()) { Logging.fine("Succeeded at copying files"); @@ -227,8 +226,8 @@ public class SimpleMVWorldManager implements MVWorldManager { // actually load the world if (doLoad(newName)) { - Logging.fine("Succeeded at loading cloned world '" + newName + "'"); - return true; + Logging.fine("Succeeded at loading cloned world '" + newName + "'"); + return true; } Logging.severe("Failed to load the cloned world '" + newName + "'"); return false; @@ -408,7 +407,7 @@ public class SimpleMVWorldManager implements MVWorldManager { this.worlds.remove(name); Logging.info("World '%s' was unloaded from Bukkit.", name); return true; - } else if (!unloadBukkit){ + } else if (!unloadBukkit) { this.worlds.remove(name); Logging.info("World '%s' was unloaded from Multiverse.", name); return true; @@ -992,6 +991,7 @@ public class SimpleMVWorldManager implements MVWorldManager { /** * Gets the {@link FileConfiguration} that this {@link SimpleMVWorldManager} is using. + * * @return The {@link FileConfiguration} that this {@link SimpleMVWorldManager} is using. */ public FileConfiguration getConfigWorlds() { @@ -1001,24 +1001,24 @@ public class SimpleMVWorldManager implements MVWorldManager { /** * {@inheritDoc} */ - @Override - public boolean hasUnloadedWorld(String name, boolean includeLoaded) { - if (getMVWorld(name) != null) { - return includeLoaded; - } - for (Map.Entry entry : this.worldsFromTheConfig.entrySet()) { - if (name.equals(entry.getKey()) || name.equals(entry.getValue().getAlias())) { - return true; - } - } - return false; - } + @Override + public boolean hasUnloadedWorld(String name, boolean includeLoaded) { + if (getMVWorld(name) != null) { + return includeLoaded; + } + for (Map.Entry entry : this.worldsFromTheConfig.entrySet()) { + if (name.equals(entry.getKey()) || name.equals(entry.getValue().getAlias())) { + return true; + } + } + return false; + } /** * {@inheritDoc} */ @Override - public Collection getPotentialWorlds() { + public Collection getPotentialWorlds() { File worldContainer = this.server.getWorldContainer(); if (worldContainer == null) { return Collections.emptyList();