mirror of
https://github.com/WiIIiam278/HuskSync.git
synced 2025-12-19 14:59:21 +00:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0772f09e98 | ||
|
|
e916673454 | ||
|
|
ac163d5130 | ||
|
|
d656b67570 | ||
|
|
3c66b65ac6 | ||
|
|
c227933b3b | ||
|
|
5cf9cb8e50 | ||
|
|
693cd6120f | ||
|
|
6efd800481 | ||
|
|
a723a7cba3 | ||
|
|
b1a5eb5f44 | ||
|
|
8232282d13 | ||
|
|
404d359f89 | ||
|
|
62e84d92fc | ||
|
|
9b2246eac2 | ||
|
|
e6d3935246 | ||
|
|
5c4111b6a7 | ||
|
|
51a700600a | ||
|
|
23c3ee08e9 | ||
|
|
c1d08f9c23 | ||
|
|
4cabdbe952 | ||
|
|
abdebd960b | ||
|
|
a7aea51a45 | ||
|
|
c8a4376208 | ||
|
|
315cd4ba6b | ||
|
|
6607ac5a6e | ||
|
|
562939498a | ||
|
|
e686d43ca8 | ||
|
|
e9ac400215 | ||
|
|
234870537a | ||
|
|
b5f392a20f | ||
|
|
9ea8eb4101 | ||
|
|
dc7cde1c33 | ||
|
|
4e75b5ca1d | ||
|
|
fe0bdccf40 | ||
|
|
c615ab592b | ||
|
|
16d4a8fd9b | ||
|
|
96f34092f6 |
20
.github/workflows/ci.yml
vendored
20
.github/workflows/ci.yml
vendored
@@ -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
|
||||||
|
|||||||
6
.github/workflows/pr_tests.yml
vendored
6
.github/workflows/pr_tests.yml
vendored
@@ -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'
|
||||||
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
@@ -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
|
||||||
|
|||||||
2
.github/workflows/update_docs.yml
vendored
2
.github/workflows/update_docs.yml
vendored
@@ -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:
|
||||||
|
|||||||
11
README.md
11
README.md
@@ -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 |
|
||||||
|
|
||||||
|
|||||||
12
build.gradle
12
build.gradle
@@ -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')) {
|
||||||
|
|||||||
@@ -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
|
|
||||||
4
bukkit/1.21.10/gradle.properties
Normal file
4
bukkit/1.21.10/gradle.properties
Normal 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
|
||||||
4
bukkit/1.21.11/gradle.properties
Normal file
4
bukkit/1.21.11/gradle.properties
Normal 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
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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())) {
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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'
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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): . 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): . 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): . 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): . 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 {
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 ->
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -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
6
gradlew
vendored
@@ -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
4
gradlew.bat
vendored
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user