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

View File

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

View File

@@ -13,9 +13,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: 'Checkout for CI 🛎️'
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: 'Set up JDK 21 📦'
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
@@ -27,7 +27,7 @@ jobs:
RELEASES_MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
RELEASES_MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
- name: 'Publish Test Report 📊'
uses: mikepenz/action-junit-report@v5
uses: mikepenz/action-junit-report@v6
if: success() || failure() # Continue on failure
with:
report_paths: '**/build/test-results/test/TEST-*.xml'
@@ -40,12 +40,11 @@ jobs:
version: ${{ github.event.release.tag_name }}
changelog: ${{ github.event.release.body }}
distro-names: |
paper-1.20.1
paper-1.21.1
paper-1.21.4
paper-1.21.5
paper-1.21.8
fabric-1.20.1
paper-1.21.10
fabric-1.21.1
fabric-1.21.4
fabric-1.21.5
@@ -60,25 +59,22 @@ jobs:
fabric
fabric
fabric
fabric
distro-descriptions: |
Paper 1.20.1
Paper 1.21.1
Paper 1.21.4
Paper 1.21.5
Paper 1.21.8
Fabric 1.20.1
Paper 1.21.10
Fabric 1.21.1
Fabric 1.21.4
Fabric 1.21.5
Fabric 1.21.8
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.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.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.4.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
steps:
- name: 'Checkout for CI 🛎️'
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: 'Push Docs to Github Wiki 📄️'
uses: Andrew-Chen-Wang/github-wiki-action@v5
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 |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 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.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **February 2026** (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.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.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.16.5 | 3.2.1 | 16 | Paper | 🗃️ Archived |

View File

@@ -1,7 +1,7 @@
import org.apache.tools.ant.filters.ReplaceTokens
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 'dev.architectury.loom' version '1.9-SNAPSHOT' apply false
id 'gg.essential.multi-version.root' apply false
@@ -89,10 +89,10 @@ allprojects {
}
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'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testCompileOnly 'org.jetbrains:annotations:26.0.2'
testCompileOnly 'org.jetbrains:annotations:26.0.2-1'
}
license {
@@ -133,7 +133,7 @@ subprojects {
// Version-specific configuration
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}"
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:mapdataapi:2.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 '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 '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 'org.projectlombok:lombok:1.18.38'
compileOnly 'commons-io:commons-io:2.20.0'
compileOnly 'org.projectlombok:lombok:1.18.42'
compileOnly 'commons-io:commons-io:2.21.0'
compileOnly 'org.json:json:20250517'
compileOnly 'net.william278:minedown:1.8.2'
compileOnly 'de.exlll:configlib-yaml:4.6.1'
compileOnly 'com.zaxxer:HikariCP:7.0.1'
compileOnly 'de.exlll:configlib-yaml:4.6.4'
compileOnly 'com.zaxxer:HikariCP:7.0.2'
compileOnly 'net.william278:DesertWell:2.0.4'
compileOnly 'net.william278:AdvancementAPI:97a9583413'
compileOnly "redis.clients:jedis:$jedis_version"
annotationProcessor 'org.projectlombok:lombok:1.18.38'
annotationProcessor 'org.projectlombok:lombok:1.18.42'
}
processResources {

View File

@@ -38,13 +38,10 @@ import org.bukkit.attribute.AttributeModifier;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
//#if MC==12001
//$$ import org.bukkit.inventory.EquipmentSlot;
//#else
import org.bukkit.inventory.EquipmentSlotGroup;
//#endif
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;
@@ -198,7 +195,9 @@ public abstract class BukkitData implements Data {
@Override
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 {
switch (type) {
case UNTYPED -> player.setStatistic(stat, value);
case BLOCK, ITEM -> player.setStatistic(stat, Objects.requireNonNull(matchMaterial(key[0])), value);
case ENTITY -> player.setStatistic(stat, Objects.requireNonNull(matchEntityType(key[0])), value);
case BLOCK, ITEM -> {
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) {
plugin.log(Level.WARNING, "Failed to apply statistic " + id, a);
@@ -567,6 +576,14 @@ public abstract class BukkitData implements Data {
@NotNull
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 AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
Registry.ATTRIBUTE.forEach(id -> {
@@ -599,33 +616,19 @@ public abstract class BukkitData implements Data {
instance.getBaseValue(),
instance.getModifiers().stream()
.filter(modifier -> !settings.isIgnoredModifier(modifier.getName()))
//#if MC==12001
//$$ .filter(modifier -> modifier.getSlot() == null)
//#else
.filter(modifier -> modifier.getSlotGroup() != EquipmentSlotGroup.ANY)
//#endif
.map(BukkitData.Attributes::adapt).collect(Collectors.toSet())
);
}
@NotNull
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(
modifier.getKey().toString(),
modifier.getAmount(),
modifier.getOperation().ordinal(),
modifier.getSlotGroup().toString()
);
//#endif
}
private static void applyAttribute(@Nullable AttributeInstance instance, @Nullable Attribute attribute) {
@@ -645,26 +648,25 @@ public abstract class BukkitData implements Data {
@NotNull
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(
Objects.requireNonNull(NamespacedKey.fromString(modifier.name())),
modifier.amount(),
AttributeModifier.Operation.values()[modifier.operation()],
Optional.ofNullable(EquipmentSlotGroup.getByName(modifier.slotGroup())).orElse(EquipmentSlotGroup.ANY)
);
//#endif
}
@Override
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();
Registry.ATTRIBUTE.forEach(id -> {
if (settings.isIgnoredAttribute(id.getKey().toString())) {

View File

@@ -124,8 +124,8 @@ public interface BukkitMapHandler {
@Nullable
@Blocking
private Map.Entry<MapData, Boolean> readMapData(@NotNull String serverName, int mapId) {
final Map.Entry<byte[], Boolean> readData = fetchMapData(serverName, mapId);
private MapData readMapData(@NotNull String serverName, int mapId) {
final byte[] readData = fetchMapData(serverName, mapId);
if (readData == null) {
return null;
}
@@ -134,23 +134,23 @@ public interface BukkitMapHandler {
@Nullable
@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);
}
@Nullable
@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
final byte[] redisData = getRedisManager().getMapData(serverName, mapId);
if (redisData != null) {
return new AbstractMap.SimpleImmutableEntry<>(redisData, true);
return redisData;
}
// 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) {
getRedisManager().setMapData(serverName, mapId, databaseData.getKey());
getRedisManager().setMapData(serverName, mapId, databaseData);
return databaseData;
}
@@ -162,7 +162,7 @@ public interface BukkitMapHandler {
}
@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
Map.Entry<String, Integer> binding = getRedisManager().getReversedMapBound(serverName, mapId);
if (binding != null) {
@@ -179,13 +179,10 @@ public interface BukkitMapHandler {
}
@Nullable
private Map.Entry<MapData, Boolean> deserializeMapData(@NotNull Map.Entry<byte[], Boolean> data) {
private MapData deserializeMapData(byte @NotNull [] data) {
try {
return new AbstractMap.SimpleImmutableEntry<>(
getPlugin().getDataAdapter().fromBytes(data.getKey(), AdaptableMapData.class)
.getData(getPlugin().getDataVersion(getPlugin().getMinecraftVersion())),
data.getValue()
);
return getPlugin().getDataAdapter().fromBytes(data, AdaptableMapData.class)
.getData(getPlugin().getDataVersion(getPlugin().getMinecraftVersion()));
} catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to deserialize map data", e);
return null;
@@ -297,7 +294,7 @@ public interface BukkitMapHandler {
}
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)) {
mapData = readLegacyMapItemData(nbt);
}
@@ -308,14 +305,14 @@ public interface BukkitMapHandler {
}
MapView newView = view != null ? view : Bukkit.createMap(getDefaultMapWorld());
generateRenderedMap(Objects.requireNonNull(mapData).getKey(), newView);
generateRenderedMap(mapData, newView);
meta.setMapView(newView);
}
private void handleUnboundMap(@NotNull MapMeta meta, @NotNull ReadableItemNBT nbt, @NotNull String originServer,
int originalId, @NotNull String currentServer) {
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)) {
mapData = readLegacyMapItemData(nbt);
}
@@ -325,7 +322,7 @@ public interface BukkitMapHandler {
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);
final int id = view.getId();
@@ -345,13 +342,13 @@ public interface BukkitMapHandler {
view.getRenderers().clear();
view.getRenderers().addAll(optionalView.get().getRenderers());
view.setLocked(true);
view.setScale(MapView.Scale.NORMAL);
view.setScale(MapView.Scale.CLOSEST);
view.setTrackingPosition(false);
view.setUnlimitedTracking(false);
return;
}
Map.Entry<MapData, Boolean> data = readMapData(getPlugin().getServerName(), view.getId());
MapData data = readMapData(getPlugin().getServerName(), view.getId());
if (data == null) {
data = readLegacyMapFileData(view.getId());
}
@@ -362,10 +359,7 @@ public interface BukkitMapHandler {
.formatted(world.getName(), view.getId()));
return;
}
if (data.getValue()) {
return;
}
renderMapView(view, data.getKey());
renderMapView(view, data);
}
@NotNull
@@ -383,7 +377,7 @@ public interface BukkitMapHandler {
view.getRenderers().clear();
view.addRenderer(new PersistentMapRenderer(canvasData));
view.setLocked(true);
view.setScale(MapView.Scale.NORMAL);
view.setScale(MapView.Scale.CLOSEST);
view.setTrackingPosition(false);
view.setUnlimitedTracking(false);
setMapView(view);
@@ -471,11 +465,11 @@ public interface BukkitMapHandler {
// Legacy - read maps from item stacks
@Nullable
@Blocking
private Map.Entry<MapData, Boolean> readLegacyMapItemData(@NotNull ReadableItemNBT nbt) {
private MapData readLegacyMapItemData(@NotNull ReadableItemNBT nbt) {
final int dataVer = getPlugin().getDataVersion(getPlugin().getMinecraftVersion());
try {
return new AbstractMap.SimpleImmutableEntry<>(MapData.fromByteArray(dataVer,
Objects.requireNonNull(nbt.getByteArray(MAP_LEGACY_PIXEL_DATA_KEY))), false);
return MapData.fromByteArray(dataVer,
Objects.requireNonNull(nbt.getByteArray(MAP_LEGACY_PIXEL_DATA_KEY)));
} catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to read legacy map data", e);
return null;
@@ -484,14 +478,14 @@ public interface BukkitMapHandler {
// Legacy - read maps from files
@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 File file = path.toFile();
if (!file.exists()) {
return null;
}
try {
return new AbstractMap.SimpleImmutableEntry<>(MapData.fromNbt(file), false);
return MapData.fromNbt(file);
} catch (IOException e) {
getPlugin().log(Level.WARNING, "Failed to read legacy map file", e);
return null;
@@ -597,11 +591,7 @@ public interface BukkitMapHandler {
final List<MapBanner> banners = Lists.newArrayList();
for (int i = 0; i < getCursors().size(); 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();
//#endif
if (type.startsWith(BANNER_PREFIX)) {
banners.add(new MapBanner(
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
public static PotionEffectType matchEffectType(@NotNull String key) {
//#if MC==12001
//$$ return PotionEffectType.getByName(key);
//#else
return getRegistryValue(Registry.EFFECT, key);
//#endif
}
private static <T extends Keyed> T getRegistryValue(@NotNull Registry<T> registry, @NotNull String keyString) {

View File

@@ -3,17 +3,17 @@ plugins {
}
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 'net.william278:minedown:1.8.2'
api 'net.william278:mapdataapi:2.0'
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 '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:DesertWell:2.0.4'
api('com.zaxxer:HikariCP:7.0.1') {
api('com.zaxxer:HikariCP:7.0.2') {
exclude module: 'slf4j-api'
}
@@ -21,12 +21,12 @@ dependencies {
compileOnly 'net.william278.uniform:uniform-common:1.3.9'
compileOnly 'com.mojang:brigadier:1.1.8'
compileOnly 'org.projectlombok:lombok:1.18.38'
compileOnly 'org.jetbrains:annotations:26.0.2'
compileOnly 'net.kyori:adventure-api:4.23.0'
compileOnly 'org.projectlombok:lombok:1.18.42'
compileOnly 'org.jetbrains:annotations:26.0.2-1'
compileOnly 'net.kyori:adventure-api:4.25.0'
compileOnly 'net.kyori:adventure-platform-api:4.4.0'
compileOnly "net.kyori:adventure-text-serializer-plain:4.23.0"
compileOnly 'com.google.guava:guava:33.4.8-jre'
compileOnly "net.kyori:adventure-text-serializer-plain:4.25.0"
compileOnly 'com.google.guava:guava:33.5.0-jre'
compileOnly 'com.github.plan-player-analytics:Plan:5.6.2965'
compileOnly "redis.clients:jedis:$jedis_version"
compileOnly "com.mysql:mysql-connector-j:$mysql_driver_version"
@@ -37,10 +37,10 @@ dependencies {
testImplementation "redis.clients:jedis:$jedis_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'
testCompileOnly 'de.exlll:configlib-yaml:4.6.1'
testCompileOnly 'org.jetbrains:annotations:26.0.2'
testCompileOnly 'de.exlll:configlib-yaml:4.6.4'
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 lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.nio.file.Path;
@Getter
@Configuration
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@@ -67,4 +65,8 @@ public class Server {
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 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
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 mapId Original map ID
* @return Map.Entry (key: server name, value: map ID)
* @param serverName Name of the local server (to_server_name in the binding)
* @param mapId Local map ID on this server (to_id in the binding)
* @return Map.Entry with origin server name (key) and origin map ID (value), or null if not found
*/
@Blocking
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
@Override
public @Nullable Map.Entry<byte[], Boolean> getMapData(@NotNull String serverName, int mapId) {
public byte @Nullable [] getMapData(@NotNull String serverName, int mapId) {
try {
Document filter = new Document("server_name", serverName).append("map_id", mapId);
FindIterable<Document> iterable = mongoCollectionHelper.getCollection(mapDataTable).find(filter);
Document doc = iterable.first();
if (doc != null) {
final Binary bin = doc.get("data", Binary.class);
return Map.entry(bin.getData(), true);
return bin.getData();
}
} catch (MongoException 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();
if (doc != null) {
return new AbstractMap.SimpleImmutableEntry<>(
doc.getString("server_name"),
doc.getInteger("to_id")
doc.getString("from_server_name"),
doc.getInteger("from_id")
);
}
return null;

View File

@@ -473,7 +473,7 @@ public class MySqlDatabase extends Database {
@Blocking
@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 (PreparedStatement statement = connection.prepareStatement(formatStatementTables("""
SELECT `data`
@@ -488,7 +488,7 @@ public class MySqlDatabase extends Database {
final Blob blob = resultSet.getBlob("data");
final byte[] dataByteArray = blob.getBytes(1, (int) blob.length());
blob.free();
return Map.entry(dataByteArray, true);
return dataByteArray;
}
}
} catch (SQLException | DataAdapter.AdaptionException e) {

View File

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

View File

@@ -202,15 +202,19 @@ public class RedisManager extends JedisPubSub {
}
final String payload = new String(redisMessage.getPayload(), StandardCharsets.UTF_8);
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();
if (!online && !plugin.isLocked(user.getUuid())) {
plugin.debug("[%s] Received check-in petition for online/unlocked user, ignoring"
.formatted(user.getName()));
// Only release checkout if user is truly offline AND not being processed
final boolean isOnline = plugin.getOnlineUser(user.getUuid()).isPresent();
final boolean isLocked = plugin.isLocked(user.getUuid());
if (isOnline || isLocked) {
plugin.debug("[%s] Petition ignored - user still being processed (online=%s, locked=%s)"
.formatted(user.getName(), isOnline, isLocked));
return;
}
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 -> {
final UUID target = redisMessage.getTargetUuid().orElse(null);

View File

@@ -41,6 +41,9 @@ public interface DataVersionSupplier {
int VERSION1_21_6 = 4435;
int VERSION1_21_7 = 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
@@ -65,7 +68,11 @@ public interface DataVersionSupplier {
case "1.21.5" -> VERSION1_21_5;
case "1.21.6" -> VERSION1_21_6;
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>
</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
<dependency>
<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
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 |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 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.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **February 2026** (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.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.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.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
minecraft_version_range='1.21.1'
minecraft_version_range=1.21.1
fabric_loader_version=0.16.10
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
minecraft_version_range='1.21.4'
minecraft_version_range=1.21.4
fabric_loader_version=0.16.10
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
minecraft_version_range='1.21.5'
minecraft_version_range=1.21.5
fabric_loader_version=0.16.14
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}"
// 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.apache.commons:commons-pool2:2.12.1')
@@ -33,10 +33,10 @@ dependencies {
implementation include('org.apache.commons:commons-pool2:2.12.1') // Redis dep
compileOnly 'net.william278:DesertWell:2.0.4'
compileOnly 'org.jetbrains:annotations:26.0.2'
compileOnly 'org.projectlombok:lombok:1.18.38'
compileOnly 'org.jetbrains:annotations:26.0.2-1'
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"))
project(":common").configurations.api.dependencies.each { dependency ->

View File

@@ -7,11 +7,9 @@ preprocess {
def fabric12105 = createNode("1.21.5", 12105, "yarn")
def fabric12104 = createNode("1.21.4", 12104, "yarn")
def fabric12101 = createNode("1.21.1", 12101, "yarn")
def fabric12001 = createNode("1.20.1", 12001, "yarn")
strictExtraMappings.set(true)
fabric12105.link(fabric12108, null)
fabric12104.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 net.minecraft.advancement.AdvancementProgress;
import net.minecraft.advancement.PlayerAdvancementTracker;
//#if MC==12001
//$$ import net.minecraft.enchantment.EnchantmentHelper;
//$$ import net.minecraft.nbt.NbtCompound;
//#else
import net.minecraft.component.DataComponentTypes;
//#endif
import net.minecraft.entity.attribute.EntityAttribute;
import net.minecraft.entity.attribute.EntityAttributeInstance;
import net.minecraft.entity.attribute.EntityAttributeModifier;
@@ -95,16 +90,6 @@ public abstract class FabricData implements Data {
stack.getItem().toString(),
stack.getCount(),
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()
.map(Text::getString)
.toList(),
@@ -112,7 +97,6 @@ public abstract class FabricData implements Data {
.map(RegistryEntry::getIdAsString)
.filter(Objects::nonNull)
.toList()
//#endif
) : null)
.toArray(Stack[]::new);
}
@@ -274,11 +258,7 @@ public abstract class FabricData implements Data {
.map(effect -> {
final StatusEffect type = matchEffectType(effect.type());
return type != null ? new StatusEffectInstance(
//#if MC==12001
//$$ type,
//#else
RegistryEntry.of(type),
//#endif
effect.duration(),
effect.amplifier(),
effect.isAmbient(),
@@ -300,16 +280,10 @@ public abstract class FabricData implements Data {
@Override
public void apply(@NotNull FabricUser user, @NotNull FabricHuskSync plugin) throws IllegalStateException {
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
final List<StatusEffect> effectsToRemove = new ArrayList<>(player.getActiveStatusEffects().keySet().stream()
.map(RegistryEntry::value).toList());
effectsToRemove.forEach(effect -> player.removeStatusEffect(RegistryEntry.of(effect)));
//#endif
getEffects().forEach(player::addStatusEffect);
}
@@ -319,11 +293,7 @@ public abstract class FabricData implements Data {
public List<Effect> getActiveEffects() {
return effects.stream()
.map(potionEffect -> {
//#if MC==12001
//$$ final String key = getEffectId(potionEffect.getEffectType());
//#else
final String key = getEffectId(potionEffect.getEffectType().value());
//#endif
return key != null ? new Effect(
key,
potionEffect.getAmplifier(),
@@ -357,21 +327,13 @@ public abstract class FabricData implements Data {
advancementProgress.getObtainedCriteria().forEach((criteria) -> awardedCriteria.put(
criteria,
//#if MC==12001
//$$ advancementProgress.getEarliestProgressObtainDate()
//#else
Date.from(advancementProgress.getEarliestProgressObtainDate())
//#endif
));
// Only save the advancement if criteria has been completed
if (!awardedCriteria.isEmpty()) {
advancements.add(Advancement.adapt(
//#if MC==12001
//$$ advancementEntry.getId().toString(),
//#else
advancementEntry.id().asString(),
//#endif
awardedCriteria
));
}
@@ -392,11 +354,7 @@ public abstract class FabricData implements Data {
final AdvancementProgress progress = player.getAdvancementTracker().getProgress(advancementEntry);
final Optional<Advancement> record = completed.stream()
.filter(r -> r.getKey().equals(
//#if MC==12001
//$$ advancementEntry.getId().toString()
//#else
advancementEntry.id().asString()
//#endif
))
.findFirst();
if (record.isEmpty()) {
@@ -414,11 +372,7 @@ public abstract class FabricData implements Data {
}
private void setAdvancement(@NotNull FabricHuskSync plugin,
//#if MC==12001
//$$ @NotNull net.minecraft.advancement.Advancement advancementEntry,
//#else
@NotNull net.minecraft.advancement.AdvancementEntry advancementEntry,
//#endif
@NotNull ServerPlayerEntity player,
@NotNull FabricUser user,
@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
private static void forEachAdvancementEntry(
@NotNull MinecraftServer server,
//#if MC==12001
//$$ @NotNull ThrowingConsumer<net.minecraft.advancement.Advancement> con
//#else
@NotNull ThrowingConsumer<net.minecraft.advancement.AdvancementEntry> con
//#endif
) {
server.getAdvancementLoader().getAdvancements().forEach(con);
}
@@ -482,11 +432,7 @@ public abstract class FabricData implements Data {
@NotNull
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();
//#endif
return from(
player.getX(),
player.getY(),
@@ -659,21 +605,6 @@ public abstract class FabricData implements Data {
final List<Attribute> attributes = Lists.newArrayList();
final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes();
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 Identifier key = Registries.ATTRIBUTE.getId(id);
if (instance == null || key == null || settings.isIgnoredAttribute(key.asString())) {
@@ -686,7 +617,6 @@ public abstract class FabricData implements Data {
modifier.operation().getId(),
Modifier.ANY_EQUIPMENT_SLOT_GROUP
)));
//#endif
attributes.add(new Attribute(
key.toString(),
instance.getBaseValue(),
@@ -719,11 +649,7 @@ public abstract class FabricData implements Data {
return;
}
applyAttribute(
//#if MC==12001
//$$ user.getPlayer().getAttributeInstance(id),
//#else
user.getPlayer().getAttributeInstance(RegistryEntry.of(id)),
//#endif
getAttribute(id).orElse(null)
);
});

View File

@@ -26,9 +26,6 @@ import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import net.minecraft.datafixer.TypeReferences;
import net.minecraft.item.ItemStack;
//#if MC==12001
//$$ import net.minecraft.nbt.NbtCompound;
//#endif
import net.minecraft.nbt.*;
import net.minecraft.registry.DynamicRegistryManager;
import net.william278.desertwell.util.Version;
@@ -280,10 +277,6 @@ public abstract class FabricSerializer {
//$$ return (NbtCompound) item.toNbt(reg);
//#elseif MC==12101
//$$ return (NbtCompound) item.encode(reg);
//#elseif MC==12001
//$$ final NbtCompound compound = new NbtCompound();
//$$ item.writeNbt(compound);
//$$ return compound;
//#endif
} catch (Throwable e) {
return null;
@@ -294,10 +287,8 @@ public abstract class FabricSerializer {
private ItemStack decodeNbt(@NotNull NbtElement item, @NotNull DynamicRegistryManager reg) {
//#if MC>=12108
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);
//#elseif MC==12001
//$$ final @Nullable ItemStack stack = ItemStack.fromNbt((NbtCompound) item);
//#endif
if (stack == null) {
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
default Optional<Data.Items.EnderChest> getEnderChest() {
return Optional.of(FabricData.Items.EnderChest.adapt(
//#if MC==12001
//$$ getPlayer().getEnderChestInventory().stacks
//#else
getPlayer().getEnderChestInventory().getHeldStacks()
//#endif
));
}

View File

@@ -82,13 +82,9 @@ public class PlayerEntityMixin {
@Unique
private boolean hasVanishingCurse(@NotNull ItemStack stack) {
//#if MC==12001
//$$ return EnchantmentHelper.hasVanishingCurse(stack);
//#else
return EnchantmentHelper.hasAnyEnchantmentsIn(
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)
public void onCreativeInventoryAction(CreativeInventoryActionC2SPacket packet, CallbackInfo ci) {
//#if MC==12001
//$$ int slot = packet.getSlot();
//#else
int slot = packet.slot();
//#endif
if (slot < 0) {
return;
}

View File

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

Binary file not shown.

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
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
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

6
gradlew vendored
View File

@@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -205,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# 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.
# * 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.
@@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.

4
gradlew.bat vendored
View File

@@ -70,11 +70,11 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CLASSPATH=
@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
@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.architectury.dev/' }
maven { url 'https://maven.minecraftforge.net' }
maven { url 'https://repo.essential.gg/repository/maven-public' }
maven { url 'https://repo.essential.gg/public' }
}
plugins {
def egtVersion = "0.6.5"
def egtVersion = "0.6.10"
id("gg.essential.defaults") version egtVersion
id("gg.essential.multi-version.root") version egtVersion
}

View File

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