9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-19 14:59:21 +00:00

Compare commits

...

38 Commits

Author SHA1 Message Date
its.bread
0772f09e98 fix: hardcode map scale to CLOSEST instead of NORMAL (#632) 2025-12-13 19:24:02 +00:00
dependabot[bot]
e916673454 deps: bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 (#615) 2025-12-11 15:23:37 +00:00
dependabot[bot]
ac163d5130 deps: bump com.google.guava:guava from 33.4.8-jre to 33.5.0-jre (#618)
Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.4.8-jre to 33.5.0-jre.
- [Release notes](https://github.com/google/guava/releases)
- [Commits](https://github.com/google/guava/commits)

---
updated-dependencies:
- dependency-name: com.google.guava:guava
  dependency-version: 33.5.0-jre
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-10 23:22:30 +00:00
dependabot[bot]
d656b67570 deps: bump de.exlll:configlib-yaml from 4.6.3 to 4.6.4 (#627)
Bumps [de.exlll:configlib-yaml](https://github.com/Exlll/ConfigLib) from 4.6.3 to 4.6.4.
- [Release notes](https://github.com/Exlll/ConfigLib/releases)
- [Commits](https://github.com/Exlll/ConfigLib/compare/v4.6.3...v4.6.4)

---
updated-dependencies:
- dependency-name: de.exlll:configlib-yaml
  dependency-version: 4.6.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-10 23:22:19 +00:00
AO
3c66b65ac6 add DataVersion 1.21.11 (#630) 2025-12-10 23:22:10 +00:00
its.bread
c227933b3b feat: add Paper 1.21.11 support (#629) 2025-12-10 16:43:24 +00:00
dependabot[bot]
5cf9cb8e50 deps: bump org.junit:junit-bom from 5.13.3 to 6.0.1 (#617)
Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.3 to 6.0.1.
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r6.0.1)

---
updated-dependencies:
- dependency-name: org.junit:junit-bom
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-07 21:19:15 +00:00
dependabot[bot]
693cd6120f deps: bump org.projectlombok:lombok from 1.18.38 to 1.18.42 (#619)
Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.38 to 1.18.42.
- [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown)
- [Commits](https://github.com/projectlombok/lombok/compare/v1.18.38...v1.18.42)

---
updated-dependencies:
- dependency-name: org.projectlombok:lombok
  dependency-version: 1.18.42
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-07 21:19:05 +00:00
dependabot[bot]
6efd800481 build(deps): bump urllib3 from 2.5.0 to 2.6.0 in /test (#625)
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.5.0 to 2.6.0.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.5.0...2.6.0)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-version: 2.6.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-07 21:18:57 +00:00
its.bread
a723a7cba3 Fix MongoDB getMapBinding and clarify Javadoc (#624) 2025-12-04 17:45:38 +00:00
Johannes / EinJojo
b1a5eb5f44 Fix org.postgresql.util.PSQLException: ERROR: operator does not exist: uuid = character varying (#623) 2025-12-04 15:28:27 +00:00
its.bread
8232282d13 Fix locked maps not rendering after server restart (#620) 2025-12-04 15:28:06 +00:00
dependabot[bot]
404d359f89 deps: bump com.github.retrooper:packetevents-spigot from 2.9.4 to 2.10.1 (#608)
Bumps [com.github.retrooper:packetevents-spigot](https://github.com/retrooper/packetevents) from 2.9.4 to 2.10.1.
- [Release notes](https://github.com/retrooper/packetevents/releases)
- [Changelog](https://github.com/retrooper/packetevents/blob/2.0/CHANGELOG.md)
- [Commits](https://github.com/retrooper/packetevents/compare/v2.9.4...v2.10.1)

---
updated-dependencies:
- dependency-name: com.github.retrooper:packetevents-spigot
  dependency-version: 2.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-29 19:33:29 +00:00
dependabot[bot]
62e84d92fc deps: bump net.kyori:adventure-platform-bukkit from 4.4.0 to 4.4.1 (#607)
Bumps [net.kyori:adventure-platform-bukkit](https://github.com/KyoriPowered/adventure-platform) from 4.4.0 to 4.4.1.
- [Release notes](https://github.com/KyoriPowered/adventure-platform/releases)
- [Commits](https://github.com/KyoriPowered/adventure-platform/compare/v4.4.0...v4.4.1)

---
updated-dependencies:
- dependency-name: net.kyori:adventure-platform-bukkit
  dependency-version: 4.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-29 19:33:12 +00:00
dependabot[bot]
9b2246eac2 deps: bump commons-io:commons-io from 2.20.0 to 2.21.0 (#606)
Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from 2.20.0 to 2.21.0.
- [Changelog](https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt)
- [Commits](https://github.com/apache/commons-io/compare/rel/commons-io-2.20.0...rel/commons-io-2.21.0)

---
updated-dependencies:
- dependency-name: commons-io:commons-io
  dependency-version: 2.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-29 19:33:05 +00:00
dependabot[bot]
e6d3935246 ci: bump actions/checkout from 5 to 6 (#613)
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-29 19:32:56 +00:00
its.bread
5c4111b6a7 fix: prevent race condition in CHECK_IN_PETITION handler (#614)
- Replace confusing 'online' boolean with direct state checks
- Only release DATA_CHECKOUT when user is truly offline AND unlocked
2025-11-29 19:32:28 +00:00
AO
51a700600a Update DataVersionSupplier.java (#609) 2025-11-12 16:54:03 +00:00
William278
23c3ee08e9 fix: actually add build files for 1.21.10 2025-11-10 17:35:56 +00:00
William278
c1d08f9c23 Merge remote-tracking branch 'origin/master' 2025-11-09 20:23:59 +00:00
William278
4cabdbe952 fix: restore wrapper 2025-11-09 20:23:51 +00:00
dependabot[bot]
abdebd960b ci: bump actions/checkout from 4 to 5 (#572)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: William <will27528@gmail.com>
2025-11-09 20:20:52 +00:00
dependabot[bot]
a7aea51a45 deps: bump de.exlll:configlib-yaml from 4.6.1 to 4.6.3 (#598)
Bumps [de.exlll:configlib-yaml](https://github.com/Exlll/ConfigLib) from 4.6.1 to 4.6.3.
- [Release notes](https://github.com/Exlll/ConfigLib/releases)
- [Commits](https://github.com/Exlll/ConfigLib/compare/v4.6.1...v4.6.3)

---
updated-dependencies:
- dependency-name: de.exlll:configlib-yaml
  dependency-version: 4.6.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-09 20:20:41 +00:00
dependabot[bot]
c8a4376208 deps: bump com.google.code.gson:gson from 2.13.1 to 2.13.2 (#599)
Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.13.1 to 2.13.2.
- [Release notes](https://github.com/google/gson/releases)
- [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md)
- [Commits](https://github.com/google/gson/compare/gson-parent-2.13.1...gson-parent-2.13.2)

---
updated-dependencies:
- dependency-name: com.google.code.gson:gson
  dependency-version: 2.13.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-09 20:20:33 +00:00
dependabot[bot]
315cd4ba6b ci: bump mikepenz/action-junit-report from 5 to 6 (#603)
Bumps [mikepenz/action-junit-report](https://github.com/mikepenz/action-junit-report) from 5 to 6.
- [Release notes](https://github.com/mikepenz/action-junit-report/releases)
- [Commits](https://github.com/mikepenz/action-junit-report/compare/v5...v6)

---
updated-dependencies:
- dependency-name: mikepenz/action-junit-report
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-09 20:20:24 +00:00
dependabot[bot]
6607ac5a6e deps: bump de.exlll:configlib-core from 4.6.1 to 4.6.3 (#602)
Bumps [de.exlll:configlib-core](https://github.com/Exlll/ConfigLib) from 4.6.1 to 4.6.3.
- [Release notes](https://github.com/Exlll/ConfigLib/releases)
- [Commits](https://github.com/Exlll/ConfigLib/compare/v4.6.1...v4.6.3)

---
updated-dependencies:
- dependency-name: de.exlll:configlib-core
  dependency-version: 4.6.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-09 20:20:19 +00:00
William278
562939498a build: bump to 3.8.8 2025-11-09 20:19:55 +00:00
William278
e686d43ca8 build: fixup build script, update wrapper 2025-11-09 20:19:30 +00:00
William278
e9ac400215 feat: add Paper 1.21.10 support 2025-10-28 19:29:20 +00:00
William278
234870537a feat: remove 1.20.1 support 2025-10-28 19:14:17 +00:00
dependabot[bot]
b5f392a20f ci: bump actions/setup-java from 4 to 5 (#575)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4 to 5.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 19:04:23 +00:00
dependabot[bot]
9ea8eb4101 deps: bump com.zaxxer:HikariCP from 7.0.1 to 7.0.2 (#590)
Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 7.0.1 to 7.0.2.
- [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES)
- [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-7.0.1...HikariCP-7.0.2)

---
updated-dependencies:
- dependency-name: com.zaxxer:HikariCP
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 19:04:15 +00:00
dependabot[bot]
dc7cde1c33 deps: bump net.kyori:adventure-api from 4.23.0 to 4.25.0 (#593)
Bumps [net.kyori:adventure-api](https://github.com/KyoriPowered/adventure) from 4.23.0 to 4.25.0.
- [Release notes](https://github.com/KyoriPowered/adventure/releases)
- [Commits](https://github.com/KyoriPowered/adventure/compare/v4.23.0...v4.25.0)

---
updated-dependencies:
- dependency-name: net.kyori:adventure-api
  dependency-version: 4.25.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 19:04:05 +00:00
Heriptik
4e75b5ca1d Fix: added null-checks for Material and EntityType in applyStat to avoid NPE (#589) 2025-10-03 09:56:15 +03:00
dependabot[bot]
fe0bdccf40 deps: bump com.gradleup.shadow from 8.3.8 to 9.2.2 (#587)
Bumps [com.gradleup.shadow](https://github.com/GradleUp/shadow) from 8.3.8 to 9.2.2.
- [Release notes](https://github.com/GradleUp/shadow/releases)
- [Commits](https://github.com/GradleUp/shadow/compare/8.3.8...9.2.2)

---
updated-dependencies:
- dependency-name: com.gradleup.shadow
  dependency-version: 9.2.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-01 18:03:55 +03:00
Tkach
c615ab592b feat: allow overriding server name via HUSKSYNC_SERVER_NAME env (#586) 2025-09-23 19:35:26 +01:00
kFor
16d4a8fd9b fix: handle ender chest size mismatch (#582) 2025-09-11 23:51:15 +01:00
mfnalex
96f34092f6 Ensure attributes are accessed on main thread only (#578) 2025-08-29 13:20:44 +01:00
42 changed files with 185 additions and 305 deletions

View File

@@ -17,9 +17,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 'Checkout for CI 🛎️' - name: 'Checkout for CI 🛎️'
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: 'Set up JDK 21 📦' - name: 'Set up JDK 21 📦'
uses: actions/setup-java@v4 uses: actions/setup-java@v5
with: with:
java-version: '21' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
@@ -31,7 +31,7 @@ jobs:
SNAPSHOTS_MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} SNAPSHOTS_MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
SNAPSHOTS_MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} SNAPSHOTS_MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
- name: 'Publish Test Report 📊' - name: 'Publish Test Report 📊'
uses: mikepenz/action-junit-report@v5 uses: mikepenz/action-junit-report@v6
if: success() || failure() # Continue on failure if: success() || failure() # Continue on failure
with: with:
report_paths: '**/build/test-results/test/TEST-*.xml' report_paths: '**/build/test-results/test/TEST-*.xml'
@@ -51,12 +51,12 @@ jobs:
version: ${{ env.version_name }} version: ${{ env.version_name }}
changelog: ${{ github.event.head_commit.message }} changelog: ${{ github.event.head_commit.message }}
distro-names: | distro-names: |
paper-1.20.1
paper-1.21.1 paper-1.21.1
paper-1.21.4 paper-1.21.4
paper-1.21.5 paper-1.21.5
paper-1.21.8 paper-1.21.8
fabric-1.20.1 paper-1.21.10
paper-1.21.11
fabric-1.21.1 fabric-1.21.1
fabric-1.21.4 fabric-1.21.4
fabric-1.21.5 fabric-1.21.5
@@ -67,29 +67,29 @@ jobs:
paper paper
paper paper
paper paper
fabric paper
fabric fabric
fabric fabric
fabric fabric
fabric fabric
distro-descriptions: | distro-descriptions: |
Paper 1.20.1
Paper 1.21.1 Paper 1.21.1
Paper 1.21.4 Paper 1.21.4
Paper 1.21.5 Paper 1.21.5
Paper 1.21.8 Paper 1.21.8
Fabric 1.20.1 Paper 1.21.10
Paper 1.21.11
Fabric 1.21.1 Fabric 1.21.1
Fabric 1.21.4 Fabric 1.21.4
Fabric 1.21.5 Fabric 1.21.5
Fabric 1.21.8 Fabric 1.21.8
files: | files: |
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.20.1.jar
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.1.jar target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.1.jar
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.4.jar target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.4.jar
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.5.jar target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.5.jar
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.8.jar target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.8.jar
target/HuskSync-Fabric-${{ env.version_name }}+mc.1.20.1.jar target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.10.jar
target/HuskSync-Bukkit-${{ env.version_name }}+mc.1.21.11.jar
target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.1.jar target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.1.jar
target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.4.jar target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.4.jar
target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.5.jar target/HuskSync-Fabric-${{ env.version_name }}+mc.1.21.5.jar

View File

@@ -13,9 +13,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 'Checkout for CI 🛎' - name: 'Checkout for CI 🛎'
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: 'Set up JDK 21 📦' - name: 'Set up JDK 21 📦'
uses: actions/setup-java@v4 uses: actions/setup-java@v5
with: with:
java-version: '21' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
@@ -24,7 +24,7 @@ jobs:
with: with:
arguments: test arguments: test
- name: 'Publish Test Report 📊' - name: 'Publish Test Report 📊'
uses: mikepenz/action-junit-report@v5 uses: mikepenz/action-junit-report@v6
if: success() || failure() # Continue on failure if: success() || failure() # Continue on failure
with: with:
report_paths: '**/build/test-results/test/TEST-*.xml' report_paths: '**/build/test-results/test/TEST-*.xml'

View File

@@ -13,9 +13,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 'Checkout for CI 🛎️' - name: 'Checkout for CI 🛎️'
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: 'Set up JDK 21 📦' - name: 'Set up JDK 21 📦'
uses: actions/setup-java@v4 uses: actions/setup-java@v5
with: with:
java-version: '21' java-version: '21'
distribution: 'temurin' distribution: 'temurin'
@@ -27,7 +27,7 @@ jobs:
RELEASES_MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} RELEASES_MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
RELEASES_MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} RELEASES_MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
- name: 'Publish Test Report 📊' - name: 'Publish Test Report 📊'
uses: mikepenz/action-junit-report@v5 uses: mikepenz/action-junit-report@v6
if: success() || failure() # Continue on failure if: success() || failure() # Continue on failure
with: with:
report_paths: '**/build/test-results/test/TEST-*.xml' report_paths: '**/build/test-results/test/TEST-*.xml'
@@ -40,12 +40,11 @@ jobs:
version: ${{ github.event.release.tag_name }} version: ${{ github.event.release.tag_name }}
changelog: ${{ github.event.release.body }} changelog: ${{ github.event.release.body }}
distro-names: | distro-names: |
paper-1.20.1
paper-1.21.1 paper-1.21.1
paper-1.21.4 paper-1.21.4
paper-1.21.5 paper-1.21.5
paper-1.21.8 paper-1.21.8
fabric-1.20.1 paper-1.21.10
fabric-1.21.1 fabric-1.21.1
fabric-1.21.4 fabric-1.21.4
fabric-1.21.5 fabric-1.21.5
@@ -60,25 +59,22 @@ jobs:
fabric fabric
fabric fabric
fabric fabric
fabric
distro-descriptions: | distro-descriptions: |
Paper 1.20.1
Paper 1.21.1 Paper 1.21.1
Paper 1.21.4 Paper 1.21.4
Paper 1.21.5 Paper 1.21.5
Paper 1.21.8 Paper 1.21.8
Fabric 1.20.1 Paper 1.21.10
Fabric 1.21.1 Fabric 1.21.1
Fabric 1.21.4 Fabric 1.21.4
Fabric 1.21.5 Fabric 1.21.5
Fabric 1.21.8 Fabric 1.21.8
files: | files: |
target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.20.1.jar
target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.1.jar target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.1.jar
target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.4.jar target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.4.jar
target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.5.jar target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.5.jar
target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.8.jar target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.8.jar
target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.20.1.jar target/HuskSync-Bukkit-${{ github.event.release.tag_name }}+mc.1.21.10.jar
target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.1.jar target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.1.jar
target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.4.jar target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.4.jar
target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.5.jar target/HuskSync-Fabric-${{ github.event.release.tag_name }}+mc.1.21.5.jar

View File

@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: 'Checkout for CI 🛎️' - name: 'Checkout for CI 🛎️'
uses: actions/checkout@v4 uses: actions/checkout@v6
- name: 'Push Docs to Github Wiki 📄️' - name: 'Push Docs to Github Wiki 📄️'
uses: Andrew-Chen-Wang/github-wiki-action@v5 uses: Andrew-Chen-Wang/github-wiki-action@v5
with: with:

View File

@@ -48,15 +48,16 @@ HuskSync supports the following [compatible versions](https://william278.net/doc
| Minecraft | Latest HuskSync | Java Version | Platforms | Support Status | | Minecraft | Latest HuskSync | Java Version | Platforms | Support Status |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------| |:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 1.21.7/8 | _latest_ | 21 | Paper | ✅ **Active Release** | | 1.21.10 | _latest_ | 21 | Paper | ✅ **Active Release** |
| 1.21.7/8 | _latest_ | 21 | Paper, Fabric | ✅ **August 2026** |
| 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) | | 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) | | 1.21.5 | _latest_ | 21 | Paper | ✅ **February 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) | | 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **February 2026** (Non-LTS) |
| 1.21.3 | 3.7.1 | 21 | Paper, Fabric | 🗃️ Archived (December 2024) | | 1.21.3 | 3.7.1 | 21 | Paper, Fabric | 🗃️ Archived (December 2024) |
| 1.21.1 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (LTS) | | 1.21.1 | _latest_ | 21 | Paper, Fabric | ✅ **May 2026** (LTS) |
| 1.20.6 | 3.6.8 | 17 | Paper | 🗃️ Archived (October 2024) | | 1.20.6 | 3.6.8 | 17 | Paper | 🗃️ Archived (October 2024) |
| 1.20.4 | 3.6.8 | 17 | Paper | 🗃️ Archived (July 2024) | | 1.20.4 | 3.6.8 | 17 | Paper | 🗃️ Archived (July 2024) |
| 1.20.1 | _latest_ | 17 | Paper, Fabric | **November 2025** (LTS) | | 1.20.1 | 3.8.7 | 17 | Paper, Fabric | 🗃️ Archived (November 2024) |
| 1.17.1 - 1.19.4 | 3.6.8 | 17 | Paper | 🗃️ Archived | | 1.17.1 - 1.19.4 | 3.6.8 | 17 | Paper | 🗃️ Archived |
| 1.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived | | 1.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived |

View File

@@ -1,7 +1,7 @@
import org.apache.tools.ant.filters.ReplaceTokens import org.apache.tools.ant.filters.ReplaceTokens
plugins { plugins {
id 'com.gradleup.shadow' version '8.3.8' id 'com.gradleup.shadow' version '9.2.2'
id 'org.cadixdev.licenser' version '0.6.1' apply false id 'org.cadixdev.licenser' version '0.6.1' apply false
id 'dev.architectury.loom' version '1.9-SNAPSHOT' apply false id 'dev.architectury.loom' version '1.9-SNAPSHOT' apply false
id 'gg.essential.multi-version.root' apply false id 'gg.essential.multi-version.root' apply false
@@ -89,10 +89,10 @@ allprojects {
} }
dependencies { dependencies {
testImplementation(platform("org.junit:junit-bom:5.13.3")) testImplementation(platform("org.junit:junit-bom:6.0.1"))
testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testCompileOnly 'org.jetbrains:annotations:26.0.2' testCompileOnly 'org.jetbrains:annotations:26.0.2-1'
} }
license { license {
@@ -100,14 +100,14 @@ allprojects {
include '**/*.java' include '**/*.java'
newLine = true newLine = true
} }
test { test {
useJUnitPlatform() useJUnitPlatform()
} }
processResources { processResources {
def tokenMap = rootProject.ext.properties def tokenMap = rootProject.ext.properties
tokenMap.merge("grgit",'',(s, s2) -> s) tokenMap.merge("grgit", '', (s, s2) -> s)
filesMatching(['**/*.json', '**/*.yml']) { filesMatching(['**/*.json', '**/*.yml']) {
filter ReplaceTokens as Class, beginToken: '${', endToken: '}', filter ReplaceTokens as Class, beginToken: '${', endToken: '}',
tokens: tokenMap tokens: tokenMap
@@ -133,7 +133,7 @@ subprojects {
// Version-specific configuration // Version-specific configuration
if (['fabric', 'bukkit'].contains(project.parent?.name)) { if (['fabric', 'bukkit'].contains(project.parent?.name)) {
compileJava.options.release.set (project.name == '1.20.1' ? 17 : 21) // 1.20.1 requires Java 17 compileJava.options.release.set 21
version += "+mc.${project.name}" version += "+mc.${project.name}"
if (project.parent?.name?.equals('fabric')) { if (project.parent?.name?.equals('fabric')) {

View File

@@ -1,4 +0,0 @@
minecraft_version_range=1.20.1
minecraft_version_numeric=12001
minecraft_api_version=1.20
paper_api_version=1.20.1-R0.1-SNAPSHOT

View File

@@ -0,0 +1,4 @@
minecraft_version_range=>=1.21.9 <=1.21.10
minecraft_version_numeric=12110
minecraft_api_version=1.21
paper_api_version=1.21.10-R0.1-SNAPSHOT

View File

@@ -0,0 +1,4 @@
minecraft_version_range=>=1.21.11 <=1.21.11
minecraft_version_numeric=12111
minecraft_api_version=1.21
paper_api_version=1.21.11-R0.1-SNAPSHOT

View File

@@ -15,25 +15,25 @@ dependencies {
implementation 'net.william278:hsldataconverter:1.0' implementation 'net.william278:hsldataconverter:1.0'
implementation 'net.william278:mapdataapi:2.0' implementation 'net.william278:mapdataapi:2.0'
implementation 'org.bstats:bstats-bukkit:3.1.0' implementation 'org.bstats:bstats-bukkit:3.1.0'
implementation 'net.kyori:adventure-platform-bukkit:4.4.0' implementation 'net.kyori:adventure-platform-bukkit:4.4.1'
implementation 'dev.triumphteam:triumph-gui:3.1.12' implementation 'dev.triumphteam:triumph-gui:3.1.12'
implementation 'space.arim.morepaperlib:morepaperlib:0.4.4' implementation 'space.arim.morepaperlib:morepaperlib:0.4.4'
implementation 'de.tr7zw:item-nbt-api:2.15.2-SNAPSHOT' implementation 'de.tr7zw:item-nbt-api:2.15.5'
compileOnly "io.papermc.paper:paper-api:${paper_api_version}" compileOnly "io.papermc.paper:paper-api:${paper_api_version}"
compileOnly 'com.github.retrooper:packetevents-spigot:2.9.4' compileOnly 'com.github.retrooper:packetevents-spigot:2.10.1'
compileOnly 'com.github.dmulloy2:ProtocolLib:5.3.0' compileOnly 'com.github.dmulloy2:ProtocolLib:5.3.0'
compileOnly 'org.projectlombok:lombok:1.18.38' compileOnly 'org.projectlombok:lombok:1.18.42'
compileOnly 'commons-io:commons-io:2.20.0' compileOnly 'commons-io:commons-io:2.21.0'
compileOnly 'org.json:json:20250517' compileOnly 'org.json:json:20250517'
compileOnly 'net.william278:minedown:1.8.2' compileOnly 'net.william278:minedown:1.8.2'
compileOnly 'de.exlll:configlib-yaml:4.6.1' compileOnly 'de.exlll:configlib-yaml:4.6.4'
compileOnly 'com.zaxxer:HikariCP:7.0.1' compileOnly 'com.zaxxer:HikariCP:7.0.2'
compileOnly 'net.william278:DesertWell:2.0.4' compileOnly 'net.william278:DesertWell:2.0.4'
compileOnly 'net.william278:AdvancementAPI:97a9583413' compileOnly 'net.william278:AdvancementAPI:97a9583413'
compileOnly "redis.clients:jedis:$jedis_version" compileOnly "redis.clients:jedis:$jedis_version"
annotationProcessor 'org.projectlombok:lombok:1.18.38' annotationProcessor 'org.projectlombok:lombok:1.18.42'
} }
processResources { processResources {

View File

@@ -38,13 +38,10 @@ import org.bukkit.attribute.AttributeModifier;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
//#if MC==12001
//$$ import org.bukkit.inventory.EquipmentSlot;
//#else
import org.bukkit.inventory.EquipmentSlotGroup; import org.bukkit.inventory.EquipmentSlotGroup;
//#endif
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -198,7 +195,9 @@ public abstract class BukkitData implements Data {
@Override @Override
public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException { public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException {
user.getPlayer().getEnderChest().setContents(plugin.setMapViews(getContents())); ItemStack[] fullContents = plugin.setMapViews(getContents());
ItemStack[] enderChestContents = Arrays.copyOf(fullContents, Math.min(fullContents.length, user.getPlayer().getEnderChest().getSize()));
user.getPlayer().getEnderChest().setContents(enderChestContents);
} }
} }
@@ -521,8 +520,18 @@ public abstract class BukkitData implements Data {
try { try {
switch (type) { switch (type) {
case UNTYPED -> player.setStatistic(stat, value); case UNTYPED -> player.setStatistic(stat, value);
case BLOCK, ITEM -> player.setStatistic(stat, Objects.requireNonNull(matchMaterial(key[0])), value); case BLOCK, ITEM -> {
case ENTITY -> player.setStatistic(stat, Objects.requireNonNull(matchEntityType(key[0])), value); Material material = matchMaterial(key.length > 0 ? key[0] : null);
if (material != null) {
player.setStatistic(stat, material, value);
}
}
case ENTITY -> {
EntityType entity = matchEntityType(key.length > 0 ? key[0] : null);
if (entity != null) {
player.setStatistic(stat, entity, value);
}
}
} }
} catch (Throwable a) { } catch (Throwable a) {
plugin.log(Level.WARNING, "Failed to apply statistic " + id, a); plugin.log(Level.WARNING, "Failed to apply statistic " + id, a);
@@ -567,6 +576,14 @@ public abstract class BukkitData implements Data {
@NotNull @NotNull
public static BukkitData.Attributes adapt(@NotNull Player player, @NotNull HuskSync plugin) { public static BukkitData.Attributes adapt(@NotNull Player player, @NotNull HuskSync plugin) {
if (!Bukkit.isPrimaryThread()) {
try {
return Bukkit.getScheduler().callSyncMethod((Plugin) plugin, () -> adapt(player, plugin)).get();
} catch (Exception e) {
throw new IllegalStateException("Failed to adapt attributes on main thread", e);
}
}
final List<Attribute> attributes = Lists.newArrayList(); final List<Attribute> attributes = Lists.newArrayList();
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registry.ATTRIBUTE.forEach(id -> { Registry.ATTRIBUTE.forEach(id -> {
@@ -599,33 +616,19 @@ public abstract class BukkitData implements Data {
instance.getBaseValue(), instance.getBaseValue(),
instance.getModifiers().stream() instance.getModifiers().stream()
.filter(modifier -> !settings.isIgnoredModifier(modifier.getName())) .filter(modifier -> !settings.isIgnoredModifier(modifier.getName()))
//#if MC==12001
//$$ .filter(modifier -> modifier.getSlot() == null)
//#else
.filter(modifier -> modifier.getSlotGroup() != EquipmentSlotGroup.ANY) .filter(modifier -> modifier.getSlotGroup() != EquipmentSlotGroup.ANY)
//#endif
.map(BukkitData.Attributes::adapt).collect(Collectors.toSet()) .map(BukkitData.Attributes::adapt).collect(Collectors.toSet())
); );
} }
@NotNull @NotNull
private static Modifier adapt(@NotNull AttributeModifier modifier) { private static Modifier adapt(@NotNull AttributeModifier modifier) {
//#if MC==12001
//$$ return new Modifier(
//$$ modifier.getUniqueId(),
//$$ modifier.getName(),
//$$ modifier.getAmount(),
//$$ modifier.getOperation().ordinal(),
//$$ modifier.getSlot() != null ? modifier.getSlot().ordinal() : -1
//$$ );
//#else
return new Modifier( return new Modifier(
modifier.getKey().toString(), modifier.getKey().toString(),
modifier.getAmount(), modifier.getAmount(),
modifier.getOperation().ordinal(), modifier.getOperation().ordinal(),
modifier.getSlotGroup().toString() modifier.getSlotGroup().toString()
); );
//#endif
} }
private static void applyAttribute(@Nullable AttributeInstance instance, @Nullable Attribute attribute) { private static void applyAttribute(@Nullable AttributeInstance instance, @Nullable Attribute attribute) {
@@ -645,26 +648,25 @@ public abstract class BukkitData implements Data {
@NotNull @NotNull
private static AttributeModifier adapt(@NotNull Modifier modifier) { private static AttributeModifier adapt(@NotNull Modifier modifier) {
//#if MC==12001
//$$ return new AttributeModifier(
//$$ modifier.uuid(),
//$$ modifier.name(),
//$$ modifier.amount(),
//$$ AttributeModifier.Operation.values()[modifier.operation()],
//$$ modifier.equipmentSlot() != -1 ? EquipmentSlot.values()[modifier.equipmentSlot()] : null
//$$ );
//#else
return new AttributeModifier( return new AttributeModifier(
Objects.requireNonNull(NamespacedKey.fromString(modifier.name())), Objects.requireNonNull(NamespacedKey.fromString(modifier.name())),
modifier.amount(), modifier.amount(),
AttributeModifier.Operation.values()[modifier.operation()], AttributeModifier.Operation.values()[modifier.operation()],
Optional.ofNullable(EquipmentSlotGroup.getByName(modifier.slotGroup())).orElse(EquipmentSlotGroup.ANY) Optional.ofNullable(EquipmentSlotGroup.getByName(modifier.slotGroup())).orElse(EquipmentSlotGroup.ANY)
); );
//#endif
} }
@Override @Override
public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException { public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException {
if (!Bukkit.isPrimaryThread()) {
try {
Bukkit.getScheduler().callSyncMethod(plugin, () -> { this.apply(user, plugin); return null; }).get();
return;
} catch (Exception e) {
throw new IllegalStateException("Failed to apply attributes on main thread", e);
}
}
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registry.ATTRIBUTE.forEach(id -> { Registry.ATTRIBUTE.forEach(id -> {
if (settings.isIgnoredAttribute(id.getKey().toString())) { if (settings.isIgnoredAttribute(id.getKey().toString())) {

View File

@@ -124,8 +124,8 @@ public interface BukkitMapHandler {
@Nullable @Nullable
@Blocking @Blocking
private Map.Entry<MapData, Boolean> readMapData(@NotNull String serverName, int mapId) { private MapData readMapData(@NotNull String serverName, int mapId) {
final Map.Entry<byte[], Boolean> readData = fetchMapData(serverName, mapId); final byte[] readData = fetchMapData(serverName, mapId);
if (readData == null) { if (readData == null) {
return null; return null;
} }
@@ -134,23 +134,23 @@ public interface BukkitMapHandler {
@Nullable @Nullable
@Blocking @Blocking
private Map.Entry<byte[], Boolean> fetchMapData(@NotNull String serverName, int mapId) { private byte[] fetchMapData(@NotNull String serverName, int mapId) {
return fetchMapData(serverName, mapId, true); return fetchMapData(serverName, mapId, true);
} }
@Nullable @Nullable
@Blocking @Blocking
private Map.Entry<byte[], Boolean> fetchMapData(@NotNull String serverName, int mapId, boolean doReverseLookup) { private byte[] fetchMapData(@NotNull String serverName, int mapId, boolean doReverseLookup) {
// Read from Redis cache // Read from Redis cache
final byte[] redisData = getRedisManager().getMapData(serverName, mapId); final byte[] redisData = getRedisManager().getMapData(serverName, mapId);
if (redisData != null) { if (redisData != null) {
return new AbstractMap.SimpleImmutableEntry<>(redisData, true); return redisData;
} }
// Read from database and set to Redis // Read from database and set to Redis
@Nullable Map.Entry<byte[], Boolean> databaseData = getPlugin().getDatabase().getMapData(serverName, mapId); final byte[] databaseData = getPlugin().getDatabase().getMapData(serverName, mapId);
if (databaseData != null) { if (databaseData != null) {
getRedisManager().setMapData(serverName, mapId, databaseData.getKey()); getRedisManager().setMapData(serverName, mapId, databaseData);
return databaseData; return databaseData;
} }
@@ -162,7 +162,7 @@ public interface BukkitMapHandler {
} }
@Nullable @Nullable
private Map.Entry<byte[], Boolean> fetchReversedMapData(@NotNull String serverName, int mapId) { private byte[] fetchReversedMapData(@NotNull String serverName, int mapId) {
// Lookup binding from Redis cache, then fetch data if found // Lookup binding from Redis cache, then fetch data if found
Map.Entry<String, Integer> binding = getRedisManager().getReversedMapBound(serverName, mapId); Map.Entry<String, Integer> binding = getRedisManager().getReversedMapBound(serverName, mapId);
if (binding != null) { if (binding != null) {
@@ -179,13 +179,10 @@ public interface BukkitMapHandler {
} }
@Nullable @Nullable
private Map.Entry<MapData, Boolean> deserializeMapData(@NotNull Map.Entry<byte[], Boolean> data) { private MapData deserializeMapData(byte @NotNull [] data) {
try { try {
return new AbstractMap.SimpleImmutableEntry<>( return getPlugin().getDataAdapter().fromBytes(data, AdaptableMapData.class)
getPlugin().getDataAdapter().fromBytes(data.getKey(), AdaptableMapData.class) .getData(getPlugin().getDataVersion(getPlugin().getMinecraftVersion()));
.getData(getPlugin().getDataVersion(getPlugin().getMinecraftVersion())),
data.getValue()
);
} catch (IOException e) { } catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to deserialize map data", e); getPlugin().log(Level.WARNING, "Failed to deserialize map data", e);
return null; return null;
@@ -297,7 +294,7 @@ public interface BukkitMapHandler {
} }
getPlugin().debug("Deserializing map data from NBT and generating view..."); getPlugin().debug("Deserializing map data from NBT and generating view...");
Map.Entry<MapData, Boolean> mapData = readMapData(originServer, originalId); MapData mapData = readMapData(originServer, originalId);
if (mapData == null && nbt.hasTag(MAP_LEGACY_PIXEL_DATA_KEY)) { if (mapData == null && nbt.hasTag(MAP_LEGACY_PIXEL_DATA_KEY)) {
mapData = readLegacyMapItemData(nbt); mapData = readLegacyMapItemData(nbt);
} }
@@ -308,14 +305,14 @@ public interface BukkitMapHandler {
} }
MapView newView = view != null ? view : Bukkit.createMap(getDefaultMapWorld()); MapView newView = view != null ? view : Bukkit.createMap(getDefaultMapWorld());
generateRenderedMap(Objects.requireNonNull(mapData).getKey(), newView); generateRenderedMap(mapData, newView);
meta.setMapView(newView); meta.setMapView(newView);
} }
private void handleUnboundMap(@NotNull MapMeta meta, @NotNull ReadableItemNBT nbt, @NotNull String originServer, private void handleUnboundMap(@NotNull MapMeta meta, @NotNull ReadableItemNBT nbt, @NotNull String originServer,
int originalId, @NotNull String currentServer) { int originalId, @NotNull String currentServer) {
getPlugin().debug("Deserializing map data from NBT and generating view..."); getPlugin().debug("Deserializing map data from NBT and generating view...");
Map.Entry<MapData, Boolean> mapData = readMapData(originServer, originalId); MapData mapData = readMapData(originServer, originalId);
if (mapData == null && nbt.hasTag(MAP_LEGACY_PIXEL_DATA_KEY)) { if (mapData == null && nbt.hasTag(MAP_LEGACY_PIXEL_DATA_KEY)) {
mapData = readLegacyMapItemData(nbt); mapData = readLegacyMapItemData(nbt);
} }
@@ -325,7 +322,7 @@ public interface BukkitMapHandler {
return; return;
} }
final MapView view = generateRenderedMap(Objects.requireNonNull(mapData, "Pixel data null!").getKey()); final MapView view = generateRenderedMap(Objects.requireNonNull(mapData, "Pixel data null!"));
meta.setMapView(view); meta.setMapView(view);
final int id = view.getId(); final int id = view.getId();
@@ -345,13 +342,13 @@ public interface BukkitMapHandler {
view.getRenderers().clear(); view.getRenderers().clear();
view.getRenderers().addAll(optionalView.get().getRenderers()); view.getRenderers().addAll(optionalView.get().getRenderers());
view.setLocked(true); view.setLocked(true);
view.setScale(MapView.Scale.NORMAL); view.setScale(MapView.Scale.CLOSEST);
view.setTrackingPosition(false); view.setTrackingPosition(false);
view.setUnlimitedTracking(false); view.setUnlimitedTracking(false);
return; return;
} }
Map.Entry<MapData, Boolean> data = readMapData(getPlugin().getServerName(), view.getId()); MapData data = readMapData(getPlugin().getServerName(), view.getId());
if (data == null) { if (data == null) {
data = readLegacyMapFileData(view.getId()); data = readLegacyMapFileData(view.getId());
} }
@@ -362,10 +359,7 @@ public interface BukkitMapHandler {
.formatted(world.getName(), view.getId())); .formatted(world.getName(), view.getId()));
return; return;
} }
if (data.getValue()) { renderMapView(view, data);
return;
}
renderMapView(view, data.getKey());
} }
@NotNull @NotNull
@@ -383,7 +377,7 @@ public interface BukkitMapHandler {
view.getRenderers().clear(); view.getRenderers().clear();
view.addRenderer(new PersistentMapRenderer(canvasData)); view.addRenderer(new PersistentMapRenderer(canvasData));
view.setLocked(true); view.setLocked(true);
view.setScale(MapView.Scale.NORMAL); view.setScale(MapView.Scale.CLOSEST);
view.setTrackingPosition(false); view.setTrackingPosition(false);
view.setUnlimitedTracking(false); view.setUnlimitedTracking(false);
setMapView(view); setMapView(view);
@@ -471,11 +465,11 @@ public interface BukkitMapHandler {
// Legacy - read maps from item stacks // Legacy - read maps from item stacks
@Nullable @Nullable
@Blocking @Blocking
private Map.Entry<MapData, Boolean> readLegacyMapItemData(@NotNull ReadableItemNBT nbt) { private MapData readLegacyMapItemData(@NotNull ReadableItemNBT nbt) {
final int dataVer = getPlugin().getDataVersion(getPlugin().getMinecraftVersion()); final int dataVer = getPlugin().getDataVersion(getPlugin().getMinecraftVersion());
try { try {
return new AbstractMap.SimpleImmutableEntry<>(MapData.fromByteArray(dataVer, return MapData.fromByteArray(dataVer,
Objects.requireNonNull(nbt.getByteArray(MAP_LEGACY_PIXEL_DATA_KEY))), false); Objects.requireNonNull(nbt.getByteArray(MAP_LEGACY_PIXEL_DATA_KEY)));
} catch (IOException e) { } catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to read legacy map data", e); getPlugin().log(Level.WARNING, "Failed to read legacy map data", e);
return null; return null;
@@ -484,14 +478,14 @@ public interface BukkitMapHandler {
// Legacy - read maps from files // Legacy - read maps from files
@Nullable @Nullable
private Map.Entry<MapData, Boolean> readLegacyMapFileData(int mapId) { private MapData readLegacyMapFileData(int mapId) {
final Path path = getPlugin().getDataFolder().toPath().resolve("maps").resolve(mapId + ".dat"); final Path path = getPlugin().getDataFolder().toPath().resolve("maps").resolve(mapId + ".dat");
final File file = path.toFile(); final File file = path.toFile();
if (!file.exists()) { if (!file.exists()) {
return null; return null;
} }
try { try {
return new AbstractMap.SimpleImmutableEntry<>(MapData.fromNbt(file), false); return MapData.fromNbt(file);
} catch (IOException e) { } catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to read legacy map file", e); getPlugin().log(Level.WARNING, "Failed to read legacy map file", e);
return null; return null;
@@ -597,11 +591,7 @@ public interface BukkitMapHandler {
final List<MapBanner> banners = Lists.newArrayList(); final List<MapBanner> banners = Lists.newArrayList();
for (int i = 0; i < getCursors().size(); i++) { for (int i = 0; i < getCursors().size(); i++) {
final MapCursor cursor = getCursors().getCursor(i); final MapCursor cursor = getCursors().getCursor(i);
//#if MC==12001
//$$ final String type = cursor.getType().name().toLowerCase(Locale.ENGLISH);
//#else
final String type = cursor.getType().getKey().getKey(); final String type = cursor.getType().getKey().getKey();
//#endif
if (type.startsWith(BANNER_PREFIX)) { if (type.startsWith(BANNER_PREFIX)) {
banners.add(new MapBanner( banners.add(new MapBanner(
type.replaceAll(BANNER_PREFIX, ""), type.replaceAll(BANNER_PREFIX, ""),
@@ -613,7 +603,7 @@ public interface BukkitMapHandler {
} }
} }
return MapData.fromPixels(mapDataVersion, pixels, getDimension(), (byte) 2, banners, List.of()); return MapData.fromPixels(mapDataVersion, pixels, getDimension(), (byte) 0, banners, List.of());
} }
} }

View File

@@ -51,11 +51,7 @@ public final class BukkitKeyedAdapter {
@Nullable @Nullable
public static PotionEffectType matchEffectType(@NotNull String key) { public static PotionEffectType matchEffectType(@NotNull String key) {
//#if MC==12001
//$$ return PotionEffectType.getByName(key);
//#else
return getRegistryValue(Registry.EFFECT, key); return getRegistryValue(Registry.EFFECT, key);
//#endif
} }
private static <T extends Keyed> T getRegistryValue(@NotNull Registry<T> registry, @NotNull String keyString) { private static <T extends Keyed> T getRegistryValue(@NotNull Registry<T> registry, @NotNull String keyString) {

View File

@@ -3,17 +3,17 @@ plugins {
} }
dependencies { dependencies {
api 'commons-io:commons-io:2.20.0' api 'commons-io:commons-io:2.21.0'
api 'org.apache.commons:commons-text:1.14.0' api 'org.apache.commons:commons-text:1.14.0'
api 'net.william278:minedown:1.8.2' api 'net.william278:minedown:1.8.2'
api 'net.william278:mapdataapi:2.0' api 'net.william278:mapdataapi:2.0'
api 'org.json:json:20250517' api 'org.json:json:20250517'
api 'com.google.code.gson:gson:2.13.1' api 'com.google.code.gson:gson:2.13.2'
api 'com.fatboyindustrial.gson-javatime-serialisers:gson-javatime-serialisers:1.1.2' api 'com.fatboyindustrial.gson-javatime-serialisers:gson-javatime-serialisers:1.1.2'
api 'de.exlll:configlib-yaml:4.6.1' api 'de.exlll:configlib-yaml:4.6.4'
api 'net.william278:paginedown:1.1.2' api 'net.william278:paginedown:1.1.2'
api 'net.william278:DesertWell:2.0.4' api 'net.william278:DesertWell:2.0.4'
api('com.zaxxer:HikariCP:7.0.1') { api('com.zaxxer:HikariCP:7.0.2') {
exclude module: 'slf4j-api' exclude module: 'slf4j-api'
} }
@@ -21,12 +21,12 @@ dependencies {
compileOnly 'net.william278.uniform:uniform-common:1.3.9' compileOnly 'net.william278.uniform:uniform-common:1.3.9'
compileOnly 'com.mojang:brigadier:1.1.8' compileOnly 'com.mojang:brigadier:1.1.8'
compileOnly 'org.projectlombok:lombok:1.18.38' compileOnly 'org.projectlombok:lombok:1.18.42'
compileOnly 'org.jetbrains:annotations:26.0.2' compileOnly 'org.jetbrains:annotations:26.0.2-1'
compileOnly 'net.kyori:adventure-api:4.23.0' compileOnly 'net.kyori:adventure-api:4.25.0'
compileOnly 'net.kyori:adventure-platform-api:4.4.0' compileOnly 'net.kyori:adventure-platform-api:4.4.0'
compileOnly "net.kyori:adventure-text-serializer-plain:4.23.0" compileOnly "net.kyori:adventure-text-serializer-plain:4.25.0"
compileOnly 'com.google.guava:guava:33.4.8-jre' compileOnly 'com.google.guava:guava:33.5.0-jre'
compileOnly 'com.github.plan-player-analytics:Plan:5.6.2965' compileOnly 'com.github.plan-player-analytics:Plan:5.6.2965'
compileOnly "redis.clients:jedis:$jedis_version" compileOnly "redis.clients:jedis:$jedis_version"
compileOnly "com.mysql:mysql-connector-j:$mysql_driver_version" compileOnly "com.mysql:mysql-connector-j:$mysql_driver_version"
@@ -37,10 +37,10 @@ dependencies {
testImplementation "redis.clients:jedis:$jedis_version" testImplementation "redis.clients:jedis:$jedis_version"
testImplementation "org.xerial.snappy:snappy-java:$snappy_version" testImplementation "org.xerial.snappy:snappy-java:$snappy_version"
testImplementation 'com.google.guava:guava:33.4.8-jre' testImplementation 'com.google.guava:guava:33.5.0-jre'
testImplementation 'com.github.plan-player-analytics:Plan:5.6.2965' testImplementation 'com.github.plan-player-analytics:Plan:5.6.2965'
testCompileOnly 'de.exlll:configlib-yaml:4.6.1' testCompileOnly 'de.exlll:configlib-yaml:4.6.4'
testCompileOnly 'org.jetbrains:annotations:26.0.2' testCompileOnly 'org.jetbrains:annotations:26.0.2-1'
annotationProcessor 'org.projectlombok:lombok:1.18.38' annotationProcessor 'org.projectlombok:lombok:1.18.42'
} }

View File

@@ -22,13 +22,11 @@ package net.william278.husksync.config;
import de.exlll.configlib.Configuration; import de.exlll.configlib.Configuration;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.nio.file.Path; import java.nio.file.Path;
@Getter
@Configuration @Configuration
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE)
@@ -66,5 +64,9 @@ public class Server {
} }
return super.equals(other); return super.equals(other);
} }
public String getName() {
final String envServerName = System.getenv("HUSKSYNC_SERVER_NAME");
return envServerName == null ? name : envServerName;
}
} }

View File

@@ -274,17 +274,17 @@ public abstract class Database {
* *
* @param serverName Name of the server the map originates from * @param serverName Name of the server the map originates from
* @param mapId Original map ID * @param mapId Original map ID
* @return Map.Entry (key: map data, value: is from current world) * @return the map data bytes, or null if not found
*/ */
@Blocking @Blocking
public abstract @Nullable Map.Entry<byte[], Boolean> getMapData(@NotNull String serverName, int mapId); public abstract byte @Nullable [] getMapData(@NotNull String serverName, int mapId);
/** /**
* Get a map server -> ID binding in the database * Reverse lookup: given a local map binding, find the origin server and map ID.
* *
* @param serverName Name of the server the map originates from * @param serverName Name of the local server (to_server_name in the binding)
* @param mapId Original map ID * @param mapId Local map ID on this server (to_id in the binding)
* @return Map.Entry (key: server name, value: map ID) * @return Map.Entry with origin server name (key) and origin map ID (value), or null if not found
*/ */
@Blocking @Blocking
public abstract @Nullable Map.Entry<String, Integer> getMapBinding(@NotNull String serverName, int mapId); public abstract @Nullable Map.Entry<String, Integer> getMapBinding(@NotNull String serverName, int mapId);

View File

@@ -376,14 +376,14 @@ public class MongoDbDatabase extends Database {
@Blocking @Blocking
@Override @Override
public @Nullable Map.Entry<byte[], Boolean> getMapData(@NotNull String serverName, int mapId) { public byte @Nullable [] getMapData(@NotNull String serverName, int mapId) {
try { try {
Document filter = new Document("server_name", serverName).append("map_id", mapId); Document filter = new Document("server_name", serverName).append("map_id", mapId);
FindIterable<Document> iterable = mongoCollectionHelper.getCollection(mapDataTable).find(filter); FindIterable<Document> iterable = mongoCollectionHelper.getCollection(mapDataTable).find(filter);
Document doc = iterable.first(); Document doc = iterable.first();
if (doc != null) { if (doc != null) {
final Binary bin = doc.get("data", Binary.class); final Binary bin = doc.get("data", Binary.class);
return Map.entry(bin.getData(), true); return bin.getData();
} }
} catch (MongoException e) { } catch (MongoException e) {
plugin.log(Level.SEVERE, "Failed to get map data from the database", e); plugin.log(Level.SEVERE, "Failed to get map data from the database", e);
@@ -399,8 +399,8 @@ public class MongoDbDatabase extends Database {
final Document doc = iterable.first(); final Document doc = iterable.first();
if (doc != null) { if (doc != null) {
return new AbstractMap.SimpleImmutableEntry<>( return new AbstractMap.SimpleImmutableEntry<>(
doc.getString("server_name"), doc.getString("from_server_name"),
doc.getInteger("to_id") doc.getInteger("from_id")
); );
} }
return null; return null;

View File

@@ -473,7 +473,7 @@ public class MySqlDatabase extends Database {
@Blocking @Blocking
@Override @Override
public @Nullable Map.Entry<byte[], Boolean> getMapData(@NotNull String serverName, int mapId) { public byte @Nullable [] getMapData(@NotNull String serverName, int mapId) {
try (Connection connection = getConnection()) { try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables(""" try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT `data` SELECT `data`
@@ -488,7 +488,7 @@ public class MySqlDatabase extends Database {
final Blob blob = resultSet.getBlob("data"); final Blob blob = resultSet.getBlob("data");
final byte[] dataByteArray = blob.getBytes(1, (int) blob.length()); final byte[] dataByteArray = blob.getBytes(1, (int) blob.length());
blob.free(); blob.free();
return Map.entry(dataByteArray, true); return dataByteArray;
} }
} }
} catch (SQLException | DataAdapter.AdaptionException e) { } catch (SQLException | DataAdapter.AdaptionException e) {

View File

@@ -300,7 +300,7 @@ public class PostgresDatabase extends Database {
SELECT COUNT(version_uuid) SELECT COUNT(version_uuid)
FROM %user_data_table% FROM %user_data_table%
WHERE player_uuid=? AND pinned=false;"""))) { WHERE player_uuid=? AND pinned=false;"""))) {
statement.setString(1, user.getUuid().toString()); statement.setObject(1, user.getUuid());
final ResultSet resultSet = statement.executeQuery(); final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) { if (resultSet.next()) {
return resultSet.getInt(1); return resultSet.getInt(1);
@@ -469,7 +469,7 @@ public class PostgresDatabase extends Database {
@Blocking @Blocking
@Override @Override
public @Nullable Map.Entry<byte[], Boolean> getMapData(@NotNull String serverName, int mapId) { public byte @Nullable [] getMapData(@NotNull String serverName, int mapId) {
try (Connection connection = getConnection()) { try (Connection connection = getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(formatStatementTables(""" try (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT data SELECT data
@@ -480,8 +480,7 @@ public class PostgresDatabase extends Database {
statement.setInt(2, mapId); statement.setInt(2, mapId);
final ResultSet resultSet = statement.executeQuery(); final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) { if (resultSet.next()) {
final byte[] data = resultSet.getBytes("data"); return resultSet.getBytes("data");
return new AbstractMap.SimpleImmutableEntry<>(data, true);
} }
return null; return null;
} }

View File

@@ -202,15 +202,19 @@ public class RedisManager extends JedisPubSub {
} }
final String payload = new String(redisMessage.getPayload(), StandardCharsets.UTF_8); final String payload = new String(redisMessage.getPayload(), StandardCharsets.UTF_8);
final User user = new User(UUID.fromString(payload.split("/")[0]), payload.split("/")[1]); final User user = new User(UUID.fromString(payload.split("/")[0]), payload.split("/")[1]);
boolean online = plugin.getDisconnectingPlayers().contains(user.getUuid())
|| plugin.getOnlineUser(user.getUuid()).isEmpty(); // Only release checkout if user is truly offline AND not being processed
if (!online && !plugin.isLocked(user.getUuid())) { final boolean isOnline = plugin.getOnlineUser(user.getUuid()).isPresent();
plugin.debug("[%s] Received check-in petition for online/unlocked user, ignoring" final boolean isLocked = plugin.isLocked(user.getUuid());
.formatted(user.getName()));
if (isOnline || isLocked) {
plugin.debug("[%s] Petition ignored - user still being processed (online=%s, locked=%s)"
.formatted(user.getName(), isOnline, isLocked));
return; return;
} }
plugin.getRedisManager().setUserCheckedOut(user, false); plugin.getRedisManager().setUserCheckedOut(user, false);
plugin.debug("[%s] Received petition for offline user, checking them in".formatted(user.getName())); plugin.debug("[%s] Petition accepted - user checked in".formatted(user.getName()));
} }
case RETURN_USER_DATA -> { case RETURN_USER_DATA -> {
final UUID target = redisMessage.getTargetUuid().orElse(null); final UUID target = redisMessage.getTargetUuid().orElse(null);

View File

@@ -41,6 +41,9 @@ public interface DataVersionSupplier {
int VERSION1_21_6 = 4435; int VERSION1_21_6 = 4435;
int VERSION1_21_7 = 4438; int VERSION1_21_7 = 4438;
int VERSION1_21_8 = 4438; int VERSION1_21_8 = 4438;
int VERSION1_21_9 = 4554;
int VERSION1_21_10 = 4556;
int VERSION1_21_11 = 4671;
/** /**
* Returns the data version for a Minecraft version * Returns the data version for a Minecraft version
@@ -65,7 +68,11 @@ public interface DataVersionSupplier {
case "1.21.5" -> VERSION1_21_5; case "1.21.5" -> VERSION1_21_5;
case "1.21.6" -> VERSION1_21_6; case "1.21.6" -> VERSION1_21_6;
case "1.21.7" -> VERSION1_21_7; case "1.21.7" -> VERSION1_21_7;
default -> VERSION1_21_8; // Latest supported version case "1.21.8" -> VERSION1_21_8;
case "1.21.9" -> VERSION1_21_9;
case "1.21.10" -> VERSION1_21_10;
case "1.21.11" -> VERSION1_21_11;
default -> VERSION1_21_11; // Latest supported version
}; };
} }

View File

@@ -52,7 +52,7 @@ Add the repository to your `pom.xml` as per below. You can alternatively specify
</repository> </repository>
</repositories> </repositories>
``` ```
Add the dependency to your `pom.xml` as per below. Replace `HUSKSYNC_VERSION` with the latest version of HuskSync (without the v): ![Latest version](https://img.shields.io/github/v/tag/WiIIiam278/HuskSync?color=%23282828&label=%20&style=flat-square). and `MINECRAFT_VERSION` with the version of Minecraft you want to target (e.g. `1.20.1`). A correctly formed version target should look like: `3.7+1.20.1`. Omit the plus symbol and Minecraft version if you are targeting the `common` platform. Add the dependency to your `pom.xml` as per below. Replace `HUSKSYNC_VERSION` with the latest version of HuskSync (without the v): ![Latest version](https://img.shields.io/github/v/tag/WiIIiam278/HuskSync?color=%23282828&label=%20&style=flat-square). and `MINECRAFT_VERSION` with the version of Minecraft you want to target (e.g. `1.21.10`). A correctly formed version target should look like: `3.7+1.21.10`. Omit the plus symbol and Minecraft version if you are targeting the `common` platform.
```xml ```xml
<dependency> <dependency>
<groupId>net.william278.husksync</groupId> <groupId>net.william278.husksync</groupId>
@@ -75,7 +75,7 @@ allprojects {
} }
} }
``` ```
Add the dependency as per below. Replace `HUSKSYNC_VERSION` with the latest version of HuskSync (without the v): ![Latest version](https://img.shields.io/github/v/tag/WiIIiam278/HuskSync?color=%23282828&label=%20&style=flat-square). and `MINECRAFT_VERSION` with the version of Minecraft you want to target (e.g. `1.20.1`). A correctly formed version target should look like: `3.7+1.20.1`. Omit the plus symbol and Minecraft version if you are targeting the `common` platform. Add the dependency as per below. Replace `HUSKSYNC_VERSION` with the latest version of HuskSync (without the v): ![Latest version](https://img.shields.io/github/v/tag/WiIIiam278/HuskSync?color=%23282828&label=%20&style=flat-square). and `MINECRAFT_VERSION` with the version of Minecraft you want to target (e.g. `1.21.10`). A correctly formed version target should look like: `3.7+1.21.10`. Omit the plus symbol and Minecraft version if you are targeting the `common` platform.
```groovy ```groovy
dependencies { dependencies {

View File

@@ -2,15 +2,16 @@ HuskSync supports the following versions of Minecraft. Since v3.7, you must down
| Minecraft | Latest HuskSync | Java Version | Platforms | Support Status | | Minecraft | Latest HuskSync | Java Version | Platforms | Support Status |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------| |:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 1.21.7/8 | _latest_ | 21 | Paper | ✅ **Active Release** | | 1.21.10 | _latest_ | 21 | Paper | ✅ **Active Release** |
| 1.21.7/8 | _latest_ | 21 | Paper, Fabric | ✅ **August 2026** |
| 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) | | 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) | | 1.21.5 | _latest_ | 21 | Paper | ✅ **February 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) | | 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **February 2026** (Non-LTS) |
| 1.21.3 | 3.7.1 | 21 | Paper, Fabric | 🗃️ Archived (December 2024) | | 1.21.3 | 3.7.1 | 21 | Paper, Fabric | 🗃️ Archived (December 2024) |
| 1.21.1 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (LTS) | | 1.21.1 | _latest_ | 21 | Paper, Fabric | ✅ **May 2026** (LTS) |
| 1.20.6 | 3.6.8 | 17 | Paper | 🗃️ Archived (October 2024) | | 1.20.6 | 3.6.8 | 17 | Paper | 🗃️ Archived (October 2024) |
| 1.20.4 | 3.6.8 | 17 | Paper | 🗃️ Archived (July 2024) | | 1.20.4 | 3.6.8 | 17 | Paper | 🗃️ Archived (July 2024) |
| 1.20.1 | _latest_ | 17 | Paper, Fabric | **November 2025** (LTS) | | 1.20.1 | 3.8.7 | 17 | Paper, Fabric | 🗃️ Archived (November 2024) |
| 1.17.1 - 1.19.4 | 3.6.8 | 17 | Paper | 🗃️ Archived | | 1.17.1 - 1.19.4 | 3.6.8 | 17 | Paper | 🗃️ Archived |
| 1.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived | | 1.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived |

View File

@@ -1,9 +0,0 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.20.1+build.10:v2
minecraft_version_range='1.20.1'
fabric_loader_version=0.15.11
fabric_api_version=0.92.2+1.20.1
fabric_permissions_api_version=0.2-SNAPSHOT
fabric_adventure_platform_version=5.9.0
fabric_sgui_version=1.2.2+1.20

View File

@@ -1,17 +0,0 @@
{
"required": true,
"minVersion": "0.8",
"package": "net.william278.husksync.mixins",
"compatibilityLevel": "JAVA_17",
"server": [
"ItemEntityMixin",
"PlayerEntityMixin",
"ServerPlayerEntityMixin",
"ServerPlayNetworkHandlerMixin",
"ServerWorldMixin"
],
"client": [],
"injectors": {
"defaultRequire": 1
}
}

View File

@@ -1,6 +1,6 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.1+build.3:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.1+build.3:v2
minecraft_version_range='1.21.1' minecraft_version_range=1.21.1
fabric_loader_version=0.16.10 fabric_loader_version=0.16.10
fabric_api_version=0.107.0+1.21.1 fabric_api_version=0.107.0+1.21.1

View File

@@ -1,6 +1,6 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.4+build.4:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.4+build.4:v2
minecraft_version_range='1.21.4' minecraft_version_range=1.21.4
fabric_loader_version=0.16.10 fabric_loader_version=0.16.10
fabric_api_version=0.116.1+1.21.4 fabric_api_version=0.116.1+1.21.4

View File

@@ -1,6 +1,6 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.5+build.1:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.5+build.1:v2
minecraft_version_range='1.21.5' minecraft_version_range=1.21.5
fabric_loader_version=0.16.14 fabric_loader_version=0.16.14
fabric_api_version=0.122.0+1.21.5 fabric_api_version=0.122.0+1.21.5

View File

@@ -19,7 +19,7 @@ dependencies {
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}"
// Manually include config deps due to the way including api deps works // Manually include config deps due to the way including api deps works
implementation include("de.exlll:configlib-core:4.6.1") implementation include("de.exlll:configlib-core:4.6.3")
implementation include("org.snakeyaml:snakeyaml-engine:2.10") implementation include("org.snakeyaml:snakeyaml-engine:2.10")
implementation include('org.apache.commons:commons-pool2:2.12.1') implementation include('org.apache.commons:commons-pool2:2.12.1')
@@ -33,10 +33,10 @@ dependencies {
implementation include('org.apache.commons:commons-pool2:2.12.1') // Redis dep implementation include('org.apache.commons:commons-pool2:2.12.1') // Redis dep
compileOnly 'net.william278:DesertWell:2.0.4' compileOnly 'net.william278:DesertWell:2.0.4'
compileOnly 'org.jetbrains:annotations:26.0.2' compileOnly 'org.jetbrains:annotations:26.0.2-1'
compileOnly 'org.projectlombok:lombok:1.18.38' compileOnly 'org.projectlombok:lombok:1.18.42'
annotationProcessor 'org.projectlombok:lombok:1.18.38' annotationProcessor 'org.projectlombok:lombok:1.18.42'
implementation include(project(path: ":common")) implementation include(project(path: ":common"))
project(":common").configurations.api.dependencies.each { dependency -> project(":common").configurations.api.dependencies.each { dependency ->

View File

@@ -7,11 +7,9 @@ preprocess {
def fabric12105 = createNode("1.21.5", 12105, "yarn") def fabric12105 = createNode("1.21.5", 12105, "yarn")
def fabric12104 = createNode("1.21.4", 12104, "yarn") def fabric12104 = createNode("1.21.4", 12104, "yarn")
def fabric12101 = createNode("1.21.1", 12101, "yarn") def fabric12101 = createNode("1.21.1", 12101, "yarn")
def fabric12001 = createNode("1.20.1", 12001, "yarn")
strictExtraMappings.set(true) strictExtraMappings.set(true)
fabric12105.link(fabric12108, null) fabric12105.link(fabric12108, null)
fabric12104.link(fabric12108, null) fabric12104.link(fabric12108, null)
fabric12101.link(fabric12108, null) fabric12101.link(fabric12108, null)
fabric12001.link(fabric12108, null)
} }

View File

@@ -26,12 +26,7 @@ import com.google.gson.annotations.SerializedName;
import lombok.*; import lombok.*;
import net.minecraft.advancement.AdvancementProgress; import net.minecraft.advancement.AdvancementProgress;
import net.minecraft.advancement.PlayerAdvancementTracker; import net.minecraft.advancement.PlayerAdvancementTracker;
//#if MC==12001
//$$ import net.minecraft.enchantment.EnchantmentHelper;
//$$ import net.minecraft.nbt.NbtCompound;
//#else
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
//#endif
import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttribute;
import net.minecraft.entity.attribute.EntityAttributeInstance; import net.minecraft.entity.attribute.EntityAttributeInstance;
import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributeModifier;
@@ -95,16 +90,6 @@ public abstract class FabricData implements Data {
stack.getItem().toString(), stack.getItem().toString(),
stack.getCount(), stack.getCount(),
stack.getName().getString(), stack.getName().getString(),
//#if MC==12001
//$$ Optional.ofNullable(stack.getSubNbt(ItemStack.DISPLAY_KEY))
//$$ .flatMap(display -> Optional.ofNullable(display.get(ItemStack.LORE_KEY))
//$$ .map(lore -> ((List<String>) lore).stream().toList()))
//$$ .orElse(null),
//$$ stack.getEnchantments().stream()
//$$ .map(element -> EnchantmentHelper.getIdFromNbt((NbtCompound) element))
//$$ .filter(Objects::nonNull).map(Identifier::toString)
//$$ .toList()
//#else
stack.getComponents().get(DataComponentTypes.LORE).lines().stream() stack.getComponents().get(DataComponentTypes.LORE).lines().stream()
.map(Text::getString) .map(Text::getString)
.toList(), .toList(),
@@ -112,7 +97,6 @@ public abstract class FabricData implements Data {
.map(RegistryEntry::getIdAsString) .map(RegistryEntry::getIdAsString)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.toList() .toList()
//#endif
) : null) ) : null)
.toArray(Stack[]::new); .toArray(Stack[]::new);
} }
@@ -274,11 +258,7 @@ public abstract class FabricData implements Data {
.map(effect -> { .map(effect -> {
final StatusEffect type = matchEffectType(effect.type()); final StatusEffect type = matchEffectType(effect.type());
return type != null ? new StatusEffectInstance( return type != null ? new StatusEffectInstance(
//#if MC==12001
//$$ type,
//#else
RegistryEntry.of(type), RegistryEntry.of(type),
//#endif
effect.duration(), effect.duration(),
effect.amplifier(), effect.amplifier(),
effect.isAmbient(), effect.isAmbient(),
@@ -300,16 +280,10 @@ public abstract class FabricData implements Data {
@Override @Override
public void apply(@NotNull FabricUser user, @NotNull FabricHuskSync plugin) throws IllegalStateException { public void apply(@NotNull FabricUser user, @NotNull FabricHuskSync plugin) throws IllegalStateException {
final ServerPlayerEntity player = user.getPlayer(); final ServerPlayerEntity player = user.getPlayer();
//#if MC==12001
//$$ final List<StatusEffect> effectsToRemove = player.getActiveStatusEffects().entrySet().stream()
//$$ .filter(e -> !e.getValue().isAmbient()).map(Map.Entry::getKey).toList();
//$$ effectsToRemove.forEach(player::removeStatusEffect);
//#else
//todo ambient check //todo ambient check
final List<StatusEffect> effectsToRemove = new ArrayList<>(player.getActiveStatusEffects().keySet().stream() final List<StatusEffect> effectsToRemove = new ArrayList<>(player.getActiveStatusEffects().keySet().stream()
.map(RegistryEntry::value).toList()); .map(RegistryEntry::value).toList());
effectsToRemove.forEach(effect -> player.removeStatusEffect(RegistryEntry.of(effect))); effectsToRemove.forEach(effect -> player.removeStatusEffect(RegistryEntry.of(effect)));
//#endif
getEffects().forEach(player::addStatusEffect); getEffects().forEach(player::addStatusEffect);
} }
@@ -319,11 +293,7 @@ public abstract class FabricData implements Data {
public List<Effect> getActiveEffects() { public List<Effect> getActiveEffects() {
return effects.stream() return effects.stream()
.map(potionEffect -> { .map(potionEffect -> {
//#if MC==12001
//$$ final String key = getEffectId(potionEffect.getEffectType());
//#else
final String key = getEffectId(potionEffect.getEffectType().value()); final String key = getEffectId(potionEffect.getEffectType().value());
//#endif
return key != null ? new Effect( return key != null ? new Effect(
key, key,
potionEffect.getAmplifier(), potionEffect.getAmplifier(),
@@ -357,21 +327,13 @@ public abstract class FabricData implements Data {
advancementProgress.getObtainedCriteria().forEach((criteria) -> awardedCriteria.put( advancementProgress.getObtainedCriteria().forEach((criteria) -> awardedCriteria.put(
criteria, criteria,
//#if MC==12001
//$$ advancementProgress.getEarliestProgressObtainDate()
//#else
Date.from(advancementProgress.getEarliestProgressObtainDate()) Date.from(advancementProgress.getEarliestProgressObtainDate())
//#endif
)); ));
// Only save the advancement if criteria has been completed // Only save the advancement if criteria has been completed
if (!awardedCriteria.isEmpty()) { if (!awardedCriteria.isEmpty()) {
advancements.add(Advancement.adapt( advancements.add(Advancement.adapt(
//#if MC==12001
//$$ advancementEntry.getId().toString(),
//#else
advancementEntry.id().asString(), advancementEntry.id().asString(),
//#endif
awardedCriteria awardedCriteria
)); ));
} }
@@ -392,11 +354,7 @@ public abstract class FabricData implements Data {
final AdvancementProgress progress = player.getAdvancementTracker().getProgress(advancementEntry); final AdvancementProgress progress = player.getAdvancementTracker().getProgress(advancementEntry);
final Optional<Advancement> record = completed.stream() final Optional<Advancement> record = completed.stream()
.filter(r -> r.getKey().equals( .filter(r -> r.getKey().equals(
//#if MC==12001
//$$ advancementEntry.getId().toString()
//#else
advancementEntry.id().asString() advancementEntry.id().asString()
//#endif
)) ))
.findFirst(); .findFirst();
if (record.isEmpty()) { if (record.isEmpty()) {
@@ -414,11 +372,7 @@ public abstract class FabricData implements Data {
} }
private void setAdvancement(@NotNull FabricHuskSync plugin, private void setAdvancement(@NotNull FabricHuskSync plugin,
//#if MC==12001
//$$ @NotNull net.minecraft.advancement.Advancement advancementEntry,
//#else
@NotNull net.minecraft.advancement.AdvancementEntry advancementEntry, @NotNull net.minecraft.advancement.AdvancementEntry advancementEntry,
//#endif
@NotNull ServerPlayerEntity player, @NotNull ServerPlayerEntity player,
@NotNull FabricUser user, @NotNull FabricUser user,
@NotNull List<String> toAward, @NotNull List<String> toAward,
@@ -445,11 +399,7 @@ public abstract class FabricData implements Data {
// Performs a consuming function for every advancement entry registered on the server // Performs a consuming function for every advancement entry registered on the server
private static void forEachAdvancementEntry( private static void forEachAdvancementEntry(
@NotNull MinecraftServer server, @NotNull MinecraftServer server,
//#if MC==12001
//$$ @NotNull ThrowingConsumer<net.minecraft.advancement.Advancement> con
//#else
@NotNull ThrowingConsumer<net.minecraft.advancement.AdvancementEntry> con @NotNull ThrowingConsumer<net.minecraft.advancement.AdvancementEntry> con
//#endif
) { ) {
server.getAdvancementLoader().getAdvancements().forEach(con); server.getAdvancementLoader().getAdvancements().forEach(con);
} }
@@ -482,11 +432,7 @@ public abstract class FabricData implements Data {
@NotNull @NotNull
public static FabricData.Location adapt(@NotNull ServerPlayerEntity player) { public static FabricData.Location adapt(@NotNull ServerPlayerEntity player) {
//#if MC==12001
//$$ final String worldName = player.getWorld().getDimensionKey().getValue().toString();
//#else
final String worldName = player.getWorld().getDimensionEntry().getIdAsString(); final String worldName = player.getWorld().getDimensionEntry().getIdAsString();
//#endif
return from( return from(
player.getX(), player.getX(),
player.getY(), player.getY(),
@@ -659,21 +605,6 @@ public abstract class FabricData implements Data {
final List<Attribute> attributes = Lists.newArrayList(); final List<Attribute> attributes = Lists.newArrayList();
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registries.ATTRIBUTE.forEach(id -> { Registries.ATTRIBUTE.forEach(id -> {
//#if MC==12001
//$$ final EntityAttributeInstance instance = player.getAttributeInstance(id);
//$$ final Identifier key = Registries.ATTRIBUTE.getId(id);
//$$ if (instance == null || key == null || settings.isIgnoredAttribute(key.asString())) {
//$$ return;
//$$ }
//$$ final Set<Modifier> modifiers = Sets.newHashSet();
//$$ instance.getModifiers().forEach(modifier -> modifiers.add(new Modifier(
//$$ modifier.getId(),
//$$ modifier.getName(),
//$$ modifier.getValue(),
//$$ modifier.getOperation().getId(),
//$$ -1
//$$ )));
//#else
final EntityAttributeInstance instance = player.getAttributeInstance(RegistryEntry.of(id)); final EntityAttributeInstance instance = player.getAttributeInstance(RegistryEntry.of(id));
final Identifier key = Registries.ATTRIBUTE.getId(id); final Identifier key = Registries.ATTRIBUTE.getId(id);
if (instance == null || key == null || settings.isIgnoredAttribute(key.asString())) { if (instance == null || key == null || settings.isIgnoredAttribute(key.asString())) {
@@ -686,7 +617,6 @@ public abstract class FabricData implements Data {
modifier.operation().getId(), modifier.operation().getId(),
Modifier.ANY_EQUIPMENT_SLOT_GROUP Modifier.ANY_EQUIPMENT_SLOT_GROUP
))); )));
//#endif
attributes.add(new Attribute( attributes.add(new Attribute(
key.toString(), key.toString(),
instance.getBaseValue(), instance.getBaseValue(),
@@ -719,11 +649,7 @@ public abstract class FabricData implements Data {
return; return;
} }
applyAttribute( applyAttribute(
//#if MC==12001
//$$ user.getPlayer().getAttributeInstance(id),
//#else
user.getPlayer().getAttributeInstance(RegistryEntry.of(id)), user.getPlayer().getAttributeInstance(RegistryEntry.of(id)),
//#endif
getAttribute(id).orElse(null) getAttribute(id).orElse(null)
); );
}); });

View File

@@ -26,9 +26,6 @@ import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import net.minecraft.datafixer.TypeReferences; import net.minecraft.datafixer.TypeReferences;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
//#if MC==12001
//$$ import net.minecraft.nbt.NbtCompound;
//#endif
import net.minecraft.nbt.*; import net.minecraft.nbt.*;
import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.DynamicRegistryManager;
import net.william278.desertwell.util.Version; import net.william278.desertwell.util.Version;
@@ -280,10 +277,6 @@ public abstract class FabricSerializer {
//$$ return (NbtCompound) item.toNbt(reg); //$$ return (NbtCompound) item.toNbt(reg);
//#elseif MC==12101 //#elseif MC==12101
//$$ return (NbtCompound) item.encode(reg); //$$ return (NbtCompound) item.encode(reg);
//#elseif MC==12001
//$$ final NbtCompound compound = new NbtCompound();
//$$ item.writeNbt(compound);
//$$ return compound;
//#endif //#endif
} catch (Throwable e) { } catch (Throwable e) {
return null; return null;
@@ -294,10 +287,8 @@ public abstract class FabricSerializer {
private ItemStack decodeNbt(@NotNull NbtElement item, @NotNull DynamicRegistryManager reg) { private ItemStack decodeNbt(@NotNull NbtElement item, @NotNull DynamicRegistryManager reg) {
//#if MC>=12108 //#if MC>=12108
final @Nullable ItemStack stack = ItemStack.CODEC.decode(reg.getOps(NbtOps.INSTANCE), item).getOrThrow().getFirst(); final @Nullable ItemStack stack = ItemStack.CODEC.decode(reg.getOps(NbtOps.INSTANCE), item).getOrThrow().getFirst();
//#elseif MC>12001 //#else
//$$ final @Nullable ItemStack stack = ItemStack.fromNbt(reg, item).orElse(null); //$$ final @Nullable ItemStack stack = ItemStack.fromNbt(reg, item).orElse(null);
//#elseif MC==12001
//$$ final @Nullable ItemStack stack = ItemStack.fromNbt((NbtCompound) item);
//#endif //#endif
if (stack == null) { if (stack == null) {
throw new IllegalStateException("Failed to decode item NBT (decode got null): (%s)".formatted(item)); throw new IllegalStateException("Failed to decode item NBT (decode got null): (%s)".formatted(item));

View File

@@ -120,11 +120,7 @@ public interface FabricUserDataHolder extends UserDataHolder {
@Override @Override
default Optional<Data.Items.EnderChest> getEnderChest() { default Optional<Data.Items.EnderChest> getEnderChest() {
return Optional.of(FabricData.Items.EnderChest.adapt( return Optional.of(FabricData.Items.EnderChest.adapt(
//#if MC==12001
//$$ getPlayer().getEnderChestInventory().stacks
//#else
getPlayer().getEnderChestInventory().getHeldStacks() getPlayer().getEnderChestInventory().getHeldStacks()
//#endif
)); ));
} }

View File

@@ -82,13 +82,9 @@ public class PlayerEntityMixin {
@Unique @Unique
private boolean hasVanishingCurse(@NotNull ItemStack stack) { private boolean hasVanishingCurse(@NotNull ItemStack stack) {
//#if MC==12001
//$$ return EnchantmentHelper.hasVanishingCurse(stack);
//#else
return EnchantmentHelper.hasAnyEnchantmentsIn( return EnchantmentHelper.hasAnyEnchantmentsIn(
stack, TagKey.of(Enchantments.VANISHING_CURSE.getRegistryRef(), Enchantments.VANISHING_CURSE.getValue()) stack, TagKey.of(Enchantments.VANISHING_CURSE.getRegistryRef(), Enchantments.VANISHING_CURSE.getValue())
); );
//#endif
} }
} }

View File

@@ -92,11 +92,7 @@ public abstract class ServerPlayNetworkHandlerMixin {
@Inject(method = "onCreativeInventoryAction", at = @At("HEAD"), cancellable = true) @Inject(method = "onCreativeInventoryAction", at = @At("HEAD"), cancellable = true)
public void onCreativeInventoryAction(CreativeInventoryActionC2SPacket packet, CallbackInfo ci) { public void onCreativeInventoryAction(CreativeInventoryActionC2SPacket packet, CallbackInfo ci) {
//#if MC==12001
//$$ int slot = packet.getSlot();
//#else
int slot = packet.slot(); int slot = packet.slot();
//#endif
if (slot < 0) { if (slot < 0) {
return; return;
} }

View File

@@ -4,7 +4,7 @@ org.gradle.daemon=true
javaVersion=21 javaVersion=21
# Plugin metadata # Plugin metadata
plugin_version=3.8.7 plugin_version=3.8.8
plugin_archive=husksync plugin_archive=husksync
plugin_description=A modern, cross-server player data synchronization system plugin_description=A modern, cross-server player data synchronization system
@@ -17,4 +17,5 @@ mongodb_driver_version=5.5.0
snappy_version=1.1.10.7 snappy_version=1.1.10.7
# Fabric settings # Fabric settings
loom.ignoreDependencyLoomVersionValidation=true loom.ignoreDependencyLoomVersionValidation=true
loom.disableUnpick=true

Binary file not shown.

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

6
gradlew vendored
View File

@@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@@ -205,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command: # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped. # and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line. # treated as '${Hostname}' itself on the command line.
@@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.

4
gradlew.bat vendored
View File

@@ -70,11 +70,11 @@ goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

View File

@@ -5,11 +5,11 @@ pluginManagement {
maven { url 'https://maven.fabricmc.net/' } maven { url 'https://maven.fabricmc.net/' }
maven { url 'https://maven.architectury.dev/' } maven { url 'https://maven.architectury.dev/' }
maven { url 'https://maven.minecraftforge.net' } maven { url 'https://maven.minecraftforge.net' }
maven { url 'https://repo.essential.gg/repository/maven-public' } maven { url 'https://repo.essential.gg/public' }
} }
plugins { plugins {
def egtVersion = "0.6.5" def egtVersion = "0.6.10"
id("gg.essential.defaults") version egtVersion id("gg.essential.defaults") version egtVersion
id("gg.essential.multi-version.root") version egtVersion id("gg.essential.multi-version.root") version egtVersion
} }

View File

@@ -4,4 +4,4 @@ colorama==0.4.6
idna==3.7 idna==3.7
requests==2.32.4 requests==2.32.4
tqdm==4.66.3 tqdm==4.66.3
urllib3==2.5.0 urllib3==2.6.0