From 1e618e3a0d7ceeab333830a1694c303ce36e0022 Mon Sep 17 00:00:00 2001 From: Madeline Miller Date: Sat, 4 Jun 2022 18:12:56 +1000 Subject: [PATCH] Merge version/7.2.x into master --- .github/workflows/codeql-analysis.yml | 6 +- .github/workflows/gradle.yml | 2 +- CHANGELOG.txt | 22 + buildSrc/build.gradle.kts | 12 +- buildSrc/src/main/kotlin/LibsConfig.kt | 3 + buildSrc/src/main/kotlin/Versions.kt | 8 +- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + .../impl/v1_17_R1_2/PaperweightAdapter.java | 134 +- .../PaperweightWorldNativeAccess.java | 6 + .../adapters/adapter-1.18.2/build.gradle.kts | 6 + .../impl/v1_18_R2/PaperweightAdapter.java | 1002 ++++++ .../v1_18_R2/PaperweightDataConverters.java | 2795 +++++++++++++++++ .../impl/v1_18_R2/PaperweightFakePlayer.java | 98 + .../PaperweightWorldNativeAccess.java | 183 ++ .../impl/v1_18_R1/PaperweightAdapter.java | 139 +- .../PaperweightWorldNativeAccess.java | 6 + .../src/main/resources/worldedit-adapters.jar | Bin 0 -> 562839 bytes worldedit-bukkit/build.gradle.kts | 19 +- .../bukkit/util/ClassSourceValidator.java | 70 +- .../bukkit/util/CommandRegistration.java | 2 +- worldedit-core/build.gradle.kts | 2 +- .../worldedit/command/BiomeCommands.java | 52 +- .../worldedit/command/GenerationCommands.java | 4 +- .../worldedit/command/RegionCommands.java | 4 +- .../argument/Chunk3dVectorConverter.java | 2 +- .../command/argument/VectorConverter.java | 8 +- .../function/mask/BlockStateMask.java | 9 +- .../internal/block/BlockStateIdAccess.java | 2 +- .../exception/ExceptionConverterHelper.java | 2 +- .../internal/wna/WorldNativeAccess.java | 7 + .../sk89q/worldedit/registry/Registry.java | 4 +- .../world/storage/McRegionReader.java | 2 +- .../src/main/resources/lang/strings.json | 3 + worldedit-fabric/build.gradle.kts | 12 +- .../fabric/FabricBlockCategoryRegistry.java | 14 +- .../sk89q/worldedit/fabric/FabricEntity.java | 11 +- .../fabric/FabricItemCategoryRegistry.java | 14 +- .../sk89q/worldedit/fabric/FabricWorld.java | 151 +- .../worldedit/fabric/FabricWorldEdit.java | 14 +- .../internal/ExtendedMinecraftServer.java | 3 - .../fabric/internal/FabricTransmogrifier.java | 49 +- .../internal/FabricWorldNativeAccess.java | 6 + .../mixin/AccessorDerivedLevelData.java | 32 + .../fabric/mixin/MixinMinecraftServer.java | 5 - .../src/main/resources/fabric.mod.json | 2 +- ...xins.json => worldedit-fabric.mixins.json} | 1 + worldedit-forge/build.gradle.kts | 17 +- .../forge/ForgeBlockCategoryRegistry.java | 26 +- .../sk89q/worldedit/forge/ForgeEntity.java | 21 +- .../forge/ForgeItemCategoryRegistry.java | 26 +- .../sk89q/worldedit/forge/ForgePlatform.java | 13 +- .../com/sk89q/worldedit/forge/ForgeWorld.java | 166 +- .../sk89q/worldedit/forge/ForgeWorldEdit.java | 13 +- .../forge/internal/ExtendedChunk.java | 43 + .../forge/internal/ForgeTransmogrifier.java | 50 +- .../internal/ForgeWorldNativeAccess.java | 11 + .../mixin/MixinLevelChunkSetBlockHook.java | 85 + .../resources/worldedit-forge.mixins.json | 14 + worldedit-libs/sponge/build.gradle.kts | 1 - worldedit-mod/build.gradle.kts | 24 +- worldedit-sponge/build.gradle.kts | 80 +- .../worldedit/sponge/CUIChannelHandler.java | 58 +- .../worldedit/sponge/CommandAdapter.java | 39 +- ...apterLoadException.java => Constants.java} | 26 +- .../sk89q/worldedit/sponge/SpongeAdapter.java | 156 +- .../worldedit/sponge/SpongeBiomeRegistry.java | 9 +- .../sponge/SpongeBlockCategoryRegistry.java | 43 + .../worldedit/sponge/SpongeBlockMaterial.java | 96 + .../worldedit/sponge/SpongeBlockRegistry.java | 92 + .../worldedit/sponge/SpongeCommandSender.java | 63 +- .../sk89q/worldedit/sponge/SpongeEntity.java | 28 +- .../sponge/SpongeEntityProperties.java | 20 +- .../sponge/SpongeItemCategoryRegistry.java | 43 + .../worldedit/sponge/SpongeItemRegistry.java | 47 + .../sponge/SpongePermissionsProvider.java | 20 +- .../worldedit/sponge/SpongePlatform.java | 78 +- .../sk89q/worldedit/sponge/SpongePlayer.java | 123 +- .../worldedit/sponge/SpongeRegistries.java | 37 +- .../worldedit/sponge/SpongeTextAdapter.java | 14 +- .../sk89q/worldedit/sponge/SpongeWorld.java | 448 ++- .../worldedit/sponge/SpongeWorldEdit.java | 408 +-- .../worldedit/sponge/ThreadSafeCache.java | 6 +- .../sponge/adapter/SpongeImplAdapter.java | 52 - .../sponge/adapter/SpongeImplLoader.java | 195 -- .../config/ConfigurateConfiguration.java | 112 +- .../sponge/config/SpongeConfiguration.java | 12 +- .../sponge/internal/ExtendedChunk.java | 43 + .../sponge/internal/LocaleResolver.java | 35 + .../worldedit/sponge/internal/NbtAdapter.java | 279 ++ .../sponge/internal/SpongeTransmogrifier.java | 189 ++ .../internal/SpongeWorldNativeAccess.java | 160 + .../adapter/impl/Sponge_1_10_Impl$1.class | Bin 1735 -> 0 bytes .../Sponge_1_10_Impl$SpongeNMSWorld.class | Bin 7204 -> 0 bytes ...Sponge_1_10_Impl$TileEntityBaseBlock.class | Bin 1163 -> 0 bytes .../adapter/impl/Sponge_1_10_Impl.class | Bin 12745 -> 0 bytes .../adapter/impl/Sponge_1_11_2_Impl$1.class | Bin 1741 -> 0 bytes .../Sponge_1_11_2_Impl$SpongeNMSWorld.class | Bin 7255 -> 0 bytes ...onge_1_11_2_Impl$TileEntityBaseBlock.class | Bin 1175 -> 0 bytes .../adapter/impl/Sponge_1_11_2_Impl.class | Bin 12755 -> 0 bytes .../adapter/impl/Sponge_1_11_Impl$1.class | Bin 1735 -> 0 bytes .../Sponge_1_11_Impl$SpongeNMSWorld.class | Bin 7237 -> 0 bytes ...Sponge_1_11_Impl$TileEntityBaseBlock.class | Bin 1163 -> 0 bytes .../adapter/impl/Sponge_1_11_Impl.class | Bin 12741 -> 0 bytes .../adapter/impl/Sponge_1_12_1_Impl$1.class | Bin 1741 -> 0 bytes .../Sponge_1_12_1_Impl$SpongeNMSWorld.class | Bin 9427 -> 0 bytes ...onge_1_12_1_Impl$TileEntityBaseBlock.class | Bin 1495 -> 0 bytes .../adapter/impl/Sponge_1_12_1_Impl.class | Bin 15702 -> 0 bytes .../adapter/impl/Sponge_1_12_2_Impl$1.class | Bin 1741 -> 0 bytes .../Sponge_1_12_2_Impl$SpongeNMSWorld.class | Bin 9427 -> 0 bytes ...onge_1_12_2_Impl$TileEntityBaseBlock.class | Bin 1495 -> 0 bytes .../adapter/impl/Sponge_1_12_2_Impl.class | Bin 15702 -> 0 bytes .../adapter/impl/Sponge_1_12_Impl$1.class | Bin 1735 -> 0 bytes .../Sponge_1_12_Impl$SpongeNMSWorld.class | Bin 9409 -> 0 bytes ...Sponge_1_12_Impl$TileEntityBaseBlock.class | Bin 1483 -> 0 bytes .../adapter/impl/Sponge_1_12_Impl.class | Bin 15686 -> 0 bytes .../adapter/impl/Sponge_Dev_Impl$1.class | Bin 1764 -> 0 bytes .../impl/Sponge_Dev_Impl$SpongeNMSWorld.class | Bin 9379 -> 0 bytes .../Sponge_Dev_Impl$TileEntityBaseBlock.class | Bin 1474 -> 0 bytes .../sponge/adapter/impl/Sponge_Dev_Impl.class | Bin 15229 -> 0 bytes 122 files changed, 6985 insertions(+), 1471 deletions(-) create mode 100644 worldedit-bukkit/adapters/adapter-1.18.2/build.gradle.kts create mode 100644 worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightAdapter.java create mode 100644 worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightDataConverters.java create mode 100644 worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightFakePlayer.java create mode 100644 worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightWorldNativeAccess.java create mode 100644 worldedit-bukkit/adapters/adapter-legacy/src/main/resources/worldedit-adapters.jar create mode 100644 worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorDerivedLevelData.java rename worldedit-fabric/src/main/resources/{worldedit.mixins.json => worldedit-fabric.mixins.json} (93%) create mode 100644 worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ExtendedChunk.java create mode 100644 worldedit-forge/src/main/java/com/sk89q/worldedit/forge/mixin/MixinLevelChunkSetBlockHook.java create mode 100644 worldedit-forge/src/main/resources/worldedit-forge.mixins.json rename worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/{adapter/AdapterLoadException.java => Constants.java} (65%) create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockCategoryRegistry.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemCategoryRegistry.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemRegistry.java delete mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplAdapter.java delete mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplLoader.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/ExtendedChunk.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/LocaleResolver.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/NbtAdapter.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeTransmogrifier.java create mode 100644 worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeWorldNativeAccess.java delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl$1.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl$SpongeNMSWorld.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl$TileEntityBaseBlock.class delete mode 100644 worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl.class diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index da9cf78a98..030aa0813e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -35,7 +35,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -46,7 +46,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -60,4 +60,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a407c41379..8f282381a4 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -20,7 +20,7 @@ jobs: distribution: 'temurin' - name: Build with Gradle run: ./gradlew build -s - - uses: actions/upload-artifact@v2.2.4 + - uses: actions/upload-artifact@v2 name: Archive Reports if: always() with: diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c8189c65e5..7e2b1dc0b0 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,25 @@ +7.2.10 +- [Forge] Fixed a bug where the max world height would not always be read correctly +- [Bukkit] Fixed detection of other plugins bundling WorldEdit for newer Spigot versions +- [Forge] [Fabric] Improve fluid masks to properly detect mod fluids +- [Forge] Fixed the UPDATE side effect +- Update to 1.18.2 +- Moved external links away from tinyurl to EngineHub URL shortener +- Allowed biome commands to be used by non-player actors (console, command block, etc) +- Fixed the UPDATE side effect not applying when called later on by API or FAST reorder mode +- Fixed entity passenger and riding status not being copied correctly + +7.2.9 +- [Forge] Add support for the UPDATE side effect +- [Forge] Fixed regen on recent Forge builds +- [Fabric] Fixed regen outside of Overworld +- [Sponge] Update to Sponge API8 (MC 1.16.5) +- [Bukkit] Fixed regen when biomes are used +- Fixed snapshots in 1.18 +- Fixed smooth functions below y=0 +- Tweak command usage label correctness for Bukkit API usage +- Fixed legacy error message output for plugins utilising our legacy APIs (Eg, WorldGuard and CraftBook) + 7.2.8 - Update to 1.18.1 - Fixed issues with certain imports in craftscripts diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 972511eb8b..29d8be4d54 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -47,13 +47,15 @@ val mixinVersion: String = properties.getProperty("mixin.version") dependencies { implementation(gradleApi()) implementation("gradle.plugin.org.cadixdev.gradle:licenser:0.6.1") - implementation("org.ajoberstar.grgit:grgit-gradle:4.1.0") - implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") - implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.24.23") - implementation("org.spongepowered:SpongeGradle:0.11.5") - implementation("net.minecraftforge.gradle:ForgeGradle:5.1.26") + implementation("org.ajoberstar.grgit:grgit-gradle:4.1.1") + implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.2") + implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.27.1") + implementation("org.spongepowered:spongegradle-plugin-development:2.0.1") + implementation("org.spongepowered:vanillagradle:0.2") + implementation("net.minecraftforge.gradle:ForgeGradle:5.1.31") implementation("net.fabricmc:fabric-loom:$loomVersion") implementation("net.fabricmc:sponge-mixin:$mixinVersion") implementation("org.enginehub.gradle:gradle-codecov-plugin:0.1.0") implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.5") + implementation("org.spongepowered:mixingradle:0.7.32") } diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index 43b11bc17c..ffd4f981a5 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -52,6 +52,9 @@ fun Project.applyLibrariesConfiguration() { exclude(dependency("org.checkerframework:checker-qual")) exclude(dependency("org.apache.logging.log4j:log4j-api")) exclude(dependency("com.google.code.findbugs:jsr305")) + exclude { + it.moduleGroup == "org.jetbrains.kotlin" + } } relocations.forEach { (from, to) -> diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index b03007fcc4..ddf36aaea5 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -4,13 +4,13 @@ object Versions { const val TEXT = "3.0.4" const val TEXT_EXTRAS = "3.0.6" const val PISTON = "0.5.7" - const val AUTO_VALUE = "1.8.2" + const val AUTO_VALUE = "1.9" const val JUNIT = "5.8.1" - const val MOCKITO = "4.0.0" + const val MOCKITO = "4.3.1" const val FAST_UTIL = "8.5.6" const val GUAVA = "31.0.1-jre" - const val GSON = "2.8.8" - const val LOG4J = "2.15.0" + const val GSON = "2.8.9" + const val LOG4J = "2.17.0" } // Properties that need a project reference to resolve: diff --git a/gradle.properties b/gradle.properties index d123944110..feb00f8fe1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ version=7.3.0-SNAPSHOT org.gradle.jvmargs=-Xmx1512M org.gradle.parallel=true -loom.version=0.10.55 -mixin.version=0.10.6+mixin.0.8.4 +loom.version=0.11.32 +mixin.version=0.11.2+mixin.0.8.5 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 8958 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e09..41dfb87909 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 2b3f06ccc6..c3c2e49660 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,7 @@ include("worldedit-libs") include("worldedit-bukkit:adapters:adapter-1.17.1") include("worldedit-bukkit:adapters:adapter-1.18") +include("worldedit-bukkit:adapters:adapter-1.18.2") listOf("bukkit", "core", "sponge", "fabric", "forge", "cli").forEach { include("worldedit-libs:$it") diff --git a/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightAdapter.java index 7a0972a839..7ecbb6d87e 100644 --- a/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightAdapter.java @@ -23,12 +23,9 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.mojang.datafixers.util.Either; -import com.mojang.serialization.Codec; -import com.mojang.serialization.Dynamic; import com.mojang.serialization.Lifecycle; import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.ByteArrayTag; @@ -85,11 +82,8 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.nbt.NbtOps; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; -import net.minecraft.resources.RegistryReadOps; -import net.minecraft.resources.RegistryWriteOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -151,13 +145,14 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.OptionalInt; +import java.util.OptionalLong; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; @@ -428,6 +423,11 @@ public BaseEntity getEntity(org.bukkit.entity.Entity entity) { CraftEntity craftEntity = ((CraftEntity) entity); Entity mcEntity = craftEntity.getHandle(); + // Do not allow creating of passenger entity snapshots, passengers are included in the vehicle entity + if (mcEntity.isPassenger()) { + return null; + } + String id = getEntityId(mcEntity); net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); @@ -444,27 +444,48 @@ public org.bukkit.entity.Entity createEntity(Location location, BaseEntity state CraftWorld craftWorld = ((CraftWorld) location.getWorld()); ServerLevel worldServer = craftWorld.getHandle(); - Entity createdEntity = createEntityFromId(state.getType().getId(), craftWorld.getHandle()); + String entityId = state.getType().getId(); - if (createdEntity != null) { - CompoundTag nativeTag = state.getNbtData(); - if (nativeTag != null) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) fromNative(nativeTag); - for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - readTagIntoEntity(tag, createdEntity); - } + CompoundTag nativeTag = state.getNbtData(); + net.minecraft.nbt.CompoundTag tag; + if (nativeTag != null) { + tag = (net.minecraft.nbt.CompoundTag) fromNative(nativeTag); + removeUnwantedEntityTagsRecursively(tag); + } else { + tag = new net.minecraft.nbt.CompoundTag(); + } + + tag.putString("id", entityId); - createdEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + Entity createdEntity = EntityType.loadEntityRecursive(tag, craftWorld.getHandle(), (loadedEntity) -> { + loadedEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + return loadedEntity; + }); - worldServer.addEntity(createdEntity, SpawnReason.CUSTOM); + if (createdEntity != null) { + worldServer.addAllEntities(createdEntity, SpawnReason.CUSTOM); return createdEntity.getBukkitEntity(); } else { return null; } } + // This removes all unwanted tags from the main entity and all its passengers + private void removeUnwantedEntityTagsRecursively(net.minecraft.nbt.CompoundTag tag) { + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } + + // Adapted from net.minecraft.world.entity.EntityType#loadEntityRecursive + if (tag.contains("Passengers", NBTConstants.TYPE_LIST)) { + net.minecraft.nbt.ListTag nbttaglist = tag.getList("Passengers", NBTConstants.TYPE_COMPOUND); + + for (int i = 0; i < nbttaglist.size(); ++i) { + removeUnwantedEntityTagsRecursively(nbttaglist.getCompound(i)); + } + } + } + @Override public Component getRichBlockName(BlockType blockType) { return TranslatableComponent.of(getBlockFromType(blockType).getDescriptionId()); @@ -481,28 +502,34 @@ public Component getRichItemName(BaseItemStack itemStack) { } @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Map> getProperties(BlockType blockType) { - Map> properties = Maps.newTreeMap(String::compareTo); - Block block = getBlockFromType(blockType); - StateDefinition blockStateList = - block.getStateDefinition(); - for (net.minecraft.world.level.block.state.properties.Property state : blockStateList.getProperties()) { - Property property; + private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader>() { + @Override + public Property load(net.minecraft.world.level.block.state.properties.Property state) throws Exception { if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { - property = new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + return new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); } else if (state instanceof DirectionProperty) { - property = new DirectionalProperty(state.getName(), + return new DirectionalProperty(state.getName(), (List) state.getPossibleValues().stream().map(e -> Direction.valueOf(((StringRepresentable) e).getSerializedName().toUpperCase(Locale.ROOT))).collect(Collectors.toList())); } else if (state instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - property = new EnumProperty(state.getName(), + return new EnumProperty(state.getName(), (List) state.getPossibleValues().stream().map(e -> ((StringRepresentable) e).getSerializedName()).collect(Collectors.toList())); } else if (state instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { - property = new IntegerProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + return new IntegerProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); } else { throw new IllegalArgumentException("WorldEdit needs an update to support " + state.getClass().getSimpleName()); } + } + }); + @SuppressWarnings({ "rawtypes" }) + @Override + public Map> getProperties(BlockType blockType) { + Map> properties = new TreeMap<>(); + Block block = getBlockFromType(blockType); + StateDefinition blockStateList = + block.getStateDefinition(); + for (net.minecraft.world.level.block.state.properties.Property state : blockStateList.getProperties()) { + Property property = PROPERTY_CACHE.getUnchecked(state); properties.put(property.getName(), property); } return properties; @@ -610,7 +637,7 @@ private void doRegen(org.bukkit.World bukkitWorld, Region region, Extent extent, long seed = options.getSeed().orElse(originalWorld.getSeed()); WorldGenSettings newOpts = options.getSeed().isPresent() - ? replaceSeed(originalWorld, seed, originalOpts) + ? originalOpts.withSeed(levelProperties.isHardcore(), OptionalLong.of(seed)) : originalOpts; LevelSettings newWorldSettings = new LevelSettings( @@ -655,49 +682,6 @@ private void doRegen(org.bukkit.World bukkitWorld, Region region, Extent extent, } } - private WorldGenSettings replaceSeed(ServerLevel originalWorld, long seed, WorldGenSettings originalOpts) { - RegistryWriteOps nbtReadRegOps = RegistryWriteOps.create( - NbtOps.INSTANCE, - originalWorld.getServer().registryAccess() - ); - RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( - NbtOps.INSTANCE, - originalWorld.getServer().getResourceManager(), - originalWorld.getServer().registryAccess() - ); - Codec dimCodec = WorldGenSettings.CODEC; - return dimCodec - .encodeStart(nbtReadRegOps, originalOpts) - .flatMap(tag -> - dimCodec.parse( - recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()) - ) - ) - .get() - .map( - l -> l, - error -> { - throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message()); - } - ); - } - - @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - if (!seen.add(dynamic)) { - return dynamic; - } - return dynamic.updateMapValues(pair -> { - if (pair.getFirst().asString("").equals("seed")) { - return pair.mapSecond(v -> v.createLong(seed)); - } - if (pair.getSecond().getValue() instanceof net.minecraft.nbt.CompoundTag) { - return pair.mapSecond(v -> recursivelySetSeed((Dynamic) v, seed, seen)); - } - return pair; - }); - } - private BiomeType adapt(ServerLevel serverWorld, Biome origBiome) { ResourceLocation key = serverWorld.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(origBiome); if (key == null) { diff --git a/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightWorldNativeAccess.java index 5da95629f5..5911ca77db 100644 --- a/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1.17.1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_17_R1_2/PaperweightWorldNativeAccess.java @@ -155,6 +155,12 @@ public void notifyNeighbors(BlockPos pos, net.minecraft.world.level.block.state. } } + @Override + public void updateBlock(BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState) { + ServerLevel world = getWorld(); + newState.onPlace(world, pos, oldState, false); + } + private void fireNeighborChanged(BlockPos pos, ServerLevel world, Block block, BlockPos neighborPos) { world.getBlockState(neighborPos).neighborChanged(world, neighborPos, block, pos, false); } diff --git a/worldedit-bukkit/adapters/adapter-1.18.2/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1.18.2/build.gradle.kts new file mode 100644 index 0000000000..31a9e5c851 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1.18.2/build.gradle.kts @@ -0,0 +1,6 @@ +applyPaperweightAdapterConfiguration() + +dependencies { + // https://papermc.io/repo/service/rest/repository/browse/maven-public/io/papermc/paper/dev-bundle/ + paperDevBundle("1.18.2-R0.1-20220304.102823-4") +} diff --git a/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightAdapter.java new file mode 100644 index 0000000000..353dcc9b0d --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightAdapter.java @@ -0,0 +1,1002 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.bukkit.adapter.impl.v1_18_R2; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; +import com.google.common.util.concurrent.Futures; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Lifecycle; +import com.sk89q.jnbt.AdventureNBTConverter; +import com.sk89q.jnbt.ByteArrayTag; +import com.sk89q.jnbt.ByteTag; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.DoubleTag; +import com.sk89q.jnbt.EndTag; +import com.sk89q.jnbt.FloatTag; +import com.sk89q.jnbt.IntArrayTag; +import com.sk89q.jnbt.IntTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.LongArrayTag; +import com.sk89q.jnbt.LongTag; +import com.sk89q.jnbt.NBTConstants; +import com.sk89q.jnbt.ShortTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.blocks.BaseItem; +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.entity.BaseEntity; +import com.sk89q.worldedit.extension.platform.Watchdog; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.Constants; +import com.sk89q.worldedit.internal.block.BlockStateIdAccess; +import com.sk89q.worldedit.internal.wna.WorldNativeAccess; +import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.registry.state.BooleanProperty; +import com.sk89q.worldedit.registry.state.DirectionalProperty; +import com.sk89q.worldedit.registry.state.EnumProperty; +import com.sk89q.worldedit.registry.state.IntegerProperty; +import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.util.SideEffect; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.util.io.file.SafeFiles; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.world.DataFixer; +import com.sk89q.worldedit.world.RegenOptions; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.biome.BiomeTypes; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; +import com.sk89q.worldedit.world.item.ItemType; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.util.StringRepresentable; +import net.minecraft.util.thread.BlockableEventLoop; +import net.minecraft.world.Clearable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelSettings; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.StructureBlockEntity; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.PrimaryLevelData; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World.Environment; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.generator.ChunkGenerator; +import org.spigotmc.SpigotConfig; +import org.spigotmc.WatchdogThread; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.OptionalInt; +import java.util.OptionalLong; +import java.util.Set; +import java.util.TreeMap; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +public final class PaperweightAdapter implements BukkitImplAdapter { + + private final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + + private final Field serverWorldsField; + private final Method getChunkFutureMethod; + private final Field chunkProviderExecutorField; + private final Watchdog watchdog; + + // ------------------------------------------------------------------------ + // Code that may break between versions of Minecraft + // ------------------------------------------------------------------------ + + public PaperweightAdapter() throws NoSuchFieldException, NoSuchMethodException { + // A simple test + CraftServer.class.cast(Bukkit.getServer()); + + int dataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); + if (dataVersion != 2975) { + throw new UnsupportedClassVersionError("Not 1.18.2!"); + } + + serverWorldsField = CraftServer.class.getDeclaredField("worlds"); + serverWorldsField.setAccessible(true); + + getChunkFutureMethod = ServerChunkCache.class.getDeclaredMethod( + Refraction.pickName("getChunkFutureMainThread", "c"), + int.class, int.class, ChunkStatus.class, boolean.class + ); + getChunkFutureMethod.setAccessible(true); + + chunkProviderExecutorField = ServerChunkCache.class.getDeclaredField( + Refraction.pickName("mainThreadProcessor", "g") + ); + chunkProviderExecutorField.setAccessible(true); + + new PaperweightDataConverters(CraftMagicNumbers.INSTANCE.getDataVersion(), this).build(ForkJoinPool.commonPool()); + + Watchdog watchdog; + try { + Class.forName("org.spigotmc.WatchdogThread"); + watchdog = new SpigotWatchdog(); + } catch (ClassNotFoundException | NoSuchFieldException e) { + try { + watchdog = new MojangWatchdog(((CraftServer) Bukkit.getServer()).getServer()); + } catch (NoSuchFieldException ex) { + watchdog = null; + } + } + this.watchdog = watchdog; + + try { + Class.forName("org.spigotmc.SpigotConfig"); + SpigotConfig.config.set("world-settings.worldeditregentempworld.verbose", false); + } catch (ClassNotFoundException ignored) { + } + } + + @Override + public DataFixer getDataFixer() { + return PaperweightDataConverters.INSTANCE; + } + + /** + * Read the given NBT data into the given tile entity. + * + * @param tileEntity the tile entity + * @param tag the tag + */ + static void readTagIntoTileEntity(net.minecraft.nbt.CompoundTag tag, BlockEntity tileEntity) { + tileEntity.load(tag); + tileEntity.setChanged(); + } + + /** + * Get the ID string of the given entity. + * + * @param entity the entity + * @return the entity ID + */ + private static String getEntityId(Entity entity) { + return EntityType.getKey(entity.getType()).toString(); + } + + /** + * Create an entity using the given entity ID. + * + * @param id the entity ID + * @param world the world + * @return an entity or null + */ + @Nullable + private static Entity createEntityFromId(String id, net.minecraft.world.level.Level world) { + return EntityType.byString(id).map(t -> t.create(world)).orElse(null); + } + + /** + * Write the given NBT data into the given entity. + * + * @param entity the entity + * @param tag the tag + */ + private static void readTagIntoEntity(net.minecraft.nbt.CompoundTag tag, Entity entity) { + entity.load(tag); + } + + /** + * Write the entity's NBT data to the given tag. + * + * @param entity the entity + * @param tag the tag + */ + private static void readEntityIntoTag(Entity entity, net.minecraft.nbt.CompoundTag tag) { + entity.save(tag); + } + + private static Block getBlockFromType(BlockType blockType) { + return Registry.BLOCK.get(ResourceLocation.tryParse(blockType.getId())); + } + + private static Item getItemFromType(ItemType itemType) { + return Registry.ITEM.get(ResourceLocation.tryParse(itemType.getId())); + } + + @Override + public OptionalInt getInternalBlockStateId(BlockData data) { + net.minecraft.world.level.block.state.BlockState state = ((CraftBlockData) data).getState(); + int combinedId = Block.getId(state); + return combinedId == 0 && state.getBlock() != Blocks.AIR ? OptionalInt.empty() : OptionalInt.of(combinedId); + } + + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + Block mcBlock = getBlockFromType(state.getBlockType()); + net.minecraft.world.level.block.state.BlockState newState = mcBlock.defaultBlockState(); + Map, Object> states = state.getStates(); + newState = applyProperties(mcBlock.getStateDefinition(), newState, states); + final int combinedId = Block.getId(newState); + return combinedId == 0 && state.getBlockType() != BlockTypes.AIR ? OptionalInt.empty() : OptionalInt.of(combinedId); + } + + @Override + public BlockState getBlock(Location location) { + checkNotNull(location); + + CraftWorld craftWorld = ((CraftWorld) location.getWorld()); + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + + final ServerLevel handle = craftWorld.getHandle(); + LevelChunk chunk = handle.getChunk(x >> 4, z >> 4); + final BlockPos blockPos = new BlockPos(x, y, z); + final net.minecraft.world.level.block.state.BlockState blockData = chunk.getBlockState(blockPos); + int internalId = Block.getId(blockData); + BlockState state = BlockStateIdAccess.getBlockStateById(internalId); + if (state == null) { + org.bukkit.block.Block bukkitBlock = location.getBlock(); + state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + } + + return state; + } + + @Override + public BaseBlock getFullBlock(Location location) { + BlockState state = getBlock(location); + + CraftWorld craftWorld = ((CraftWorld) location.getWorld()); + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + + final ServerLevel handle = craftWorld.getHandle(); + LevelChunk chunk = handle.getChunk(x >> 4, z >> 4); + final BlockPos blockPos = new BlockPos(x, y, z); + + // Read the NBT data + BlockEntity te = chunk.getBlockEntity(blockPos); + if (te != null) { + net.minecraft.nbt.CompoundTag tag = te.saveWithId(); + return state.toBaseBlock((CompoundTag) toNative(tag)); + } + + return state.toBaseBlock(); + } + + @Override + public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { + return new PaperweightWorldNativeAccess(this, + new WeakReference<>(((CraftWorld) world).getHandle())); + } + + private static net.minecraft.core.Direction adapt(Direction face) { + switch (face) { + case NORTH: + return net.minecraft.core.Direction.NORTH; + case SOUTH: + return net.minecraft.core.Direction.SOUTH; + case WEST: + return net.minecraft.core.Direction.WEST; + case EAST: + return net.minecraft.core.Direction.EAST; + case DOWN: + return net.minecraft.core.Direction.DOWN; + case UP: + default: + return net.minecraft.core.Direction.UP; + } + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private net.minecraft.world.level.block.state.BlockState applyProperties( + StateDefinition stateContainer, + net.minecraft.world.level.block.state.BlockState newState, + Map, Object> states + ) { + for (Map.Entry, Object> state : states.entrySet()) { + net.minecraft.world.level.block.state.properties.Property property = + stateContainer.getProperty(state.getKey().getName()); + Comparable value = (Comparable) state.getValue(); + // we may need to adapt this value, depending on the source prop + if (property instanceof DirectionProperty) { + Direction dir = (Direction) value; + value = adapt(dir); + } else if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + String enumName = (String) value; + value = ((net.minecraft.world.level.block.state.properties.EnumProperty) property) + .getValue(enumName).orElseThrow(() -> + new IllegalStateException( + "Enum property " + property.getName() + " does not contain " + enumName + ) + ); + } + + newState = newState.setValue( + (net.minecraft.world.level.block.state.properties.Property) property, + (Comparable) value + ); + } + return newState; + } + + @Override + public BaseEntity getEntity(org.bukkit.entity.Entity entity) { + checkNotNull(entity); + + CraftEntity craftEntity = ((CraftEntity) entity); + Entity mcEntity = craftEntity.getHandle(); + + // Do not allow creating of passenger entity snapshots, passengers are included in the vehicle entity + if (mcEntity.isPassenger()) { + return null; + } + + String id = getEntityId(mcEntity); + + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + readEntityIntoTag(mcEntity, tag); + return new BaseEntity(com.sk89q.worldedit.world.entity.EntityTypes.get(id), (CompoundTag) toNative(tag)); + } + + @Nullable + @Override + public org.bukkit.entity.Entity createEntity(Location location, BaseEntity state) { + checkNotNull(location); + checkNotNull(state); + + CraftWorld craftWorld = ((CraftWorld) location.getWorld()); + ServerLevel worldServer = craftWorld.getHandle(); + + String entityId = state.getType().getId(); + + CompoundTag nativeTag = state.getNbtData(); + net.minecraft.nbt.CompoundTag tag; + if (nativeTag != null) { + tag = (net.minecraft.nbt.CompoundTag) fromNative(nativeTag); + removeUnwantedEntityTagsRecursively(tag); + } else { + tag = new net.minecraft.nbt.CompoundTag(); + } + + tag.putString("id", entityId); + + Entity createdEntity = EntityType.loadEntityRecursive(tag, craftWorld.getHandle(), (loadedEntity) -> { + loadedEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + return loadedEntity; + }); + + if (createdEntity != null) { + worldServer.addFreshEntityWithPassengers(createdEntity, SpawnReason.CUSTOM); + return createdEntity.getBukkitEntity(); + } else { + return null; + } + } + + // This removes all unwanted tags from the main entity and all its passengers + private void removeUnwantedEntityTagsRecursively(net.minecraft.nbt.CompoundTag tag) { + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } + + // Adapted from net.minecraft.world.entity.EntityType#loadEntityRecursive + if (tag.contains("Passengers", NBTConstants.TYPE_LIST)) { + net.minecraft.nbt.ListTag nbttaglist = tag.getList("Passengers", NBTConstants.TYPE_COMPOUND); + + for (int i = 0; i < nbttaglist.size(); ++i) { + removeUnwantedEntityTagsRecursively(nbttaglist.getCompound(i)); + } + } + } + + @Override + public Component getRichBlockName(BlockType blockType) { + return TranslatableComponent.of(getBlockFromType(blockType).getDescriptionId()); + } + + @Override + public Component getRichItemName(ItemType itemType) { + return TranslatableComponent.of(getItemFromType(itemType).getDescriptionId()); + } + + @Override + public Component getRichItemName(BaseItemStack itemStack) { + return TranslatableComponent.of(CraftItemStack.asNMSCopy(BukkitAdapter.adapt(itemStack)).getDescriptionId()); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader>() { + @Override + public Property load(net.minecraft.world.level.block.state.properties.Property state) throws Exception { + if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { + return new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + } else if (state instanceof DirectionProperty) { + return new DirectionalProperty(state.getName(), + (List) state.getPossibleValues().stream().map(e -> Direction.valueOf(((StringRepresentable) e).getSerializedName().toUpperCase(Locale.ROOT))).collect(Collectors.toList())); + } else if (state instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + return new EnumProperty(state.getName(), + (List) state.getPossibleValues().stream().map(e -> ((StringRepresentable) e).getSerializedName()).collect(Collectors.toList())); + } else if (state instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { + return new IntegerProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + } else { + throw new IllegalArgumentException("WorldEdit needs an update to support " + state.getClass().getSimpleName()); + } + } + }); + + @SuppressWarnings({ "rawtypes" }) + @Override + public Map> getProperties(BlockType blockType) { + Map> properties = new TreeMap<>(); + Block block = getBlockFromType(blockType); + StateDefinition blockStateList = + block.getStateDefinition(); + for (net.minecraft.world.level.block.state.properties.Property state : blockStateList.getProperties()) { + Property property = PROPERTY_CACHE.getUnchecked(state); + properties.put(property.getName(), property); + } + return properties; + } + + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, CompoundBinaryTag nbtData) { + ((CraftPlayer) player).getHandle().networkManager.send(ClientboundBlockEntityDataPacket.create( + new StructureBlockEntity( + new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), + Blocks.STRUCTURE_BLOCK.defaultBlockState() + ), + __ -> (net.minecraft.nbt.CompoundTag) fromNative(AdventureNBTConverter.fromAdventure(nbtData)) + )); + } + + @Override + public void sendFakeOP(Player player) { + ((CraftPlayer) player).getHandle().networkManager.send(new ClientboundEntityEventPacket( + ((CraftPlayer) player).getHandle(), (byte) 28 + )); + } + + @Override + public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { + ItemStack stack = new ItemStack(Registry.ITEM.get(ResourceLocation.tryParse(item.getType().getId())), item.getAmount()); + stack.setTag(((net.minecraft.nbt.CompoundTag) fromNative(item.getNbtData()))); + return CraftItemStack.asCraftMirror(stack); + } + + @Override + public BaseItemStack adapt(org.bukkit.inventory.ItemStack itemStack) { + final ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); + final BaseItemStack weStack = new BaseItemStack(BukkitAdapter.asItemType(itemStack.getType()), itemStack.getAmount()); + weStack.setNbtData(((CompoundTag) toNative(nmsStack.getTag()))); + return weStack; + } + + private final LoadingCache fakePlayers + = CacheBuilder.newBuilder().weakKeys().softValues().build(CacheLoader.from(PaperweightFakePlayer::new)); + + @Override + public boolean simulateItemUse(org.bukkit.World world, BlockVector3 position, BaseItem item, Direction face) { + CraftWorld craftWorld = (CraftWorld) world; + ServerLevel worldServer = craftWorld.getHandle(); + ItemStack stack = CraftItemStack.asNMSCopy(BukkitAdapter.adapt(item instanceof BaseItemStack + ? ((BaseItemStack) item) : new BaseItemStack(item.getType(), item.getNbtData(), 1))); + stack.setTag((net.minecraft.nbt.CompoundTag) fromNative(item.getNbtData())); + + PaperweightFakePlayer fakePlayer; + try { + fakePlayer = fakePlayers.get(worldServer); + } catch (ExecutionException ignored) { + return false; + } + fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack); + fakePlayer.absMoveTo(position.getBlockX(), position.getBlockY(), position.getBlockZ(), + (float) face.toVector().toYaw(), (float) face.toVector().toPitch()); + + final BlockPos blockPos = new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + final Vec3 blockVec = Vec3.atLowerCornerOf(blockPos); + final net.minecraft.core.Direction enumFacing = adapt(face); + BlockHitResult rayTrace = new BlockHitResult(blockVec, enumFacing, blockPos, false); + UseOnContext context = new UseOnContext(fakePlayer, InteractionHand.MAIN_HAND, rayTrace); + InteractionResult result = stack.useOn(context, InteractionHand.MAIN_HAND); + if (result != InteractionResult.SUCCESS) { + if (worldServer.getBlockState(blockPos).use(worldServer, fakePlayer, InteractionHand.MAIN_HAND, rayTrace).consumesAction()) { + result = InteractionResult.SUCCESS; + } else { + result = stack.getItem().use(worldServer, fakePlayer, InteractionHand.MAIN_HAND).getResult(); + } + } + + return result == InteractionResult.SUCCESS; + } + + @Override + public boolean canPlaceAt(org.bukkit.World world, BlockVector3 position, BlockState blockState) { + int internalId = BlockStateIdAccess.getBlockStateId(blockState); + net.minecraft.world.level.block.state.BlockState blockData = Block.stateById(internalId); + return blockData.canSurvive(((CraftWorld) world).getHandle(), new BlockPos(position.getX(), position.getY(), position.getZ())); + } + + @Override + public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent extent, RegenOptions options) { + try { + doRegen(bukkitWorld, region, extent, options); + } catch (Exception e) { + throw new IllegalStateException("Regen failed.", e); + } + + return true; + } + + private void doRegen(org.bukkit.World bukkitWorld, Region region, Extent extent, RegenOptions options) throws Exception { + Environment env = bukkitWorld.getEnvironment(); + ChunkGenerator gen = bukkitWorld.getGenerator(); + + Path tempDir = Files.createTempDirectory("WorldEditWorldGen"); + LevelStorageSource levelStorage = LevelStorageSource.createDefault(tempDir); + ResourceKey worldDimKey = getWorldDimKey(env); + try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("worldeditregentempworld", worldDimKey)) { + ServerLevel originalWorld = ((CraftWorld) bukkitWorld).getHandle(); + PrimaryLevelData levelProperties = (PrimaryLevelData) originalWorld.getServer() + .getWorldData().overworldData(); + WorldGenSettings originalOpts = levelProperties.worldGenSettings(); + + long seed = options.getSeed().orElse(originalWorld.getSeed()); + WorldGenSettings newOpts = options.getSeed().isPresent() + ? originalOpts.withSeed(levelProperties.isHardcore(), OptionalLong.of(seed)) + : originalOpts; + + LevelSettings newWorldSettings = new LevelSettings( + "worldeditregentempworld", + levelProperties.settings.gameType(), + levelProperties.settings.hardcore(), + levelProperties.settings.difficulty(), + levelProperties.settings.allowCommands(), + levelProperties.settings.gameRules(), + levelProperties.settings.getDataPackConfig() + ); + PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); + + ServerLevel freshWorld = new ServerLevel( + originalWorld.getServer(), + originalWorld.getServer().executor, + session, newWorldData, + originalWorld.dimension(), + originalWorld.dimensionTypeRegistration(), + new NoOpWorldLoadListener(), + newOpts.dimensions().get(worldDimKey).generator(), + originalWorld.isDebug(), + seed, + ImmutableList.of(), + false, + env, gen, + bukkitWorld.getBiomeProvider() + ); + try { + regenForWorld(region, extent, freshWorld, options); + } finally { + freshWorld.getChunkSource().close(false); + } + } finally { + try { + @SuppressWarnings("unchecked") + Map map = (Map) serverWorldsField.get(Bukkit.getServer()); + map.remove("worldeditregentempworld"); + } catch (IllegalAccessException ignored) { + } + SafeFiles.tryHardToDeleteDir(tempDir); + } + } + + private BiomeType adapt(ServerLevel serverWorld, Biome origBiome) { + ResourceLocation key = serverWorld.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(origBiome); + if (key == null) { + return null; + } + return BiomeTypes.get(key.toString()); + } + + @SuppressWarnings("unchecked") + private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws WorldEditException { + List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); + BlockableEventLoop executor; + try { + executor = (BlockableEventLoop) chunkProviderExecutorField.get(serverWorld.getChunkSource()); + } catch (IllegalAccessException e) { + throw new IllegalStateException("Couldn't get executor for chunk loading.", e); + } + executor.managedBlock(() -> { + // bail out early if a future fails + if (chunkLoadings.stream().anyMatch(ftr -> + ftr.isDone() && Futures.getUnchecked(ftr) == null + )) { + return false; + } + return chunkLoadings.stream().allMatch(CompletableFuture::isDone); + }); + Map chunks = new HashMap<>(); + for (CompletableFuture future : chunkLoadings) { + @Nullable + ChunkAccess chunk = future.getNow(null); + checkState(chunk != null, "Failed to generate a chunk, regen failed."); + chunks.put(chunk.getPos(), chunk); + } + + for (BlockVector3 vec : region) { + BlockPos pos = new BlockPos(vec.getBlockX(), vec.getBlockY(), vec.getBlockZ()); + ChunkAccess chunk = chunks.get(new ChunkPos(pos)); + final net.minecraft.world.level.block.state.BlockState blockData = chunk.getBlockState(pos); + int internalId = Block.getId(blockData); + BlockStateHolder state = BlockStateIdAccess.getBlockStateById(internalId); + Objects.requireNonNull(state); + BlockEntity blockEntity = chunk.getBlockEntity(pos); + if (blockEntity != null) { + net.minecraft.nbt.CompoundTag tag = blockEntity.saveWithId(); + state = state.toBaseBlock(((CompoundTag) toNative(tag))); + } + extent.setBlock(vec, state.toBaseBlock()); + if (options.shouldRegenBiomes()) { + Biome origBiome = chunk.getNoiseBiome(vec.getX(), vec.getY(), vec.getZ()).value(); + BiomeType adaptedBiome = adapt(serverWorld, origBiome); + if (adaptedBiome != null) { + extent.setBiome(vec, adaptedBiome); + } + } + } + } + + @SuppressWarnings("unchecked") + private List> submitChunkLoadTasks(Region region, ServerLevel serverWorld) { + ServerChunkCache chunkManager = serverWorld.getChunkSource(); + List> chunkLoadings = new ArrayList<>(); + // Pre-gen all the chunks + for (BlockVector2 chunk : region.getChunks()) { + try { + //noinspection unchecked + chunkLoadings.add( + ((CompletableFuture>) + getChunkFutureMethod.invoke(chunkManager, chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true)) + .thenApply(either -> either.left().orElse(null)) + ); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException("Couldn't load chunk for regen.", e); + } + } + return chunkLoadings; + } + + private ResourceKey getWorldDimKey(Environment env) { + switch (env) { + case NETHER: + return LevelStem.NETHER; + case THE_END: + return LevelStem.END; + case NORMAL: + default: + return LevelStem.OVERWORLD; + } + } + + private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( + SideEffect.NEIGHBORS, + SideEffect.LIGHTING, + SideEffect.VALIDATION, + SideEffect.ENTITY_AI, + SideEffect.EVENTS, + SideEffect.UPDATE + ); + + @Override + public Set getSupportedSideEffects() { + return SUPPORTED_SIDE_EFFECTS; + } + + @Override + public boolean clearContainerBlockContents(org.bukkit.World world, BlockVector3 pt) { + ServerLevel originalWorld = ((CraftWorld) world).getHandle(); + + BlockEntity entity = originalWorld.getBlockEntity(new BlockPos(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ())); + if (entity instanceof Clearable) { + ((Clearable) entity).clearContent(); + return true; + } + return false; + } + + // ------------------------------------------------------------------------ + // Code that is less likely to break + // ------------------------------------------------------------------------ + + /** + * Converts from a non-native NMS NBT structure to a native WorldEdit NBT + * structure. + * + * @param foreign non-native NMS NBT structure + * @return native WorldEdit NBT structure + */ + Tag toNative(net.minecraft.nbt.Tag foreign) { + if (foreign == null) { + return null; + } + if (foreign instanceof net.minecraft.nbt.CompoundTag) { + Map values = new HashMap<>(); + Set foreignKeys = ((net.minecraft.nbt.CompoundTag) foreign).getAllKeys(); + + for (String str : foreignKeys) { + net.minecraft.nbt.Tag base = ((net.minecraft.nbt.CompoundTag) foreign).get(str); + values.put(str, toNative(base)); + } + return new CompoundTag(values); + } else if (foreign instanceof net.minecraft.nbt.ByteTag) { + return new ByteTag(((net.minecraft.nbt.ByteTag) foreign).getAsByte()); + } else if (foreign instanceof net.minecraft.nbt.ByteArrayTag) { + return new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) foreign).getAsByteArray()); + } else if (foreign instanceof net.minecraft.nbt.DoubleTag) { + return new DoubleTag(((net.minecraft.nbt.DoubleTag) foreign).getAsDouble()); + } else if (foreign instanceof net.minecraft.nbt.FloatTag) { + return new FloatTag(((net.minecraft.nbt.FloatTag) foreign).getAsFloat()); + } else if (foreign instanceof net.minecraft.nbt.IntTag) { + return new IntTag(((net.minecraft.nbt.IntTag) foreign).getAsInt()); + } else if (foreign instanceof net.minecraft.nbt.IntArrayTag) { + return new IntArrayTag(((net.minecraft.nbt.IntArrayTag) foreign).getAsIntArray()); + } else if (foreign instanceof net.minecraft.nbt.LongArrayTag) { + return new LongArrayTag(((net.minecraft.nbt.LongArrayTag) foreign).getAsLongArray()); + } else if (foreign instanceof net.minecraft.nbt.ListTag) { + try { + return toNativeList((net.minecraft.nbt.ListTag) foreign); + } catch (Throwable e) { + logger.log(Level.WARNING, "Failed to convert net.minecraft.nbt.ListTag", e); + return new ListTag(ByteTag.class, new ArrayList()); + } + } else if (foreign instanceof net.minecraft.nbt.LongTag) { + return new LongTag(((net.minecraft.nbt.LongTag) foreign).getAsLong()); + } else if (foreign instanceof net.minecraft.nbt.ShortTag) { + return new ShortTag(((net.minecraft.nbt.ShortTag) foreign).getAsShort()); + } else if (foreign instanceof net.minecraft.nbt.StringTag) { + return new StringTag(foreign.getAsString()); + } else if (foreign instanceof net.minecraft.nbt.EndTag) { + return new EndTag(); + } else { + throw new IllegalArgumentException("Don't know how to make native " + foreign.getClass().getCanonicalName()); + } + } + + /** + * Convert a foreign NBT list tag into a native WorldEdit one. + * + * @param foreign the foreign tag + * @return the converted tag + * @throws SecurityException on error + * @throws IllegalArgumentException on error + */ + private ListTag toNativeList(net.minecraft.nbt.ListTag foreign) throws SecurityException, IllegalArgumentException { + List values = new ArrayList<>(); + int type = foreign.getElementType(); + + for (net.minecraft.nbt.Tag tag : foreign) { + values.add(toNative(tag)); + } + + Class cls = NBTConstants.getClassFromType(type); + return new ListTag(cls, values); + } + + /** + * Converts a WorldEdit-native NBT structure to a NMS structure. + * + * @param foreign structure to convert + * @return non-native structure + */ + net.minecraft.nbt.Tag fromNative(Tag foreign) { + if (foreign == null) { + return null; + } + if (foreign instanceof CompoundTag) { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + for (Map.Entry entry : ((CompoundTag) foreign) + .getValue().entrySet()) { + tag.put(entry.getKey(), fromNative(entry.getValue())); + } + return tag; + } else if (foreign instanceof ByteTag) { + return net.minecraft.nbt.ByteTag.valueOf(((ByteTag) foreign).getValue()); + } else if (foreign instanceof ByteArrayTag) { + return new net.minecraft.nbt.ByteArrayTag(((ByteArrayTag) foreign).getValue()); + } else if (foreign instanceof DoubleTag) { + return net.minecraft.nbt.DoubleTag.valueOf(((DoubleTag) foreign).getValue()); + } else if (foreign instanceof FloatTag) { + return net.minecraft.nbt.FloatTag.valueOf(((FloatTag) foreign).getValue()); + } else if (foreign instanceof IntTag) { + return net.minecraft.nbt.IntTag.valueOf(((IntTag) foreign).getValue()); + } else if (foreign instanceof IntArrayTag) { + return new net.minecraft.nbt.IntArrayTag(((IntArrayTag) foreign).getValue()); + } else if (foreign instanceof LongArrayTag) { + return new net.minecraft.nbt.LongArrayTag(((LongArrayTag) foreign).getValue()); + } else if (foreign instanceof ListTag) { + net.minecraft.nbt.ListTag tag = new net.minecraft.nbt.ListTag(); + ListTag foreignList = (ListTag) foreign; + for (Tag t : foreignList.getValue()) { + tag.add(fromNative(t)); + } + return tag; + } else if (foreign instanceof LongTag) { + return net.minecraft.nbt.LongTag.valueOf(((LongTag) foreign).getValue()); + } else if (foreign instanceof ShortTag) { + return net.minecraft.nbt.ShortTag.valueOf(((ShortTag) foreign).getValue()); + } else if (foreign instanceof StringTag) { + return net.minecraft.nbt.StringTag.valueOf(((StringTag) foreign).getValue()); + } else if (foreign instanceof EndTag) { + return net.minecraft.nbt.EndTag.INSTANCE; + } else { + throw new IllegalArgumentException("Don't know how to make NMS " + foreign.getClass().getCanonicalName()); + } + } + + @Override + public boolean supportsWatchdog() { + return watchdog != null; + } + + @Override + public void tickWatchdog() { + watchdog.tick(); + } + + private class SpigotWatchdog implements Watchdog { + private final Field instanceField; + private final Field lastTickField; + + SpigotWatchdog() throws NoSuchFieldException { + Field instanceField = WatchdogThread.class.getDeclaredField("instance"); + instanceField.setAccessible(true); + this.instanceField = instanceField; + + Field lastTickField = WatchdogThread.class.getDeclaredField("lastTick"); + lastTickField.setAccessible(true); + this.lastTickField = lastTickField; + } + + @Override + public void tick() { + try { + WatchdogThread instance = (WatchdogThread) this.instanceField.get(null); + if ((long) lastTickField.get(instance) != 0) { + WatchdogThread.tick(); + } + } catch (IllegalAccessException e) { + logger.log(Level.WARNING, "Failed to tick watchdog", e); + } + } + } + + private static class MojangWatchdog implements Watchdog { + private final DedicatedServer server; + private final Field tickField; + + MojangWatchdog(DedicatedServer server) throws NoSuchFieldException { + this.server = server; + Field tickField = MinecraftServer.class.getDeclaredField( + Refraction.pickName("nextTickTime", "ao") + ); + tickField.setAccessible(true); + this.tickField = tickField; + } + + @Override + public void tick() { + try { + tickField.set(server, Util.getMillis()); + } catch (IllegalAccessException ignored) { + } + } + } + + private static class NoOpWorldLoadListener implements ChunkProgressListener { + @Override + public void updateSpawnPos(ChunkPos spawnPos) { + } + + @Override + public void onStatusChange(ChunkPos pos, @org.jetbrains.annotations.Nullable ChunkStatus status) { + } + + @Override + public void start() { + } + + @Override + public void stop() { + } + + @Override + public void setChunkRadius(int radius) { + } + } +} diff --git a/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightDataConverters.java b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightDataConverters.java new file mode 100644 index 0000000000..8678a34f5b --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightDataConverters.java @@ -0,0 +1,2795 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.bukkit.adapter.impl.v1_18_R2; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.mojang.datafixers.DSL.TypeReference; +import com.mojang.datafixers.DataFixer; +import com.mojang.datafixers.DataFixerBuilder; +import com.mojang.datafixers.schemas.Schema; +import com.mojang.serialization.Dynamic; +import com.sk89q.jnbt.CompoundTag; +import net.minecraft.core.Direction; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.util.StringUtil; +import net.minecraft.util.datafix.DataFixers; +import net.minecraft.util.datafix.fixes.References; +import net.minecraft.world.item.DyeColor; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; +import javax.annotation.Nullable; + +/** + * Handles converting all Pre 1.13.2 data using the Legacy DataFix System (ported to 1.13.2) + * + * We register a DFU Fixer per Legacy Data Version and apply the fixes using legacy strategy + * which is safer, faster and cleaner code. + * + * The pre DFU code did not fail when the Source version was unknown. + * + * This class also provides util methods for converting compounds to wrap the update call to + * receive the source version in the compound + */ +@SuppressWarnings({ "rawtypes", "unchecked" }) +class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.worldedit.world.DataFixer { + + @SuppressWarnings("unchecked") + @Override + public T fixUp(FixType type, T original, int srcVer) { + if (type == FixTypes.CHUNK) { + return (T) fixChunk((CompoundTag) original, srcVer); + } else if (type == FixTypes.BLOCK_ENTITY) { + return (T) fixBlockEntity((CompoundTag) original, srcVer); + } else if (type == FixTypes.ENTITY) { + return (T) fixEntity((CompoundTag) original, srcVer); + } else if (type == FixTypes.BLOCK_STATE) { + return (T) fixBlockState((String) original, srcVer); + } else if (type == FixTypes.ITEM_TYPE) { + return (T) fixItemType((String) original, srcVer); + } else if (type == FixTypes.BIOME) { + return (T) fixBiome((String) original, srcVer); + } + return original; + } + + private CompoundTag fixChunk(CompoundTag originalChunk, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(originalChunk); + net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.CHUNK, tag, srcVer); + return (CompoundTag) adapter.toNative(fixed); + } + + private CompoundTag fixBlockEntity(CompoundTag origTileEnt, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(origTileEnt); + net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.BLOCK_ENTITY, tag, srcVer); + return (CompoundTag) adapter.toNative(fixed); + } + + private CompoundTag fixEntity(CompoundTag origEnt, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(origEnt); + net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.ENTITY, tag, srcVer); + return (CompoundTag) adapter.toNative(fixed); + } + + private String fixBlockState(String blockState, int srcVer) { + net.minecraft.nbt.CompoundTag stateNBT = stateToNBT(blockState); + Dynamic dynamic = new Dynamic<>(OPS_NBT, stateNBT); + net.minecraft.nbt.CompoundTag fixed = (net.minecraft.nbt.CompoundTag) INSTANCE.fixer.update(References.BLOCK_STATE, dynamic, srcVer, DATA_VERSION).getValue(); + return nbtToState(fixed); + } + + private String nbtToState(net.minecraft.nbt.CompoundTag tagCompound) { + StringBuilder sb = new StringBuilder(); + sb.append(tagCompound.getString("Name")); + if (tagCompound.contains("Properties", 10)) { + sb.append('['); + net.minecraft.nbt.CompoundTag props = tagCompound.getCompound("Properties"); + sb.append(props.getAllKeys().stream().map(k -> k + "=" + props.getString(k).replace("\"", "")).collect(Collectors.joining(","))); + sb.append(']'); + } + return sb.toString(); + } + + private static net.minecraft.nbt.CompoundTag stateToNBT(String blockState) { + int propIdx = blockState.indexOf('['); + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + if (propIdx < 0) { + tag.putString("Name", blockState); + } else { + tag.putString("Name", blockState.substring(0, propIdx)); + net.minecraft.nbt.CompoundTag propTag = new net.minecraft.nbt.CompoundTag(); + String props = blockState.substring(propIdx + 1, blockState.length() - 1); + String[] propArr = props.split(","); + for (String pair : propArr) { + final String[] split = pair.split("="); + propTag.putString(split[0], split[1]); + } + tag.put("Properties", propTag); + } + return tag; + } + + private String fixBiome(String key, int srcVer) { + return fixName(key, srcVer, References.BIOME); + } + + private String fixItemType(String key, int srcVer) { + return fixName(key, srcVer, References.ITEM_NAME); + } + + private static String fixName(String key, int srcVer, TypeReference type) { + return INSTANCE.fixer.update(type, new Dynamic<>(OPS_NBT, net.minecraft.nbt.StringTag.valueOf(key)), srcVer, DATA_VERSION) + .getValue().getAsString(); + } + + private final PaperweightAdapter adapter; + + private static final NbtOps OPS_NBT = NbtOps.INSTANCE; + private static final int LEGACY_VERSION = 1343; + private static int DATA_VERSION; + static PaperweightDataConverters INSTANCE; + + private final Map> converters = new EnumMap<>(LegacyType.class); + private final Map> inspectors = new EnumMap<>(LegacyType.class); + + // Set on build + private DataFixer fixer; + private static final Map DFU_TO_LEGACY = new HashMap<>(); + + public enum LegacyType { + LEVEL(References.LEVEL), + PLAYER(References.PLAYER), + CHUNK(References.CHUNK), + BLOCK_ENTITY(References.BLOCK_ENTITY), + ENTITY(References.ENTITY), + ITEM_INSTANCE(References.ITEM_STACK), + OPTIONS(References.OPTIONS), + STRUCTURE(References.STRUCTURE); + + private final TypeReference type; + + LegacyType(TypeReference type) { + this.type = type; + DFU_TO_LEGACY.put(type.typeName(), this); + } + + public TypeReference getDFUType() { + return type; + } + } + + PaperweightDataConverters(int dataVersion, PaperweightAdapter adapter) { + super(dataVersion); + DATA_VERSION = dataVersion; + INSTANCE = this; + this.adapter = adapter; + registerConverters(); + registerInspectors(); + } + + + // Called after fixers are built and ready for FIXING + @Override + public DataFixer build(final Executor executor) { + return this.fixer = new WrappedDataFixer(DataFixers.getDataFixer()); + } + + @SuppressWarnings("unchecked") + private class WrappedDataFixer implements DataFixer { + private final DataFixer realFixer; + + WrappedDataFixer(DataFixer realFixer) { + this.realFixer = realFixer; + } + + @Override + public Dynamic update(TypeReference type, Dynamic dynamic, int sourceVer, int targetVer) { + LegacyType legacyType = DFU_TO_LEGACY.get(type.typeName()); + if (sourceVer < LEGACY_VERSION && legacyType != null) { + net.minecraft.nbt.CompoundTag cmp = (net.minecraft.nbt.CompoundTag) dynamic.getValue(); + int desiredVersion = Math.min(targetVer, LEGACY_VERSION); + + cmp = convert(legacyType, cmp, sourceVer, desiredVersion); + sourceVer = desiredVersion; + dynamic = new Dynamic(OPS_NBT, cmp); + } + return realFixer.update(type, dynamic, sourceVer, targetVer); + } + + private net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp, int sourceVer, int desiredVersion) { + List converters = PaperweightDataConverters.this.converters.get(type); + if (converters != null && !converters.isEmpty()) { + for (DataConverter converter : converters) { + int dataVersion = converter.getDataVersion(); + if (dataVersion > sourceVer && dataVersion <= desiredVersion) { + cmp = converter.convert(cmp); + } + } + } + + List inspectors = PaperweightDataConverters.this.inspectors.get(type); + if (inspectors != null && !inspectors.isEmpty()) { + for (DataInspector inspector : inspectors) { + cmp = inspector.inspect(cmp, sourceVer, desiredVersion); + } + } + + return cmp; + } + + @Override + public Schema getSchema(int i) { + return realFixer.getSchema(i); + } + } + + public static net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp) { + return convert(type.getDFUType(), cmp); + } + + public static net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp, int sourceVer) { + return convert(type.getDFUType(), cmp, sourceVer); + } + + public static net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + return convert(type.getDFUType(), cmp, sourceVer, targetVer); + } + + public static net.minecraft.nbt.CompoundTag convert(TypeReference type, net.minecraft.nbt.CompoundTag cmp) { + int i = cmp.contains("DataVersion", 99) ? cmp.getInt("DataVersion") : -1; + return convert(type, cmp, i); + } + + public static net.minecraft.nbt.CompoundTag convert(TypeReference type, net.minecraft.nbt.CompoundTag cmp, int sourceVer) { + return convert(type, cmp, sourceVer, DATA_VERSION); + } + + public static net.minecraft.nbt.CompoundTag convert(TypeReference type, net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (sourceVer >= targetVer) { + return cmp; + } + return (net.minecraft.nbt.CompoundTag) INSTANCE.fixer.update(type, new Dynamic<>(OPS_NBT, cmp), sourceVer, targetVer).getValue(); + } + + + public interface DataInspector { + net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer); + } + + public interface DataConverter { + + int getDataVersion(); + + net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp); + } + + + private void registerInspector(LegacyType type, DataInspector inspector) { + this.inspectors.computeIfAbsent(type, k -> new ArrayList<>()).add(inspector); + } + + private void registerConverter(LegacyType type, DataConverter converter) { + int version = converter.getDataVersion(); + + List list = this.converters.computeIfAbsent(type, k -> new ArrayList<>()); + if (!list.isEmpty() && list.get(list.size() - 1).getDataVersion() > version) { + for (int j = 0; j < list.size(); ++j) { + if (list.get(j).getDataVersion() > version) { + list.add(j, converter); + break; + } + } + } else { + list.add(converter); + } + } + + private void registerInspectors() { + registerEntityItemList("EntityHorseDonkey", "SaddleItem", "Items"); + registerEntityItemList("EntityHorseMule", "Items"); + registerEntityItemList("EntityMinecartChest", "Items"); + registerEntityItemList("EntityMinecartHopper", "Items"); + registerEntityItemList("EntityVillager", "Inventory"); + registerEntityItemListEquipment("EntityArmorStand"); + registerEntityItemListEquipment("EntityBat"); + registerEntityItemListEquipment("EntityBlaze"); + registerEntityItemListEquipment("EntityCaveSpider"); + registerEntityItemListEquipment("EntityChicken"); + registerEntityItemListEquipment("EntityCow"); + registerEntityItemListEquipment("EntityCreeper"); + registerEntityItemListEquipment("EntityEnderDragon"); + registerEntityItemListEquipment("EntityEnderman"); + registerEntityItemListEquipment("EntityEndermite"); + registerEntityItemListEquipment("EntityEvoker"); + registerEntityItemListEquipment("EntityGhast"); + registerEntityItemListEquipment("EntityGiantZombie"); + registerEntityItemListEquipment("EntityGuardian"); + registerEntityItemListEquipment("EntityGuardianElder"); + registerEntityItemListEquipment("EntityHorse"); + registerEntityItemListEquipment("EntityHorseDonkey"); + registerEntityItemListEquipment("EntityHorseMule"); + registerEntityItemListEquipment("EntityHorseSkeleton"); + registerEntityItemListEquipment("EntityHorseZombie"); + registerEntityItemListEquipment("EntityIronGolem"); + registerEntityItemListEquipment("EntityMagmaCube"); + registerEntityItemListEquipment("EntityMushroomCow"); + registerEntityItemListEquipment("EntityOcelot"); + registerEntityItemListEquipment("EntityPig"); + registerEntityItemListEquipment("EntityPigZombie"); + registerEntityItemListEquipment("EntityRabbit"); + registerEntityItemListEquipment("EntitySheep"); + registerEntityItemListEquipment("EntityShulker"); + registerEntityItemListEquipment("EntitySilverfish"); + registerEntityItemListEquipment("EntitySkeleton"); + registerEntityItemListEquipment("EntitySkeletonStray"); + registerEntityItemListEquipment("EntitySkeletonWither"); + registerEntityItemListEquipment("EntitySlime"); + registerEntityItemListEquipment("EntitySnowman"); + registerEntityItemListEquipment("EntitySpider"); + registerEntityItemListEquipment("EntitySquid"); + registerEntityItemListEquipment("EntityVex"); + registerEntityItemListEquipment("EntityVillager"); + registerEntityItemListEquipment("EntityVindicator"); + registerEntityItemListEquipment("EntityWitch"); + registerEntityItemListEquipment("EntityWither"); + registerEntityItemListEquipment("EntityWolf"); + registerEntityItemListEquipment("EntityZombie"); + registerEntityItemListEquipment("EntityZombieHusk"); + registerEntityItemListEquipment("EntityZombieVillager"); + registerEntityItemSingle("EntityFireworks", "FireworksItem"); + registerEntityItemSingle("EntityHorse", "ArmorItem"); + registerEntityItemSingle("EntityHorse", "SaddleItem"); + registerEntityItemSingle("EntityHorseMule", "SaddleItem"); + registerEntityItemSingle("EntityHorseSkeleton", "SaddleItem"); + registerEntityItemSingle("EntityHorseZombie", "SaddleItem"); + registerEntityItemSingle("EntityItem", "Item"); + registerEntityItemSingle("EntityItemFrame", "Item"); + registerEntityItemSingle("EntityPotion", "Potion"); + + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItem("TileEntityRecordPlayer", "RecordItem")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityBrewingStand", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityChest", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityDispenser", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityDropper", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityFurnace", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityHopper", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityShulkerBox", "Items")); + registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorMobSpawnerMobs()); + registerInspector(LegacyType.CHUNK, new DataInspectorChunks()); + registerInspector(LegacyType.ENTITY, new DataInspectorCommandBlock()); + registerInspector(LegacyType.ENTITY, new DataInspectorEntityPassengers()); + registerInspector(LegacyType.ENTITY, new DataInspectorMobSpawnerMinecart()); + registerInspector(LegacyType.ENTITY, new DataInspectorVillagers()); + registerInspector(LegacyType.ITEM_INSTANCE, new DataInspectorBlockEntity()); + registerInspector(LegacyType.ITEM_INSTANCE, new DataInspectorEntity()); + registerInspector(LegacyType.LEVEL, new DataInspectorLevelPlayer()); + registerInspector(LegacyType.PLAYER, new DataInspectorPlayer()); + registerInspector(LegacyType.PLAYER, new DataInspectorPlayerVehicle()); + registerInspector(LegacyType.STRUCTURE, new DataInspectorStructure()); + } + + private void registerConverters() { + registerConverter(LegacyType.ENTITY, new DataConverterEquipment()); + registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterSignText()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterMaterialId()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterPotionId()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterSpawnEgg()); + registerConverter(LegacyType.ENTITY, new DataConverterMinecart()); + registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterMobSpawner()); + registerConverter(LegacyType.ENTITY, new DataConverterUUID()); + registerConverter(LegacyType.ENTITY, new DataConverterHealth()); + registerConverter(LegacyType.ENTITY, new DataConverterSaddle()); + registerConverter(LegacyType.ENTITY, new DataConverterHanging()); + registerConverter(LegacyType.ENTITY, new DataConverterDropChances()); + registerConverter(LegacyType.ENTITY, new DataConverterRiding()); + registerConverter(LegacyType.ENTITY, new DataConverterArmorStand()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBook()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterCookedFish()); + registerConverter(LegacyType.ENTITY, new DataConverterZombie()); + registerConverter(LegacyType.OPTIONS, new DataConverterVBO()); + registerConverter(LegacyType.ENTITY, new DataConverterGuardian()); + registerConverter(LegacyType.ENTITY, new DataConverterSkeleton()); + registerConverter(LegacyType.ENTITY, new DataConverterZombieType()); + registerConverter(LegacyType.ENTITY, new DataConverterHorse()); + registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterTileEntity()); + registerConverter(LegacyType.ENTITY, new DataConverterEntity()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBanner()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterPotionWater()); + registerConverter(LegacyType.ENTITY, new DataConverterShulker()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterShulkerBoxItem()); + registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterShulkerBoxBlock()); + registerConverter(LegacyType.OPTIONS, new DataConverterLang()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterTotem()); + registerConverter(LegacyType.CHUNK, new DataConverterBedBlock()); + registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBedItem()); + } + + private void registerEntityItemList(String type, String... keys) { + registerInspector(LegacyType.ENTITY, new DataInspectorItemList(type, keys)); + } + + private void registerEntityItemSingle(String type, String key) { + registerInspector(LegacyType.ENTITY, new DataInspectorItem(type, key)); + } + + private void registerEntityItemListEquipment(String type) { + registerEntityItemList(type, "ArmorItems", "HandItems"); + } + + private static final Map OLD_ID_TO_KEY_MAP = new HashMap<>(); + + static { + final Map map = OLD_ID_TO_KEY_MAP; + map.put("EntityItem", new ResourceLocation("item")); + map.put("EntityExperienceOrb", new ResourceLocation("xp_orb")); + map.put("EntityAreaEffectCloud", new ResourceLocation("area_effect_cloud")); + map.put("EntityGuardianElder", new ResourceLocation("elder_guardian")); + map.put("EntitySkeletonWither", new ResourceLocation("wither_skeleton")); + map.put("EntitySkeletonStray", new ResourceLocation("stray")); + map.put("EntityEgg", new ResourceLocation("egg")); + map.put("EntityLeash", new ResourceLocation("leash_knot")); + map.put("EntityPainting", new ResourceLocation("painting")); + map.put("EntityTippedArrow", new ResourceLocation("arrow")); + map.put("EntitySnowball", new ResourceLocation("snowball")); + map.put("EntityLargeFireball", new ResourceLocation("fireball")); + map.put("EntitySmallFireball", new ResourceLocation("small_fireball")); + map.put("EntityEnderPearl", new ResourceLocation("ender_pearl")); + map.put("EntityEnderSignal", new ResourceLocation("eye_of_ender_signal")); + map.put("EntityPotion", new ResourceLocation("potion")); + map.put("EntityThrownExpBottle", new ResourceLocation("xp_bottle")); + map.put("EntityItemFrame", new ResourceLocation("item_frame")); + map.put("EntityWitherSkull", new ResourceLocation("wither_skull")); + map.put("EntityTNTPrimed", new ResourceLocation("tnt")); + map.put("EntityFallingBlock", new ResourceLocation("falling_block")); + map.put("EntityFireworks", new ResourceLocation("fireworks_rocket")); + map.put("EntityZombieHusk", new ResourceLocation("husk")); + map.put("EntitySpectralArrow", new ResourceLocation("spectral_arrow")); + map.put("EntityShulkerBullet", new ResourceLocation("shulker_bullet")); + map.put("EntityDragonFireball", new ResourceLocation("dragon_fireball")); + map.put("EntityZombieVillager", new ResourceLocation("zombie_villager")); + map.put("EntityHorseSkeleton", new ResourceLocation("skeleton_horse")); + map.put("EntityHorseZombie", new ResourceLocation("zombie_horse")); + map.put("EntityArmorStand", new ResourceLocation("armor_stand")); + map.put("EntityHorseDonkey", new ResourceLocation("donkey")); + map.put("EntityHorseMule", new ResourceLocation("mule")); + map.put("EntityEvokerFangs", new ResourceLocation("evocation_fangs")); + map.put("EntityEvoker", new ResourceLocation("evocation_illager")); + map.put("EntityVex", new ResourceLocation("vex")); + map.put("EntityVindicator", new ResourceLocation("vindication_illager")); + map.put("EntityIllagerIllusioner", new ResourceLocation("illusion_illager")); + map.put("EntityMinecartCommandBlock", new ResourceLocation("commandblock_minecart")); + map.put("EntityBoat", new ResourceLocation("boat")); + map.put("EntityMinecartRideable", new ResourceLocation("minecart")); + map.put("EntityMinecartChest", new ResourceLocation("chest_minecart")); + map.put("EntityMinecartFurnace", new ResourceLocation("furnace_minecart")); + map.put("EntityMinecartTNT", new ResourceLocation("tnt_minecart")); + map.put("EntityMinecartHopper", new ResourceLocation("hopper_minecart")); + map.put("EntityMinecartMobSpawner", new ResourceLocation("spawner_minecart")); + map.put("EntityCreeper", new ResourceLocation("creeper")); + map.put("EntitySkeleton", new ResourceLocation("skeleton")); + map.put("EntitySpider", new ResourceLocation("spider")); + map.put("EntityGiantZombie", new ResourceLocation("giant")); + map.put("EntityZombie", new ResourceLocation("zombie")); + map.put("EntitySlime", new ResourceLocation("slime")); + map.put("EntityGhast", new ResourceLocation("ghast")); + map.put("EntityPigZombie", new ResourceLocation("zombie_pigman")); + map.put("EntityEnderman", new ResourceLocation("enderman")); + map.put("EntityCaveSpider", new ResourceLocation("cave_spider")); + map.put("EntitySilverfish", new ResourceLocation("silverfish")); + map.put("EntityBlaze", new ResourceLocation("blaze")); + map.put("EntityMagmaCube", new ResourceLocation("magma_cube")); + map.put("EntityEnderDragon", new ResourceLocation("ender_dragon")); + map.put("EntityWither", new ResourceLocation("wither")); + map.put("EntityBat", new ResourceLocation("bat")); + map.put("EntityWitch", new ResourceLocation("witch")); + map.put("EntityEndermite", new ResourceLocation("endermite")); + map.put("EntityGuardian", new ResourceLocation("guardian")); + map.put("EntityShulker", new ResourceLocation("shulker")); + map.put("EntityPig", new ResourceLocation("pig")); + map.put("EntitySheep", new ResourceLocation("sheep")); + map.put("EntityCow", new ResourceLocation("cow")); + map.put("EntityChicken", new ResourceLocation("chicken")); + map.put("EntitySquid", new ResourceLocation("squid")); + map.put("EntityWolf", new ResourceLocation("wolf")); + map.put("EntityMushroomCow", new ResourceLocation("mooshroom")); + map.put("EntitySnowman", new ResourceLocation("snowman")); + map.put("EntityOcelot", new ResourceLocation("ocelot")); + map.put("EntityIronGolem", new ResourceLocation("villager_golem")); + map.put("EntityHorse", new ResourceLocation("horse")); + map.put("EntityRabbit", new ResourceLocation("rabbit")); + map.put("EntityPolarBear", new ResourceLocation("polar_bear")); + map.put("EntityLlama", new ResourceLocation("llama")); + map.put("EntityLlamaSpit", new ResourceLocation("llama_spit")); + map.put("EntityParrot", new ResourceLocation("parrot")); + map.put("EntityVillager", new ResourceLocation("villager")); + map.put("EntityEnderCrystal", new ResourceLocation("ender_crystal")); + map.put("TileEntityFurnace", new ResourceLocation("furnace")); + map.put("TileEntityChest", new ResourceLocation("chest")); + map.put("TileEntityEnderChest", new ResourceLocation("ender_chest")); + map.put("TileEntityRecordPlayer", new ResourceLocation("jukebox")); + map.put("TileEntityDispenser", new ResourceLocation("dispenser")); + map.put("TileEntityDropper", new ResourceLocation("dropper")); + map.put("TileEntitySign", new ResourceLocation("sign")); + map.put("TileEntityMobSpawner", new ResourceLocation("mob_spawner")); + map.put("TileEntityNote", new ResourceLocation("noteblock")); + map.put("TileEntityPiston", new ResourceLocation("piston")); + map.put("TileEntityBrewingStand", new ResourceLocation("brewing_stand")); + map.put("TileEntityEnchantTable", new ResourceLocation("enchanting_table")); + map.put("TileEntityEnderPortal", new ResourceLocation("end_portal")); + map.put("TileEntityBeacon", new ResourceLocation("beacon")); + map.put("TileEntitySkull", new ResourceLocation("skull")); + map.put("TileEntityLightDetector", new ResourceLocation("daylight_detector")); + map.put("TileEntityHopper", new ResourceLocation("hopper")); + map.put("TileEntityComparator", new ResourceLocation("comparator")); + map.put("TileEntityFlowerPot", new ResourceLocation("flower_pot")); + map.put("TileEntityBanner", new ResourceLocation("banner")); + map.put("TileEntityStructure", new ResourceLocation("structure_block")); + map.put("TileEntityEndGateway", new ResourceLocation("end_gateway")); + map.put("TileEntityCommand", new ResourceLocation("command_block")); + map.put("TileEntityShulkerBox", new ResourceLocation("shulker_box")); + map.put("TileEntityBed", new ResourceLocation("bed")); + } + + private static ResourceLocation getKey(String type) { + final ResourceLocation key = OLD_ID_TO_KEY_MAP.get(type); + if (key == null) { + throw new IllegalArgumentException("Unknown mapping for " + type); + } + return key; + } + + private static void convertCompound(LegacyType type, net.minecraft.nbt.CompoundTag cmp, String key, int sourceVer, int targetVer) { + cmp.put(key, convert(type, cmp.getCompound(key), sourceVer, targetVer)); + } + + private static void convertItem(net.minecraft.nbt.CompoundTag nbttagcompound, String key, int sourceVer, int targetVer) { + if (nbttagcompound.contains(key, 10)) { + convertCompound(LegacyType.ITEM_INSTANCE, nbttagcompound, key, sourceVer, targetVer); + } + } + + private static void convertItems(net.minecraft.nbt.CompoundTag nbttagcompound, String key, int sourceVer, int targetVer) { + if (nbttagcompound.contains(key, 9)) { + net.minecraft.nbt.ListTag nbttaglist = nbttagcompound.getList(key, 10); + + for (int j = 0; j < nbttaglist.size(); ++j) { + nbttaglist.set(j, convert(LegacyType.ITEM_INSTANCE, nbttaglist.getCompound(j), sourceVer, targetVer)); + } + } + + } + + private static class DataConverterEquipment implements DataConverter { + + DataConverterEquipment() { + } + + public int getDataVersion() { + return 100; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + net.minecraft.nbt.ListTag nbttaglist = cmp.getList("Equipment", 10); + net.minecraft.nbt.ListTag nbttaglist1; + + if (!nbttaglist.isEmpty() && !cmp.contains("HandItems", 10)) { + nbttaglist1 = new net.minecraft.nbt.ListTag(); + nbttaglist1.add(nbttaglist.get(0)); + nbttaglist1.add(new net.minecraft.nbt.CompoundTag()); + cmp.put("HandItems", nbttaglist1); + } + + if (nbttaglist.size() > 1 && !cmp.contains("ArmorItem", 10)) { + nbttaglist1 = new net.minecraft.nbt.ListTag(); + nbttaglist1.add(nbttaglist.get(1)); + nbttaglist1.add(nbttaglist.get(2)); + nbttaglist1.add(nbttaglist.get(3)); + nbttaglist1.add(nbttaglist.get(4)); + cmp.put("ArmorItems", nbttaglist1); + } + + cmp.remove("Equipment"); + if (cmp.contains("DropChances", 9)) { + nbttaglist1 = cmp.getList("DropChances", 5); + net.minecraft.nbt.ListTag nbttaglist2; + + if (!cmp.contains("HandDropChances", 10)) { + nbttaglist2 = new net.minecraft.nbt.ListTag(); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(nbttaglist1.getFloat(0))); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(0.0F)); + cmp.put("HandDropChances", nbttaglist2); + } + + if (!cmp.contains("ArmorDropChances", 10)) { + nbttaglist2 = new net.minecraft.nbt.ListTag(); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(nbttaglist1.getFloat(1))); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(nbttaglist1.getFloat(2))); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(nbttaglist1.getFloat(3))); + nbttaglist2.add(net.minecraft.nbt.FloatTag.valueOf(nbttaglist1.getFloat(4))); + cmp.put("ArmorDropChances", nbttaglist2); + } + + cmp.remove("DropChances"); + } + + return cmp; + } + } + + private static class DataInspectorBlockEntity implements DataInspector { + + private static final Map b = Maps.newHashMap(); + private static final Map c = Maps.newHashMap(); + + DataInspectorBlockEntity() { + } + + @Nullable + private static String convertEntityId(int i, String s) { + String key = new ResourceLocation(s).toString(); + if (i < 515 && DataInspectorBlockEntity.b.containsKey(key)) { + return DataInspectorBlockEntity.b.get(key); + } else { + return DataInspectorBlockEntity.c.get(key); + } + } + + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (!cmp.contains("tag", 10)) { + return cmp; + } else { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (nbttagcompound1.contains("BlockEntityTag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); + String s = cmp.getString("id"); + String s1 = convertEntityId(sourceVer, s); + boolean flag; + + if (s1 == null) { + // CraftBukkit - Remove unnecessary warning (occurs when deserializing a Shulker Box item) + // DataInspectorBlockEntity.a.warn("Unable to resolve BlockEntity for ItemInstance: {}", s); + flag = false; + } else { + flag = !nbttagcompound2.contains("id"); + nbttagcompound2.putString("id", s1); + } + + convert(LegacyType.BLOCK_ENTITY, nbttagcompound2, sourceVer, targetVer); + if (flag) { + nbttagcompound2.remove("id"); + } + } + + return cmp; + } + } + + static { + Map map = DataInspectorBlockEntity.b; + + map.put("minecraft:furnace", "Furnace"); + map.put("minecraft:lit_furnace", "Furnace"); + map.put("minecraft:chest", "Chest"); + map.put("minecraft:trapped_chest", "Chest"); + map.put("minecraft:ender_chest", "EnderChest"); + map.put("minecraft:jukebox", "RecordPlayer"); + map.put("minecraft:dispenser", "Trap"); + map.put("minecraft:dropper", "Dropper"); + map.put("minecraft:sign", "Sign"); + map.put("minecraft:mob_spawner", "MobSpawner"); + map.put("minecraft:noteblock", "Music"); + map.put("minecraft:brewing_stand", "Cauldron"); + map.put("minecraft:enhanting_table", "EnchantTable"); + map.put("minecraft:command_block", "CommandBlock"); + map.put("minecraft:beacon", "Beacon"); + map.put("minecraft:skull", "Skull"); + map.put("minecraft:daylight_detector", "DLDetector"); + map.put("minecraft:hopper", "Hopper"); + map.put("minecraft:banner", "Banner"); + map.put("minecraft:flower_pot", "FlowerPot"); + map.put("minecraft:repeating_command_block", "CommandBlock"); + map.put("minecraft:chain_command_block", "CommandBlock"); + map.put("minecraft:standing_sign", "Sign"); + map.put("minecraft:wall_sign", "Sign"); + map.put("minecraft:piston_head", "Piston"); + map.put("minecraft:daylight_detector_inverted", "DLDetector"); + map.put("minecraft:unpowered_comparator", "Comparator"); + map.put("minecraft:powered_comparator", "Comparator"); + map.put("minecraft:wall_banner", "Banner"); + map.put("minecraft:standing_banner", "Banner"); + map.put("minecraft:structure_block", "Structure"); + map.put("minecraft:end_portal", "Airportal"); + map.put("minecraft:end_gateway", "EndGateway"); + map.put("minecraft:shield", "Shield"); + map = DataInspectorBlockEntity.c; + map.put("minecraft:furnace", "minecraft:furnace"); + map.put("minecraft:lit_furnace", "minecraft:furnace"); + map.put("minecraft:chest", "minecraft:chest"); + map.put("minecraft:trapped_chest", "minecraft:chest"); + map.put("minecraft:ender_chest", "minecraft:enderchest"); + map.put("minecraft:jukebox", "minecraft:jukebox"); + map.put("minecraft:dispenser", "minecraft:dispenser"); + map.put("minecraft:dropper", "minecraft:dropper"); + map.put("minecraft:sign", "minecraft:sign"); + map.put("minecraft:mob_spawner", "minecraft:mob_spawner"); + map.put("minecraft:noteblock", "minecraft:noteblock"); + map.put("minecraft:brewing_stand", "minecraft:brewing_stand"); + map.put("minecraft:enhanting_table", "minecraft:enchanting_table"); + map.put("minecraft:command_block", "minecraft:command_block"); + map.put("minecraft:beacon", "minecraft:beacon"); + map.put("minecraft:skull", "minecraft:skull"); + map.put("minecraft:daylight_detector", "minecraft:daylight_detector"); + map.put("minecraft:hopper", "minecraft:hopper"); + map.put("minecraft:banner", "minecraft:banner"); + map.put("minecraft:flower_pot", "minecraft:flower_pot"); + map.put("minecraft:repeating_command_block", "minecraft:command_block"); + map.put("minecraft:chain_command_block", "minecraft:command_block"); + map.put("minecraft:shulker_box", "minecraft:shulker_box"); + map.put("minecraft:white_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:orange_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:magenta_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:light_blue_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:yellow_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:lime_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:pink_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:gray_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:silver_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:cyan_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:purple_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:blue_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:brown_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:green_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:red_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:black_shulker_box", "minecraft:shulker_box"); + map.put("minecraft:bed", "minecraft:bed"); + map.put("minecraft:standing_sign", "minecraft:sign"); + map.put("minecraft:wall_sign", "minecraft:sign"); + map.put("minecraft:piston_head", "minecraft:piston"); + map.put("minecraft:daylight_detector_inverted", "minecraft:daylight_detector"); + map.put("minecraft:unpowered_comparator", "minecraft:comparator"); + map.put("minecraft:powered_comparator", "minecraft:comparator"); + map.put("minecraft:wall_banner", "minecraft:banner"); + map.put("minecraft:standing_banner", "minecraft:banner"); + map.put("minecraft:structure_block", "minecraft:structure_block"); + map.put("minecraft:end_portal", "minecraft:end_portal"); + map.put("minecraft:end_gateway", "minecraft:end_gateway"); + map.put("minecraft:shield", "minecraft:shield"); + } + } + + private static class DataInspectorEntity implements DataInspector { + + private static final Logger a = LogManager.getLogger(PaperweightDataConverters.class); + + DataInspectorEntity() { + } + + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (nbttagcompound1.contains("EntityTag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); + String s = cmp.getString("id"); + String s1; + + if ("minecraft:armor_stand".equals(s)) { + s1 = sourceVer < 515 ? "ArmorStand" : "minecraft:armor_stand"; + } else { + if (!"minecraft:spawn_egg".equals(s)) { + return cmp; + } + + s1 = nbttagcompound2.getString("id"); + } + + boolean flag; + + flag = !nbttagcompound2.contains("id", 8); + nbttagcompound2.putString("id", s1); + + convert(LegacyType.ENTITY, nbttagcompound2, sourceVer, targetVer); + if (flag) { + nbttagcompound2.remove("id"); + } + } + + return cmp; + } + } + + + private abstract static class DataInspectorTagged implements DataInspector { + + private final ResourceLocation key; + + DataInspectorTagged(String type) { + this.key = getKey(type); + } + + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (this.key.equals(new ResourceLocation(cmp.getString("id")))) { + cmp = this.inspectChecked(cmp, sourceVer, targetVer); + } + + return cmp; + } + + abstract net.minecraft.nbt.CompoundTag inspectChecked(net.minecraft.nbt.CompoundTag nbttagcompound, int sourceVer, int targetVer); + } + + private static class DataInspectorItemList extends DataInspectorTagged { + + private final String[] keys; + + DataInspectorItemList(String oclass, String... astring) { + super(oclass); + this.keys = astring; + } + + net.minecraft.nbt.CompoundTag inspectChecked(net.minecraft.nbt.CompoundTag nbttagcompound, int sourceVer, int targetVer) { + for (String s : this.keys) { + PaperweightDataConverters.convertItems(nbttagcompound, s, sourceVer, targetVer); + } + + return nbttagcompound; + } + } + + private static class DataInspectorItem extends DataInspectorTagged { + + private final String[] keys; + + DataInspectorItem(String oclass, String... astring) { + super(oclass); + this.keys = astring; + } + + net.minecraft.nbt.CompoundTag inspectChecked(net.minecraft.nbt.CompoundTag nbttagcompound, int sourceVer, int targetVer) { + for (String key : this.keys) { + PaperweightDataConverters.convertItem(nbttagcompound, key, sourceVer, targetVer); + } + + return nbttagcompound; + } + } + + private static class DataConverterMaterialId implements DataConverter { + + private static final String[] materials = new String[2268]; + + DataConverterMaterialId() { + } + + public int getDataVersion() { + return 102; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (cmp.contains("id", 99)) { + short short0 = cmp.getShort("id"); + + if (short0 > 0 && short0 < materials.length && materials[short0] != null) { + cmp.putString("id", materials[short0]); + } + } + + return cmp; + } + + static { + materials[1] = "minecraft:stone"; + materials[2] = "minecraft:grass"; + materials[3] = "minecraft:dirt"; + materials[4] = "minecraft:cobblestone"; + materials[5] = "minecraft:planks"; + materials[6] = "minecraft:sapling"; + materials[7] = "minecraft:bedrock"; + materials[8] = "minecraft:flowing_water"; + materials[9] = "minecraft:water"; + materials[10] = "minecraft:flowing_lava"; + materials[11] = "minecraft:lava"; + materials[12] = "minecraft:sand"; + materials[13] = "minecraft:gravel"; + materials[14] = "minecraft:gold_ore"; + materials[15] = "minecraft:iron_ore"; + materials[16] = "minecraft:coal_ore"; + materials[17] = "minecraft:log"; + materials[18] = "minecraft:leaves"; + materials[19] = "minecraft:sponge"; + materials[20] = "minecraft:glass"; + materials[21] = "minecraft:lapis_ore"; + materials[22] = "minecraft:lapis_block"; + materials[23] = "minecraft:dispenser"; + materials[24] = "minecraft:sandstone"; + materials[25] = "minecraft:noteblock"; + materials[27] = "minecraft:golden_rail"; + materials[28] = "minecraft:detector_rail"; + materials[29] = "minecraft:sticky_piston"; + materials[30] = "minecraft:web"; + materials[31] = "minecraft:tallgrass"; + materials[32] = "minecraft:deadbush"; + materials[33] = "minecraft:piston"; + materials[35] = "minecraft:wool"; + materials[37] = "minecraft:yellow_flower"; + materials[38] = "minecraft:red_flower"; + materials[39] = "minecraft:brown_mushroom"; + materials[40] = "minecraft:red_mushroom"; + materials[41] = "minecraft:gold_block"; + materials[42] = "minecraft:iron_block"; + materials[43] = "minecraft:double_stone_slab"; + materials[44] = "minecraft:stone_slab"; + materials[45] = "minecraft:brick_block"; + materials[46] = "minecraft:tnt"; + materials[47] = "minecraft:bookshelf"; + materials[48] = "minecraft:mossy_cobblestone"; + materials[49] = "minecraft:obsidian"; + materials[50] = "minecraft:torch"; + materials[51] = "minecraft:fire"; + materials[52] = "minecraft:mob_spawner"; + materials[53] = "minecraft:oak_stairs"; + materials[54] = "minecraft:chest"; + materials[56] = "minecraft:diamond_ore"; + materials[57] = "minecraft:diamond_block"; + materials[58] = "minecraft:crafting_table"; + materials[60] = "minecraft:farmland"; + materials[61] = "minecraft:furnace"; + materials[62] = "minecraft:lit_furnace"; + materials[65] = "minecraft:ladder"; + materials[66] = "minecraft:rail"; + materials[67] = "minecraft:stone_stairs"; + materials[69] = "minecraft:lever"; + materials[70] = "minecraft:stone_pressure_plate"; + materials[72] = "minecraft:wooden_pressure_plate"; + materials[73] = "minecraft:redstone_ore"; + materials[76] = "minecraft:redstone_torch"; + materials[77] = "minecraft:stone_button"; + materials[78] = "minecraft:snow_layer"; + materials[79] = "minecraft:ice"; + materials[80] = "minecraft:snow"; + materials[81] = "minecraft:cactus"; + materials[82] = "minecraft:clay"; + materials[84] = "minecraft:jukebox"; + materials[85] = "minecraft:fence"; + materials[86] = "minecraft:pumpkin"; + materials[87] = "minecraft:netherrack"; + materials[88] = "minecraft:soul_sand"; + materials[89] = "minecraft:glowstone"; + materials[90] = "minecraft:portal"; + materials[91] = "minecraft:lit_pumpkin"; + materials[95] = "minecraft:stained_glass"; + materials[96] = "minecraft:trapdoor"; + materials[97] = "minecraft:monster_egg"; + materials[98] = "minecraft:stonebrick"; + materials[99] = "minecraft:brown_mushroom_block"; + materials[100] = "minecraft:red_mushroom_block"; + materials[101] = "minecraft:iron_bars"; + materials[102] = "minecraft:glass_pane"; + materials[103] = "minecraft:melon_block"; + materials[106] = "minecraft:vine"; + materials[107] = "minecraft:fence_gate"; + materials[108] = "minecraft:brick_stairs"; + materials[109] = "minecraft:stone_brick_stairs"; + materials[110] = "minecraft:mycelium"; + materials[111] = "minecraft:waterlily"; + materials[112] = "minecraft:nether_brick"; + materials[113] = "minecraft:nether_brick_fence"; + materials[114] = "minecraft:nether_brick_stairs"; + materials[116] = "minecraft:enchanting_table"; + materials[119] = "minecraft:end_portal"; + materials[120] = "minecraft:end_portal_frame"; + materials[121] = "minecraft:end_stone"; + materials[122] = "minecraft:dragon_egg"; + materials[123] = "minecraft:redstone_lamp"; + materials[125] = "minecraft:double_wooden_slab"; + materials[126] = "minecraft:wooden_slab"; + materials[127] = "minecraft:cocoa"; + materials[128] = "minecraft:sandstone_stairs"; + materials[129] = "minecraft:emerald_ore"; + materials[130] = "minecraft:ender_chest"; + materials[131] = "minecraft:tripwire_hook"; + materials[133] = "minecraft:emerald_block"; + materials[134] = "minecraft:spruce_stairs"; + materials[135] = "minecraft:birch_stairs"; + materials[136] = "minecraft:jungle_stairs"; + materials[137] = "minecraft:command_block"; + materials[138] = "minecraft:beacon"; + materials[139] = "minecraft:cobblestone_wall"; + materials[141] = "minecraft:carrots"; + materials[142] = "minecraft:potatoes"; + materials[143] = "minecraft:wooden_button"; + materials[145] = "minecraft:anvil"; + materials[146] = "minecraft:trapped_chest"; + materials[147] = "minecraft:light_weighted_pressure_plate"; + materials[148] = "minecraft:heavy_weighted_pressure_plate"; + materials[151] = "minecraft:daylight_detector"; + materials[152] = "minecraft:redstone_block"; + materials[153] = "minecraft:quartz_ore"; + materials[154] = "minecraft:hopper"; + materials[155] = "minecraft:quartz_block"; + materials[156] = "minecraft:quartz_stairs"; + materials[157] = "minecraft:activator_rail"; + materials[158] = "minecraft:dropper"; + materials[159] = "minecraft:stained_hardened_clay"; + materials[160] = "minecraft:stained_glass_pane"; + materials[161] = "minecraft:leaves2"; + materials[162] = "minecraft:log2"; + materials[163] = "minecraft:acacia_stairs"; + materials[164] = "minecraft:dark_oak_stairs"; + materials[170] = "minecraft:hay_block"; + materials[171] = "minecraft:carpet"; + materials[172] = "minecraft:hardened_clay"; + materials[173] = "minecraft:coal_block"; + materials[174] = "minecraft:packed_ice"; + materials[175] = "minecraft:double_plant"; + materials[256] = "minecraft:iron_shovel"; + materials[257] = "minecraft:iron_pickaxe"; + materials[258] = "minecraft:iron_axe"; + materials[259] = "minecraft:flint_and_steel"; + materials[260] = "minecraft:apple"; + materials[261] = "minecraft:bow"; + materials[262] = "minecraft:arrow"; + materials[263] = "minecraft:coal"; + materials[264] = "minecraft:diamond"; + materials[265] = "minecraft:iron_ingot"; + materials[266] = "minecraft:gold_ingot"; + materials[267] = "minecraft:iron_sword"; + materials[268] = "minecraft:wooden_sword"; + materials[269] = "minecraft:wooden_shovel"; + materials[270] = "minecraft:wooden_pickaxe"; + materials[271] = "minecraft:wooden_axe"; + materials[272] = "minecraft:stone_sword"; + materials[273] = "minecraft:stone_shovel"; + materials[274] = "minecraft:stone_pickaxe"; + materials[275] = "minecraft:stone_axe"; + materials[276] = "minecraft:diamond_sword"; + materials[277] = "minecraft:diamond_shovel"; + materials[278] = "minecraft:diamond_pickaxe"; + materials[279] = "minecraft:diamond_axe"; + materials[280] = "minecraft:stick"; + materials[281] = "minecraft:bowl"; + materials[282] = "minecraft:mushroom_stew"; + materials[283] = "minecraft:golden_sword"; + materials[284] = "minecraft:golden_shovel"; + materials[285] = "minecraft:golden_pickaxe"; + materials[286] = "minecraft:golden_axe"; + materials[287] = "minecraft:string"; + materials[288] = "minecraft:feather"; + materials[289] = "minecraft:gunpowder"; + materials[290] = "minecraft:wooden_hoe"; + materials[291] = "minecraft:stone_hoe"; + materials[292] = "minecraft:iron_hoe"; + materials[293] = "minecraft:diamond_hoe"; + materials[294] = "minecraft:golden_hoe"; + materials[295] = "minecraft:wheat_seeds"; + materials[296] = "minecraft:wheat"; + materials[297] = "minecraft:bread"; + materials[298] = "minecraft:leather_helmet"; + materials[299] = "minecraft:leather_chestplate"; + materials[300] = "minecraft:leather_leggings"; + materials[301] = "minecraft:leather_boots"; + materials[302] = "minecraft:chainmail_helmet"; + materials[303] = "minecraft:chainmail_chestplate"; + materials[304] = "minecraft:chainmail_leggings"; + materials[305] = "minecraft:chainmail_boots"; + materials[306] = "minecraft:iron_helmet"; + materials[307] = "minecraft:iron_chestplate"; + materials[308] = "minecraft:iron_leggings"; + materials[309] = "minecraft:iron_boots"; + materials[310] = "minecraft:diamond_helmet"; + materials[311] = "minecraft:diamond_chestplate"; + materials[312] = "minecraft:diamond_leggings"; + materials[313] = "minecraft:diamond_boots"; + materials[314] = "minecraft:golden_helmet"; + materials[315] = "minecraft:golden_chestplate"; + materials[316] = "minecraft:golden_leggings"; + materials[317] = "minecraft:golden_boots"; + materials[318] = "minecraft:flint"; + materials[319] = "minecraft:porkchop"; + materials[320] = "minecraft:cooked_porkchop"; + materials[321] = "minecraft:painting"; + materials[322] = "minecraft:golden_apple"; + materials[323] = "minecraft:sign"; + materials[324] = "minecraft:wooden_door"; + materials[325] = "minecraft:bucket"; + materials[326] = "minecraft:water_bucket"; + materials[327] = "minecraft:lava_bucket"; + materials[328] = "minecraft:minecart"; + materials[329] = "minecraft:saddle"; + materials[330] = "minecraft:iron_door"; + materials[331] = "minecraft:redstone"; + materials[332] = "minecraft:snowball"; + materials[333] = "minecraft:boat"; + materials[334] = "minecraft:leather"; + materials[335] = "minecraft:milk_bucket"; + materials[336] = "minecraft:brick"; + materials[337] = "minecraft:clay_ball"; + materials[338] = "minecraft:reeds"; + materials[339] = "minecraft:paper"; + materials[340] = "minecraft:book"; + materials[341] = "minecraft:slime_ball"; + materials[342] = "minecraft:chest_minecart"; + materials[343] = "minecraft:furnace_minecart"; + materials[344] = "minecraft:egg"; + materials[345] = "minecraft:compass"; + materials[346] = "minecraft:fishing_rod"; + materials[347] = "minecraft:clock"; + materials[348] = "minecraft:glowstone_dust"; + materials[349] = "minecraft:fish"; + materials[350] = "minecraft:cooked_fish"; // Paper - cooked_fished -> cooked_fish + materials[351] = "minecraft:dye"; + materials[352] = "minecraft:bone"; + materials[353] = "minecraft:sugar"; + materials[354] = "minecraft:cake"; + materials[355] = "minecraft:bed"; + materials[356] = "minecraft:repeater"; + materials[357] = "minecraft:cookie"; + materials[358] = "minecraft:filled_map"; + materials[359] = "minecraft:shears"; + materials[360] = "minecraft:melon"; + materials[361] = "minecraft:pumpkin_seeds"; + materials[362] = "minecraft:melon_seeds"; + materials[363] = "minecraft:beef"; + materials[364] = "minecraft:cooked_beef"; + materials[365] = "minecraft:chicken"; + materials[366] = "minecraft:cooked_chicken"; + materials[367] = "minecraft:rotten_flesh"; + materials[368] = "minecraft:ender_pearl"; + materials[369] = "minecraft:blaze_rod"; + materials[370] = "minecraft:ghast_tear"; + materials[371] = "minecraft:gold_nugget"; + materials[372] = "minecraft:nether_wart"; + materials[373] = "minecraft:potion"; + materials[374] = "minecraft:glass_bottle"; + materials[375] = "minecraft:spider_eye"; + materials[376] = "minecraft:fermented_spider_eye"; + materials[377] = "minecraft:blaze_powder"; + materials[378] = "minecraft:magma_cream"; + materials[379] = "minecraft:brewing_stand"; + materials[380] = "minecraft:cauldron"; + materials[381] = "minecraft:ender_eye"; + materials[382] = "minecraft:speckled_melon"; + materials[383] = "minecraft:spawn_egg"; + materials[384] = "minecraft:experience_bottle"; + materials[385] = "minecraft:fire_charge"; + materials[386] = "minecraft:writable_book"; + materials[387] = "minecraft:written_book"; + materials[388] = "minecraft:emerald"; + materials[389] = "minecraft:item_frame"; + materials[390] = "minecraft:flower_pot"; + materials[391] = "minecraft:carrot"; + materials[392] = "minecraft:potato"; + materials[393] = "minecraft:baked_potato"; + materials[394] = "minecraft:poisonous_potato"; + materials[395] = "minecraft:map"; + materials[396] = "minecraft:golden_carrot"; + materials[397] = "minecraft:skull"; + materials[398] = "minecraft:carrot_on_a_stick"; + materials[399] = "minecraft:nether_star"; + materials[400] = "minecraft:pumpkin_pie"; + materials[401] = "minecraft:fireworks"; + materials[402] = "minecraft:firework_charge"; + materials[403] = "minecraft:enchanted_book"; + materials[404] = "minecraft:comparator"; + materials[405] = "minecraft:netherbrick"; + materials[406] = "minecraft:quartz"; + materials[407] = "minecraft:tnt_minecart"; + materials[408] = "minecraft:hopper_minecart"; + materials[417] = "minecraft:iron_horse_armor"; + materials[418] = "minecraft:golden_horse_armor"; + materials[419] = "minecraft:diamond_horse_armor"; + materials[420] = "minecraft:lead"; + materials[421] = "minecraft:name_tag"; + materials[422] = "minecraft:command_block_minecart"; + materials[2256] = "minecraft:record_13"; + materials[2257] = "minecraft:record_cat"; + materials[2258] = "minecraft:record_blocks"; + materials[2259] = "minecraft:record_chirp"; + materials[2260] = "minecraft:record_far"; + materials[2261] = "minecraft:record_mall"; + materials[2262] = "minecraft:record_mellohi"; + materials[2263] = "minecraft:record_stal"; + materials[2264] = "minecraft:record_strad"; + materials[2265] = "minecraft:record_ward"; + materials[2266] = "minecraft:record_11"; + materials[2267] = "minecraft:record_wait"; + // Paper start + materials[409] = "minecraft:prismarine_shard"; + materials[410] = "minecraft:prismarine_crystals"; + materials[411] = "minecraft:rabbit"; + materials[412] = "minecraft:cooked_rabbit"; + materials[413] = "minecraft:rabbit_stew"; + materials[414] = "minecraft:rabbit_foot"; + materials[415] = "minecraft:rabbit_hide"; + materials[416] = "minecraft:armor_stand"; + materials[423] = "minecraft:mutton"; + materials[424] = "minecraft:cooked_mutton"; + materials[425] = "minecraft:banner"; + materials[426] = "minecraft:end_crystal"; + materials[427] = "minecraft:spruce_door"; + materials[428] = "minecraft:birch_door"; + materials[429] = "minecraft:jungle_door"; + materials[430] = "minecraft:acacia_door"; + materials[431] = "minecraft:dark_oak_door"; + materials[432] = "minecraft:chorus_fruit"; + materials[433] = "minecraft:chorus_fruit_popped"; + materials[434] = "minecraft:beetroot"; + materials[435] = "minecraft:beetroot_seeds"; + materials[436] = "minecraft:beetroot_soup"; + materials[437] = "minecraft:dragon_breath"; + materials[438] = "minecraft:splash_potion"; + materials[439] = "minecraft:spectral_arrow"; + materials[440] = "minecraft:tipped_arrow"; + materials[441] = "minecraft:lingering_potion"; + materials[442] = "minecraft:shield"; + materials[443] = "minecraft:elytra"; + materials[444] = "minecraft:spruce_boat"; + materials[445] = "minecraft:birch_boat"; + materials[446] = "minecraft:jungle_boat"; + materials[447] = "minecraft:acacia_boat"; + materials[448] = "minecraft:dark_oak_boat"; + materials[449] = "minecraft:totem_of_undying"; + materials[450] = "minecraft:shulker_shell"; + materials[452] = "minecraft:iron_nugget"; + materials[453] = "minecraft:knowledge_book"; + // Paper end + } + } + + private static class DataConverterArmorStand implements DataConverter { + + DataConverterArmorStand() { + } + + public int getDataVersion() { + return 147; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("ArmorStand".equals(cmp.getString("id")) && cmp.getBoolean("Silent") && !cmp.getBoolean("Marker")) { + cmp.remove("Silent"); + } + + return cmp; + } + } + + private static class DataConverterBanner implements DataConverter { + + DataConverterBanner() { + } + + public int getDataVersion() { + return 804; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:banner".equals(cmp.getString("id")) && cmp.contains("tag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (nbttagcompound1.contains("BlockEntityTag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); + + if (nbttagcompound2.contains("Base", 99)) { + cmp.putShort("Damage", (short) (nbttagcompound2.getShort("Base") & 15)); + if (nbttagcompound1.contains("display", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound3 = nbttagcompound1.getCompound("display"); + + if (nbttagcompound3.contains("Lore", 9)) { + net.minecraft.nbt.ListTag nbttaglist = nbttagcompound3.getList("Lore", 8); + + if (nbttaglist.size() == 1 && "(+NBT)".equals(nbttaglist.getString(0))) { + return cmp; + } + } + } + + nbttagcompound2.remove("Base"); + if (nbttagcompound2.isEmpty()) { + nbttagcompound1.remove("BlockEntityTag"); + } + + if (nbttagcompound1.isEmpty()) { + cmp.remove("tag"); + } + } + } + } + + return cmp; + } + } + + private static class DataConverterPotionId implements DataConverter { + + private static final String[] potions = new String[128]; + + DataConverterPotionId() { + } + + public int getDataVersion() { + return 102; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:potion".equals(cmp.getString("id"))) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + short short0 = cmp.getShort("Damage"); + + if (!nbttagcompound1.contains("Potion", 8)) { + String s = DataConverterPotionId.potions[short0 & 127]; + + nbttagcompound1.putString("Potion", s == null ? "minecraft:water" : s); + cmp.put("tag", nbttagcompound1); + if ((short0 & 16384) == 16384) { + cmp.putString("id", "minecraft:splash_potion"); + } + } + + if (short0 != 0) { + cmp.putShort("Damage", (short) 0); + } + } + + return cmp; + } + + static { + DataConverterPotionId.potions[0] = "minecraft:water"; + DataConverterPotionId.potions[1] = "minecraft:regeneration"; + DataConverterPotionId.potions[2] = "minecraft:swiftness"; + DataConverterPotionId.potions[3] = "minecraft:fire_resistance"; + DataConverterPotionId.potions[4] = "minecraft:poison"; + DataConverterPotionId.potions[5] = "minecraft:healing"; + DataConverterPotionId.potions[6] = "minecraft:night_vision"; + DataConverterPotionId.potions[7] = null; + DataConverterPotionId.potions[8] = "minecraft:weakness"; + DataConverterPotionId.potions[9] = "minecraft:strength"; + DataConverterPotionId.potions[10] = "minecraft:slowness"; + DataConverterPotionId.potions[11] = "minecraft:leaping"; + DataConverterPotionId.potions[12] = "minecraft:harming"; + DataConverterPotionId.potions[13] = "minecraft:water_breathing"; + DataConverterPotionId.potions[14] = "minecraft:invisibility"; + DataConverterPotionId.potions[15] = null; + DataConverterPotionId.potions[16] = "minecraft:awkward"; + DataConverterPotionId.potions[17] = "minecraft:regeneration"; + DataConverterPotionId.potions[18] = "minecraft:swiftness"; + DataConverterPotionId.potions[19] = "minecraft:fire_resistance"; + DataConverterPotionId.potions[20] = "minecraft:poison"; + DataConverterPotionId.potions[21] = "minecraft:healing"; + DataConverterPotionId.potions[22] = "minecraft:night_vision"; + DataConverterPotionId.potions[23] = null; + DataConverterPotionId.potions[24] = "minecraft:weakness"; + DataConverterPotionId.potions[25] = "minecraft:strength"; + DataConverterPotionId.potions[26] = "minecraft:slowness"; + DataConverterPotionId.potions[27] = "minecraft:leaping"; + DataConverterPotionId.potions[28] = "minecraft:harming"; + DataConverterPotionId.potions[29] = "minecraft:water_breathing"; + DataConverterPotionId.potions[30] = "minecraft:invisibility"; + DataConverterPotionId.potions[31] = null; + DataConverterPotionId.potions[32] = "minecraft:thick"; + DataConverterPotionId.potions[33] = "minecraft:strong_regeneration"; + DataConverterPotionId.potions[34] = "minecraft:strong_swiftness"; + DataConverterPotionId.potions[35] = "minecraft:fire_resistance"; + DataConverterPotionId.potions[36] = "minecraft:strong_poison"; + DataConverterPotionId.potions[37] = "minecraft:strong_healing"; + DataConverterPotionId.potions[38] = "minecraft:night_vision"; + DataConverterPotionId.potions[39] = null; + DataConverterPotionId.potions[40] = "minecraft:weakness"; + DataConverterPotionId.potions[41] = "minecraft:strong_strength"; + DataConverterPotionId.potions[42] = "minecraft:slowness"; + DataConverterPotionId.potions[43] = "minecraft:strong_leaping"; + DataConverterPotionId.potions[44] = "minecraft:strong_harming"; + DataConverterPotionId.potions[45] = "minecraft:water_breathing"; + DataConverterPotionId.potions[46] = "minecraft:invisibility"; + DataConverterPotionId.potions[47] = null; + DataConverterPotionId.potions[48] = null; + DataConverterPotionId.potions[49] = "minecraft:strong_regeneration"; + DataConverterPotionId.potions[50] = "minecraft:strong_swiftness"; + DataConverterPotionId.potions[51] = "minecraft:fire_resistance"; + DataConverterPotionId.potions[52] = "minecraft:strong_poison"; + DataConverterPotionId.potions[53] = "minecraft:strong_healing"; + DataConverterPotionId.potions[54] = "minecraft:night_vision"; + DataConverterPotionId.potions[55] = null; + DataConverterPotionId.potions[56] = "minecraft:weakness"; + DataConverterPotionId.potions[57] = "minecraft:strong_strength"; + DataConverterPotionId.potions[58] = "minecraft:slowness"; + DataConverterPotionId.potions[59] = "minecraft:strong_leaping"; + DataConverterPotionId.potions[60] = "minecraft:strong_harming"; + DataConverterPotionId.potions[61] = "minecraft:water_breathing"; + DataConverterPotionId.potions[62] = "minecraft:invisibility"; + DataConverterPotionId.potions[63] = null; + DataConverterPotionId.potions[64] = "minecraft:mundane"; + DataConverterPotionId.potions[65] = "minecraft:long_regeneration"; + DataConverterPotionId.potions[66] = "minecraft:long_swiftness"; + DataConverterPotionId.potions[67] = "minecraft:long_fire_resistance"; + DataConverterPotionId.potions[68] = "minecraft:long_poison"; + DataConverterPotionId.potions[69] = "minecraft:healing"; + DataConverterPotionId.potions[70] = "minecraft:long_night_vision"; + DataConverterPotionId.potions[71] = null; + DataConverterPotionId.potions[72] = "minecraft:long_weakness"; + DataConverterPotionId.potions[73] = "minecraft:long_strength"; + DataConverterPotionId.potions[74] = "minecraft:long_slowness"; + DataConverterPotionId.potions[75] = "minecraft:long_leaping"; + DataConverterPotionId.potions[76] = "minecraft:harming"; + DataConverterPotionId.potions[77] = "minecraft:long_water_breathing"; + DataConverterPotionId.potions[78] = "minecraft:long_invisibility"; + DataConverterPotionId.potions[79] = null; + DataConverterPotionId.potions[80] = "minecraft:awkward"; + DataConverterPotionId.potions[81] = "minecraft:long_regeneration"; + DataConverterPotionId.potions[82] = "minecraft:long_swiftness"; + DataConverterPotionId.potions[83] = "minecraft:long_fire_resistance"; + DataConverterPotionId.potions[84] = "minecraft:long_poison"; + DataConverterPotionId.potions[85] = "minecraft:healing"; + DataConverterPotionId.potions[86] = "minecraft:long_night_vision"; + DataConverterPotionId.potions[87] = null; + DataConverterPotionId.potions[88] = "minecraft:long_weakness"; + DataConverterPotionId.potions[89] = "minecraft:long_strength"; + DataConverterPotionId.potions[90] = "minecraft:long_slowness"; + DataConverterPotionId.potions[91] = "minecraft:long_leaping"; + DataConverterPotionId.potions[92] = "minecraft:harming"; + DataConverterPotionId.potions[93] = "minecraft:long_water_breathing"; + DataConverterPotionId.potions[94] = "minecraft:long_invisibility"; + DataConverterPotionId.potions[95] = null; + DataConverterPotionId.potions[96] = "minecraft:thick"; + DataConverterPotionId.potions[97] = "minecraft:regeneration"; + DataConverterPotionId.potions[98] = "minecraft:swiftness"; + DataConverterPotionId.potions[99] = "minecraft:long_fire_resistance"; + DataConverterPotionId.potions[100] = "minecraft:poison"; + DataConverterPotionId.potions[101] = "minecraft:strong_healing"; + DataConverterPotionId.potions[102] = "minecraft:long_night_vision"; + DataConverterPotionId.potions[103] = null; + DataConverterPotionId.potions[104] = "minecraft:long_weakness"; + DataConverterPotionId.potions[105] = "minecraft:strength"; + DataConverterPotionId.potions[106] = "minecraft:long_slowness"; + DataConverterPotionId.potions[107] = "minecraft:leaping"; + DataConverterPotionId.potions[108] = "minecraft:strong_harming"; + DataConverterPotionId.potions[109] = "minecraft:long_water_breathing"; + DataConverterPotionId.potions[110] = "minecraft:long_invisibility"; + DataConverterPotionId.potions[111] = null; + DataConverterPotionId.potions[112] = null; + DataConverterPotionId.potions[113] = "minecraft:regeneration"; + DataConverterPotionId.potions[114] = "minecraft:swiftness"; + DataConverterPotionId.potions[115] = "minecraft:long_fire_resistance"; + DataConverterPotionId.potions[116] = "minecraft:poison"; + DataConverterPotionId.potions[117] = "minecraft:strong_healing"; + DataConverterPotionId.potions[118] = "minecraft:long_night_vision"; + DataConverterPotionId.potions[119] = null; + DataConverterPotionId.potions[120] = "minecraft:long_weakness"; + DataConverterPotionId.potions[121] = "minecraft:strength"; + DataConverterPotionId.potions[122] = "minecraft:long_slowness"; + DataConverterPotionId.potions[123] = "minecraft:leaping"; + DataConverterPotionId.potions[124] = "minecraft:strong_harming"; + DataConverterPotionId.potions[125] = "minecraft:long_water_breathing"; + DataConverterPotionId.potions[126] = "minecraft:long_invisibility"; + DataConverterPotionId.potions[127] = null; + } + } + + private static class DataConverterSpawnEgg implements DataConverter { + + private static final String[] eggs = new String[256]; + + DataConverterSpawnEgg() { + } + + public int getDataVersion() { + return 105; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:spawn_egg".equals(cmp.getString("id"))) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); + short short0 = cmp.getShort("Damage"); + + if (!nbttagcompound2.contains("id", 8)) { + String s = DataConverterSpawnEgg.eggs[short0 & 255]; + + if (s != null) { + nbttagcompound2.putString("id", s); + nbttagcompound1.put("EntityTag", nbttagcompound2); + cmp.put("tag", nbttagcompound1); + } + } + + if (short0 != 0) { + cmp.putShort("Damage", (short) 0); + } + } + + return cmp; + } + + static { + + DataConverterSpawnEgg.eggs[1] = "Item"; + DataConverterSpawnEgg.eggs[2] = "XPOrb"; + DataConverterSpawnEgg.eggs[7] = "ThrownEgg"; + DataConverterSpawnEgg.eggs[8] = "LeashKnot"; + DataConverterSpawnEgg.eggs[9] = "Painting"; + DataConverterSpawnEgg.eggs[10] = "Arrow"; + DataConverterSpawnEgg.eggs[11] = "Snowball"; + DataConverterSpawnEgg.eggs[12] = "Fireball"; + DataConverterSpawnEgg.eggs[13] = "SmallFireball"; + DataConverterSpawnEgg.eggs[14] = "ThrownEnderpearl"; + DataConverterSpawnEgg.eggs[15] = "EyeOfEnderSignal"; + DataConverterSpawnEgg.eggs[16] = "ThrownPotion"; + DataConverterSpawnEgg.eggs[17] = "ThrownExpBottle"; + DataConverterSpawnEgg.eggs[18] = "ItemFrame"; + DataConverterSpawnEgg.eggs[19] = "WitherSkull"; + DataConverterSpawnEgg.eggs[20] = "PrimedTnt"; + DataConverterSpawnEgg.eggs[21] = "FallingSand"; + DataConverterSpawnEgg.eggs[22] = "FireworksRocketEntity"; + DataConverterSpawnEgg.eggs[23] = "TippedArrow"; + DataConverterSpawnEgg.eggs[24] = "SpectralArrow"; + DataConverterSpawnEgg.eggs[25] = "ShulkerBullet"; + DataConverterSpawnEgg.eggs[26] = "DragonFireball"; + DataConverterSpawnEgg.eggs[30] = "ArmorStand"; + DataConverterSpawnEgg.eggs[41] = "Boat"; + DataConverterSpawnEgg.eggs[42] = "MinecartRideable"; + DataConverterSpawnEgg.eggs[43] = "MinecartChest"; + DataConverterSpawnEgg.eggs[44] = "MinecartFurnace"; + DataConverterSpawnEgg.eggs[45] = "MinecartTNT"; + DataConverterSpawnEgg.eggs[46] = "MinecartHopper"; + DataConverterSpawnEgg.eggs[47] = "MinecartSpawner"; + DataConverterSpawnEgg.eggs[40] = "MinecartCommandBlock"; + DataConverterSpawnEgg.eggs[48] = "Mob"; + DataConverterSpawnEgg.eggs[49] = "Monster"; + DataConverterSpawnEgg.eggs[50] = "Creeper"; + DataConverterSpawnEgg.eggs[51] = "Skeleton"; + DataConverterSpawnEgg.eggs[52] = "Spider"; + DataConverterSpawnEgg.eggs[53] = "Giant"; + DataConverterSpawnEgg.eggs[54] = "Zombie"; + DataConverterSpawnEgg.eggs[55] = "Slime"; + DataConverterSpawnEgg.eggs[56] = "Ghast"; + DataConverterSpawnEgg.eggs[57] = "PigZombie"; + DataConverterSpawnEgg.eggs[58] = "Enderman"; + DataConverterSpawnEgg.eggs[59] = "CaveSpider"; + DataConverterSpawnEgg.eggs[60] = "Silverfish"; + DataConverterSpawnEgg.eggs[61] = "Blaze"; + DataConverterSpawnEgg.eggs[62] = "LavaSlime"; + DataConverterSpawnEgg.eggs[63] = "EnderDragon"; + DataConverterSpawnEgg.eggs[64] = "WitherBoss"; + DataConverterSpawnEgg.eggs[65] = "Bat"; + DataConverterSpawnEgg.eggs[66] = "Witch"; + DataConverterSpawnEgg.eggs[67] = "Endermite"; + DataConverterSpawnEgg.eggs[68] = "Guardian"; + DataConverterSpawnEgg.eggs[69] = "Shulker"; + DataConverterSpawnEgg.eggs[90] = "Pig"; + DataConverterSpawnEgg.eggs[91] = "Sheep"; + DataConverterSpawnEgg.eggs[92] = "Cow"; + DataConverterSpawnEgg.eggs[93] = "Chicken"; + DataConverterSpawnEgg.eggs[94] = "Squid"; + DataConverterSpawnEgg.eggs[95] = "Wolf"; + DataConverterSpawnEgg.eggs[96] = "MushroomCow"; + DataConverterSpawnEgg.eggs[97] = "SnowMan"; + DataConverterSpawnEgg.eggs[98] = "Ozelot"; + DataConverterSpawnEgg.eggs[99] = "VillagerGolem"; + DataConverterSpawnEgg.eggs[100] = "EntityHorse"; + DataConverterSpawnEgg.eggs[101] = "Rabbit"; + DataConverterSpawnEgg.eggs[120] = "Villager"; + DataConverterSpawnEgg.eggs[200] = "EnderCrystal"; + } + } + + private static class DataConverterMinecart implements DataConverter { + + private static final List a = Lists.newArrayList("MinecartRideable", "MinecartChest", "MinecartFurnace", "MinecartTNT", "MinecartSpawner", "MinecartHopper", "MinecartCommandBlock"); + + DataConverterMinecart() { + } + + public int getDataVersion() { + return 106; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("Minecart".equals(cmp.getString("id"))) { + String s = "MinecartRideable"; + int i = cmp.getInt("Type"); + + if (i > 0 && i < DataConverterMinecart.a.size()) { + s = DataConverterMinecart.a.get(i); + } + + cmp.putString("id", s); + cmp.remove("Type"); + } + + return cmp; + } + } + + private static class DataConverterMobSpawner implements DataConverter { + + DataConverterMobSpawner() { + } + + public int getDataVersion() { + return 107; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (!"MobSpawner".equals(cmp.getString("id"))) { + return cmp; + } else { + if (cmp.contains("EntityId", 8)) { + String s = cmp.getString("EntityId"); + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("SpawnData"); + + nbttagcompound1.putString("id", s.isEmpty() ? "Pig" : s); + cmp.put("SpawnData", nbttagcompound1); + cmp.remove("EntityId"); + } + + if (cmp.contains("SpawnPotentials", 9)) { + net.minecraft.nbt.ListTag nbttaglist = cmp.getList("SpawnPotentials", 10); + + for (int i = 0; i < nbttaglist.size(); ++i) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompound(i); + + if (nbttagcompound2.contains("Type", 8)) { + net.minecraft.nbt.CompoundTag nbttagcompound3 = nbttagcompound2.getCompound("Properties"); + + nbttagcompound3.putString("id", nbttagcompound2.getString("Type")); + nbttagcompound2.put("Entity", nbttagcompound3); + nbttagcompound2.remove("Type"); + nbttagcompound2.remove("Properties"); + } + } + } + + return cmp; + } + } + } + + private static class DataConverterUUID implements DataConverter { + + DataConverterUUID() { + } + + public int getDataVersion() { + return 108; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (cmp.contains("UUID", 8)) { + cmp.putUUID("UUID", UUID.fromString(cmp.getString("UUID"))); + } + + return cmp; + } + } + + private static class DataConverterHealth implements DataConverter { + + private static final Set a = Sets.newHashSet("ArmorStand", "Bat", "Blaze", "CaveSpider", "Chicken", "Cow", "Creeper", "EnderDragon", "Enderman", "Endermite", "EntityHorse", "Ghast", "Giant", "Guardian", "LavaSlime", "MushroomCow", "Ozelot", "Pig", "PigZombie", "Rabbit", "Sheep", "Shulker", "Silverfish", "Skeleton", "Slime", "SnowMan", "Spider", "Squid", "Villager", "VillagerGolem", "Witch", "WitherBoss", "Wolf", "Zombie"); + + DataConverterHealth() { + } + + public int getDataVersion() { + return 109; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (DataConverterHealth.a.contains(cmp.getString("id"))) { + float f; + + if (cmp.contains("HealF", 99)) { + f = cmp.getFloat("HealF"); + cmp.remove("HealF"); + } else { + if (!cmp.contains("Health", 99)) { + return cmp; + } + + f = cmp.getFloat("Health"); + } + + cmp.putFloat("Health", f); + } + + return cmp; + } + } + + private static class DataConverterSaddle implements DataConverter { + + DataConverterSaddle() { + } + + public int getDataVersion() { + return 110; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("EntityHorse".equals(cmp.getString("id")) && !cmp.contains("SaddleItem", 10) && cmp.getBoolean("Saddle")) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = new net.minecraft.nbt.CompoundTag(); + + nbttagcompound1.putString("id", "minecraft:saddle"); + nbttagcompound1.putByte("Count", (byte) 1); + nbttagcompound1.putShort("Damage", (short) 0); + cmp.put("SaddleItem", nbttagcompound1); + cmp.remove("Saddle"); + } + + return cmp; + } + } + + private static class DataConverterHanging implements DataConverter { + + DataConverterHanging() { + } + + public int getDataVersion() { + return 111; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + String s = cmp.getString("id"); + boolean flag = "Painting".equals(s); + boolean flag1 = "ItemFrame".equals(s); + + if ((flag || flag1) && !cmp.contains("Facing", 99)) { + Direction enumdirection; + + if (cmp.contains("Direction", 99)) { + enumdirection = Direction.from2DDataValue(cmp.getByte("Direction")); + cmp.putInt("TileX", cmp.getInt("TileX") + enumdirection.getStepX()); + cmp.putInt("TileY", cmp.getInt("TileY") + enumdirection.getStepY()); + cmp.putInt("TileZ", cmp.getInt("TileZ") + enumdirection.getStepZ()); + cmp.remove("Direction"); + if (flag1 && cmp.contains("ItemRotation", 99)) { + cmp.putByte("ItemRotation", (byte) (cmp.getByte("ItemRotation") * 2)); + } + } else { + enumdirection = Direction.from2DDataValue(cmp.getByte("Dir")); + cmp.remove("Dir"); + } + + cmp.putByte("Facing", (byte) enumdirection.get2DDataValue()); + } + + return cmp; + } + } + + private static class DataConverterDropChances implements DataConverter { + + DataConverterDropChances() { + } + + public int getDataVersion() { + return 113; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + net.minecraft.nbt.ListTag nbttaglist; + + if (cmp.contains("HandDropChances", 9)) { + nbttaglist = cmp.getList("HandDropChances", 5); + if (nbttaglist.size() == 2 && nbttaglist.getFloat(0) == 0.0F && nbttaglist.getFloat(1) == 0.0F) { + cmp.remove("HandDropChances"); + } + } + + if (cmp.contains("ArmorDropChances", 9)) { + nbttaglist = cmp.getList("ArmorDropChances", 5); + if (nbttaglist.size() == 4 && nbttaglist.getFloat(0) == 0.0F && nbttaglist.getFloat(1) == 0.0F && nbttaglist.getFloat(2) == 0.0F && nbttaglist.getFloat(3) == 0.0F) { + cmp.remove("ArmorDropChances"); + } + } + + return cmp; + } + } + + private static class DataConverterRiding implements DataConverter { + + DataConverterRiding() { + } + + public int getDataVersion() { + return 135; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + while (cmp.contains("Riding", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = this.b(cmp); + + this.convert(cmp, nbttagcompound1); + cmp = nbttagcompound1; + } + + return cmp; + } + + protected void convert(net.minecraft.nbt.CompoundTag nbttagcompound, net.minecraft.nbt.CompoundTag nbttagcompound1) { + net.minecraft.nbt.ListTag nbttaglist = new net.minecraft.nbt.ListTag(); + + nbttaglist.add(nbttagcompound); + nbttagcompound1.put("Passengers", nbttaglist); + } + + protected net.minecraft.nbt.CompoundTag b(net.minecraft.nbt.CompoundTag nbttagcompound) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Riding"); + + nbttagcompound.remove("Riding"); + return nbttagcompound1; + } + } + + private static class DataConverterBook implements DataConverter { + + DataConverterBook() { + } + + public int getDataVersion() { + return 165; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:written_book".equals(cmp.getString("id"))) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (nbttagcompound1.contains("pages", 9)) { + net.minecraft.nbt.ListTag nbttaglist = nbttagcompound1.getList("pages", 8); + + for (int i = 0; i < nbttaglist.size(); ++i) { + String s = nbttaglist.getString(i); + Component object = null; + + if (!"null".equals(s) && !StringUtil.isNullOrEmpty(s)) { + if ((s.charAt(0) != 34 || s.charAt(s.length() - 1) != 34) && (s.charAt(0) != 123 || s.charAt(s.length() - 1) != 125)) { + object = new TextComponent(s); + } else { + try { + object = GsonHelper.fromJson(DataConverterSignText.a, s, Component.class, true); + if (object == null) { + object = new TextComponent(""); + } + } catch (JsonParseException jsonparseexception) { + ; + } + + if (object == null) { + try { + object = Component.Serializer.fromJson(s); + } catch (JsonParseException jsonparseexception1) { + ; + } + } + + if (object == null) { + try { + object = Component.Serializer.fromJsonLenient(s); + } catch (JsonParseException jsonparseexception2) { + ; + } + } + + if (object == null) { + object = new TextComponent(s); + } + } + } else { + object = new TextComponent(""); + } + + nbttaglist.set(i, net.minecraft.nbt.StringTag.valueOf(Component.Serializer.toJson(object))); + } + + nbttagcompound1.put("pages", nbttaglist); + } + } + + return cmp; + } + } + + private static class DataConverterCookedFish implements DataConverter { + + private static final ResourceLocation a = new ResourceLocation("cooked_fished"); + + DataConverterCookedFish() { + } + + public int getDataVersion() { + return 502; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (cmp.contains("id", 8) && DataConverterCookedFish.a.equals(new ResourceLocation(cmp.getString("id")))) { + cmp.putString("id", "minecraft:cooked_fish"); + } + + return cmp; + } + } + + private static class DataConverterZombie implements DataConverter { + + private static final Random a = new Random(); + + DataConverterZombie() { + } + + public int getDataVersion() { + return 502; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("Zombie".equals(cmp.getString("id")) && cmp.getBoolean("IsVillager")) { + if (!cmp.contains("ZombieType", 99)) { + int i = -1; + + if (cmp.contains("VillagerProfession", 99)) { + try { + i = this.convert(cmp.getInt("VillagerProfession")); + } catch (RuntimeException runtimeexception) { + ; + } + } + + if (i == -1) { + i = this.convert(DataConverterZombie.a.nextInt(6)); + } + + cmp.putInt("ZombieType", i); + } + + cmp.remove("IsVillager"); + } + + return cmp; + } + + private int convert(int i) { + return i >= 0 && i < 6 ? i : -1; + } + } + + private static class DataConverterVBO implements DataConverter { + + DataConverterVBO() { + } + + public int getDataVersion() { + return 505; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + cmp.putString("useVbo", "true"); + return cmp; + } + } + + private static class DataConverterGuardian implements DataConverter { + + DataConverterGuardian() { + } + + public int getDataVersion() { + return 700; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("Guardian".equals(cmp.getString("id"))) { + if (cmp.getBoolean("Elder")) { + cmp.putString("id", "ElderGuardian"); + } + + cmp.remove("Elder"); + } + + return cmp; + } + } + + private static class DataConverterSkeleton implements DataConverter { + + DataConverterSkeleton() { + } + + public int getDataVersion() { + return 701; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + String s = cmp.getString("id"); + + if ("Skeleton".equals(s)) { + int i = cmp.getInt("SkeletonType"); + + if (i == 1) { + cmp.putString("id", "WitherSkeleton"); + } else if (i == 2) { + cmp.putString("id", "Stray"); + } + + cmp.remove("SkeletonType"); + } + + return cmp; + } + } + + private static class DataConverterZombieType implements DataConverter { + + DataConverterZombieType() { + } + + public int getDataVersion() { + return 702; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("Zombie".equals(cmp.getString("id"))) { + int i = cmp.getInt("ZombieType"); + + switch (i) { + case 0: + default: + break; + + case 1: + case 2: + case 3: + case 4: + case 5: + cmp.putString("id", "ZombieVillager"); + cmp.putInt("Profession", i - 1); + break; + + case 6: + cmp.putString("id", "Husk"); + } + + cmp.remove("ZombieType"); + } + + return cmp; + } + } + + private static class DataConverterHorse implements DataConverter { + + DataConverterHorse() { + } + + public int getDataVersion() { + return 703; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("EntityHorse".equals(cmp.getString("id"))) { + int i = cmp.getInt("Type"); + + switch (i) { + case 0: + default: + cmp.putString("id", "Horse"); + break; + + case 1: + cmp.putString("id", "Donkey"); + break; + + case 2: + cmp.putString("id", "Mule"); + break; + + case 3: + cmp.putString("id", "ZombieHorse"); + break; + + case 4: + cmp.putString("id", "SkeletonHorse"); + } + + cmp.remove("Type"); + } + + return cmp; + } + } + + private static class DataConverterTileEntity implements DataConverter { + + private static final Map a = Maps.newHashMap(); + + DataConverterTileEntity() { + } + + public int getDataVersion() { + return 704; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + String s = DataConverterTileEntity.a.get(cmp.getString("id")); + + if (s != null) { + cmp.putString("id", s); + } + + return cmp; + } + + static { + DataConverterTileEntity.a.put("Airportal", "minecraft:end_portal"); + DataConverterTileEntity.a.put("Banner", "minecraft:banner"); + DataConverterTileEntity.a.put("Beacon", "minecraft:beacon"); + DataConverterTileEntity.a.put("Cauldron", "minecraft:brewing_stand"); + DataConverterTileEntity.a.put("Chest", "minecraft:chest"); + DataConverterTileEntity.a.put("Comparator", "minecraft:comparator"); + DataConverterTileEntity.a.put("Control", "minecraft:command_block"); + DataConverterTileEntity.a.put("DLDetector", "minecraft:daylight_detector"); + DataConverterTileEntity.a.put("Dropper", "minecraft:dropper"); + DataConverterTileEntity.a.put("EnchantTable", "minecraft:enchanting_table"); + DataConverterTileEntity.a.put("EndGateway", "minecraft:end_gateway"); + DataConverterTileEntity.a.put("EnderChest", "minecraft:ender_chest"); + DataConverterTileEntity.a.put("FlowerPot", "minecraft:flower_pot"); + DataConverterTileEntity.a.put("Furnace", "minecraft:furnace"); + DataConverterTileEntity.a.put("Hopper", "minecraft:hopper"); + DataConverterTileEntity.a.put("MobSpawner", "minecraft:mob_spawner"); + DataConverterTileEntity.a.put("Music", "minecraft:noteblock"); + DataConverterTileEntity.a.put("Piston", "minecraft:piston"); + DataConverterTileEntity.a.put("RecordPlayer", "minecraft:jukebox"); + DataConverterTileEntity.a.put("Sign", "minecraft:sign"); + DataConverterTileEntity.a.put("Skull", "minecraft:skull"); + DataConverterTileEntity.a.put("Structure", "minecraft:structure_block"); + DataConverterTileEntity.a.put("Trap", "minecraft:dispenser"); + } + } + + private static class DataConverterEntity implements DataConverter { + + private static final Map a = Maps.newHashMap(); + + DataConverterEntity() { + } + + public int getDataVersion() { + return 704; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + String s = DataConverterEntity.a.get(cmp.getString("id")); + + if (s != null) { + cmp.putString("id", s); + } + + return cmp; + } + + static { + DataConverterEntity.a.put("AreaEffectCloud", "minecraft:area_effect_cloud"); + DataConverterEntity.a.put("ArmorStand", "minecraft:armor_stand"); + DataConverterEntity.a.put("Arrow", "minecraft:arrow"); + DataConverterEntity.a.put("Bat", "minecraft:bat"); + DataConverterEntity.a.put("Blaze", "minecraft:blaze"); + DataConverterEntity.a.put("Boat", "minecraft:boat"); + DataConverterEntity.a.put("CaveSpider", "minecraft:cave_spider"); + DataConverterEntity.a.put("Chicken", "minecraft:chicken"); + DataConverterEntity.a.put("Cow", "minecraft:cow"); + DataConverterEntity.a.put("Creeper", "minecraft:creeper"); + DataConverterEntity.a.put("Donkey", "minecraft:donkey"); + DataConverterEntity.a.put("DragonFireball", "minecraft:dragon_fireball"); + DataConverterEntity.a.put("ElderGuardian", "minecraft:elder_guardian"); + DataConverterEntity.a.put("EnderCrystal", "minecraft:ender_crystal"); + DataConverterEntity.a.put("EnderDragon", "minecraft:ender_dragon"); + DataConverterEntity.a.put("Enderman", "minecraft:enderman"); + DataConverterEntity.a.put("Endermite", "minecraft:endermite"); + DataConverterEntity.a.put("EyeOfEnderSignal", "minecraft:eye_of_ender_signal"); + DataConverterEntity.a.put("FallingSand", "minecraft:falling_block"); + DataConverterEntity.a.put("Fireball", "minecraft:fireball"); + DataConverterEntity.a.put("FireworksRocketEntity", "minecraft:fireworks_rocket"); + DataConverterEntity.a.put("Ghast", "minecraft:ghast"); + DataConverterEntity.a.put("Giant", "minecraft:giant"); + DataConverterEntity.a.put("Guardian", "minecraft:guardian"); + DataConverterEntity.a.put("Horse", "minecraft:horse"); + DataConverterEntity.a.put("Husk", "minecraft:husk"); + DataConverterEntity.a.put("Item", "minecraft:item"); + DataConverterEntity.a.put("ItemFrame", "minecraft:item_frame"); + DataConverterEntity.a.put("LavaSlime", "minecraft:magma_cube"); + DataConverterEntity.a.put("LeashKnot", "minecraft:leash_knot"); + DataConverterEntity.a.put("MinecartChest", "minecraft:chest_minecart"); + DataConverterEntity.a.put("MinecartCommandBlock", "minecraft:commandblock_minecart"); + DataConverterEntity.a.put("MinecartFurnace", "minecraft:furnace_minecart"); + DataConverterEntity.a.put("MinecartHopper", "minecraft:hopper_minecart"); + DataConverterEntity.a.put("MinecartRideable", "minecraft:minecart"); + DataConverterEntity.a.put("MinecartSpawner", "minecraft:spawner_minecart"); + DataConverterEntity.a.put("MinecartTNT", "minecraft:tnt_minecart"); + DataConverterEntity.a.put("Mule", "minecraft:mule"); + DataConverterEntity.a.put("MushroomCow", "minecraft:mooshroom"); + DataConverterEntity.a.put("Ozelot", "minecraft:ocelot"); + DataConverterEntity.a.put("Painting", "minecraft:painting"); + DataConverterEntity.a.put("Pig", "minecraft:pig"); + DataConverterEntity.a.put("PigZombie", "minecraft:zombie_pigman"); + DataConverterEntity.a.put("PolarBear", "minecraft:polar_bear"); + DataConverterEntity.a.put("PrimedTnt", "minecraft:tnt"); + DataConverterEntity.a.put("Rabbit", "minecraft:rabbit"); + DataConverterEntity.a.put("Sheep", "minecraft:sheep"); + DataConverterEntity.a.put("Shulker", "minecraft:shulker"); + DataConverterEntity.a.put("ShulkerBullet", "minecraft:shulker_bullet"); + DataConverterEntity.a.put("Silverfish", "minecraft:silverfish"); + DataConverterEntity.a.put("Skeleton", "minecraft:skeleton"); + DataConverterEntity.a.put("SkeletonHorse", "minecraft:skeleton_horse"); + DataConverterEntity.a.put("Slime", "minecraft:slime"); + DataConverterEntity.a.put("SmallFireball", "minecraft:small_fireball"); + DataConverterEntity.a.put("SnowMan", "minecraft:snowman"); + DataConverterEntity.a.put("Snowball", "minecraft:snowball"); + DataConverterEntity.a.put("SpectralArrow", "minecraft:spectral_arrow"); + DataConverterEntity.a.put("Spider", "minecraft:spider"); + DataConverterEntity.a.put("Squid", "minecraft:squid"); + DataConverterEntity.a.put("Stray", "minecraft:stray"); + DataConverterEntity.a.put("ThrownEgg", "minecraft:egg"); + DataConverterEntity.a.put("ThrownEnderpearl", "minecraft:ender_pearl"); + DataConverterEntity.a.put("ThrownExpBottle", "minecraft:xp_bottle"); + DataConverterEntity.a.put("ThrownPotion", "minecraft:potion"); + DataConverterEntity.a.put("Villager", "minecraft:villager"); + DataConverterEntity.a.put("VillagerGolem", "minecraft:villager_golem"); + DataConverterEntity.a.put("Witch", "minecraft:witch"); + DataConverterEntity.a.put("WitherBoss", "minecraft:wither"); + DataConverterEntity.a.put("WitherSkeleton", "minecraft:wither_skeleton"); + DataConverterEntity.a.put("WitherSkull", "minecraft:wither_skull"); + DataConverterEntity.a.put("Wolf", "minecraft:wolf"); + DataConverterEntity.a.put("XPOrb", "minecraft:xp_orb"); + DataConverterEntity.a.put("Zombie", "minecraft:zombie"); + DataConverterEntity.a.put("ZombieHorse", "minecraft:zombie_horse"); + DataConverterEntity.a.put("ZombieVillager", "minecraft:zombie_villager"); + } + } + + private static class DataConverterPotionWater implements DataConverter { + + DataConverterPotionWater() { + } + + public int getDataVersion() { + return 806; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + String s = cmp.getString("id"); + + if ("minecraft:potion".equals(s) || "minecraft:splash_potion".equals(s) || "minecraft:lingering_potion".equals(s) || "minecraft:tipped_arrow".equals(s)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (!nbttagcompound1.contains("Potion", 8)) { + nbttagcompound1.putString("Potion", "minecraft:water"); + } + + if (!cmp.contains("tag", 10)) { + cmp.put("tag", nbttagcompound1); + } + } + + return cmp; + } + } + + private static class DataConverterShulker implements DataConverter { + + DataConverterShulker() { + } + + public int getDataVersion() { + return 808; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:shulker".equals(cmp.getString("id")) && !cmp.contains("Color", 99)) { + cmp.putByte("Color", (byte) 10); + } + + return cmp; + } + } + + private static class DataConverterShulkerBoxItem implements DataConverter { + + public static final String[] a = new String[] { "minecraft:white_shulker_box", "minecraft:orange_shulker_box", "minecraft:magenta_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:yellow_shulker_box", "minecraft:lime_shulker_box", "minecraft:pink_shulker_box", "minecraft:gray_shulker_box", "minecraft:silver_shulker_box", "minecraft:cyan_shulker_box", "minecraft:purple_shulker_box", "minecraft:blue_shulker_box", "minecraft:brown_shulker_box", "minecraft:green_shulker_box", "minecraft:red_shulker_box", "minecraft:black_shulker_box" }; + + DataConverterShulkerBoxItem() { + } + + public int getDataVersion() { + return 813; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:shulker_box".equals(cmp.getString("id")) && cmp.contains("tag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("tag"); + + if (nbttagcompound1.contains("BlockEntityTag", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); + + if (nbttagcompound2.getList("Items", 10).isEmpty()) { + nbttagcompound2.remove("Items"); + } + + int i = nbttagcompound2.getInt("Color"); + + nbttagcompound2.remove("Color"); + if (nbttagcompound2.isEmpty()) { + nbttagcompound1.remove("BlockEntityTag"); + } + + if (nbttagcompound1.isEmpty()) { + cmp.remove("tag"); + } + + cmp.putString("id", DataConverterShulkerBoxItem.a[i % 16]); + } + } + + return cmp; + } + } + + private static class DataConverterShulkerBoxBlock implements DataConverter { + + DataConverterShulkerBoxBlock() { + } + + public int getDataVersion() { + return 813; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:shulker".equals(cmp.getString("id"))) { + cmp.remove("Color"); + } + + return cmp; + } + } + + private static class DataConverterLang implements DataConverter { + + DataConverterLang() { + } + + public int getDataVersion() { + return 816; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if (cmp.contains("lang", 8)) { + cmp.putString("lang", cmp.getString("lang").toLowerCase(Locale.ROOT)); + } + + return cmp; + } + } + + private static class DataConverterTotem implements DataConverter { + + DataConverterTotem() { + } + + public int getDataVersion() { + return 820; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:totem".equals(cmp.getString("id"))) { + cmp.putString("id", "minecraft:totem_of_undying"); + } + + return cmp; + } + } + + private static class DataConverterBedBlock implements DataConverter { + + private static final Logger a = LogManager.getLogger(PaperweightDataConverters.class); + + DataConverterBedBlock() { + } + + public int getDataVersion() { + return 1125; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + try { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("Level"); + int i = nbttagcompound1.getInt("xPos"); + int j = nbttagcompound1.getInt("zPos"); + net.minecraft.nbt.ListTag nbttaglist = nbttagcompound1.getList("TileEntities", 10); + net.minecraft.nbt.ListTag nbttaglist1 = nbttagcompound1.getList("Sections", 10); + + for (int k = 0; k < nbttaglist1.size(); ++k) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist1.getCompound(k); + byte b0 = nbttagcompound2.getByte("Y"); + byte[] abyte = nbttagcompound2.getByteArray("Blocks"); + + for (int l = 0; l < abyte.length; ++l) { + if (416 == (abyte[l] & 255) << 4) { + int i1 = l & 15; + int j1 = l >> 8 & 15; + int k1 = l >> 4 & 15; + net.minecraft.nbt.CompoundTag nbttagcompound3 = new net.minecraft.nbt.CompoundTag(); + + nbttagcompound3.putString("id", "bed"); + nbttagcompound3.putInt("x", i1 + (i << 4)); + nbttagcompound3.putInt("y", j1 + (b0 << 4)); + nbttagcompound3.putInt("z", k1 + (j << 4)); + nbttaglist.add(nbttagcompound3); + } + } + } + } catch (Exception exception) { + DataConverterBedBlock.a.warn("Unable to datafix Bed blocks, level format may be missing tags."); + } + + return cmp; + } + } + + private static class DataConverterBedItem implements DataConverter { + + DataConverterBedItem() { + } + + public int getDataVersion() { + return 1125; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("minecraft:bed".equals(cmp.getString("id")) && cmp.getShort("Damage") == 0) { + cmp.putShort("Damage", (short) DyeColor.RED.getId()); + } + + return cmp; + } + } + + private static class DataConverterSignText implements DataConverter { + + public static final Gson a = new GsonBuilder().registerTypeAdapter(Component.class, new JsonDeserializer() { + MutableComponent a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { + if (jsonelement.isJsonPrimitive()) { + return new TextComponent(jsonelement.getAsString()); + } else if (jsonelement.isJsonArray()) { + JsonArray jsonarray = jsonelement.getAsJsonArray(); + MutableComponent ichatbasecomponent = null; + Iterator iterator = jsonarray.iterator(); + + while (iterator.hasNext()) { + JsonElement jsonelement1 = (JsonElement) iterator.next(); + MutableComponent ichatbasecomponent1 = this.a(jsonelement1, jsonelement1.getClass(), jsondeserializationcontext); + + if (ichatbasecomponent == null) { + ichatbasecomponent = ichatbasecomponent1; + } else { + ichatbasecomponent.append(ichatbasecomponent1); + } + } + + return ichatbasecomponent; + } else { + throw new JsonParseException("Don't know how to turn " + jsonelement + " into a Component"); + } + } + + public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { + return this.a(jsonelement, type, jsondeserializationcontext); + } + }).create(); + + DataConverterSignText() { + } + + public int getDataVersion() { + return 101; + } + + public net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp) { + if ("Sign".equals(cmp.getString("id"))) { + this.convert(cmp, "Text1"); + this.convert(cmp, "Text2"); + this.convert(cmp, "Text3"); + this.convert(cmp, "Text4"); + } + + return cmp; + } + + private void convert(net.minecraft.nbt.CompoundTag nbttagcompound, String s) { + String s1 = nbttagcompound.getString(s); + Component object = null; + + if (!"null".equals(s1) && !StringUtil.isNullOrEmpty(s1)) { + if ((s1.charAt(0) != 34 || s1.charAt(s1.length() - 1) != 34) && (s1.charAt(0) != 123 || s1.charAt(s1.length() - 1) != 125)) { + object = new TextComponent(s1); + } else { + try { + object = GsonHelper.fromJson(DataConverterSignText.a, s1, Component.class, true); + if (object == null) { + object = new TextComponent(""); + } + } catch (JsonParseException jsonparseexception) { + ; + } + + if (object == null) { + try { + object = Component.Serializer.fromJson(s1); + } catch (JsonParseException jsonparseexception1) { + ; + } + } + + if (object == null) { + try { + object = Component.Serializer.fromJsonLenient(s1); + } catch (JsonParseException jsonparseexception2) { + ; + } + } + + if (object == null) { + object = new TextComponent(s1); + } + } + } else { + object = new TextComponent(""); + } + + nbttagcompound.putString(s, Component.Serializer.toJson(object)); + } + } + + private static class DataInspectorPlayerVehicle implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (cmp.contains("RootVehicle", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("RootVehicle"); + + if (nbttagcompound1.contains("Entity", 10)) { + convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); + } + } + + return cmp; + } + } + + private static class DataInspectorLevelPlayer implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (cmp.contains("Player", 10)) { + convertCompound(LegacyType.PLAYER, cmp, "Player", sourceVer, targetVer); + } + + return cmp; + } + } + + private static class DataInspectorStructure implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + net.minecraft.nbt.ListTag nbttaglist; + int j; + net.minecraft.nbt.CompoundTag nbttagcompound1; + + if (cmp.contains("entities", 9)) { + nbttaglist = cmp.getList("entities", 10); + + for (j = 0; j < nbttaglist.size(); ++j) { + nbttagcompound1 = (net.minecraft.nbt.CompoundTag) nbttaglist.get(j); + if (nbttagcompound1.contains("nbt", 10)) { + convertCompound(LegacyType.ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); + } + } + } + + if (cmp.contains("blocks", 9)) { + nbttaglist = cmp.getList("blocks", 10); + + for (j = 0; j < nbttaglist.size(); ++j) { + nbttagcompound1 = (net.minecraft.nbt.CompoundTag) nbttaglist.get(j); + if (nbttagcompound1.contains("nbt", 10)) { + convertCompound(LegacyType.BLOCK_ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); + } + } + } + + return cmp; + } + } + + private static class DataInspectorChunks implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (cmp.contains("Level", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("Level"); + net.minecraft.nbt.ListTag nbttaglist; + int j; + + if (nbttagcompound1.contains("Entities", 9)) { + nbttaglist = nbttagcompound1.getList("Entities", 10); + + for (j = 0; j < nbttaglist.size(); ++j) { + nbttaglist.set(j, convert(LegacyType.ENTITY, (net.minecraft.nbt.CompoundTag) nbttaglist.get(j), sourceVer, targetVer)); + } + } + + if (nbttagcompound1.contains("TileEntities", 9)) { + nbttaglist = nbttagcompound1.getList("TileEntities", 10); + + for (j = 0; j < nbttaglist.size(); ++j) { + nbttaglist.set(j, convert(LegacyType.BLOCK_ENTITY, (net.minecraft.nbt.CompoundTag) nbttaglist.get(j), sourceVer, targetVer)); + } + } + } + + return cmp; + } + } + + private static class DataInspectorEntityPassengers implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (cmp.contains("Passengers", 9)) { + net.minecraft.nbt.ListTag nbttaglist = cmp.getList("Passengers", 10); + + for (int j = 0; j < nbttaglist.size(); ++j) { + nbttaglist.set(j, convert(LegacyType.ENTITY, nbttaglist.getCompound(j), sourceVer, targetVer)); + } + } + + return cmp; + } + } + + private static class DataInspectorPlayer implements DataInspector { + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + convertItems(cmp, "Inventory", sourceVer, targetVer); + convertItems(cmp, "EnderItems", sourceVer, targetVer); + if (cmp.contains("ShoulderEntityLeft", 10)) { + convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityLeft", sourceVer, targetVer); + } + + if (cmp.contains("ShoulderEntityRight", 10)) { + convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityRight", sourceVer, targetVer); + } + + return cmp; + } + } + + private static class DataInspectorVillagers implements DataInspector { + ResourceLocation entityVillager = getKey("EntityVillager"); + + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (entityVillager.equals(new ResourceLocation(cmp.getString("id"))) && cmp.contains("Offers", 10)) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = cmp.getCompound("Offers"); + + if (nbttagcompound1.contains("Recipes", 9)) { + net.minecraft.nbt.ListTag nbttaglist = nbttagcompound1.getList("Recipes", 10); + + for (int j = 0; j < nbttaglist.size(); ++j) { + net.minecraft.nbt.CompoundTag nbttagcompound2 = nbttaglist.getCompound(j); + + convertItem(nbttagcompound2, "buy", sourceVer, targetVer); + convertItem(nbttagcompound2, "buyB", sourceVer, targetVer); + convertItem(nbttagcompound2, "sell", sourceVer, targetVer); + nbttaglist.set(j, nbttagcompound2); + } + } + } + + return cmp; + } + } + + private static class DataInspectorMobSpawnerMinecart implements DataInspector { + ResourceLocation entityMinecartMobSpawner = getKey("EntityMinecartMobSpawner"); + ResourceLocation tileEntityMobSpawner = getKey("TileEntityMobSpawner"); + + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + String s = cmp.getString("id"); + if (entityMinecartMobSpawner.equals(new ResourceLocation(s))) { + cmp.putString("id", tileEntityMobSpawner.toString()); + convert(LegacyType.BLOCK_ENTITY, cmp, sourceVer, targetVer); + cmp.putString("id", s); + } + + return cmp; + } + } + + private static class DataInspectorMobSpawnerMobs implements DataInspector { + ResourceLocation tileEntityMobSpawner = getKey("TileEntityMobSpawner"); + + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (tileEntityMobSpawner.equals(new ResourceLocation(cmp.getString("id")))) { + if (cmp.contains("SpawnPotentials", 9)) { + net.minecraft.nbt.ListTag nbttaglist = cmp.getList("SpawnPotentials", 10); + + for (int j = 0; j < nbttaglist.size(); ++j) { + net.minecraft.nbt.CompoundTag nbttagcompound1 = nbttaglist.getCompound(j); + + convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); + } + } + + convertCompound(LegacyType.ENTITY, cmp, "SpawnData", sourceVer, targetVer); + } + + return cmp; + } + } + + private static class DataInspectorCommandBlock implements DataInspector { + ResourceLocation tileEntityCommand = getKey("TileEntityCommand"); + + @Override + public net.minecraft.nbt.CompoundTag inspect(net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + if (tileEntityCommand.equals(new ResourceLocation(cmp.getString("id")))) { + cmp.putString("id", "Control"); + convert(LegacyType.BLOCK_ENTITY, cmp, sourceVer, targetVer); + cmp.putString("id", "MinecartCommandBlock"); + } + + return cmp; + } + } +} diff --git a/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightFakePlayer.java b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightFakePlayer.java new file mode 100644 index 0000000000..f3097a98bb --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightFakePlayer.java @@ -0,0 +1,98 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.bukkit.adapter.impl.v1_18_R2; + +import com.mojang.authlib.GameProfile; +import net.minecraft.network.chat.ChatType; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ServerboundClientInformationPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stat; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.phys.Vec3; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; + +import java.util.OptionalInt; +import java.util.UUID; + +class PaperweightFakePlayer extends ServerPlayer { + private static final GameProfile FAKE_WORLDEDIT_PROFILE = new GameProfile(UUID.nameUUIDFromBytes("worldedit".getBytes()), "[WorldEdit]"); + private static final Vec3 ORIGIN = new Vec3(0.0D, 0.0D, 0.0D); + + PaperweightFakePlayer(ServerLevel world) { + super(world.getServer(), world, FAKE_WORLDEDIT_PROFILE); + } + + @Override + public Vec3 position() { + return ORIGIN; + } + + @Override + public void tick() { + } + + @Override + public void die(DamageSource damagesource) { + } + + @Override + public Entity changeDimension(ServerLevel worldserver, TeleportCause cause) { + return this; + } + + @Override + public OptionalInt openMenu(MenuProvider factory) { + return OptionalInt.empty(); + } + + @Override + public void updateOptions(ServerboundClientInformationPacket packet) { + } + + @Override + public void displayClientMessage(Component message, boolean actionBar) { + } + + @Override + public void sendMessage(Component message, ChatType type, UUID sender) { + } + + @Override + public void awardStat(Stat stat, int amount) { + } + + @Override + public void awardStat(Stat stat) { + } + + @Override + public boolean isInvulnerableTo(DamageSource damageSource) { + return true; + } + + @Override + public void openTextEdit(SignBlockEntity sign) { + } +} diff --git a/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightWorldNativeAccess.java new file mode 100644 index 0000000000..be9cdb98e7 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1.18.2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R2/PaperweightWorldNativeAccess.java @@ -0,0 +1,183 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.bukkit.adapter.impl.v1_18_R2; + +import com.sk89q.jnbt.AdventureNBTConverter; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.internal.block.BlockStateIdAccess; +import com.sk89q.worldedit.internal.wna.WorldNativeAccess; +import com.sk89q.worldedit.util.SideEffect; +import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.world.block.BlockState; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.LevelChunk; +import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R2.block.data.CraftBlockData; +import org.bukkit.event.block.BlockPhysicsEvent; + +import java.lang.ref.WeakReference; +import java.util.Objects; +import javax.annotation.Nullable; + +public class PaperweightWorldNativeAccess implements WorldNativeAccess { + private static final int UPDATE = 1; + private static final int NOTIFY = 2; + + private final PaperweightAdapter adapter; + private final WeakReference world; + private SideEffectSet sideEffectSet; + + public PaperweightWorldNativeAccess(PaperweightAdapter adapter, WeakReference world) { + this.adapter = adapter; + this.world = world; + } + + private ServerLevel getWorld() { + return Objects.requireNonNull(world.get(), "The reference to the world was lost"); + } + + @Override + public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { + this.sideEffectSet = sideEffectSet; + } + + @Override + public LevelChunk getChunk(int x, int z) { + return getWorld().getChunk(x, z); + } + + @Override + public net.minecraft.world.level.block.state.BlockState toNative(BlockState state) { + int stateId = BlockStateIdAccess.getBlockStateId(state); + return BlockStateIdAccess.isValidInternalId(stateId) + ? Block.stateById(stateId) + : ((CraftBlockData) BukkitAdapter.adapt(state)).getState(); + } + + @Override + public net.minecraft.world.level.block.state.BlockState getBlockState(LevelChunk chunk, BlockPos position) { + return chunk.getBlockState(position); + } + + @Nullable + @Override + public net.minecraft.world.level.block.state.BlockState setBlockState(LevelChunk chunk, BlockPos position, net.minecraft.world.level.block.state.BlockState state) { + return chunk.setBlockState(position, state, false, this.sideEffectSet.shouldApply(SideEffect.UPDATE)); + } + + @Override + public net.minecraft.world.level.block.state.BlockState getValidBlockForPosition(net.minecraft.world.level.block.state.BlockState block, BlockPos position) { + return Block.updateFromNeighbourShapes(block, getWorld(), position); + } + + @Override + public BlockPos getPosition(int x, int y, int z) { + return new BlockPos(x, y, z); + } + + @Override + public void updateLightingForBlock(BlockPos position) { + getWorld().getChunkSource().getLightEngine().checkBlock(position); + } + + @Override + public boolean updateTileEntity(BlockPos position, CompoundBinaryTag tag) { + // We will assume that the tile entity was created for us + BlockEntity tileEntity = getWorld().getBlockEntity(position); + if (tileEntity == null) { + return false; + } + Tag nativeTag = adapter.fromNative(AdventureNBTConverter.fromAdventure(tag)); + PaperweightAdapter.readTagIntoTileEntity((net.minecraft.nbt.CompoundTag) nativeTag, tileEntity); + return true; + } + + @Override + public void notifyBlockUpdate(LevelChunk chunk, BlockPos position, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState) { + if (chunk.getSections()[getWorld().getSectionIndex(position.getY())] != null) { + getWorld().sendBlockUpdated(position, oldState, newState, UPDATE | NOTIFY); + } + } + + @Override + public boolean isChunkTicking(LevelChunk chunk) { + return chunk.getFullStatus().isOrAfter(ChunkHolder.FullChunkStatus.TICKING); + } + + @Override + public void markBlockChanged(LevelChunk chunk, BlockPos position) { + if (chunk.getSections()[getWorld().getSectionIndex(position.getY())] != null) { + getWorld().getChunkSource().blockChanged(position); + } + } + + @Override + public void notifyNeighbors(BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState) { + ServerLevel world = getWorld(); + if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { + world.updateNeighborsAt(pos, oldState.getBlock()); + } else { + // When we don't want events, manually run the physics without them. + Block block = oldState.getBlock(); + fireNeighborChanged(pos, world, block, pos.west()); + fireNeighborChanged(pos, world, block, pos.east()); + fireNeighborChanged(pos, world, block, pos.below()); + fireNeighborChanged(pos, world, block, pos.above()); + fireNeighborChanged(pos, world, block, pos.north()); + fireNeighborChanged(pos, world, block, pos.south()); + } + if (newState.hasAnalogOutputSignal()) { + world.updateNeighbourForOutputSignal(pos, newState.getBlock()); + } + } + + private void fireNeighborChanged(BlockPos pos, ServerLevel world, Block block, BlockPos neighborPos) { + world.getBlockState(neighborPos).neighborChanged(world, neighborPos, block, pos, false); + } + + @Override + public void updateNeighbors(BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState, int recursionLimit) { + ServerLevel world = getWorld(); + // a == updateNeighbors + // b == updateDiagonalNeighbors + oldState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); + if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { + CraftWorld craftWorld = world.getWorld(); + BlockPhysicsEvent event = new BlockPhysicsEvent(craftWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), CraftBlockData.fromData(newState)); + world.getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + } + newState.updateNeighbourShapes(world, pos, NOTIFY, recursionLimit); + newState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); + } + + @Override + public void onBlockStateChange(BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState) { + getWorld().onBlockStateChange(pos, oldState, newState); + } +} diff --git a/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightAdapter.java index 5284346d3b..f4bbab0c5f 100644 --- a/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightAdapter.java @@ -23,12 +23,9 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; import com.mojang.datafixers.util.Either; -import com.mojang.serialization.Codec; -import com.mojang.serialization.Dynamic; import com.mojang.serialization.Lifecycle; import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.ByteArrayTag; @@ -85,11 +82,8 @@ import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; -import net.minecraft.nbt.NbtOps; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundEntityEventPacket; -import net.minecraft.resources.RegistryReadOps; -import net.minecraft.resources.RegistryWriteOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -120,7 +114,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.PalettedContainer; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.storage.LevelStorageSource; @@ -152,13 +145,14 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.OptionalInt; +import java.util.OptionalLong; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; @@ -420,6 +414,11 @@ public BaseEntity getEntity(org.bukkit.entity.Entity entity) { CraftEntity craftEntity = ((CraftEntity) entity); Entity mcEntity = craftEntity.getHandle(); + // Do not allow creating of passenger entity snapshots, passengers are included in the vehicle entity + if (mcEntity.isPassenger()) { + return null; + } + String id = getEntityId(mcEntity); net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); @@ -436,27 +435,48 @@ public org.bukkit.entity.Entity createEntity(Location location, BaseEntity state CraftWorld craftWorld = ((CraftWorld) location.getWorld()); ServerLevel worldServer = craftWorld.getHandle(); - Entity createdEntity = createEntityFromId(state.getType().getId(), craftWorld.getHandle()); + String entityId = state.getType().getId(); - if (createdEntity != null) { - CompoundTag nativeTag = state.getNbtData(); - if (nativeTag != null) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) fromNative(nativeTag); - for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - readTagIntoEntity(tag, createdEntity); - } + CompoundTag nativeTag = state.getNbtData(); + net.minecraft.nbt.CompoundTag tag; + if (nativeTag != null) { + tag = (net.minecraft.nbt.CompoundTag) fromNative(nativeTag); + removeUnwantedEntityTagsRecursively(tag); + } else { + tag = new net.minecraft.nbt.CompoundTag(); + } + + tag.putString("id", entityId); - createdEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + Entity createdEntity = EntityType.loadEntityRecursive(tag, craftWorld.getHandle(), (loadedEntity) -> { + loadedEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + return loadedEntity; + }); - worldServer.addFreshEntity(createdEntity, SpawnReason.CUSTOM); + if (createdEntity != null) { + worldServer.addFreshEntityWithPassengers(createdEntity, SpawnReason.CUSTOM); return createdEntity.getBukkitEntity(); } else { return null; } } + // This removes all unwanted tags from the main entity and all its passengers + private void removeUnwantedEntityTagsRecursively(net.minecraft.nbt.CompoundTag tag) { + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } + + // Adapted from net.minecraft.world.entity.EntityType#loadEntityRecursive + if (tag.contains("Passengers", NBTConstants.TYPE_LIST)) { + net.minecraft.nbt.ListTag nbttaglist = tag.getList("Passengers", NBTConstants.TYPE_COMPOUND); + + for (int i = 0; i < nbttaglist.size(); ++i) { + removeUnwantedEntityTagsRecursively(nbttaglist.getCompound(i)); + } + } + } + @Override public Component getRichBlockName(BlockType blockType) { return TranslatableComponent.of(getBlockFromType(blockType).getDescriptionId()); @@ -473,28 +493,34 @@ public Component getRichItemName(BaseItemStack itemStack) { } @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Map> getProperties(BlockType blockType) { - Map> properties = Maps.newTreeMap(String::compareTo); - Block block = getBlockFromType(blockType); - StateDefinition blockStateList = - block.getStateDefinition(); - for (net.minecraft.world.level.block.state.properties.Property state : blockStateList.getProperties()) { - Property property; + private static final LoadingCache> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader>() { + @Override + public Property load(net.minecraft.world.level.block.state.properties.Property state) throws Exception { if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { - property = new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + return new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); } else if (state instanceof DirectionProperty) { - property = new DirectionalProperty(state.getName(), + return new DirectionalProperty(state.getName(), (List) state.getPossibleValues().stream().map(e -> Direction.valueOf(((StringRepresentable) e).getSerializedName().toUpperCase(Locale.ROOT))).collect(Collectors.toList())); } else if (state instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - property = new EnumProperty(state.getName(), + return new EnumProperty(state.getName(), (List) state.getPossibleValues().stream().map(e -> ((StringRepresentable) e).getSerializedName()).collect(Collectors.toList())); } else if (state instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { - property = new IntegerProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + return new IntegerProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); } else { throw new IllegalArgumentException("WorldEdit needs an update to support " + state.getClass().getSimpleName()); } + } + }); + @SuppressWarnings({ "rawtypes" }) + @Override + public Map> getProperties(BlockType blockType) { + Map> properties = new TreeMap<>(); + Block block = getBlockFromType(blockType); + StateDefinition blockStateList = + block.getStateDefinition(); + for (net.minecraft.world.level.block.state.properties.Property state : blockStateList.getProperties()) { + Property property = PROPERTY_CACHE.getUnchecked(state); properties.put(property.getName(), property); } return properties; @@ -604,7 +630,7 @@ private void doRegen(org.bukkit.World bukkitWorld, Region region, Extent extent, long seed = options.getSeed().orElse(originalWorld.getSeed()); WorldGenSettings newOpts = options.getSeed().isPresent() - ? replaceSeed(originalWorld, seed, originalOpts) + ? originalOpts.withSeed(levelProperties.isHardcore(), OptionalLong.of(seed)) : originalOpts; LevelSettings newWorldSettings = new LevelSettings( @@ -649,49 +675,6 @@ private void doRegen(org.bukkit.World bukkitWorld, Region region, Extent extent, } } - private WorldGenSettings replaceSeed(ServerLevel originalWorld, long seed, WorldGenSettings originalOpts) { - RegistryWriteOps nbtReadRegOps = RegistryWriteOps.create( - NbtOps.INSTANCE, - originalWorld.getServer().registryAccess() - ); - RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( - NbtOps.INSTANCE, - originalWorld.getServer().getResourceManager(), - originalWorld.getServer().registryAccess() - ); - Codec dimCodec = WorldGenSettings.CODEC; - return dimCodec - .encodeStart(nbtReadRegOps, originalOpts) - .flatMap(tag -> - dimCodec.parse( - recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()) - ) - ) - .get() - .map( - l -> l, - error -> { - throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message()); - } - ); - } - - @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - if (!seen.add(dynamic)) { - return dynamic; - } - return dynamic.updateMapValues(pair -> { - if (pair.getFirst().asString("").equals("seed")) { - return pair.mapSecond(v -> v.createLong(seed)); - } - if (pair.getSecond().getValue() instanceof net.minecraft.nbt.CompoundTag) { - return pair.mapSecond(v -> recursivelySetSeed((Dynamic) v, seed, seen)); - } - return pair; - }); - } - private BiomeType adapt(ServerLevel serverWorld, Biome origBiome) { ResourceLocation key = serverWorld.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY).getKey(origBiome); if (key == null) { @@ -740,9 +723,7 @@ private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld } extent.setBlock(vec, state.toBaseBlock()); if (options.shouldRegenBiomes()) { - PalettedContainer biomeIndex = chunk.getSection(chunk.getSectionIndex(vec.getBlockY())) - .getBiomes(); - Biome origBiome = biomeIndex.get(vec.getBlockX(), vec.getBlockY(), vec.getBlockZ()); + Biome origBiome = chunk.getNoiseBiome(vec.getX(), vec.getY(), vec.getZ()); BiomeType adaptedBiome = adapt(serverWorld, origBiome); if (adaptedBiome != null) { extent.setBiome(vec, adaptedBiome); diff --git a/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightWorldNativeAccess.java index f2839de501..41ce6fcb79 100644 --- a/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1.18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/v1_18_R1/PaperweightWorldNativeAccess.java @@ -154,6 +154,12 @@ public void notifyNeighbors(BlockPos pos, net.minecraft.world.level.block.state. } } + @Override + public void updateBlock(BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState) { + ServerLevel world = getWorld(); + newState.onPlace(world, pos, oldState, false); + } + private void fireNeighborChanged(BlockPos pos, ServerLevel world, Block block, BlockPos neighborPos) { world.getBlockState(neighborPos).neighborChanged(world, neighborPos, block, pos, false); } diff --git a/worldedit-bukkit/adapters/adapter-legacy/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/adapters/adapter-legacy/src/main/resources/worldedit-adapters.jar new file mode 100644 index 0000000000000000000000000000000000000000..b5a31a462caba82634936ad65f48893e87963562 GIT binary patch literal 562839 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

n2d1imG=O+ZJ*YMMPh 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

tmywn_zj-e@h;C$OnUGO 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 q;e("shadowJar") { // In tandem with not bundling log4j, we shouldn't relocate base package here. // relocate("org.apache.logging", "com.sk89q.worldedit.log4j") relocate("org.antlr.v4", "com.sk89q.worldedit.antlr4") - include(dependency(":worldedit-core")) // Purposefully not included, we assume (even though no API exposes it) that Log4J will be present at runtime // If it turns out not to be true for Spigot/Paper, our only two official platforms, this can be uncommented. // include(dependency("org.apache.logging.log4j:log4j-api")) include(dependency("org.antlr:antlr4-runtime")) - relocate("org.bstats", "com.sk89q.worldedit.bstats") { - include(dependency("org.bstats:")) - } - relocate("io.papermc.lib", "com.sk89q.worldedit.bukkit.paperlib") { - include(dependency("io.papermc:paperlib")) - } - relocate("it.unimi.dsi.fastutil", "com.sk89q.worldedit.bukkit.fastutil") { - include(dependency("it.unimi.dsi:fastutil")) - } + include(dependency("org.bstats:")) + include(dependency("io.papermc:paperlib")) + include(dependency("it.unimi.dsi:fastutil")) + + relocate("org.bstats", "com.sk89q.worldedit.bstats") + relocate("io.papermc.lib", "com.sk89q.worldedit.bukkit.paperlib") + relocate("it.unimi.dsi.fastutil", "com.sk89q.worldedit.bukkit.fastutil") } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/ClassSourceValidator.java b/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/ClassSourceValidator.java index e0789e3e7a..bc06d4845c 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/ClassSourceValidator.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/ClassSourceValidator.java @@ -21,11 +21,11 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import org.apache.logging.log4j.Logger; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import java.security.CodeSource; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -40,12 +40,27 @@ */ public class ClassSourceValidator { - private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final String SEPARATOR_LINE = Strings.repeat("*", 46); + private static final Method loadClass; + private static Class pluginClassLoaderClass; + + static { + Method tmp; + try { + pluginClassLoaderClass = Class.forName("org.bukkit.plugin.java.PluginClassLoader", false, + Bukkit.class.getClassLoader()); + tmp = pluginClassLoaderClass.getDeclaredMethod("loadClass0", + String.class, boolean.class, boolean.class, boolean.class); + tmp.setAccessible(true); + } catch (NoSuchMethodException | ClassNotFoundException e) { + tmp = null; + } + loadClass = tmp; + } private final Plugin plugin; @Nullable - private final CodeSource expectedCodeSource; + private final ClassLoader expectedClassLoader; /** * Create a new instance. @@ -55,7 +70,10 @@ public class ClassSourceValidator { public ClassSourceValidator(Plugin plugin) { checkNotNull(plugin, "plugin"); this.plugin = plugin; - this.expectedCodeSource = plugin.getClass().getProtectionDomain().getCodeSource(); + this.expectedClassLoader = plugin.getClass().getClassLoader(); + if (loadClass == null) { + plugin.getLogger().info("Bukkit PluginClassLoader seems to have changed. Class source validation will be skipped."); + } } /** @@ -64,19 +82,33 @@ public ClassSourceValidator(Plugin plugin) { * @param classes A list of classes to check * @return The results */ - public Map, CodeSource> findMismatches(List> classes) { + public Map, Plugin> findMismatches(List> classes) { checkNotNull(classes, "classes"); - if (expectedCodeSource == null) { + if (expectedClassLoader == null || loadClass == null) { return ImmutableMap.of(); } - Map, CodeSource> mismatches = new HashMap<>(); + Map, Plugin> mismatches = new HashMap<>(); - for (Class testClass : classes) { - CodeSource testSource = testClass.getProtectionDomain().getCodeSource(); - if (!expectedCodeSource.equals(testSource)) { - mismatches.put(testClass, testSource); + for (Plugin target : Bukkit.getPluginManager().getPlugins()) { + if (target == plugin) { + continue; + } + ClassLoader targetLoader = target.getClass().getClassLoader(); + if (!(pluginClassLoaderClass.isAssignableFrom(targetLoader.getClass()))) { + continue; + } + for (Class testClass : classes) { + Class targetClass; + try { + targetClass = (Class) loadClass.invoke(targetLoader, testClass.getName(), false, false, false); + } catch (IllegalAccessException | InvocationTargetException ignored) { + continue; + } + if (targetClass.getClassLoader() != expectedClassLoader) { + mismatches.putIfAbsent(testClass, targetClass.getClassLoader() == targetLoader ? target : null); + } } } @@ -94,7 +126,7 @@ public void reportMismatches(List> classes) { if (Boolean.getBoolean("enginehub.disable.class.source.validation")) { return; } - Map, CodeSource> mismatches = findMismatches(classes); + Map, Plugin> mismatches = findMismatches(classes); if (mismatches.isEmpty()) { return; @@ -117,15 +149,17 @@ public void reportMismatches(List> classes) { builder.append("**\n"); builder.append("** Here are some files that have been overridden:\n"); builder.append("** \n"); - for (Map.Entry, CodeSource> entry : mismatches.entrySet()) { - CodeSource codeSource = entry.getValue(); - String url = codeSource != null ? codeSource.getLocation().toExternalForm() : "(unknown)"; + for (Map.Entry, Plugin> entry : mismatches.entrySet()) { + Plugin badPlugin = entry.getValue(); + String url = badPlugin == null + ? "(unknown)" + : badPlugin.getName() + " (" + badPlugin.getClass().getProtectionDomain().getCodeSource().getLocation() + ")"; builder.append("** '").append(entry.getKey().getSimpleName()).append("' came from '").append(url).append("'\n"); } builder.append("**\n"); builder.append("** Please report this to the plugins' developers.\n"); builder.append(SEPARATOR_LINE).append("\n"); - LOGGER.error(builder.toString()); + plugin.getLogger().severe(builder.toString()); } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java b/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java index d9c0ef37d0..e24078e11d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/bukkit/util/CommandRegistration.java @@ -75,7 +75,7 @@ public boolean register(List registered) { } for (CommandInfo command : registered) { DynamicPluginCommand cmd = new DynamicPluginCommand(command.getAliases(), - command.getDesc(), "/" + command.getAliases()[0] + " " + command.getUsage(), executor, command.getRegisteredWith(), plugin); + command.getDesc(), command.getUsage(), executor, command.getRegisteredWith(), plugin); cmd.setPermissions(command.getPermissions()); commandMap.register(plugin.getDescription().getName(), cmd); } diff --git a/worldedit-core/build.gradle.kts b/worldedit-core/build.gradle.kts index 0e7c38abfb..0b7d45f1c4 100644 --- a/worldedit-core/build.gradle.kts +++ b/worldedit-core/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { "implementation"("org.mozilla:rhino-runtime:1.7.13") "implementation"("org.yaml:snakeyaml:1.26") "implementation"("com.google.guava:guava") - "implementation"("com.google.code.findbugs:jsr305:1.3.9") + "compileOnlyApi"("com.google.code.findbugs:jsr305:1.3.9") "implementation"("com.google.code.gson:gson") "implementation"("org.apache.logging.log4j:log4j-api:${Versions.LOG4J}") { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BiomeCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BiomeCommands.java index 0212884a0e..a42f88f24d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BiomeCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BiomeCommands.java @@ -30,6 +30,7 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.extension.platform.Locatable; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.RegionMaskingFilter; import com.sk89q.worldedit.function.biome.BiomeReplace; @@ -106,7 +107,7 @@ public void biomeList(Actor actor, descFooter = "By default, uses all blocks in your selection." ) @CommandPermissions("worldedit.biome.info") - public void biomeInfo(Player player, LocalSession session, + public void biomeInfo(Actor actor, World world, LocalSession session, @Switch(name = 't', desc = "Use the block you are looking at.") boolean useLineOfSight, @Switch(name = 'p', desc = "Use the block you are currently in.") @@ -117,23 +118,32 @@ public void biomeInfo(Player player, LocalSession session, String messageKey; if (useLineOfSight) { - Location blockPosition = player.getBlockTrace(300); - if (blockPosition == null) { - player.printError(TranslatableComponent.of("worldedit.raytrace.noblock")); + if (actor instanceof Player) { + Location blockPosition = ((Player) actor).getBlockTrace(300); + if (blockPosition == null) { + actor.printError(TranslatableComponent.of("worldedit.raytrace.noblock")); + return; + } + + BiomeType biome = world.getBiome(blockPosition.toVector().toBlockPoint()); + biomes.add(biome); + + messageKey = "worldedit.biomeinfo.lineofsight"; + } else { + actor.printError(TranslatableComponent.of("worldedit.raytrace.require-player")); return; } - - BiomeType biome = player.getWorld().getBiome(blockPosition.toVector().toBlockPoint()); - biomes.add(biome); - - messageKey = "worldedit.biomeinfo.lineofsight"; } else if (usePosition) { - BiomeType biome = player.getWorld().getBiome(player.getLocation().toVector().toBlockPoint()); - biomes.add(biome); + if (actor instanceof Locatable) { + BiomeType biome = world.getBiome(((Locatable) actor).getLocation().toVector().toBlockPoint()); + biomes.add(biome); - messageKey = "worldedit.biomeinfo.position"; + messageKey = "worldedit.biomeinfo.position"; + } else { + actor.printError(TranslatableComponent.of("worldedit.biomeinfo.not-locatable")); + return; + } } else { - World world = player.getWorld(); Region region = session.getSelection(world); for (BlockVector3 pt : region) { @@ -148,7 +158,7 @@ public void biomeInfo(Player player, LocalSession session, HoverEvent.showText(TextComponent.of(biome.getId())) ) ).collect(Collectors.toList()); - player.printInfo(TranslatableComponent.of(messageKey, TextUtils.join(components, TextComponent.of(", ")))); + actor.printInfo(TranslatableComponent.of(messageKey, TextUtils.join(components, TextComponent.of(", ")))); } @Command( @@ -158,17 +168,21 @@ public void biomeInfo(Player player, LocalSession session, ) @Logging(REGION) @CommandPermissions("worldedit.biome.set") - public void setBiome(Player player, LocalSession session, EditSession editSession, + public void setBiome(Actor actor, World world, LocalSession session, EditSession editSession, @Arg(desc = "Biome type.") BiomeType target, @Switch(name = 'p', desc = "Use your current position") boolean atPosition) throws WorldEditException { - World world = player.getWorld(); Region region; Mask mask = editSession.getMask(); if (atPosition) { - final BlockVector3 pos = player.getLocation().toVector().toBlockPoint(); - region = new CuboidRegion(pos, pos); + if (actor instanceof Locatable) { + final BlockVector3 pos = ((Locatable) actor).getLocation().toVector().toBlockPoint(); + region = new CuboidRegion(pos, pos); + } else { + actor.printError(TranslatableComponent.of("worldedit.setbiome.not-locatable")); + return; + } } else { region = session.getSelection(world); } @@ -180,7 +194,7 @@ public void setBiome(Player player, LocalSession session, EditSession editSessio RegionVisitor visitor = new RegionVisitor(region, replace); Operations.completeLegacy(visitor); - player.printInfo(TranslatableComponent.of( + actor.printInfo(TranslatableComponent.of( "worldedit.setbiome.changed", TextComponent.of(visitor.getAffected()) ) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index e0c858f487..c1f769d859 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -276,7 +276,7 @@ public int pyramid(Actor actor, LocalSession session, EditSession editSession, name = "/generate", aliases = { "/gen", "/g" }, desc = "Generates a shape according to a formula.", - descFooter = "See also https://tinyurl.com/weexpr." + descFooter = "For details, see https://ehub.to/we/expr" ) @CommandPermissions("worldedit.generation.shape") @Logging(ALL) @@ -345,7 +345,7 @@ public int generate(Actor actor, LocalSession session, EditSession editSession, name = "/generatebiome", aliases = { "/genbiome", "/gb" }, desc = "Sets biome according to a formula.", - descFooter = "See also https://tinyurl.com/weexpr." + descFooter = "For details, see https://ehub.to/we/expr" ) @CommandPermissions("worldedit.generation.shape.biome") @Logging(ALL) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index 7a006cd83a..addf03c289 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -394,6 +394,8 @@ public int stack(Actor actor, World world, EditSession editSession, LocalSession boolean blockUnits, @ArgFlag(name = 'm', desc = "Set the include mask, non-matching blocks become air") Mask mask) throws WorldEditException { + checkCommandArgument(count >= 1, "Count must be >= 1"); + Mask combinedMask; if (ignoreAirBlocks) { if (mask == null) { @@ -467,7 +469,7 @@ void regenerate(Actor actor, World world, LocalSession session, EditSession edit desc = "Deforms a selected region with an expression", descFooter = "The expression is executed for each block and is expected\n" + "to modify the variables x, y and z to point to a new block\n" - + "to fetch. See also https://tinyurl.com/weexpr" + + "to fetch. For details, see https://ehub.to/we/expr" ) @CommandPermissions("worldedit.region.deform") @Logging(ALL) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/Chunk3dVectorConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/Chunk3dVectorConverter.java index 4cfccd4786..68fd64f817 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/Chunk3dVectorConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/Chunk3dVectorConverter.java @@ -56,7 +56,7 @@ public static void register(CommandManager commandManager) { } throw new AssertionError("Expected 2 or 3 components"); }, - "block vector with x,z or x,y,z" + "block vector in the form x,z or x,y,z" )); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/VectorConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/VectorConverter.java index 91ddfa2e4e..31436b6238 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/VectorConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/VectorConverter.java @@ -48,7 +48,7 @@ public class VectorConverter implements ArgumentConverter { INT_CONVERTER, 3, cmps -> BlockVector3.at(cmps.get(0), cmps.get(1), cmps.get(2)), - "block vector with x, y, and z" + "block vector in the form x,y,z" ); public static void register(CommandManager commandManager) { @@ -58,14 +58,14 @@ public static void register(CommandManager commandManager) { INT_CONVERTER, 2, cmps -> BlockVector2.at(cmps.get(0), cmps.get(1)), - "block vector with x and z" + "block vector in the form x,z" )); commandManager.registerConverter(Key.of(Vector2.class), new VectorConverter<>( doubleConverter, 2, cmps -> Vector2.at(cmps.get(0), cmps.get(1)), - "vector with x and z" + "vector in the form x,z" )); commandManager.registerConverter(Key.of(BlockVector3.class), BLOCK_VECTOR_3_CONVERTER); commandManager.registerConverter(Key.of(Vector3.class), @@ -73,7 +73,7 @@ public static void register(CommandManager commandManager) { doubleConverter, 3, cmps -> Vector3.at(cmps.get(0), cmps.get(1), cmps.get(2)), - "vector with x, y, and z" + "vector in the form x,y,z" )); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java index 4e02358603..8919146cc4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockStateMask.java @@ -28,6 +28,7 @@ import com.sk89q.worldedit.world.block.BlockType; import java.util.Map; +import java.util.Objects; import javax.annotation.Nullable; public class BlockStateMask extends AbstractExtentMask { @@ -58,7 +59,11 @@ public boolean test(BlockVector3 vector) { if (strict && checkProps.isEmpty()) { return false; } - return checkProps.entrySet().stream() - .allMatch(entry -> block.getState(entry.getKey()) == entry.getValue()); + for (Map.Entry, Object> entry : checkProps.entrySet()) { + if (!Objects.equals(block.getState(entry.getKey()), entry.getValue())) { + return false; + } + } + return true; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java index 387a25f9a7..5a4ca155c4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java @@ -32,7 +32,7 @@ public final class BlockStateIdAccess { private static final int INVALID_ID = -1; - private static final int EXPECTED_BLOCK_COUNT = 2 << 13; + private static final int EXPECTED_BLOCK_COUNT = 2 << 14; private static final Int2ObjectOpenHashMap TO_STATE = new Int2ObjectOpenHashMap<>(EXPECTED_BLOCK_COUNT); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/ExceptionConverterHelper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/ExceptionConverterHelper.java index bab3a3936e..dd48e0f0fa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/ExceptionConverterHelper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/ExceptionConverterHelper.java @@ -78,7 +78,7 @@ public void convert(Throwable t) throws CommandException { throw (CommandException) e.getCause(); } if (e.getCause() instanceof com.sk89q.minecraft.util.commands.CommandException) { - throw new CommandException(e.getCause(), ImmutableList.of()); + throw new CommandExecutionException(e.getCause(), ImmutableList.of()); } throw new CommandExecutionException(e, ImmutableList.of()); } catch (IllegalArgumentException | IllegalAccessException e) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java index 0accaa6427..24b6157480 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java @@ -101,6 +101,10 @@ default void applySideEffects(BlockVector3 position, BlockState previousType, Si NBS oldData = toNative(previousType); NBS newData = getBlockState(chunk, pos); + if (sideEffectSet.shouldApply(SideEffect.UPDATE)) { + updateBlock(pos, oldData, newData); + } + if (sideEffectSet.getState(SideEffect.LIGHTING) == SideEffect.State.ON) { updateLightingForBlock(pos); } @@ -150,6 +154,9 @@ default void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { void notifyNeighbors(NP pos, NBS oldState, NBS newState); + default void updateBlock(NP pos, NBS oldState, NBS newState) { + } + void updateNeighbors(NP pos, NBS oldState, NBS newState, int recursionLimit); void onBlockStateChange(NP pos, NBS oldState, NBS newState); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java index e4c764c0f9..b9fe5ed7e3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/Registry.java @@ -45,14 +45,14 @@ public String getName() { @Nullable public V get(final String key) { - checkState(key.equals(key.toLowerCase(Locale.ROOT)), "key must be lowercase"); + checkState(key.equals(key.toLowerCase(Locale.ROOT)), "key must be lowercase: %s", key); return this.map.get(key); } public V register(final String key, final V value) { requireNonNull(key, "key"); requireNonNull(value, "value"); - checkState(key.equals(key.toLowerCase(Locale.ROOT)), "key must be lowercase"); + checkState(key.equals(key.toLowerCase(Locale.ROOT)), "key must be lowercase: %s", key); checkState(!this.map.containsKey(key), "key '%s' already has an associated %s", key, this.name); this.map.put(key, value); return value; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java index 6131be919a..789bdc4d39 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java @@ -126,7 +126,7 @@ public synchronized InputStream getChunkInputStream(BlockVector2 position) throw // The chunk hasn't been generated if (offset == 0) { - throw new DataException("The chunk at " + x + "," + z + " is not generated"); + throw new DataException("The chunk at " + position + " is not generated"); } int sectorNumber = offset >> 8; diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index ab6386f34b..41b8436b11 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -6,6 +6,7 @@ "worldedit.biomeinfo.lineofsight": "Biomes at line of sight point: {0}", "worldedit.biomeinfo.position": "Biomes at your position: {0}", "worldedit.biomeinfo.selection": "Biomes in your selection: {0}", + "worldedit.biomeinfo.not-locatable": "Command sender must be present in the world to use the -p flag.", "worldedit.brush.radius-too-large": "Maximum allowed brush radius: {0}", "worldedit.brush.apply.description": "Apply brush, apply a function to every block", @@ -41,6 +42,7 @@ "worldedit.setbiome.changed": "Biomes were changed for approximately {0} blocks.", "worldedit.setbiome.warning": "You may have to re-join your game (or close and re-open your world) to see changes.", + "worldedit.setbiome.not-locatable": "Command sender must be present in the world to use the -p flag.", "worldedit.drawsel.disabled": "Server CUI disabled.", "worldedit.drawsel.enabled": "Server CUI enabled. This only supports cuboid regions, with a maximum size of {0}x{1}x{2}.", @@ -86,6 +88,7 @@ "worldedit.clearhistory.cleared": "History cleared.", "worldedit.raytrace.noblock": "No block in sight!", + "worldedit.raytrace.require-player": "Raytracing commands require a player!", "worldedit.restore.not-configured": "Snapshot/backup restore is not configured.", "worldedit.restore.not-available": "That snapshot does not exist or is not available.", diff --git a/worldedit-fabric/build.gradle.kts b/worldedit-fabric/build.gradle.kts index f7b1525882..bff20558f7 100644 --- a/worldedit-fabric/build.gradle.kts +++ b/worldedit-fabric/build.gradle.kts @@ -21,8 +21,8 @@ applyShadowConfiguration() apply(plugin = "fabric-loom") apply(plugin = "java-library") -val minecraftVersion = "1.18.1" -val loaderVersion = "0.12.9" +val minecraftVersion = "1.18.2" +val loaderVersion = "0.13.3" val fabricApiConfiguration: Configuration = configurations.create("fabricApi") @@ -48,7 +48,7 @@ dependencies { "modImplementation"("net.fabricmc:fabric-loader:$loaderVersion") // [1] declare fabric-api dependency... - "fabricApi"("net.fabricmc.fabric-api:fabric-api:0.44.0+1.18") + "fabricApi"("net.fabricmc.fabric-api:fabric-api:0.47.9+1.18.2") // [2] Load the API dependencies from the fabric mod json... @Suppress("UNCHECKED_CAST") @@ -58,6 +58,7 @@ dependencies { val wantedDependencies = (fabricModJson["depends"] ?: error("no depends in fabric.mod.json")).keys .filter { it == "fabric-api-base" || it.contains(Regex("v\\d$")) } .map { "net.fabricmc.fabric-api:$it" } + .toSet() logger.lifecycle("Looking for these dependencies:") for (wantedDependency in wantedDependencies) { logger.lifecycle(wantedDependency) @@ -103,7 +104,7 @@ dependencies { "annotationProcessor"("net.fabricmc:fabric-loom:${project.versions.loom}") // Silence some warnings, since apparently this isn't on the compile classpath like it should be. - "compileOnly"("com.google.errorprone:error_prone_annotations:2.10.0") + "compileOnly"("com.google.errorprone:error_prone_annotations:2.11.0") } configure { @@ -139,10 +140,9 @@ tasks.named("shadowJar") { tasks.register("remapShadowJar") { val shadowJar = tasks.getByName("shadowJar") dependsOn(shadowJar) - input.set(shadowJar.archiveFile) + inputFile.set(shadowJar.archiveFile) archiveFileName.set(shadowJar.archiveFileName.get().replace(Regex("-dev\\.jar$"), ".jar")) addNestedDependencies.set(true) - remapAccessWidener.set(true) } tasks.named("assemble").configure { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java index b9d9c06413..5c80a7c66a 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricBlockCategoryRegistry.java @@ -21,22 +21,22 @@ import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.registry.BlockCategoryRegistry; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; -import java.util.Collections; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; public class FabricBlockCategoryRegistry implements BlockCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(BlockTags.getAllTags().getTag(new ResourceLocation(category))) - .map(Tag::getValues) - .orElse(Collections.emptyList()) + return Registry.BLOCK.getTag(TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(category))) .stream() + .flatMap(HolderSet.Named::stream) + .map(Holder::value) .map(FabricAdapter::adapt) .collect(Collectors.toSet()); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java index 51ab18ea77..f60c0667e2 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricEntity.java @@ -50,14 +50,13 @@ class FabricEntity implements Entity { @Override public BaseEntity getState() { net.minecraft.world.entity.Entity entity = entityRef.get(); - if (entity != null) { - ResourceLocation id = Registry.ENTITY_TYPE.getKey(entity.getType()); - CompoundTag tag = new CompoundTag(); - entity.saveWithoutId(tag); - return new BaseEntity(EntityTypes.get(id.toString()), LazyReference.from(() -> NBTConverter.fromNative(tag))); - } else { + if (entity == null || entity.isPassenger()) { return null; } + ResourceLocation id = Registry.ENTITY_TYPE.getKey(entity.getType()); + CompoundTag tag = new CompoundTag(); + entity.saveWithoutId(tag); + return new BaseEntity(EntityTypes.get(id.toString()), LazyReference.from(() -> NBTConverter.fromNative(tag))); } @Override diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java index b71ed33d81..e43544361c 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricItemCategoryRegistry.java @@ -21,22 +21,22 @@ import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.ItemCategoryRegistry; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; -import java.util.Collections; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; public class FabricItemCategoryRegistry implements ItemCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(ItemTags.getAllTags().getTag(new ResourceLocation(category))) - .map(Tag::getValues) - .orElse(Collections.emptyList()) + return Registry.ITEM.getTag(TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(category))) .stream() + .flatMap(HolderSet.Named::stream) + .map(Holder::value) .map(FabricAdapter::adapt) .collect(Collectors.toSet()); } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java index 29199e413c..c5a12f6145 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorld.java @@ -26,7 +26,7 @@ import com.google.common.collect.Sets; import com.google.common.collect.Streams; import com.google.common.util.concurrent.Futures; -import com.mojang.serialization.Dynamic; +import com.sk89q.jnbt.NBTConstants; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; @@ -37,8 +37,12 @@ import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; import com.sk89q.worldedit.fabric.internal.FabricWorldNativeAccess; import com.sk89q.worldedit.fabric.internal.NBTConverter; +import com.sk89q.worldedit.fabric.mixin.AccessorDerivedLevelData; import com.sk89q.worldedit.fabric.mixin.AccessorPrimaryLevelData; import com.sk89q.worldedit.fabric.mixin.AccessorServerChunkCache; +import com.sk89q.worldedit.function.mask.AbstractExtentMask; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Mask2D; import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; @@ -63,13 +67,10 @@ import com.sk89q.worldedit.world.weather.WeatherTypes; import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.worldgen.features.EndFeatures; import net.minecraft.data.worldgen.features.TreeFeatures; -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.RegistryReadOps; -import net.minecraft.resources.RegistryWriteOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -85,6 +86,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkSource; @@ -106,11 +108,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.OptionalLong; import java.util.Random; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -221,7 +223,9 @@ public BiomeType getBiome(BlockVector3 position) { } private BiomeType getBiomeInChunk(BlockVector3 position, ChunkAccess chunk) { - return FabricAdapter.adapt(chunk.getNoiseBiome(position.getX() >> 2, position.getY() >> 2, position.getZ() >> 2)); + return FabricAdapter.adapt( + chunk.getNoiseBiome(position.getX() >> 2, position.getY() >> 2, position.getZ() >> 2).value() + ); } @Override @@ -230,10 +234,12 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { checkNotNull(biome); ChunkAccess chunk = getWorld().getChunk(position.getBlockX() >> 4, position.getBlockZ() >> 4); - PalettedContainer biomeArray = chunk.getSection(chunk.getSectionIndex(position.getY())).getBiomes(); + PalettedContainer> biomeArray = chunk.getSection(chunk.getSectionIndex(position.getY())).getBiomes(); biomeArray.getAndSetUnchecked( position.getX() & 3, position.getY() & 3, position.getZ() & 3, - FabricAdapter.adapt(biome) + getWorld().registryAccess().registry(Registry.BIOME_REGISTRY) + .orElseThrow() + .getHolderOrThrow(ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(biome.getId()))) ); chunk.setUnsaved(true); return true; @@ -317,13 +323,17 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws LevelStorageSource levelStorage = LevelStorageSource.createDefault(tempDir); try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("WorldEditTempGen")) { ServerLevel originalWorld = (ServerLevel) getWorld(); - AccessorPrimaryLevelData levelProperties = (AccessorPrimaryLevelData) - originalWorld.getLevelData(); + AccessorPrimaryLevelData levelProperties; + if (originalWorld.getLevelData() instanceof AccessorDerivedLevelData derivedLevelData) { + levelProperties = (AccessorPrimaryLevelData) derivedLevelData.getWrapped(); + } else { + levelProperties = (AccessorPrimaryLevelData) originalWorld.getLevelData(); + } WorldGenSettings originalOpts = levelProperties.worldGenSettings(); long seed = options.getSeed().orElse(originalWorld.getSeed()); WorldGenSettings newOpts = options.getSeed().isPresent() - ? replaceSeed(originalWorld, seed, originalOpts) + ? originalOpts.withSeed(levelProperties.isHardcore(), OptionalLong.of(seed)) : originalOpts; levelProperties.setWorldGenSettings(newOpts); @@ -334,7 +344,7 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws originalWorld.getServer(), Util.backgroundExecutor(), session, ((ServerLevelData) originalWorld.getLevelData()), worldRegKey, - originalWorld.dimensionType(), + originalWorld.dimensionTypeRegistration(), new WorldEditGenListener(), dimGenOpts.generator(), originalWorld.isDebug(), @@ -358,49 +368,6 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws } } - private WorldGenSettings replaceSeed(ServerLevel originalWorld, long seed, WorldGenSettings originalOpts) { - RegistryWriteOps nbtRegReadOps = RegistryWriteOps.create( - NbtOps.INSTANCE, - originalWorld.getServer().registryAccess() - ); - RegistryReadOps nbtRegOps = RegistryReadOps.create( - NbtOps.INSTANCE, - ((ExtendedMinecraftServer) originalWorld.getServer()) - .getResources().getResourceManager(), - originalWorld.getServer().registryAccess() - ); - return WorldGenSettings.CODEC - .encodeStart(nbtRegReadOps, originalOpts) - .flatMap(tag -> - WorldGenSettings.CODEC.parse( - recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()) - ) - ) - .get() - .map( - l -> l, - error -> { - throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message()); - } - ); - } - - @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - if (!seen.add(dynamic)) { - return dynamic; - } - return dynamic.updateMapValues(pair -> { - if (pair.getFirst().asString("").equals("seed")) { - return pair.mapSecond(v -> v.createLong(seed)); - } - if (pair.getSecond().getValue() instanceof net.minecraft.nbt.CompoundTag) { - return pair.mapSecond(v -> recursivelySetSeed((Dynamic) v, seed, seen)); - } - return pair; - }); - } - private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws WorldEditException { List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); @@ -457,7 +424,7 @@ private List> submitChunkLoadTasks(Region region, } @Nullable - private static ConfiguredFeature createTreeFeatureGenerator(TreeType type) { + private static Holder> createTreeFeatureGenerator(TreeType type) { return switch (type) { // Based off of the SaplingGenerator class, as well as uses of DefaultBiomeFeatures fields case TREE -> TreeFeatures.OAK; @@ -486,7 +453,9 @@ private List> submitChunkLoadTasks(Region region, @Override public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) { - ConfiguredFeature generator = createTreeFeatureGenerator(type); + ConfiguredFeature generator = Optional.ofNullable(createTreeFeatureGenerator(type)) + .map(Holder::value) + .orElse(null); ServerLevel world = (ServerLevel) getWorld(); ServerChunkCache chunkManager = world.getChunkSource(); if (type == TreeType.CHORUS_PLANT) { @@ -664,29 +633,63 @@ public List getEntities() { @Nullable @Override public Entity createEntity(Location location, BaseEntity entity) { - Level world = getWorld(); - final Optional> entityType = EntityType.byString(entity.getType().getId()); + ServerLevel world = (ServerLevel) getWorld(); + String entityId = entity.getType().getId(); + final Optional> entityType = EntityType.byString(entityId); if (entityType.isEmpty()) { return null; } - net.minecraft.world.entity.Entity createdEntity = entityType.get().create(world); + CompoundBinaryTag nativeTag = entity.getNbt(); + net.minecraft.nbt.CompoundTag tag; + if (nativeTag != null) { + tag = NBTConverter.toNative(nativeTag); + removeUnwantedEntityTagsRecursively(tag); + } else { + tag = new net.minecraft.nbt.CompoundTag(); + } + tag.putString("id", entityId); + + net.minecraft.world.entity.Entity createdEntity = EntityType.loadEntityRecursive(tag, world, (loadedEntity) -> { + loadedEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + return loadedEntity; + }); if (createdEntity != null) { - CompoundBinaryTag nativeTag = entity.getNbt(); - if (nativeTag != null) { - net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(nativeTag); - for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - createdEntity.load(tag); - } + world.addFreshEntityWithPassengers(createdEntity); + return new FabricEntity(createdEntity); + } + return null; + } - createdEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + private void removeUnwantedEntityTagsRecursively(net.minecraft.nbt.CompoundTag tag) { + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } - world.addFreshEntity(createdEntity); - return new FabricEntity(createdEntity); - } else { - return null; + // Adapted from net.minecraft.world.entity.EntityType#loadEntityRecursive + if (tag.contains("Passengers", NBTConstants.TYPE_LIST)) { + net.minecraft.nbt.ListTag nbttaglist = tag.getList("Passengers", NBTConstants.TYPE_COMPOUND); + + for (int i = 0; i < nbttaglist.size(); ++i) { + removeUnwantedEntityTagsRecursively(nbttaglist.getCompound(i)); + } } } + @Override + public Mask createLiquidMask() { + return new AbstractExtentMask(this) { + @Override + public boolean test(BlockVector3 vector) { + return FabricAdapter.adapt(getExtent().getBlock(vector)).getBlock() instanceof LiquidBlock; + } + + @Nullable + @Override + public Mask2D toMask2D() { + return null; + } + }; + } + + } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java index 7950821ff4..f3be6ea106 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricWorldEdit.java @@ -60,8 +60,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -83,7 +82,6 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer; import static com.sk89q.worldedit.internal.anvil.ChunkDeleter.DELCHUNKS_FILE_NAME; -import static java.util.stream.Collectors.toList; /** * The Fabric implementation of WorldEdit. @@ -163,7 +161,7 @@ private void registerCommands(CommandDispatcher dispatcher, } List commands = manager.getPlatformCommandManager().getCommandManager() - .getAllCommands().collect(toList()); + .getAllCommands().toList(); for (Command command : commands) { CommandWrapper.register(dispatcher, command); Set perms = command.getCondition().as(PermissionCondition.class) @@ -212,16 +210,16 @@ private void setupRegistries(MinecraftServer server) { } } // Tags - for (ResourceLocation name : BlockTags.getAllTags().getAvailableTags()) { + Registry.BLOCK.getTagNames().map(TagKey::location).forEach(name -> { if (BlockCategory.REGISTRY.get(name.toString()) == null) { BlockCategory.REGISTRY.register(name.toString(), new BlockCategory(name.toString())); } - } - for (ResourceLocation name : ItemTags.getAllTags().getAvailableTags()) { + }); + Registry.ITEM.getTagNames().map(TagKey::location).forEach(name -> { if (ItemCategory.REGISTRY.get(name.toString()) == null) { ItemCategory.REGISTRY.register(name.toString(), new ItemCategory(name.toString())); } - } + }); } private void onStartingServer(MinecraftServer minecraftServer) { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java index 0a476fffdb..22376275a2 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/ExtendedMinecraftServer.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.fabric.internal; -import net.minecraft.server.ServerResources; import net.minecraft.world.level.Level; import java.nio.file.Path; @@ -28,6 +27,4 @@ public interface ExtendedMinecraftServer { Path getStoragePath(Level world); - ServerResources getResources(); - } diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java index fec99ee384..e29956ba48 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricTransmogrifier.java @@ -19,6 +19,9 @@ package com.sk89q.worldedit.fabric.internal; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.fabric.FabricAdapter; import com.sk89q.worldedit.registry.state.BooleanProperty; @@ -44,26 +47,34 @@ */ public class FabricTransmogrifier { - public static Property transmogToWorldEditProperty(net.minecraft.world.level.block.state.properties.Property property) { - if (property instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { - return new BooleanProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.BooleanProperty) property).getPossibleValues())); - } - if (property instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { - return new IntegerProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.IntegerProperty) property).getPossibleValues())); - } - if (property instanceof DirectionProperty) { - return new DirectionalProperty(property.getName(), ((DirectionProperty) property).getPossibleValues().stream() - .map(FabricAdapter::adaptEnumFacing) - .collect(Collectors.toList())); - } - if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - // Note: do not make x.asString a method reference. - // It will cause runtime bootstrap exceptions. - return new EnumProperty(property.getName(), ((net.minecraft.world.level.block.state.properties.EnumProperty) property).getPossibleValues().stream() - .map(x -> x.getSerializedName()) - .collect(Collectors.toList())); + private static final LoadingCache, Property> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { + @Override + public Property load(net.minecraft.world.level.block.state.properties.Property property) throws Exception { + if (property instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { + return new BooleanProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.BooleanProperty) property).getPossibleValues())); + } + if (property instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { + return new IntegerProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.IntegerProperty) property).getPossibleValues())); + } + if (property instanceof DirectionProperty) { + return new DirectionalProperty(property.getName(), ((DirectionProperty) property).getPossibleValues().stream() + .map(FabricAdapter::adaptEnumFacing) + .collect(Collectors.toList())); + } + if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + // Note: do not make x.asString a method reference. + // It will cause runtime bootstrap exceptions. + //noinspection Convert2MethodRef + return new EnumProperty(property.getName(), ((net.minecraft.world.level.block.state.properties.EnumProperty) property).getPossibleValues().stream() + .map(x -> x.getSerializedName()) + .collect(Collectors.toList())); + } + return new PropertyAdapter<>(property); } - return new PropertyAdapter<>(property); + }); + + public static Property transmogToWorldEditProperty(net.minecraft.world.level.block.state.properties.Property property) { + return PROPERTY_CACHE.getUnchecked(property); } private static Map, Object> transmogToWorldEditProperties(BlockType block, Map, Comparable> mcProps) { diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java index ef1a134717..f1295c0ab5 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/internal/FabricWorldNativeAccess.java @@ -142,6 +142,12 @@ public void notifyNeighbors(BlockPos pos, BlockState oldState, BlockState newSta } } + @Override + public void updateBlock(BlockPos pos, BlockState oldState, BlockState newState) { + Level world = getWorld(); + newState.onPlace(world, pos, oldState, false); + } + @Override public void updateNeighbors(BlockPos pos, BlockState oldState, BlockState newState, int recursionLimit) { Level world = getWorld(); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorDerivedLevelData.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorDerivedLevelData.java new file mode 100644 index 0000000000..8af17bc613 --- /dev/null +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/AccessorDerivedLevelData.java @@ -0,0 +1,32 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.fabric.mixin; + +import net.minecraft.world.level.storage.DerivedLevelData; +import net.minecraft.world.level.storage.ServerLevelData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(DerivedLevelData.class) +public interface AccessorDerivedLevelData extends ServerLevelData { + + @Accessor + ServerLevelData getWrapped(); +} diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java index 17ae3eea91..c2fa3b572f 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/mixin/MixinMinecraftServer.java @@ -23,13 +23,11 @@ import com.sk89q.worldedit.fabric.internal.ExtendedMinecraftServer; import net.minecraft.Util; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.ServerResources; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.LevelStorageSource; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; import java.nio.file.Path; @@ -52,7 +50,4 @@ public Path getStoragePath(Level world) { return storageSource.getDimensionPath(world.dimension()); } - @Accessor - @Override - public abstract ServerResources getResources(); } diff --git a/worldedit-fabric/src/main/resources/fabric.mod.json b/worldedit-fabric/src/main/resources/fabric.mod.json index d380affc9f..81174ad6b9 100644 --- a/worldedit-fabric/src/main/resources/fabric.mod.json +++ b/worldedit-fabric/src/main/resources/fabric.mod.json @@ -39,7 +39,7 @@ "fabric-permissions-api-v0": "*" }, "mixins": [ - "worldedit.mixins.json" + "worldedit-fabric.mixins.json" ], "accessWidener" : "worldedit.accesswidener" } diff --git a/worldedit-fabric/src/main/resources/worldedit.mixins.json b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json similarity index 93% rename from worldedit-fabric/src/main/resources/worldedit.mixins.json rename to worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json index 37f3c7809b..076670106b 100644 --- a/worldedit-fabric/src/main/resources/worldedit.mixins.json +++ b/worldedit-fabric/src/main/resources/worldedit-fabric.mixins.json @@ -5,6 +5,7 @@ "mixins": [ "AccessorClientboundBlockEntityDataPacket", "AccessorPrimaryLevelData", + "AccessorDerivedLevelData", "AccessorServerChunkCache", "MixinLevelChunkSetBlockHook", "MixinMinecraftServer", diff --git a/worldedit-forge/build.gradle.kts b/worldedit-forge/build.gradle.kts index c9fb12b1cc..1109aa3a10 100644 --- a/worldedit-forge/build.gradle.kts +++ b/worldedit-forge/build.gradle.kts @@ -5,17 +5,18 @@ import net.minecraftforge.gradle.userdev.tasks.RenameJarInPlace plugins { id("net.minecraftforge.gradle") + id("org.spongepowered.mixin") `java-library` } applyPlatformAndCoreConfiguration(javaRelease = 17) applyShadowConfiguration() -val minecraftVersion = "1.18.1" +val minecraftVersion = "1.18.2" val nextMajorMinecraftVersion: String = minecraftVersion.split('.').let { (useless, major) -> "$useless.${major.toInt() + 1}" } -val forgeVersion = "39.0.0" +val forgeVersion = "40.0.18" val apiClasspath = configurations.create("apiClasspath") { isCanBeResolved = true @@ -29,6 +30,7 @@ dependencies { }) "minecraft"("net.minecraftforge:forge:$minecraftVersion-$forgeVersion") + "annotationProcessor"("org.spongepowered:mixin:0.8.5:processor") } configure { @@ -54,6 +56,11 @@ configure { } +configure { + add(sourceSets["main"], "worldedit-forge.mixins.refmap.json") + config("worldedit-forge.mixins.json") +} + configure { archivesBaseName = "$archivesBaseName-mc$minecraftVersion" } @@ -158,7 +165,5 @@ tasks.named("shadowJar") { } } -afterEvaluate { - val reobf = extensions.getByName>("reobf") - reobf.create("shadowJar") -} +val reobf = extensions.getByName>("reobf") +reobf.create("shadowJar") diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockCategoryRegistry.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockCategoryRegistry.java index ecf819b015..b613cd882c 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockCategoryRegistry.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeBlockCategoryRegistry.java @@ -19,22 +19,32 @@ package com.sk89q.worldedit.forge; +import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.registry.BlockCategoryRegistry; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.tags.ITagManager; -import java.util.Collections; -import java.util.Optional; +import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; public class ForgeBlockCategoryRegistry implements BlockCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(BlockTags.getAllTags().getTag(new ResourceLocation(category))) - .map(Tag::getValues).orElse(Collections.emptyList()) - .stream().map(ForgeAdapter::adapt).collect(Collectors.toSet()); + ITagManager tags = Objects.requireNonNull( + ForgeRegistries.BLOCKS.tags(), "no block tags registry" + ); + return tags + .getTag(TagKey.create( + Registry.BLOCK_REGISTRY, + new ResourceLocation(category) + )) + .stream() + .map(ForgeAdapter::adapt) + .collect(ImmutableSet.toImmutableSet()); } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java index fd5f992d13..47690688b7 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntity.java @@ -50,21 +50,16 @@ class ForgeEntity implements Entity { @Override public BaseEntity getState() { net.minecraft.world.entity.Entity entity = entityRef.get(); - if (entity != null) { - ResourceLocation id = entity.getType().getRegistryName(); - if (id != null) { - CompoundTag tag = new CompoundTag(); - entity.saveWithoutId(tag); - return new BaseEntity( - EntityTypes.get(id.toString()), - LazyReference.from(() -> NBTConverter.fromNative(tag)) - ); - } else { - return null; - } - } else { + if (entity == null || entity.isPassenger()) { + return null; + } + ResourceLocation id = entity.getType().getRegistryName(); + if (id == null) { return null; } + CompoundTag tag = new CompoundTag(); + entity.saveWithoutId(tag); + return new BaseEntity(EntityTypes.get(id.toString()), LazyReference.from(() -> NBTConverter.fromNative(tag))); } @Override diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemCategoryRegistry.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemCategoryRegistry.java index a060994101..79191caff2 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemCategoryRegistry.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemCategoryRegistry.java @@ -19,22 +19,32 @@ package com.sk89q.worldedit.forge; +import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.ItemCategoryRegistry; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.Tag; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.tags.ITagManager; -import java.util.Collections; -import java.util.Optional; +import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; public class ForgeItemCategoryRegistry implements ItemCategoryRegistry { @Override public Set getCategorisedByName(String category) { - return Optional.ofNullable(ItemTags.getAllTags().getTag(new ResourceLocation(category))) - .map(Tag::getValues).orElse(Collections.emptyList()) - .stream().map(ForgeAdapter::adapt).collect(Collectors.toSet()); + ITagManager tags = Objects.requireNonNull( + ForgeRegistries.ITEMS.tags(), "no item tags registry" + ); + return tags + .getTag(TagKey.create( + Registry.ITEM_REGISTRY, + new ResourceLocation(category) + )) + .stream() + .map(ForgeAdapter::adapt) + .collect(ImmutableSet.toImmutableSet()); } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java index 17c27c299b..dc9e986690 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.forge; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.PermissionCondition; @@ -28,6 +29,7 @@ import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.MultiUserPlatform; import com.sk89q.worldedit.extension.platform.Preference; +import com.sk89q.worldedit.forge.internal.ExtendedChunk; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.io.ResourceLoader; import com.sk89q.worldedit.world.DataFixer; @@ -41,6 +43,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraftforge.server.ServerLifecycleHooks; import org.enginehub.piston.Command; @@ -217,7 +220,7 @@ public Map getCapabilities() { return capabilities; } - private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( + private static final Set SUPPORTED_SIDE_EFFECTS_NO_MIXIN = Sets.immutableEnumSet( SideEffect.VALIDATION, SideEffect.ENTITY_AI, SideEffect.LIGHTING, @@ -225,9 +228,15 @@ public Map getCapabilities() { SideEffect.EVENTS ); + private static final Set SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet( + Iterables.concat(SUPPORTED_SIDE_EFFECTS_NO_MIXIN, Collections.singleton(SideEffect.UPDATE)) + ); + @Override public Set getSupportedSideEffects() { - return SUPPORTED_SIDE_EFFECTS; + return ExtendedChunk.class.isAssignableFrom(LevelChunk.class) + ? SUPPORTED_SIDE_EFFECTS + : SUPPORTED_SIDE_EFFECTS_NO_MIXIN; } @Override diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index cd8c4d5917..3376da2f9f 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -23,12 +23,10 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.google.common.collect.Streams; import com.google.common.util.concurrent.Futures; -import com.mojang.serialization.Codec; -import com.mojang.serialization.Dynamic; +import com.sk89q.jnbt.NBTConstants; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; @@ -39,8 +37,10 @@ import com.sk89q.worldedit.forge.internal.ForgeWorldNativeAccess; import com.sk89q.worldedit.forge.internal.NBTConverter; import com.sk89q.worldedit.forge.internal.TileEntityUtils; +import com.sk89q.worldedit.function.mask.AbstractExtentMask; +import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.function.mask.Mask2D; import com.sk89q.worldedit.internal.Constants; -import com.sk89q.worldedit.internal.util.BiomeMath; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; @@ -64,13 +64,10 @@ import com.sk89q.worldedit.world.weather.WeatherTypes; import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.worldgen.features.EndFeatures; import net.minecraft.data.worldgen.features.TreeFeatures; -import net.minecraft.nbt.NbtOps; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.RegistryReadOps; -import net.minecraft.resources.RegistryWriteOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerChunkCache; @@ -86,6 +83,7 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; @@ -106,11 +104,11 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.OptionalLong; import java.util.Random; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -219,7 +217,9 @@ public BiomeType getBiome(BlockVector3 position) { } private BiomeType getBiomeInChunk(BlockVector3 position, ChunkAccess chunk) { - return ForgeAdapter.adapt(chunk.getNoiseBiome(position.getX() >> 2, position.getY() >> 2, position.getZ() >> 2)); + return ForgeAdapter.adapt( + chunk.getNoiseBiome(position.getX() >> 2, position.getY() >> 2, position.getZ() >> 2).value() + ); } @Override @@ -228,10 +228,12 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { checkNotNull(biome); LevelChunk chunk = getWorld().getChunk(position.getBlockX() >> 4, position.getBlockZ() >> 4); - PalettedContainer biomes = chunk.getSection(chunk.getSectionIndex(position.getY())).getBiomes(); + PalettedContainer> biomes = chunk.getSection(chunk.getSectionIndex(position.getY())).getBiomes(); biomes.getAndSetUnchecked( position.getX() & 3, position.getY() & 3, position.getZ() & 3, - ForgeAdapter.adapt(biome) + getWorld().registryAccess().registry(Registry.BIOME_REGISTRY) + .orElseThrow() + .getHolderOrThrow(ResourceKey.create(Registry.BIOME_REGISTRY, new ResourceLocation(biome.getId()))) ); chunk.setUnsaved(true); return true; @@ -320,7 +322,7 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws long seed = options.getSeed().orElse(originalWorld.getSeed()); WorldGenSettings newOpts = options.getSeed().isPresent() - ? replaceSeed(originalWorld, seed, originalOpts) + ? originalOpts.withSeed(levelProperties.isHardcore(), OptionalLong.of(seed)) : originalOpts; levelProperties.worldGenSettings = newOpts; @@ -331,7 +333,7 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws originalWorld.getServer(), Util.backgroundExecutor(), session, ((ServerLevelData) originalWorld.getLevelData()), worldRegKey, - originalWorld.dimensionType(), + originalWorld.dimensionTypeRegistration(), new WorldEditGenListener(), dimGenOpts.generator(), originalWorld.isDebug(), @@ -355,49 +357,6 @@ private void doRegen(Region region, Extent extent, RegenOptions options) throws } } - private WorldGenSettings replaceSeed(ServerLevel originalWorld, long seed, WorldGenSettings originalOpts) { - RegistryWriteOps nbtReadRegOps = RegistryWriteOps.create( - NbtOps.INSTANCE, - originalWorld.getServer().registryAccess() - ); - RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( - NbtOps.INSTANCE, - originalWorld.getServer().getResourceManager(), - originalWorld.getServer().registryAccess() - ); - Codec dimCodec = WorldGenSettings.CODEC; - return dimCodec - .encodeStart(nbtReadRegOps, originalOpts) - .flatMap(tag -> - dimCodec.parse( - recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()) - ) - ) - .get() - .map( - l -> l, - error -> { - throw new IllegalStateException("Unable to map GeneratorOptions: " + error.message()); - } - ); - } - - @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - if (!seen.add(dynamic)) { - return dynamic; - } - return dynamic.updateMapValues(pair -> { - if (pair.getFirst().asString("").equals("seed")) { - return pair.mapSecond(v -> v.createLong(seed)); - } - if (pair.getSecond().getValue() instanceof net.minecraft.nbt.CompoundTag) { - return pair.mapSecond(v -> recursivelySetSeed((Dynamic) v, seed, seen)); - } - return pair; - }); - } - private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws WorldEditException { List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); @@ -428,9 +387,7 @@ private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld BlockStateHolder state = ForgeAdapter.adapt(chunk.getBlockState(pos)); BlockEntity blockEntity = chunk.getBlockEntity(pos); if (blockEntity != null) { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - blockEntity.save(tag); - state = state.toBaseBlock(LazyReference.from(() -> NBTConverter.fromNative(tag))); + state = state.toBaseBlock(LazyReference.from(() -> NBTConverter.fromNative(blockEntity.saveWithFullMetadata()))); } extent.setBlock(vec, state.toBaseBlock()); @@ -454,7 +411,7 @@ private List> submitChunkLoadTasks(Region region, } @Nullable - private static ConfiguredFeature createTreeFeatureGenerator(TreeType type) { + private static Holder> createTreeFeatureGenerator(TreeType type) { return switch (type) { case TREE -> TreeFeatures.OAK; case BIG_TREE -> TreeFeatures.FANCY_OAK; @@ -482,7 +439,9 @@ private List> submitChunkLoadTasks(Region region, @Override public boolean generateTree(TreeType type, EditSession editSession, BlockVector3 position) { - ConfiguredFeature generator = createTreeFeatureGenerator(type); + ConfiguredFeature generator = Optional.ofNullable(createTreeFeatureGenerator(type)) + .map(Holder::value) + .orElse(null); ServerLevel world = getWorld(); ServerChunkCache chunkManager = world.getChunkSource(); if (type == TreeType.CHORUS_PLANT) { @@ -572,7 +531,7 @@ public int getMinY() { @Override public int getMaxY() { - return getWorld().getHeight() - 1; + return getWorld().getMaxBuildHeight() - 1; } @Override @@ -618,8 +577,7 @@ public int hashCode() { public boolean equals(Object o) { if (o == null) { return false; - } else if ((o instanceof ForgeWorld)) { - ForgeWorld other = ((ForgeWorld) o); + } else if ((o instanceof ForgeWorld other)) { Level otherWorld = other.worldRef.get(); Level thisWorld = worldRef.get(); return otherWorld != null && otherWorld.equals(thisWorld); @@ -642,47 +600,75 @@ public List getEntities(Region region) { box, e -> region.contains(ForgeAdapter.adapt(e.blockPosition())) ); - return ImmutableList.copyOf(Lists.transform( - nmsEntities, - ForgeEntity::new - )); + return nmsEntities.stream().map(ForgeEntity::new).collect(ImmutableList.toImmutableList()); } @Override public List getEntities() { final ServerLevel world = getWorld(); - return ImmutableList.copyOf(Iterables.transform( - world.getAllEntities(), - ForgeEntity::new - )); + return Streams.stream(world.getAllEntities()) + .map(ForgeEntity::new) + .collect(ImmutableList.toImmutableList()); } @Nullable @Override public Entity createEntity(Location location, BaseEntity entity) { ServerLevel world = getWorld(); - final Optional> entityType = EntityType.byString(entity.getType().getId()); - if (!entityType.isPresent()) { + String entityId = entity.getType().getId(); + final Optional> entityType = EntityType.byString(entityId); + if (entityType.isEmpty()) { return null; } - net.minecraft.world.entity.Entity createdEntity = entityType.get().create(world); + CompoundBinaryTag nativeTag = entity.getNbt(); + net.minecraft.nbt.CompoundTag tag; + if (nativeTag != null) { + tag = NBTConverter.toNative(nativeTag); + removeUnwantedEntityTagsRecursively(tag); + } else { + tag = new net.minecraft.nbt.CompoundTag(); + } + tag.putString("id", entityId); + + net.minecraft.world.entity.Entity createdEntity = EntityType.loadEntityRecursive(tag, world, (loadedEntity) -> { + loadedEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + return loadedEntity; + }); if (createdEntity != null) { - CompoundBinaryTag nativeTag = entity.getNbt(); - if (nativeTag != null) { - net.minecraft.nbt.CompoundTag tag = NBTConverter.toNative(nativeTag); - for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - createdEntity.load(tag); - } + world.addFreshEntityWithPassengers(createdEntity); + return new ForgeEntity(createdEntity); + } + return null; + } - createdEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + private void removeUnwantedEntityTagsRecursively(net.minecraft.nbt.CompoundTag tag) { + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } - world.addFreshEntity(createdEntity); - return new ForgeEntity(createdEntity); - } else { - return null; + // Adapted from net.minecraft.world.entity.EntityType#loadEntityRecursive + if (tag.contains("Passengers", NBTConstants.TYPE_LIST)) { + net.minecraft.nbt.ListTag nbttaglist = tag.getList("Passengers", NBTConstants.TYPE_COMPOUND); + + for (int i = 0; i < nbttaglist.size(); ++i) { + removeUnwantedEntityTagsRecursively(nbttaglist.getCompound(i)); + } } } + @Override + public Mask createLiquidMask() { + return new AbstractExtentMask(this) { + @Override + public boolean test(BlockVector3 vector) { + return ForgeAdapter.adapt(getExtent().getBlock(vector)).getBlock() instanceof LiquidBlock; + } + + @Nullable + @Override + public Mask2D toMask2D() { + return null; + } + }; + } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java index 1287e7f2b4..3cba00de79 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java @@ -50,8 +50,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.InteractionHand; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.CommandEvent; @@ -173,6 +172,8 @@ private void setupPlatform() { // } } + // TODO clean this up once Forge adds a proper API for this + @SuppressWarnings("deprecation") private void setupRegistries(MinecraftServer server) { // Blocks for (ResourceLocation name : ForgeRegistries.BLOCKS.getKeys()) { @@ -200,16 +201,16 @@ private void setupRegistries(MinecraftServer server) { } } // Tags - for (ResourceLocation name : BlockTags.getAllTags().getAvailableTags()) { + Registry.BLOCK.getTagNames().map(TagKey::location).forEach(name -> { if (BlockCategory.REGISTRY.get(name.toString()) == null) { BlockCategory.REGISTRY.register(name.toString(), new BlockCategory(name.toString())); } - } - for (ResourceLocation name : ItemTags.getAllTags().getAvailableTags()) { + }); + Registry.ITEM.getTagNames().map(TagKey::location).forEach(name -> { if (ItemCategory.REGISTRY.get(name.toString()) == null) { ItemCategory.REGISTRY.register(name.toString(), new ItemCategory(name.toString())); } - } + }); } @SubscribeEvent diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ExtendedChunk.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ExtendedChunk.java new file mode 100644 index 0000000000..7fb97026dc --- /dev/null +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ExtendedChunk.java @@ -0,0 +1,43 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.forge.internal; + +import com.sk89q.worldedit.util.SideEffect; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; + +import javax.annotation.Nullable; + +public interface ExtendedChunk { + /** + * {@link ChunkAccess#setBlockState(BlockPos, BlockState, boolean)} with the extra + * {@link SideEffect#UPDATE} flag. + * + * @param pos the position to set + * @param state the state to set + * @param moved I honestly have no idea and can't be bothered to investigate, we pass {@code + * false} + * @param update the update flag, see side-effect for details + * @return the old block state, or {@code null} if unchanged + */ + @Nullable + BlockState setBlockState(BlockPos pos, BlockState state, boolean moved, boolean update); +} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeTransmogrifier.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeTransmogrifier.java index b647237cb5..38224711fd 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeTransmogrifier.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeTransmogrifier.java @@ -19,6 +19,9 @@ package com.sk89q.worldedit.forge.internal; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.forge.ForgeAdapter; import com.sk89q.worldedit.registry.state.BooleanProperty; @@ -44,27 +47,34 @@ */ public class ForgeTransmogrifier { - public static Property transmogToWorldEditProperty(net.minecraft.world.level.block.state.properties.Property property) { - if (property instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { - return new BooleanProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.BooleanProperty) property).getPossibleValues())); - } - if (property instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { - return new IntegerProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.IntegerProperty) property).getPossibleValues())); - } - if (property instanceof DirectionProperty) { - return new DirectionalProperty(property.getName(), ((DirectionProperty) property).getPossibleValues().stream() - .map(ForgeAdapter::adaptEnumFacing) - .collect(Collectors.toList())); - } - if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { - // Note: do not make x.getSerializedName a method reference. - // It will cause runtime bootstrap exceptions. - //noinspection Convert2MethodRef - return new EnumProperty(property.getName(), ((net.minecraft.world.level.block.state.properties.EnumProperty) property).getPossibleValues().stream() - .map(x -> x.getSerializedName()) - .collect(Collectors.toList())); + private static final LoadingCache, Property> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader<>() { + @Override + public Property load(net.minecraft.world.level.block.state.properties.Property property) throws Exception { + if (property instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { + return new BooleanProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.BooleanProperty) property).getPossibleValues())); + } + if (property instanceof net.minecraft.world.level.block.state.properties.IntegerProperty) { + return new IntegerProperty(property.getName(), ImmutableList.copyOf(((net.minecraft.world.level.block.state.properties.IntegerProperty) property).getPossibleValues())); + } + if (property instanceof DirectionProperty) { + return new DirectionalProperty(property.getName(), ((DirectionProperty) property).getPossibleValues().stream() + .map(ForgeAdapter::adaptEnumFacing) + .collect(Collectors.toList())); + } + if (property instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + // Note: do not make x.getSerializedName a method reference. + // It will cause runtime bootstrap exceptions. + //noinspection Convert2MethodRef + return new EnumProperty(property.getName(), ((net.minecraft.world.level.block.state.properties.EnumProperty) property).getPossibleValues().stream() + .map(x -> x.getSerializedName()) + .collect(Collectors.toList())); + } + return new IPropertyAdapter<>(property); } - return new IPropertyAdapter<>(property); + }); + + public static Property transmogToWorldEditProperty(net.minecraft.world.level.block.state.properties.Property property) { + return PROPERTY_CACHE.getUnchecked(property); } public static Map, Object> transmogToWorldEditProperties(BlockType block, Map, Comparable> mcProps) { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java index 975a645d8f..6e3d2694fb 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/internal/ForgeWorldNativeAccess.java @@ -77,6 +77,11 @@ public BlockState getBlockState(LevelChunk chunk, BlockPos position) { @Nullable @Override public BlockState setBlockState(LevelChunk chunk, BlockPos position, BlockState state) { + if (chunk instanceof ExtendedChunk) { + return ((ExtendedChunk) chunk).setBlockState( + position, state, false, sideEffectSet.shouldApply(SideEffect.UPDATE) + ); + } return chunk.setBlockState(position, state, false); } @@ -140,6 +145,12 @@ public void notifyNeighbors(BlockPos pos, BlockState oldState, BlockState newSta } } + @Override + public void updateBlock(BlockPos pos, BlockState oldState, BlockState newState) { + ServerLevel world = getWorld(); + newState.onPlace(world, pos, oldState, false); + } + @Override public void updateNeighbors(BlockPos pos, BlockState oldState, BlockState newState, int recursionLimit) { ServerLevel world = getWorld(); diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/mixin/MixinLevelChunkSetBlockHook.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/mixin/MixinLevelChunkSetBlockHook.java new file mode 100644 index 0000000000..4bfa690b3b --- /dev/null +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/mixin/MixinLevelChunkSetBlockHook.java @@ -0,0 +1,85 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.forge.mixin; + +import com.sk89q.worldedit.forge.internal.ExtendedChunk; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.UpgradeData; +import net.minecraft.world.level.levelgen.blending.BlendingData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; + +import javax.annotation.Nullable; + +@Mixin(LevelChunk.class) +public abstract class MixinLevelChunkSetBlockHook extends ChunkAccess implements ExtendedChunk { + private boolean shouldUpdate = true; + + public MixinLevelChunkSetBlockHook(ChunkPos chunkPos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor, Registry registry, long l, @org.jetbrains.annotations.Nullable LevelChunkSection[] levelChunkSections, @org.jetbrains.annotations.Nullable BlendingData blendingData) { + super(chunkPos, upgradeData, levelHeightAccessor, registry, l, levelChunkSections, blendingData); + } + + @Nullable + @Override + public BlockState setBlockState(BlockPos pos, BlockState state, boolean moved, boolean update) { + // save the state for the hook + shouldUpdate = update; + try { + return setBlockState(pos, state, moved); + } finally { + // restore natural mode + shouldUpdate = true; + } + } + + @Redirect( + method = "setBlockState", + slice = @Slice( + from = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;is(Lnet/minecraft/world/level/block/Block;)Z") + ), + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;onPlace(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V") + ) + public void setBlockStateHook(BlockState target, Level world, BlockPos pos, BlockState old, boolean move) { + boolean localShouldUpdate; + MinecraftServer server = world.getServer(); + if (server == null || Thread.currentThread() != server.getRunningThread()) { + // We're not on the server thread for some reason, WorldEdit will never be here + // so we'll just ignore our flag + localShouldUpdate = true; + } else { + localShouldUpdate = shouldUpdate; + } + if (localShouldUpdate) { + target.onPlace(world, pos, old, move); + } + } +} diff --git a/worldedit-forge/src/main/resources/worldedit-forge.mixins.json b/worldedit-forge/src/main/resources/worldedit-forge.mixins.json new file mode 100644 index 0000000000..930b41b6db --- /dev/null +++ b/worldedit-forge/src/main/resources/worldedit-forge.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "com.sk89q.worldedit.forge.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "MixinLevelChunkSetBlockHook" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "worldedit-forge.mixins.refmap.json" +} diff --git a/worldedit-libs/sponge/build.gradle.kts b/worldedit-libs/sponge/build.gradle.kts index 47bd7e59c5..7f10cf0124 100644 --- a/worldedit-libs/sponge/build.gradle.kts +++ b/worldedit-libs/sponge/build.gradle.kts @@ -8,5 +8,4 @@ repositories { } } dependencies { - "shade"("net.kyori:text-adapter-spongeapi:${Versions.TEXT_EXTRAS}") } diff --git a/worldedit-mod/build.gradle.kts b/worldedit-mod/build.gradle.kts index 66fa8cd67b..ebed03bf56 100644 --- a/worldedit-mod/build.gradle.kts +++ b/worldedit-mod/build.gradle.kts @@ -13,9 +13,29 @@ tasks.register("jar") { project(":worldedit-forge").tasks.named("reobfShadowJar") ) from(zipTree({remapFabric.get().archiveFile})) - from(zipTree({project(":worldedit-forge").tasks.getByName("shadowJar").outputs.files.singleFile})) + from(zipTree({project(":worldedit-forge").tasks.getByName("shadowJar").outputs.files.singleFile})) { + // Duplicated first-party files + exclude("META-INF/services/org.enginehub.piston.CommandManagerService") + exclude("lang/") + // No-brainer library excludes + exclude("com/sk89q/jchronic/") + exclude("com/sk89q/jnbt/") + exclude("com/sk89q/minecraft/") + exclude("com/sk89q/util/") + exclude("com/thoughtworks/") + exclude("net/royawesome/") + exclude("org/enginehub/piston/") + // Exclude worldedit-core + exclude { + val pathString = it.relativePath.pathString + pathString.startsWith("com/sk89q/worldedit/") && !pathString.startsWith("com/sk89q/worldedit/forge/") + } + // Questionable excludes. So far the two files from each jar are the same. + exclude("defaults/worldedit.properties") + exclude("pack.mcmeta") + } - duplicatesStrategy = DuplicatesStrategy.EXCLUDE + duplicatesStrategy = DuplicatesStrategy.FAIL archiveClassifier.set("dist") } diff --git a/worldedit-sponge/build.gradle.kts b/worldedit-sponge/build.gradle.kts index affa68b86a..c8493eac9f 100644 --- a/worldedit-sponge/build.gradle.kts +++ b/worldedit-sponge/build.gradle.kts @@ -1,54 +1,86 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.spongepowered.gradle.plugin.config.PluginLoaders +import org.spongepowered.plugin.metadata.model.PluginDependency plugins { id("org.spongepowered.gradle.plugin") + id("org.spongepowered.gradle.vanilla") } applyPlatformAndCoreConfiguration() applyShadowConfiguration() -// I can't believe sponge sets this in a base plugin with no opt-out -convention.getPlugin(JavaPluginConvention::class.java).apply { - setSourceCompatibility(null) - setTargetCompatibility(null) +repositories { + mavenCentral() } -repositories { - maven { url = uri("https://repo.codemc.org/repository/maven-public") } +minecraft { + version("1.16.5") +} + +val spongeApiVersion = "8.1.0"; + +sponge { + apiVersion(spongeApiVersion) + license("GPL-3.0-or-later") + plugin("worldedit") { + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } + displayName("WorldEdit") + version(project.ext["internalVersion"].toString()) + entrypoint("com.sk89q.worldedit.sponge.SpongeWorldEdit") + description("WorldEdit is an easy-to-use in-game world editor for Minecraft, supporting both single- and multi-player.") + links { + homepage("https://enginehub.org/worldedit/") + source("https://github.com/EngineHub/WorldEdit") + issues("https://github.com/EngineHub/WorldEdit/issues") + } + contributor("EngineHub") { + description("Various members of the EngineHub team") + } + dependency("spongeapi") { + loadOrder(PluginDependency.LoadOrder.AFTER) + optional(false) + } + } } dependencies { api(project(":worldedit-core")) api(project(":worldedit-libs:sponge")) - api("org.spongepowered:spongeapi:7.1.0") { - exclude(group = "org.slf4j", module = "slf4j-api") + // TODO remove after VG merges and releases my patch + // https://github.com/SpongePowered/VanillaGradle/pull/66 + minecraft(minecraft.platform().get().moduleName() + ":" + minecraft.version().get()) { + exclude("it.unimi.dsi", "fastutil") } implementation(platform("org.apache.logging.log4j:log4j-bom:${Versions.LOG4J}") { because("Sponge 8 (will?) provides Log4J") }) api("org.apache.logging.log4j:log4j-api") - api("org.bstats:bstats-sponge:1.7") - testImplementation("org.mockito:mockito-core:1.9.0-rc1") + implementation("org.bstats:bstats-sponge:3.0.0") + implementation("it.unimi.dsi:fastutil") + testImplementation("org.mockito:mockito-core:${Versions.MOCKITO}") +} + +configure { + archivesName.set("${project.name}-api$spongeApiVersion") } addJarManifest(WorldEditKind.Mod, includeClasspath = true) tasks.named("shadowJar") { dependencies { - relocate ("org.bstats", "com.sk89q.worldedit.sponge.bstats") { - include(dependency("org.bstats:bstats-sponge:1.7")) - } - } -} + include(dependency("org.bstats:")) + include(dependency("org.antlr:antlr4-runtime")) + include(dependency("it.unimi.dsi:fastutil")) -if (project.hasProperty("signing")) { - apply(plugin = "signing") - - configure { - sign("shadowJar") - } - - tasks.named("build").configure { - dependsOn("signShadowJar") + relocate("org.antlr.v4", "com.sk89q.worldedit.antlr4") + relocate("org.bstats", "com.sk89q.worldedit.sponge.bstats") + relocate("it.unimi.dsi.fastutil", "com.sk89q.worldedit.sponge.fastutil") } } +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CUIChannelHandler.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CUIChannelHandler.java index 8e342f79ca..79f23a134c 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CUIChannelHandler.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CUIChannelHandler.java @@ -20,42 +20,48 @@ package com.sk89q.worldedit.sponge; import com.sk89q.worldedit.LocalSession; -import org.spongepowered.api.Platform; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.network.ChannelBinding; -import org.spongepowered.api.network.ChannelBuf; -import org.spongepowered.api.network.PlayerConnection; -import org.spongepowered.api.network.RawDataListener; -import org.spongepowered.api.network.RemoteConnection; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.util.lifecycle.SimpleLifecycled; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.lifecycle.RegisterChannelEvent; +import org.spongepowered.api.network.ServerPlayerConnection; +import org.spongepowered.api.network.channel.ChannelBuf; +import org.spongepowered.api.network.channel.raw.RawDataChannel; +import org.spongepowered.api.network.channel.raw.play.RawPlayDataHandler; import java.nio.charset.StandardCharsets; -public class CUIChannelHandler implements RawDataListener { - public static final String CUI_PLUGIN_CHANNEL = "worldedit:cui"; +public class CUIChannelHandler implements RawPlayDataHandler { + public static final ResourceKey CUI_PLUGIN_CHANNEL = ResourceKey.of("worldedit", "cui"); + private static final SimpleLifecycled CHANNEL = SimpleLifecycled.invalid(); - private static ChannelBinding.RawDataChannel channel; - - public static void init() { - channel = Sponge.getChannelRegistrar().createRawChannel(SpongeWorldEdit.inst(), CUI_PLUGIN_CHANNEL); - channel.addListener(Platform.Type.SERVER, new CUIChannelHandler()); + public static final class RegistrationHandler { + @Listener + public void onChannelRegistration(RegisterChannelEvent event) { + RawDataChannel channel = event.register(CUI_PLUGIN_CHANNEL, RawDataChannel.class); + channel.play().addHandler(ServerPlayerConnection.class, new CUIChannelHandler()); + CHANNEL.newValue(channel); + } } - - public static ChannelBinding.RawDataChannel getActiveChannel() { - return channel; + public static RawDataChannel channel() { + return CHANNEL.valueOrThrow(); } @Override - public void handlePayload(ChannelBuf data, RemoteConnection connection, Platform.Type side) { - if (connection instanceof PlayerConnection) { - Player player = ((PlayerConnection) connection).getPlayer(); + public void handlePayload(ChannelBuf data, ServerPlayerConnection connection) { + ServerPlayer player = connection.player(); - LocalSession session = SpongeWorldEdit.inst().getSession(player); + SpongePlayer spongePlayer = SpongeAdapter.adapt(player); + LocalSession session = WorldEdit.getInstance().getSessionManager().get( + spongePlayer + ); - final SpongePlayer actor = SpongeWorldEdit.inst().wrapPlayer(player); - session.handleCUIInitializationMessage(new String(data.readBytes(data.available()), StandardCharsets.UTF_8), - actor); - } + session.handleCUIInitializationMessage( + new String(data.readBytes(data.available()), StandardCharsets.UTF_8), + spongePlayer + ); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CommandAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CommandAdapter.java index 261d811b8d..be08709a14 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CommandAdapter.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/CommandAdapter.java @@ -20,18 +20,17 @@ package com.sk89q.worldedit.sponge; import com.sk89q.worldedit.command.util.PermissionCondition; +import com.sk89q.worldedit.sponge.internal.LocaleResolver; +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; import org.enginehub.piston.Command; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.text.Text; +import org.spongepowered.api.command.CommandCause; import java.util.Collections; import java.util.Optional; import java.util.Set; -import static com.sk89q.worldedit.sponge.SpongeTextAdapter.convert; - -public abstract class CommandAdapter implements CommandCallable { +public abstract class CommandAdapter implements org.spongepowered.api.command.Command.Raw { private final Command command; protected CommandAdapter(Command command) { @@ -39,12 +38,18 @@ protected CommandAdapter(Command command) { } @Override - public boolean testPermission(CommandSource source) { + public boolean canExecute(CommandCause cause) { Set permissions = command.getCondition().as(PermissionCondition.class) .map(PermissionCondition::getPermissions) .orElseGet(Collections::emptySet); + + // Allow commands without permission nodes to always execute. + if (permissions.isEmpty()) { + return true; + } + for (String perm : permissions) { - if (source.hasPermission(perm)) { + if (cause.hasPermission(perm)) { return true; } } @@ -52,19 +57,25 @@ public boolean testPermission(CommandSource source) { } @Override - public Optional getShortDescription(CommandSource source) { + public Optional shortDescription(CommandCause cause) { return Optional.of(command.getDescription()) - .map(desc -> SpongeTextAdapter.convert(desc, source.getLocale())); + .map(desc -> SpongeTextAdapter.convert(desc, LocaleResolver.resolveLocale(cause.audience()))); + } + + @Override + public Optional extendedDescription(CommandCause cause) { + return command.getFooter() + .map(footer -> SpongeTextAdapter.convert(footer, LocaleResolver.resolveLocale(cause.audience()))); } @Override - public Optional getHelp(CommandSource source) { + public Optional help(@NonNull CommandCause cause) { return Optional.of(command.getFullHelp()) - .map(help -> SpongeTextAdapter.convert(help, source.getLocale())); + .map(help -> SpongeTextAdapter.convert(help, LocaleResolver.resolveLocale(cause.audience()))); } @Override - public Text getUsage(CommandSource source) { - return convert(command.getUsage(), source.getLocale()); + public Component usage(CommandCause cause) { + return SpongeTextAdapter.convert(command.getUsage(), LocaleResolver.resolveLocale(cause.audience())); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/AdapterLoadException.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/Constants.java similarity index 65% rename from worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/AdapterLoadException.java rename to worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/Constants.java index f2698fc729..7edfd16c6f 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/AdapterLoadException.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/Constants.java @@ -17,25 +17,23 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.sponge.adapter; +package com.sk89q.worldedit.sponge; + +import org.spongepowered.api.data.persistence.DataQuery; /** - * Thrown when no adapter can be found. + * Kinda mirrors Sponge Common's Constants class. + * + *

Internal. Do not use.

*/ -public class AdapterLoadException extends Exception { - - public AdapterLoadException() { - } - - public AdapterLoadException(String message) { - super(message); - } +public class Constants { + public static class Sponge { + public static final DataQuery UNSAFE_NBT = DataQuery.of("UnsafeData"); - public AdapterLoadException(String message, Throwable cause) { - super(message, cause); + private Sponge() { + } } - public AdapterLoadException(Throwable cause) { - super(cause); + private Constants() { } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeAdapter.java index 5f720b679c..034e988d12 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeAdapter.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeAdapter.java @@ -19,15 +19,37 @@ package com.sk89q.worldedit.sponge; -import com.flowpowered.math.vector.Vector3d; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.internal.block.BlockStateIdAccess; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.sponge.internal.NbtAdapter; +import com.sk89q.worldedit.sponge.internal.SpongeTransmogrifier; +import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.biome.BiomeTypes; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.item.ItemTypes; +import net.minecraft.world.level.block.Block; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.data.persistence.DataView; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.item.inventory.ItemStack; +import org.spongepowered.api.registry.RegistryKey; +import org.spongepowered.api.registry.RegistryReference; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.biome.Biome; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.math.vector.Vector3d; +import org.spongepowered.math.vector.Vector3i; + +import java.util.Objects; import static com.google.common.base.Preconditions.checkNotNull; @@ -36,22 +58,21 @@ */ public class SpongeAdapter { - private SpongeAdapter() { + public static org.spongepowered.api.block.BlockState adapt(BlockState blockState) { + int blockStateId = BlockStateIdAccess.getBlockStateId(blockState); + if (!BlockStateIdAccess.isValidInternalId(blockStateId)) { + return SpongeTransmogrifier.transmogToMinecraft(blockState); + } + return (org.spongepowered.api.block.BlockState) Block.stateById(blockStateId); } - /** - * Create a WorldEdit world from a Sponge extent. - * - * @param world the Sponge extent - * @return a WorldEdit world - */ - public static World checkWorld(org.spongepowered.api.world.extent.Extent world) { - checkNotNull(world); - if (world instanceof org.spongepowered.api.world.World) { - return adapt((org.spongepowered.api.world.World) world); - } else { - throw new IllegalArgumentException("Extent type is not a world"); + public static BlockState adapt(org.spongepowered.api.block.BlockState blockState) { + int blockStateId = Block.getId((net.minecraft.world.level.block.state.BlockState) blockState); + BlockState worldEdit = BlockStateIdAccess.getBlockStateById(blockStateId); + if (worldEdit == null) { + return SpongeTransmogrifier.transmogToWorldEdit(blockState); } + return worldEdit; } /** @@ -60,9 +81,9 @@ public static World checkWorld(org.spongepowered.api.world.extent.Extent world) * @param world the Sponge world * @return a WorldEdit world */ - public static World adapt(org.spongepowered.api.world.World world) { + public static World adapt(ServerWorld world) { checkNotNull(world); - return SpongeWorldEdit.inst().getWorld(world); + return new SpongeWorld(world); } /** @@ -71,12 +92,13 @@ public static World adapt(org.spongepowered.api.world.World world) { * @param player The Sponge player * @return The WorldEdit player */ - public static SpongePlayer adapt(Player player) { - return SpongeWorldEdit.inst().wrapPlayer(player); + public static SpongePlayer adapt(ServerPlayer player) { + Objects.requireNonNull(player); + return new SpongePlayer(player); } /** - * Create a Bukkit Player from a WorldEdit Player. + * Create a Sponge Player from a WorldEdit Player. * * @param player The WorldEdit player * @return The Bukkit player @@ -91,12 +113,15 @@ public static Player adapt(com.sk89q.worldedit.entity.Player player) { * @param world the WorldEdit world * @return a Sponge world */ - public static org.spongepowered.api.world.World adapt(World world) { + public static ServerWorld adapt(World world) { checkNotNull(world); if (world instanceof SpongeWorld) { return ((SpongeWorld) world).getWorld(); } else { - org.spongepowered.api.world.World match = Sponge.getServer().getWorld(world.getName()).orElse(null); + // Currently this is 99% certain to fail, we don't have consistent world name/id mapping + ServerWorld match = Sponge.server().worldManager().world( + ResourceKey.resolve(world.getName()) + ).orElse(null); if (match != null) { return match; } else { @@ -105,12 +130,9 @@ public static org.spongepowered.api.world.World adapt(World world) { } } - public static BiomeType adapt(org.spongepowered.api.world.biome.BiomeType biomeType) { - return BiomeTypes.get(biomeType.getId()); - } - - public static org.spongepowered.api.world.biome.BiomeType adapt(BiomeType biomeType) { - return Sponge.getRegistry().getType(org.spongepowered.api.world.biome.BiomeType.class, biomeType.getId()).orElse(null); + public static RegistryReference adapt(BiomeType biomeType) { + return RegistryKey.of(RegistryTypes.BIOME, ResourceKey.resolve(biomeType.getId())) + .asReference(); } /** @@ -119,14 +141,15 @@ public static org.spongepowered.api.world.biome.BiomeType adapt(BiomeType biomeT * @param location the Sponge location * @return a WorldEdit location */ - public static Location adapt(org.spongepowered.api.world.Location location, Vector3d rotation) { + public static Location adapt(ServerLocation location, Vector3d rotation) { checkNotNull(location); Vector3 position = asVector(location); return new Location( - adapt(location.getExtent()), - position, - (float) rotation.getX(), - (float) rotation.getY()); + adapt(location.world()), + position, + (float) rotation.x(), + (float) rotation.y() + ); } /** @@ -135,12 +158,13 @@ public static Location adapt(org.spongepowered.api.world.Location adapt(Location location) { + public static ServerLocation adapt(Location location) { checkNotNull(location); Vector3 position = location.toVector(); - return new org.spongepowered.api.world.Location<>( - adapt((World) location.getExtent()), - position.getX(), position.getY(), position.getZ()); + return ServerLocation.of( + adapt((World) location.getExtent()), + position.getX(), position.getY(), position.getZ() + ); } /** @@ -155,24 +179,66 @@ public static Vector3d adaptRotation(Location location) { } /** - * Create a WorldEdit Vector from a Bukkit location. + * Create a WorldEdit Vector from a Sponge location. * - * @param location The Bukkit location + * @param location The Sponge location * @return a WorldEdit vector */ - public static Vector3 asVector(org.spongepowered.api.world.Location location) { + public static Vector3 asVector(ServerLocation location) { checkNotNull(location); - return Vector3.at(location.getX(), location.getY(), location.getZ()); + return Vector3.at(location.x(), location.y(), location.z()); } /** - * Create a WorldEdit BlockVector from a Bukkit location. + * Create a WorldEdit BlockVector from a Sponge location. * - * @param location The Bukkit location + * @param location The Sponge location * @return a WorldEdit vector */ - public static BlockVector3 asBlockVector(org.spongepowered.api.world.Location location) { + public static BlockVector3 asBlockVector(ServerLocation location) { checkNotNull(location); - return BlockVector3.at(location.getX(), location.getY(), location.getZ()); + return BlockVector3.at(location.x(), location.y(), location.z()); } + + public static BaseItemStack adapt(ItemStack itemStack) { + CompoundTag tag = itemStack.toContainer().getView(Constants.Sponge.UNSAFE_NBT) + .map(NbtAdapter::adaptToWorldEdit) + .orElse(null); + return new BaseItemStack( + ItemTypes.get(itemStack.type().key(RegistryTypes.ITEM_TYPE).asString()), + tag, + itemStack.quantity() + ); + } + + public static ItemStack adapt(BaseItemStack itemStack) { + ItemStack stack = ItemStack.builder() + .itemType(() -> Sponge.game().registry(RegistryTypes.ITEM_TYPE) + .value(ResourceKey.resolve(itemStack.getType().getId()))) + .quantity(itemStack.getAmount()) + .build(); + if (itemStack.getNbtData() != null) { + stack.setRawData( + DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED) + .set(Constants.Sponge.UNSAFE_NBT, NbtAdapter.adaptFromWorldEdit(itemStack.getNbtData())) + ); + } + return stack; + } + + public static Direction adapt(org.spongepowered.api.util.Direction direction) { + return Direction.valueOf(direction.name()); + } + + public static Vector3i adaptVector3i(BlockVector3 bv3) { + return new Vector3i(bv3.getX(), bv3.getY(), bv3.getZ()); + } + + public static BlockVector3 adaptVector3i(Vector3i vec3i) { + return BlockVector3.at(vec3i.x(), vec3i.y(), vec3i.z()); + } + + private SpongeAdapter() { + } + } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBiomeRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBiomeRegistry.java index fd012d2941..48dafb6a2e 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBiomeRegistry.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBiomeRegistry.java @@ -24,7 +24,8 @@ import com.sk89q.worldedit.util.translation.TranslationManager; import com.sk89q.worldedit.world.biome.BiomeData; import com.sk89q.worldedit.world.registry.BiomeRegistry; -import org.spongepowered.api.world.biome.BiomeType; +import org.spongepowered.api.registry.RegistryReference; +import org.spongepowered.api.world.biome.Biome; import javax.annotation.Nullable; @@ -49,21 +50,21 @@ public BiomeData getData(com.sk89q.worldedit.world.biome.BiomeType biome) { @Deprecated private static class SpongeBiomeData implements BiomeData { - private final BiomeType biome; + private final RegistryReference biome; /** * Create a new instance. * * @param biome the base biome */ - private SpongeBiomeData(BiomeType biome) { + private SpongeBiomeData(RegistryReference biome) { this.biome = biome; } @SuppressWarnings("deprecation") @Override public String getName() { - return biome.getName(); + return biome.location().asString(); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockCategoryRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockCategoryRegistry.java new file mode 100644 index 0000000000..7d28858ca0 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockCategoryRegistry.java @@ -0,0 +1,43 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge; + +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.registry.BlockCategoryRegistry; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.registry.RegistryTypes; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + +public class SpongeBlockCategoryRegistry implements BlockCategoryRegistry { + @Override + public Set getCategorisedByName(String category) { + return Sponge.game().registry(RegistryTypes.BLOCK_TYPE_TAGS) + .findValue(ResourceKey.resolve(category)) + .map(org.spongepowered.api.tag.Tag::values) + .orElse(Collections.emptyList()) + .stream() + .map(b -> BlockType.REGISTRY.get(Sponge.game().registry(RegistryTypes.BLOCK_TYPE).valueKey(b).formatted())) + .collect(Collectors.toSet()); + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java new file mode 100644 index 0000000000..142b53a9ef --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockMaterial.java @@ -0,0 +1,96 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge; + +import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.world.registry.PassthroughBlockMaterial; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.PushReaction; + +import javax.annotation.Nullable; + +/** + * Sponge block material that pulls as much info as possible from the Minecraft + * Material, and passes the rest to another implementation, typically the + * bundled block info. + */ +public class SpongeBlockMaterial extends PassthroughBlockMaterial { + + private final Material delegate; + private final BlockState block; + + public SpongeBlockMaterial(Material delegate, BlockState block, @Nullable BlockMaterial secondary) { + super(secondary); + this.delegate = delegate; + this.block = block; + } + + @Override + public boolean isAir() { + return delegate == Material.AIR || super.isAir(); + } + + @Override + public boolean isOpaque() { + return delegate.isSolidBlocking(); + } + + @Override + public boolean isLiquid() { + return delegate.isLiquid(); + } + + @Override + public boolean isSolid() { + return delegate.isSolid(); + } + + @Override + public boolean isFragileWhenPushed() { + return delegate.getPushReaction() == PushReaction.DESTROY; + } + + @Override + public boolean isUnpushable() { + return delegate.getPushReaction() == PushReaction.BLOCK; + } + + @Override + public boolean isMovementBlocker() { + return delegate.blocksMotion(); + } + + @Override + public boolean isBurnable() { + return delegate.isFlammable(); + } + + @Override + public boolean isToolRequired() { + return block.requiresCorrectToolForDrops(); + } + + @Override + public boolean isReplacedDuringPlacement() { + return delegate.isReplaceable(); + } + +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java new file mode 100644 index 0000000000..89515a5b94 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeBlockRegistry.java @@ -0,0 +1,92 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge; + +import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.sponge.internal.SpongeTransmogrifier; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.world.registry.BundledBlockRegistry; +import net.minecraft.world.level.block.Block; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.state.StateProperty; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.OptionalInt; +import java.util.TreeMap; + +public class SpongeBlockRegistry extends BundledBlockRegistry { + + private final Map materialMap = + new HashMap<>(); + + @Override + public Component getRichName(BlockType blockType) { + return SpongeTextAdapter.convert(Sponge.game().registry(RegistryTypes.BLOCK_TYPE) + .value(ResourceKey.resolve(blockType.getId())).asComponent()); + } + + @Override + public BlockMaterial getMaterial(BlockType blockType) { + org.spongepowered.api.block.BlockType spongeBlockType = + Sponge.game().registry(RegistryTypes.BLOCK_TYPE) + .value(ResourceKey.resolve(blockType.getId())); + return materialMap.computeIfAbsent( + spongeBlockType.defaultState(), + m -> { + net.minecraft.world.level.block.state.BlockState blockState = + (net.minecraft.world.level.block.state.BlockState) m; + return new SpongeBlockMaterial( + blockState.getMaterial(), + blockState, + super.getMaterial(blockType) + ); + } + ); + } + + @Override + public Map> getProperties(BlockType blockType) { + org.spongepowered.api.block.BlockType spongeBlockType = + Sponge.game().registry(RegistryTypes.BLOCK_TYPE) + .value(ResourceKey.resolve(blockType.getId())); + Map> map = new TreeMap<>(); + Collection> propertyKeys = spongeBlockType + .defaultState().stateProperties(); + for (StateProperty key : propertyKeys) { + map.put(key.name(), SpongeTransmogrifier.transmogToWorldEditProperty(key)); + } + return map; + } + + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + org.spongepowered.api.block.BlockState equivalent = SpongeAdapter.adapt(state); + return OptionalInt.of(Block.getId( + (net.minecraft.world.level.block.state.BlockState) equivalent + )); + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java index 39b8cfd2c8..a75ee8fc6c 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java @@ -23,21 +23,15 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.session.SessionKey; -import com.sk89q.worldedit.util.auth.AuthorizationException; -import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; -import com.sk89q.worldedit.util.formatting.text.adapter.spongeapi.TextAdapter; -import org.spongepowered.api.command.CommandSource; +import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.util.formatting.text.format.TextColor; +import net.kyori.adventure.audience.Audience; import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.text.format.TextColor; -import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.text.serializer.TextSerializers; import java.io.File; import java.util.Locale; import java.util.UUID; -import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -49,15 +43,15 @@ public class SpongeCommandSender implements Actor { */ private static final UUID DEFAULT_ID = UUID.fromString("a233eb4b-4cab-42cd-9fd9-7e7b9a3f74be"); - private final CommandSource sender; - private final SpongeWorldEdit plugin; + private final Audience sender; - public SpongeCommandSender(SpongeWorldEdit plugin, CommandSource sender) { - checkNotNull(plugin); + public SpongeCommandSender(Audience sender) { checkNotNull(sender); - checkArgument(!(sender instanceof Player), "Cannot wrap a player"); + checkArgument( + !(sender instanceof Player), + "Players should be wrapped using the specialized class" + ); - this.plugin = plugin; this.sender = sender; } @@ -68,42 +62,44 @@ public UUID getUniqueId() { @Override public String getName() { - return sender.getName(); + return "Console"; } - @SuppressWarnings("deprecation") @Override + @Deprecated public void printRaw(String msg) { for (String part : msg.split("\n")) { - sender.sendMessage(TextSerializers.LEGACY_FORMATTING_CODE.deserialize(part)); + sender.sendMessage(net.kyori.adventure.text.Component.text(part)); } } @Override + @Deprecated public void print(String msg) { - sendColorized(msg, TextColors.LIGHT_PURPLE); + for (String part : msg.split("\n")) { + print(TextComponent.of(part, TextColor.LIGHT_PURPLE)); + } } @Override + @Deprecated public void printDebug(String msg) { - sendColorized(msg, TextColors.GRAY); + for (String part : msg.split("\n")) { + print(TextComponent.of(part, TextColor.GRAY)); + } } @Override + @Deprecated public void printError(String msg) { - sendColorized(msg, TextColors.RED); + for (String part : msg.split("\n")) { + print(TextComponent.of(part, TextColor.RED)); + } } @Override public void print(Component component) { - TextAdapter.sendMessage(sender, WorldEditText.format(component, getLocale())); - } - - @SuppressWarnings("deprecation") - private void sendColorized(String msg, TextColor formatting) { - for (String part : msg.split("\n")) { - sender.sendMessage(Text.of(formatting, TextSerializers.LEGACY_FORMATTING_CODE.deserialize(part))); - } + sender.sendMessage(SpongeTextAdapter.convert(component, getLocale())); } @Override @@ -122,7 +118,7 @@ public boolean hasPermission(String perm) { } @Override - public void checkPermission(String permission) throws AuthorizationException { + public void checkPermission(String permission) { } @Override @@ -152,20 +148,19 @@ public Locale getLocale() { @Override public SessionKey getSessionKey() { return new SessionKey() { - @Nullable @Override public String getName() { - return null; + return "Console"; } @Override public boolean isActive() { - return false; + return true; } @Override public boolean isPersistent() { - return false; + return true; } @Override diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntity.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntity.java index 532a366082..48ecd794fb 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntity.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntity.java @@ -19,14 +19,17 @@ package com.sk89q.worldedit.sponge; -import com.flowpowered.math.vector.Vector3d; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.entity.metadata.EntityProperties; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.sponge.internal.NbtAdapter; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.NullWorld; -import org.spongepowered.api.world.World; +import com.sk89q.worldedit.world.entity.EntityType; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.math.vector.Vector3d; import java.lang.ref.WeakReference; import javax.annotation.Nullable; @@ -45,21 +48,28 @@ class SpongeEntity implements Entity { @Override public BaseEntity getState() { org.spongepowered.api.entity.Entity entity = entityRef.get(); - if (entity != null) { - return SpongeWorldEdit.inst().getAdapter().createBaseEntity(entity); - } else { + if (entity == null || entity.vehicle().isPresent()) { + return null; + } + EntityType entityType = EntityType.REGISTRY.get(entity.type().key(RegistryTypes.ENTITY_TYPE).asString()); + if (entityType == null) { return null; } + return new BaseEntity(entityType, + entity.toContainer().getView(Constants.Sponge.UNSAFE_NBT) + .map(NbtAdapter::adaptToWorldEdit) + .orElse(null) + ); } @Override public Location getLocation() { org.spongepowered.api.entity.Entity entity = entityRef.get(); if (entity != null) { - org.spongepowered.api.world.Location entityLoc = entity.getLocation(); - Vector3d entityRot = entity.getRotation(); + ServerLocation entityLoc = entity.serverLocation(); + Vector3d entityRot = entity.rotation(); - return SpongeWorldEdit.inst().getAdapter().adapt(entityLoc, entityRot); + return SpongeAdapter.adapt(entityLoc, entityRot); } else { return new Location(NullWorld.getInstance()); } @@ -79,7 +89,7 @@ public boolean setLocation(Location location) { public Extent getExtent() { org.spongepowered.api.entity.Entity entity = entityRef.get(); if (entity != null) { - return SpongeWorldEdit.inst().getAdapter().getWorld(entity.getWorld()); + return SpongeAdapter.adapt(entity.serverLocation().world()); } else { return NullWorld.getInstance(); } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityProperties.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityProperties.java index 7373ae642f..f7b0269a7f 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityProperties.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeEntityProperties.java @@ -20,29 +20,27 @@ package com.sk89q.worldedit.sponge; import com.sk89q.worldedit.entity.metadata.EntityProperties; -import org.spongepowered.api.data.key.Keys; +import org.spongepowered.api.data.Keys; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.ExperienceOrb; import org.spongepowered.api.entity.FallingBlock; import org.spongepowered.api.entity.Item; -import org.spongepowered.api.entity.explosive.PrimedTNT; +import org.spongepowered.api.entity.explosive.fused.PrimedTNT; import org.spongepowered.api.entity.hanging.ItemFrame; import org.spongepowered.api.entity.hanging.Painting; import org.spongepowered.api.entity.living.Ambient; import org.spongepowered.api.entity.living.ArmorStand; +import org.spongepowered.api.entity.living.ComplexLivingPart; import org.spongepowered.api.entity.living.Humanoid; import org.spongepowered.api.entity.living.Living; -import org.spongepowered.api.entity.living.Villager; import org.spongepowered.api.entity.living.animal.Animal; -import org.spongepowered.api.entity.living.complex.ComplexLivingPart; +import org.spongepowered.api.entity.living.aquatic.Aquatic; import org.spongepowered.api.entity.living.golem.Golem; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.trader.Trader; import org.spongepowered.api.entity.projectile.Projectile; import org.spongepowered.api.entity.vehicle.Boat; import org.spongepowered.api.entity.vehicle.minecart.Minecart; -import org.spongepowered.api.text.Text; - -import java.util.Optional; import static com.google.common.base.Preconditions.checkNotNull; @@ -122,7 +120,7 @@ public boolean isAmbient() { @Override public boolean isNPC() { - return entity instanceof Villager; + return entity instanceof Trader; } @Override @@ -132,12 +130,12 @@ public boolean isGolem() { @Override public boolean isTamed() { - return entity.get(Keys.TAMED_OWNER).orElse(Optional.empty()).isPresent(); + return entity.get(Keys.IS_TAMED).orElse(false); } @Override public boolean isTagged() { - return !entity.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).isEmpty(); + return entity.get(Keys.CUSTOM_NAME).isPresent(); } @Override @@ -152,6 +150,6 @@ public boolean isPasteable() { @Override public boolean isWaterCreature() { - return false; // TODO api8 + return entity instanceof Aquatic; } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemCategoryRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemCategoryRegistry.java new file mode 100644 index 0000000000..22029ea8d7 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemCategoryRegistry.java @@ -0,0 +1,43 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge; + +import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.world.registry.ItemCategoryRegistry; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.registry.RegistryTypes; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + +public class SpongeItemCategoryRegistry implements ItemCategoryRegistry { + @Override + public Set getCategorisedByName(String category) { + return Sponge.game().registry(RegistryTypes.ITEM_TYPE_TAGS) + .findValue(ResourceKey.resolve(category)) + .map(org.spongepowered.api.tag.Tag::values) + .orElse(Collections.emptyList()) + .stream() + .map(b -> ItemType.REGISTRY.get(Sponge.game().registry(RegistryTypes.ITEM_TYPE).valueKey(b).formatted())) + .collect(Collectors.toSet()); + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemRegistry.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemRegistry.java new file mode 100644 index 0000000000..61dd1222d9 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeItemRegistry.java @@ -0,0 +1,47 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge; + +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.world.registry.BundledItemRegistry; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.registry.RegistryTypes; + +public class SpongeItemRegistry extends BundledItemRegistry { + + @Override + public Component getRichName(ItemType itemType) { + return SpongeTextAdapter.convert(Sponge.game().registry(RegistryTypes.ITEM_TYPE) + .value(ResourceKey.resolve(itemType.getId())).asComponent()); + } + + @Override + public Component getRichName(BaseItemStack itemStack) { + return TranslatableComponent.of( + ((ItemStack) (Object) SpongeAdapter.adapt(itemStack)).getDescriptionId() + ); + } + +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePermissionsProvider.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePermissionsProvider.java index 0e8fc89c94..da99c0eca6 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePermissionsProvider.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePermissionsProvider.java @@ -20,28 +20,28 @@ package com.sk89q.worldedit.sponge; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandCallable; -import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import org.spongepowered.api.service.permission.PermissionDescription; import org.spongepowered.api.service.permission.PermissionService; import org.spongepowered.api.service.permission.SubjectReference; public class SpongePermissionsProvider { - public boolean hasPermission(Player player, String permission) { + public boolean hasPermission(ServerPlayer player, String permission) { return player.hasPermission(permission); } - public void registerPermission(CommandCallable command, String permission) { - Sponge.getGame().getServiceManager().getRegistration(PermissionService.class).ifPresent((permissionService -> { - PermissionDescription.Builder permissionBuilder = permissionService.getProvider().newDescriptionBuilder(SpongeWorldEdit.inst()); + public void registerPermission(String permission) { + Sponge.game().serviceProvider().registration(PermissionService.class).ifPresent((permissionService -> { + PermissionDescription.Builder permissionBuilder = permissionService.service() + .newDescriptionBuilder(SpongeWorldEdit.inst().getPluginContainer()); permissionBuilder.id(permission).register(); })); } - public String[] getGroups(Player player) { - return player.getParents().stream() - .map(SubjectReference::getSubjectIdentifier) - .toArray(String[]::new); + public String[] getGroups(ServerPlayer player) { + return player.parents().stream() + .map(SubjectReference::subjectIdentifier) + .toArray(String[]::new); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java index a55109b9b9..11c47d75d9 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlatform.java @@ -19,31 +19,25 @@ package com.sk89q.worldedit.sponge; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.event.platform.CommandEvent; -import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; import com.sk89q.worldedit.extension.platform.AbstractPlatform; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.MultiUserPlatform; import com.sk89q.worldedit.extension.platform.Preference; -import com.sk89q.worldedit.internal.command.CommandUtil; import com.sk89q.worldedit.sponge.config.SpongeConfiguration; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.registry.Registries; -import org.enginehub.piston.Command; import org.enginehub.piston.CommandManager; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandException; -import org.spongepowered.api.command.CommandResult; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.EntityType; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; +import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.scheduler.Task; -import org.spongepowered.api.world.Location; +import org.spongepowered.api.util.Ticks; +import org.spongepowered.api.world.server.ServerWorld; import java.util.ArrayList; import java.util.Collection; @@ -76,13 +70,13 @@ public Registries getRegistries() { @Override public int getDataVersion() { - // TODO add to adapter - org.spongepowered.common.data.util.DataUtil#MINECRAFT_DATA_VERSION - return 1631; + return Sponge.platform().minecraftVersion().dataVersion().orElse(-1); } @Override public boolean isValidMobType(String type) { - return Sponge.getRegistry().getType(EntityType.class, type).isPresent(); + return Sponge.game().registry(RegistryTypes.ENTITY_TYPE) + .findValue(ResourceKey.resolve(type)).isPresent(); } @Override @@ -93,16 +87,21 @@ public void reload() { @Override public int schedule(long delay, long period, Runnable task) { - Task.builder().delayTicks(delay).intervalTicks(period).execute(task).submit(SpongeWorldEdit.inst()); - return 0; // TODO This isn't right, but we only check for -1 values + Task t = Task.builder() + .delay(Ticks.of(delay)) + .interval(Ticks.of(period)) + .execute(task) + .plugin(SpongeWorldEdit.inst().getPluginContainer()) + .build(); + return Math.abs(t.hashCode()); // TODO This isn't right, but we only check for -1 values } @Override public List getWorlds() { - Collection worlds = Sponge.getServer().getWorlds(); + Collection worlds = Sponge.server().worldManager().worlds(); List ret = new ArrayList<>(worlds.size()); - for (org.spongepowered.api.world.World world : worlds) { - ret.add(SpongeWorldEdit.inst().getAdapter().getWorld(world)); + for (ServerWorld world : worlds) { + ret.add(SpongeAdapter.adapt(world)); } return ret; } @@ -113,8 +112,8 @@ public Player matchPlayer(Player player) { if (player instanceof SpongePlayer) { return player; } else { - Optional optPlayer = Sponge.getServer().getPlayer(player.getUniqueId()); - return optPlayer.map(player1 -> new SpongePlayer(this, player1)).orElse(null); + Optional optPlayer = Sponge.server().player(player.getUniqueId()); + return optPlayer.map(SpongePlayer::new).orElse(null); } } @@ -124,9 +123,10 @@ public World matchWorld(World world) { if (world instanceof SpongeWorld) { return world; } else { - for (org.spongepowered.api.world.World ws : Sponge.getServer().getWorlds()) { - if (ws.getName().equals(world.getName())) { - return SpongeWorldEdit.inst().getAdapter().getWorld(ws); + // TODO this needs fixing for world name shenanigans + for (ServerWorld spongeWorld : Sponge.server().worldManager().worlds()) { + if (spongeWorld.key().toString().equals(world.getName())) { + return SpongeAdapter.adapt(spongeWorld); } } @@ -136,26 +136,6 @@ public World matchWorld(World world) { @Override public void registerCommands(CommandManager manager) { - for (Command command : manager.getAllCommands().collect(toList())) { - CommandAdapter adapter = new CommandAdapter(command) { - @Override - public CommandResult process(CommandSource source, String arguments) throws org.spongepowered.api.command.CommandException { - CommandEvent weEvent = new CommandEvent(SpongeWorldEdit.inst().wrapCommandSource(source), command.getName() + " " + arguments); - WorldEdit.getInstance().getEventBus().post(weEvent); - return weEvent.isCancelled() ? CommandResult.success() : CommandResult.empty(); - } - - @Override - public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { - CommandSuggestionEvent weEvent = new CommandSuggestionEvent(SpongeWorldEdit.inst().wrapCommandSource(source), command.getName() + " " + arguments); - WorldEdit.getInstance().getEventBus().post(weEvent); - return CommandUtil.fixSuggestions(arguments, weEvent.getSuggestions()); - } - }; - ImmutableList.Builder aliases = ImmutableList.builder(); - aliases.add(command.getName()).addAll(command.getAliases()); - Sponge.getCommandManager().register(SpongeWorldEdit.inst(), adapter, aliases.build()); - } } @Override @@ -202,15 +182,13 @@ public Map getCapabilities() { @Override public Set getSupportedSideEffects() { - return ImmutableSet.of(); + return ImmutableSet.of( + SideEffect.UPDATE, SideEffect.ENTITY_AI, SideEffect.LIGHTING, SideEffect.NEIGHBORS + ); } @Override public Collection getConnectedUsers() { - List users = new ArrayList<>(); - for (org.spongepowered.api.entity.living.player.Player player : Sponge.getServer().getOnlinePlayers()) { - users.add(new SpongePlayer(this, player)); - } - return users; + return Sponge.server().onlinePlayers().stream().map(SpongePlayer::new).collect(toList()); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java index f0f814d74f..9d32d6ba4b 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.sponge; -import com.flowpowered.math.vector.Vector3d; +import com.sk89q.jnbt.CompoundTag; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; @@ -29,63 +29,64 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; +import com.sk89q.worldedit.sponge.internal.NbtAdapter; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; -import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; -import com.sk89q.worldedit.util.formatting.text.adapter.spongeapi.TextAdapter; +import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; -import com.sk89q.worldedit.world.item.ItemTypes; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.data.key.Keys; +import org.spongepowered.api.data.Keys; import org.spongepowered.api.data.type.HandTypes; import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.item.ItemType; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import org.spongepowered.api.item.inventory.ItemStack; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.text.format.TextColor; -import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.text.serializer.TextSerializers; -import org.spongepowered.api.world.World; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.math.vector.Vector3d; import java.nio.charset.StandardCharsets; import java.util.Locale; -import java.util.Optional; import java.util.UUID; import javax.annotation.Nullable; public class SpongePlayer extends AbstractPlayerActor { + private static final int STRUCTURE_BLOCK_PACKET_ID = 7; - private final Player player; + private final ServerPlayer player; - protected SpongePlayer(SpongePlatform platform, Player player) { + protected SpongePlayer(ServerPlayer player) { this.player = player; ThreadSafeCache.getInstance().getOnlineIds().add(getUniqueId()); } @Override public UUID getUniqueId() { - return player.getUniqueId(); + return player.uniqueId(); } @Override public BaseItemStack getItemInHand(HandSide handSide) { - Optional is = this.player.getItemInHand(handSide == HandSide.MAIN_HAND - ? HandTypes.MAIN_HAND : HandTypes.OFF_HAND); - return is.map(itemStack -> new BaseItemStack(ItemTypes.get(itemStack.getType().getId()))).orElse(null); + ItemStack is = this.player.itemInHand( + handSide == HandSide.MAIN_HAND ? HandTypes.MAIN_HAND : HandTypes.OFF_HAND + ); + return SpongeAdapter.adapt(is); } @Override public String getName() { - return this.player.getName(); + return this.player.name(); } - @SuppressWarnings("deprecation") @Override public String getDisplayName() { - return player.getDisplayNameData().displayName().getDirect().map(TextSerializers.LEGACY_FORMATTING_CODE::serialize).orElse(getName()); + return LegacyComponentSerializer.legacySection().serialize(player.displayName().get()); } @Override @@ -95,10 +96,10 @@ public BaseEntity getState() { @Override public Location getLocation() { - org.spongepowered.api.world.Location entityLoc = this.player.getLocation(); - Vector3d entityRot = this.player.getRotation(); + ServerLocation entityLoc = this.player.serverLocation(); + Vector3d entityRot = this.player.rotation(); - return SpongeWorldEdit.inst().getAdapter().adapt(entityLoc, entityRot); + return SpongeAdapter.adapt(entityLoc, entityRot); } @Override @@ -108,15 +109,12 @@ public boolean setLocation(Location location) { @Override public com.sk89q.worldedit.world.World getWorld() { - return SpongeWorldEdit.inst().getAdapter().getWorld(player.getWorld()); + return SpongeAdapter.adapt(player.serverLocation().world()); } @Override public void giveItem(BaseItemStack itemStack) { - this.player.getInventory().offer( - ItemStack.of(Sponge.getGame().getRegistry().getType(ItemType.class, itemStack.getType().getId()).get(), - itemStack.getAmount()) - ); + this.player.inventory().offer(SpongeAdapter.adapt(itemStack)); } @Override @@ -128,46 +126,55 @@ public void dispatchCUIEvent(CUIEvent event) { } String finalData = send; - CUIChannelHandler.getActiveChannel().sendTo(player, buffer -> buffer.writeBytes(finalData.getBytes(StandardCharsets.UTF_8))); + CUIChannelHandler.channel().play().sendTo( + player, + buffer -> buffer.writeBytes(finalData.getBytes(StandardCharsets.UTF_8)) + ); } @Override + @Deprecated public void printRaw(String msg) { for (String part : msg.split("\n")) { - this.player.sendMessage(TextSerializers.FORMATTING_CODE.deserialize(part)); + this.player.sendMessage(LegacyComponentSerializer.legacySection().deserialize(part)); } } @Override + @Deprecated public void printDebug(String msg) { - sendColorized(msg, TextColors.GRAY); + sendColorized(msg, NamedTextColor.GRAY); } @Override + @Deprecated public void print(String msg) { - sendColorized(msg, TextColors.LIGHT_PURPLE); + sendColorized(msg, NamedTextColor.LIGHT_PURPLE); } @Override + @Deprecated public void printError(String msg) { - sendColorized(msg, TextColors.RED); + sendColorized(msg, NamedTextColor.RED); } @Override public void print(Component component) { - TextAdapter.sendMessage(player, WorldEditText.format(component, getLocale())); + player.sendMessage(SpongeTextAdapter.convert(component, getLocale())); } private void sendColorized(String msg, TextColor formatting) { for (String part : msg.split("\n")) { - this.player.sendMessage(Text.of(formatting, TextSerializers.FORMATTING_CODE.deserialize(part))); + this.player.sendMessage( + LegacyComponentSerializer.legacySection().deserialize(part).color(formatting) + ); } } @Override public boolean trySetPosition(Vector3 pos, float pitch, float yaw) { - org.spongepowered.api.world.Location loc = new org.spongepowered.api.world.Location<>( - this.player.getWorld(), pos.getX(), pos.getY(), pos.getZ() + ServerLocation loc = ServerLocation.of( + this.player.world(), pos.getX(), pos.getY(), pos.getZ() ); return this.player.setLocationAndRotation(loc, new Vector3d(pitch, yaw, 0)); @@ -196,13 +203,16 @@ public T getFacet(Class cls) { @Override public GameMode getGameMode() { - return GameModes.get(player.getGameModeData().type().get().getId()); + return GameModes.get(player.gameMode().get().key(RegistryTypes.GAME_MODE).asString()); } @Override public void setGameMode(GameMode gameMode) { - player.getGameModeData().type().set(Sponge.getRegistry().getType(org.spongepowered.api.entity.living.player.gamemode.GameMode.class, - gameMode.getId()).get()); + player.gameMode().set( + Sponge.game().registry(RegistryTypes.GAME_MODE).value( + ResourceKey.resolve(gameMode.getId()) + ) + ); } @Override @@ -217,24 +227,29 @@ public void setFlying(boolean flying) { @Override public > void sendFakeBlock(BlockVector3 pos, B block) { - org.spongepowered.api.world.Location loc = player.getWorld().getLocation(pos.getX(), pos.getY(), pos.getZ()); if (block == null) { - player.sendBlockChange(loc.getBlockPosition(), loc.getBlock()); + player.resetBlockChange(pos.getX(), pos.getY(), pos.getZ()); } else { - // TODO - // player.sendBlockChange(loc, BukkitAdapter.adapt(block)); - // if (block instanceof BaseBlock && ((BaseBlock) block).hasNbtData()) { - // BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - // if (adapter != null) { - // adapter.sendFakeNBT(player, pos, ((BaseBlock) block).getNbtData()); - // } - // } + player.sendBlockChange(pos.getX(), pos.getY(), pos.getZ(), SpongeAdapter.adapt(block.toImmutableState())); + if (block instanceof BaseBlock && block.getBlockType().equals(com.sk89q.worldedit.world.block.BlockTypes.STRUCTURE_BLOCK)) { + final BaseBlock baseBlock = (BaseBlock) block; + final CompoundTag nbtData = baseBlock.getNbtData(); + if (nbtData != null) { + net.minecraft.server.level.ServerPlayer mcPlayer = + ((net.minecraft.server.level.ServerPlayer) player); + mcPlayer.connection.send(new net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket( + new net.minecraft.core.BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()), + STRUCTURE_BLOCK_PACKET_ID, + NbtAdapter.adaptNMSToWorldEdit(nbtData)) + ); + } + } } } @Override public Locale getLocale() { - return player.getLocale(); + return player.locale(); } @Override @@ -249,8 +264,8 @@ static class SessionKeyImpl implements SessionKey { private final String name; SessionKeyImpl(Player player) { - this.uuid = player.getUniqueId(); - this.name = player.getName(); + this.uuid = player.uniqueId(); + this.name = player.name(); } @Override diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeRegistries.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeRegistries.java index 47b83250e2..04baa39365 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeRegistries.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeRegistries.java @@ -20,7 +20,11 @@ package com.sk89q.worldedit.sponge; import com.sk89q.worldedit.world.registry.BiomeRegistry; +import com.sk89q.worldedit.world.registry.BlockCategoryRegistry; +import com.sk89q.worldedit.world.registry.BlockRegistry; import com.sk89q.worldedit.world.registry.BundledRegistries; +import com.sk89q.worldedit.world.registry.ItemCategoryRegistry; +import com.sk89q.worldedit.world.registry.ItemRegistry; /** * World data for the Sponge platform. @@ -28,20 +32,39 @@ class SpongeRegistries extends BundledRegistries { private static final SpongeRegistries INSTANCE = new SpongeRegistries(); + + public static SpongeRegistries getInstance() { + return INSTANCE; + } + private final BiomeRegistry biomeRegistry = new SpongeBiomeRegistry(); + private final BlockRegistry blockRegistry = new SpongeBlockRegistry(); + private final BlockCategoryRegistry blockCategoryRegistry = new SpongeBlockCategoryRegistry(); + private final ItemRegistry itemRegistry = new SpongeItemRegistry(); + private final ItemCategoryRegistry itemCategoryRegistry = new SpongeItemCategoryRegistry(); @Override public BiomeRegistry getBiomeRegistry() { return biomeRegistry; } - /** - * Get a static instance. - * - * @return an instance - */ - public static SpongeRegistries getInstance() { - return INSTANCE; + @Override + public BlockRegistry getBlockRegistry() { + return blockRegistry; } + @Override + public BlockCategoryRegistry getBlockCategoryRegistry() { + return blockCategoryRegistry; + } + + @Override + public ItemRegistry getItemRegistry() { + return itemRegistry; + } + + @Override + public ItemCategoryRegistry getItemCategoryRegistry() { + return itemCategoryRegistry; + } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java index 1731f98d13..7709737e43 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java @@ -22,16 +22,22 @@ import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.text.serializer.TextSerializers; import java.util.Locale; public class SpongeTextAdapter { - public static Text convert(Component component, Locale locale) { + public static net.kyori.adventure.text.Component convert(Component component, Locale locale) { component = WorldEditText.format(component, locale); - return TextSerializers.JSON.deserialize(GsonComponentSerializer.INSTANCE.serialize(component)); + return net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson() + .deserialize(GsonComponentSerializer.INSTANCE.serialize(component)); + } + + public static Component convert(net.kyori.adventure.text.Component component) { + return GsonComponentSerializer.INSTANCE.deserialize( + net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson() + .serialize(component) + ); } private SpongeTextAdapter() { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java index 8aead8e81e..0509d8e40c 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java @@ -19,49 +19,74 @@ package com.sk89q.worldedit.sponge; -import com.flowpowered.math.vector.Vector3d; -import com.flowpowered.math.vector.Vector3i; +import com.google.common.collect.Sets; +import com.sk89q.jnbt.AdventureNBTConverter; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.sponge.internal.NbtAdapter; +import com.sk89q.worldedit.sponge.internal.SpongeWorldNativeAccess; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.SideEffect; +import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.TreeGenerator; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.AbstractWorld; import com.sk89q.worldedit.world.RegenOptions; -import com.sk89q.worldedit.world.WorldUnloadedException; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; +import net.minecraft.core.BlockPos; +import net.minecraft.data.worldgen.Features; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.apache.logging.log4j.Logger; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; -import org.spongepowered.api.block.BlockSnapshot; -import org.spongepowered.api.block.BlockState; -import org.spongepowered.api.block.BlockType; -import org.spongepowered.api.block.BlockTypes; -import org.spongepowered.api.block.tileentity.TileEntity; -import org.spongepowered.api.data.key.Keys; -import org.spongepowered.api.data.property.block.GroundLuminanceProperty; -import org.spongepowered.api.data.property.block.SkyLuminanceProperty; +import org.spongepowered.api.block.entity.BlockEntityArchetype; +import org.spongepowered.api.block.entity.BlockEntityType; +import org.spongepowered.api.entity.EntityArchetype; import org.spongepowered.api.entity.EntityType; import org.spongepowered.api.entity.EntityTypes; +import org.spongepowered.api.entity.Item; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.util.Ticks; import org.spongepowered.api.world.BlockChangeFlags; -import org.spongepowered.api.world.World; -import org.spongepowered.api.world.weather.Weather; +import org.spongepowered.api.world.LightTypes; +import org.spongepowered.api.world.SerializationBehavior; +import org.spongepowered.api.world.generation.config.WorldGenerationConfig; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.api.world.server.WorldTemplate; +import org.spongepowered.api.world.volume.stream.StreamOptions; +import org.spongepowered.math.vector.Vector3d; +import org.spongepowered.math.vector.Vector3i; import java.lang.ref.WeakReference; import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; -import java.util.Locale; -import java.util.Map; import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; @@ -69,43 +94,34 @@ /** * An adapter to Minecraft worlds for WorldEdit. */ -public abstract class SpongeWorld extends AbstractWorld { +public final class SpongeWorld extends AbstractWorld { - private final WeakReference worldRef; + private static final Random random = new Random(); + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private final WeakReference worldRef; + private final SpongeWorldNativeAccess worldNativeAccess; /** * Construct a new world. * * @param world the world */ - protected SpongeWorld(World world) { + protected SpongeWorld(ServerWorld world) { checkNotNull(world); this.worldRef = new WeakReference<>(world); + this.worldNativeAccess = new SpongeWorldNativeAccess(new WeakReference<>((ServerLevel) world)); } /** * Get the underlying handle to the world. * * @return the world - * @throws WorldEditException thrown if a reference to the world was lost (i.e. world was unloaded) - */ - public World getWorldChecked() throws WorldEditException { - World world = worldRef.get(); - if (world != null) { - return world; - } else { - throw new WorldUnloadedException(); - } - } - - /** - * Get the underlying handle to the world. - * - * @return the world - * @throws RuntimeException thrown if a reference to the world was lost (i.e. world was unloaded) + * @throws RuntimeException thrown if a reference to the world was lost (i.e. world was + * unloaded) */ - public World getWorld() { - World world = worldRef.get(); + ServerWorld getWorld() { + ServerWorld world = worldRef.get(); if (world != null) { return world; } else { @@ -113,104 +129,237 @@ public World getWorld() { } } + // This is sus but leaving it for later world name/id reworks @Override public String getName() { - return getWorld().getName(); + return getWorld().key().asString(); } @Override public String getId() { - return getName().replace(" ", "_").toLowerCase(Locale.ROOT) - + getWorld().getDimension().getType().getName().toLowerCase(Locale.ROOT); + return getWorld().key().asString(); } @Override public Path getStoragePath() { - return getWorld().getDirectory(); + return getWorld().directory(); + } + + @Override + public BlockState getBlock(BlockVector3 position) { + return SpongeAdapter.adapt(getWorld().block( + position.getX(), position.getY(), position.getZ() + )); + } + + @Override + public BaseBlock getFullBlock(BlockVector3 position) { + CompoundTag entity = getWorld() + .blockEntity(position.getX(), position.getY(), position.getZ()) + .map(e -> NbtAdapter.adaptToWorldEdit(e.createArchetype().blockEntityData())) + .orElse(null); + return getBlock(position).toBaseBlock(entity); } - @SuppressWarnings("WeakerAccess") - protected BlockState getBlockState(BlockStateHolder block) { - if (block instanceof com.sk89q.worldedit.world.block.BlockState) { - BlockState state = Sponge.getRegistry().getType(BlockType.class, block.getBlockType().getId()).orElse(BlockTypes.AIR).getDefaultState(); - for (Map.Entry, Object> entry : block.getStates().entrySet()) { - // TODO Convert across states + @Override + public > boolean setBlock(BlockVector3 position, B block, SideEffectSet sideEffects) throws WorldEditException { + checkNotNull(position); + checkNotNull(block); + + ServerWorld world = getWorld(); + + org.spongepowered.api.block.BlockState newState = SpongeAdapter.adapt(block.toImmutableState()); + + boolean didSet = world.setBlock( + position.getX(), position.getY(), position.getZ(), + newState, + BlockChangeFlags.NONE + .withUpdateNeighbors(sideEffects.shouldApply(SideEffect.NEIGHBORS)) + .withNotifyClients(true) + .withPhysics(sideEffects.shouldApply(SideEffect.UPDATE)) + .withNotifyObservers(sideEffects.shouldApply(SideEffect.UPDATE)) + .withLightingUpdates(sideEffects.shouldApply(SideEffect.LIGHTING)) + .withPathfindingUpdates(sideEffects.shouldApply(SideEffect.ENTITY_AI)) + .withNeighborDropsAllowed(false) + .withBlocksMoving(false) + .withForcedReRender(false) + .withIgnoreRender(false) + ); + if (!didSet) { + // still update NBT if the block is the same + if (world.block(position.getX(), position.getY(), position.getZ()) == newState) { + didSet = block.toBaseBlock().hasNbtData(); } - return state; - } else { - throw new UnsupportedOperationException("Missing Sponge adapter for WorldEdit!"); } - } - @SuppressWarnings("WeakerAccess") - protected abstract void applyTileEntityData(TileEntity entity, BaseBlock block); + // Create the TileEntity + if (didSet && block instanceof BaseBlock && ((BaseBlock) block).getNbtReference() != null) { + BaseBlock baseBlock = (BaseBlock) block; + BlockEntityArchetype.builder() + .blockEntity((BlockEntityType) + world.engine().registry(RegistryTypes.BLOCK_ENTITY_TYPE) + .value(ResourceKey.resolve(baseBlock.getNbtId())) + ) + .blockEntityData(NbtAdapter.adaptFromWorldEdit((CompoundTag) AdventureNBTConverter.fromAdventure(baseBlock.getNbt()))) + .state(newState) + .build() + .apply(ServerLocation.of(world, position.getX(), position.getY(), position.getZ())); + } - private static final BlockSnapshot.Builder builder = BlockSnapshot.builder(); + return true; + } @Override - public > boolean setBlock(BlockVector3 position, B block, boolean notifyAndLight) throws WorldEditException { + public Set applySideEffects(BlockVector3 position, com.sk89q.worldedit.world.block.BlockState previousType, SideEffectSet sideEffectSet) throws WorldEditException { checkNotNull(position); - checkNotNull(block); - World world = getWorldChecked(); + worldNativeAccess.applySideEffects(position, previousType, sideEffectSet); - // First set the block - Vector3i pos = new Vector3i(position.getX(), position.getY(), position.getZ()); - BlockState newState = getBlockState(block); + return Sets.intersection( + SpongeWorldEdit.inst().getInternalPlatform().getSupportedSideEffects(), + sideEffectSet.getSideEffectsToApply() + ); + } + + @Override + public boolean clearContainerBlockContents(BlockVector3 position) { + getWorld().removeBlockEntity(position.getX(), position.getY(), position.getZ()); + return true; + } - BlockSnapshot snapshot = builder.reset() - .blockState(newState) - .position(pos) - .world(world.getProperties()) - .build(); + @Override + public boolean regenerate(Region region, Extent extent, RegenOptions options) { + Server server = Sponge.server(); + + final String id = "worldedittemp_" + getWorld().key().value(); + + WorldGenerationConfig baseConfig = getWorld().asTemplate().generationConfig(); + + WorldTemplate tempWorldProperties = getWorld().asTemplate().asBuilder() + .key(ResourceKey.of("worldedit", id)) + .loadOnStartup(false) + .serializationBehavior(SerializationBehavior.NONE) + .generationConfig(options.getSeed().isPresent() + ? WorldGenerationConfig.Mutable.builder() + .generateBonusChest(baseConfig.generateBonusChest()) + .generateFeatures(baseConfig.generateFeatures()) + .seed(options.getSeed().getAsLong()) + .build() + : baseConfig) + .build(); + + ServerWorld tempWorld; + try { + tempWorld = server.worldManager().loadWorld(tempWorldProperties).get(); + } catch (InterruptedException | ExecutionException e) { + LOGGER.error("Failed to load temp world", e); + return false; + } - snapshot.restore(true, notifyAndLight ? BlockChangeFlags.ALL : BlockChangeFlags.NONE); + try { + // Pre-gen all the chunks + // We need to also pull one more chunk in every direction + CuboidRegion expandedPreGen = new CuboidRegion(region.getMinimumPoint().subtract(16, 16, 16), region.getMaximumPoint().add(16, 16, 16)); + for (BlockVector3 chunk : expandedPreGen.getChunkCubes()) { + tempWorld.loadChunk(chunk.getBlockX(), chunk.getBlockY(), chunk.getBlockZ(), true); + } - // Create the TileEntity - if (block instanceof BaseBlock) { - BaseBlock baseBlock = (BaseBlock) block; - if (baseBlock.getNbtReference() != null) { - // Kill the old TileEntity - world.getTileEntity(pos).ifPresent(tileEntity -> applyTileEntityData(tileEntity, baseBlock)); + World from = SpongeAdapter.adapt(tempWorld); + for (BlockVector3 vec : region) { + extent.setBlock(vec, from.getFullBlock(vec)); + if (options.shouldRegenBiomes()) { + extent.setBiome(vec, from.getBiome(vec)); + } } + } catch (WorldEditException e) { + throw new RuntimeException(e); + } finally { + // Remove temp world + server.worldManager().unloadWorld(tempWorldProperties.key()).thenRun(() -> server.worldManager().deleteWorld(tempWorldProperties.key())); } return true; } - @Override - public boolean notifyAndLightBlock(BlockVector3 position, com.sk89q.worldedit.world.block.BlockState previousType) throws WorldEditException { - // TODO Move this to adapter - return false; + + @Nullable + private static ConfiguredFeature createTreeFeatureGenerator(TreeGenerator.TreeType type) { + switch (type) { + // Based off of the SaplingGenerator class, as well as uses of DefaultBiomeFeatures fields + case TREE: + return Features.OAK; + case BIG_TREE: + return Features.FANCY_OAK; + case REDWOOD: + return Features.SPRUCE; + case TALL_REDWOOD: + return Features.MEGA_SPRUCE; + case MEGA_REDWOOD: + return Features.MEGA_PINE; + case BIRCH: + return Features.BIRCH; + case JUNGLE: + return Features.MEGA_JUNGLE_TREE; + case SMALL_JUNGLE: + return Features.JUNGLE_TREE; + case SHORT_JUNGLE: + return Features.JUNGLE_TREE_NO_VINE; + case JUNGLE_BUSH: + return Features.JUNGLE_BUSH; + case SWAMP: + return Features.SWAMP_TREE; + case ACACIA: + return Features.ACACIA; + case DARK_OAK: + return Features.DARK_OAK; + case TALL_BIRCH: + return Features.BIRCH_TALL; + case RED_MUSHROOM: + return Features.HUGE_RED_MUSHROOM; + case BROWN_MUSHROOM: + return Features.HUGE_BROWN_MUSHROOM; + case WARPED_FUNGUS: + return Features.WARPED_FUNGI; + case CRIMSON_FUNGUS: + return Features.CRIMSON_FUNGI; + case CHORUS_PLANT: + return Features.CHORUS_PLANT; + case RANDOM: + return createTreeFeatureGenerator(TreeGenerator.TreeType.values()[ThreadLocalRandom.current().nextInt(TreeGenerator.TreeType.values().length)]); + default: + return null; + } } @Override - public boolean regenerate(Region region, Extent extent, RegenOptions options) { - return false; + public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, BlockVector3 position) { + ConfiguredFeature generator = createTreeFeatureGenerator(type); + ServerLevel world = (ServerLevel) getWorld(); + return generator != null && generator.place( + world, world.getChunkSource().getGenerator(), random, + new BlockPos(position.getX(), position.getY(), position.getZ()) + ); } @Override public int getBlockLightLevel(BlockVector3 position) { checkNotNull(position); - BlockState state = getWorld().getBlock(new Vector3i(position.getX(), position.getY(), position.getZ())); + int skyLight = getWorld().light(LightTypes.SKY, position.getX(), position.getY(), position.getZ()); + int groundLight = getWorld().light(LightTypes.BLOCK, position.getX(), position.getY(), position.getZ()); - Optional groundLuminanceProperty = state.getProperty(GroundLuminanceProperty.class); - Optional skyLuminanceProperty = state.getProperty(SkyLuminanceProperty.class); - - if (!groundLuminanceProperty.isPresent() || !skyLuminanceProperty.isPresent()) { - return 0; - } - - //noinspection ConstantConditions - return (int) Math.max(groundLuminanceProperty.get().getValue(), skyLuminanceProperty.get().getValue()); + return Math.max(skyLight, groundLight); } @Override public BiomeType getBiome(BlockVector3 position) { checkNotNull(position); - return SpongeAdapter.adapt(getWorld().getBiome(position.getBlockX(), position.getBlockY(), position.getBlockZ())); + return BiomeType.REGISTRY.get( + getWorld().registry(RegistryTypes.BIOME) + .valueKey(getWorld().biome(position.getBlockX(), position.getBlockY(), position.getBlockZ())) + .asString() + ); } @Override @@ -218,7 +367,12 @@ public boolean setBiome(BlockVector3 position, BiomeType biome) { checkNotNull(position); checkNotNull(biome); - getWorld().setBiome(position.getBlockX(), position.getY(), position.getBlockZ(), SpongeAdapter.adapt(biome)); + getWorld().setBiome( + position.getBlockX(), position.getY(), position.getBlockZ(), + getWorld().registry(RegistryTypes.BIOME).value( + ResourceKey.resolve(biome.getId()) + ) + ); return true; } @@ -231,24 +385,32 @@ public void dropItem(Vector3 position, BaseItemStack item) { return; } - org.spongepowered.api.entity.Entity entity = getWorld().createEntity( - EntityTypes.ITEM, - new Vector3d(position.getX(), position.getY(), position.getZ()) + Item itemEntity = getWorld().createEntity( + EntityTypes.ITEM, + new Vector3d(position.getX(), position.getY(), position.getZ()) ); - entity.offer(Keys.REPRESENTED_ITEM, SpongeWorldEdit.toSpongeItemStack(item).createSnapshot()); - getWorld().spawnEntity(entity); + itemEntity.item().set( + SpongeAdapter.adapt(item).createSnapshot() + ); + getWorld().spawnEntity(itemEntity); } @Override public void simulateBlockMine(BlockVector3 position) { - // TODO + getWorld().destroyBlock( + new Vector3i(position.getX(), position.getY(), position.getZ()), + true + ); } @Override public boolean canPlaceAt(BlockVector3 position, com.sk89q.worldedit.world.block.BlockState blockState) { - // TODO - return true; + return ((net.minecraft.world.level.block.state.BlockState) SpongeAdapter.adapt(blockState)) + .canSurvive( + ((LevelReader) getWorld()), + new BlockPos(position.getX(), position.getY(), position.getZ()) + ); } @Override @@ -262,89 +424,89 @@ public boolean equals(Object o) { return false; } else if ((o instanceof SpongeWorld)) { SpongeWorld other = ((SpongeWorld) o); - World otherWorld = other.worldRef.get(); - World thisWorld = worldRef.get(); + ServerWorld otherWorld = other.worldRef.get(); + ServerWorld thisWorld = worldRef.get(); return otherWorld != null && otherWorld.equals(thisWorld); } else { return o instanceof com.sk89q.worldedit.world.World - && ((com.sk89q.worldedit.world.World) o).getName().equals(getName()); + && ((com.sk89q.worldedit.world.World) o).getName().equals(getName()); } } @Override public List getEntities(Region region) { - List entities = new ArrayList<>(); - for (org.spongepowered.api.entity.Entity entity : getWorld().getEntities()) { - org.spongepowered.api.world.Location loc = entity.getLocation(); - if (region.contains(BlockVector3.at(loc.getX(), loc.getY(), loc.getZ()))) { - entities.add(new SpongeEntity(entity)); - } - } - return entities; + return getWorld() + .entityStream( + SpongeAdapter.adaptVector3i(region.getMinimumPoint()), + SpongeAdapter.adaptVector3i(region.getMaximumPoint()), + // We don't need to force load or clone to copy entities + StreamOptions.builder() + .setCarbonCopy(false) + .setLoadingStyle(StreamOptions.LoadingStyle.NONE) + .build() + ) + .toStream() + .map(ve -> new SpongeEntity(ve.type())) + .collect(Collectors.toList()); } @Override public List getEntities() { - List entities = new ArrayList<>(); - for (org.spongepowered.api.entity.Entity entity : getWorld().getEntities()) { - entities.add(new SpongeEntity(entity)); - } - return entities; + return getWorld().entities().stream() + .map(SpongeEntity::new) + .collect(Collectors.toList()); } - protected abstract void applyEntityData(org.spongepowered.api.entity.Entity entity, BaseEntity data); - @Nullable @Override public Entity createEntity(Location location, BaseEntity entity) { - World world = getWorld(); - - EntityType entityType = Sponge.getRegistry().getType(EntityType.class, entity.getType().getId()).get(); - Vector3d pos = new Vector3d(location.getX(), location.getY(), location.getZ()); - - org.spongepowered.api.entity.Entity newEnt = world.createEntity(entityType, pos); - if (entity.getNbtReference() != null) { - applyEntityData(newEnt, entity); + Optional> entityType = Sponge.game().registry(RegistryTypes.ENTITY_TYPE) + .findValue(ResourceKey.resolve(entity.getType().getId())); + if (!entityType.isPresent()) { + return null; } - - // Overwrite any data set by the NBT application - Vector3 dir = location.getDirection(); - - newEnt.setLocationAndRotation( - new org.spongepowered.api.world.Location<>(getWorld(), pos), - new Vector3d(dir.getX(), dir.getY(), dir.getZ()) - ); - - if (world.spawnEntity(newEnt)) { - return new SpongeEntity(newEnt); + EntityArchetype.Builder builder = EntityArchetype.builder().type(entityType.get()); + CompoundBinaryTag nativeTag = entity.getNbt(); + if (nativeTag != null) { + builder.entityData(NbtAdapter.adaptFromWorldEdit((CompoundTag) AdventureNBTConverter.fromAdventure(nativeTag))); } - - return null; + return builder.build().apply(SpongeAdapter.adapt(location)).map(SpongeEntity::new).orElse(null); } @Override public WeatherType getWeather() { - return WeatherTypes.get(getWorld().getWeather().getId()); + return WeatherTypes.get( + getWorld().weather().type().key(RegistryTypes.WEATHER_TYPE).asString() + ); } @Override public long getRemainingWeatherDuration() { - return getWorld().getRemainingDuration(); + return getWorld().weather().remainingDuration().ticks(); } @Override public void setWeather(WeatherType weatherType) { - getWorld().setWeather(Sponge.getRegistry().getType(Weather.class, weatherType.getId()).get()); + getWorld().setWeather( + Sponge.game().registry(RegistryTypes.WEATHER_TYPE).value( + ResourceKey.resolve(weatherType.getId()) + ) + ); } @Override public void setWeather(WeatherType weatherType, long duration) { - getWorld().setWeather(Sponge.getRegistry().getType(Weather.class, weatherType.getId()).get(), duration); + getWorld().setWeather( + Sponge.game().registry(RegistryTypes.WEATHER_TYPE).value( + ResourceKey.resolve(weatherType.getId()) + ), + Ticks.of(duration) + ); } @Override public BlockVector3 getSpawnPosition() { - return SpongeAdapter.asBlockVector(getWorld().getSpawnLocation()); + return SpongeAdapter.adaptVector3i(getWorld().properties().spawnPosition()); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java index c9b218a4d6..519b2b4244 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java @@ -19,227 +19,283 @@ package com.sk89q.worldedit.sponge; +import com.google.common.base.Joiner; import com.google.inject.Inject; -import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.command.util.PermissionCondition; +import com.sk89q.worldedit.event.platform.CommandEvent; +import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; +import com.sk89q.worldedit.event.platform.PlatformUnreadyEvent; +import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent; import com.sk89q.worldedit.event.platform.SessionIdleEvent; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extension.platform.PlatformManager; import com.sk89q.worldedit.internal.anvil.ChunkDeleter; -import com.sk89q.worldedit.sponge.adapter.AdapterLoadException; -import com.sk89q.worldedit.sponge.adapter.SpongeImplAdapter; -import com.sk89q.worldedit.sponge.adapter.SpongeImplLoader; +import com.sk89q.worldedit.internal.command.CommandUtil; import com.sk89q.worldedit.sponge.config.SpongeConfiguration; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockCategory; +import com.sk89q.worldedit.world.item.ItemCategory; +import net.kyori.adventure.audience.Audience; import org.apache.logging.log4j.Logger; -import org.bstats.sponge.Metrics2; +import org.bstats.sponge.Metrics; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; import org.spongepowered.api.block.BlockSnapshot; import org.spongepowered.api.block.BlockType; import org.spongepowered.api.block.BlockTypes; -import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.command.Command; +import org.spongepowered.api.command.CommandCause; +import org.spongepowered.api.command.CommandCompletion; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.parameter.ArgumentReader; import org.spongepowered.api.config.ConfigDir; -import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.block.InteractBlockEvent; import org.spongepowered.api.event.filter.cause.Root; -import org.spongepowered.api.event.game.state.GameAboutToStartServerEvent; -import org.spongepowered.api.event.game.state.GameInitializationEvent; -import org.spongepowered.api.event.game.state.GamePostInitializationEvent; -import org.spongepowered.api.event.game.state.GamePreInitializationEvent; -import org.spongepowered.api.event.game.state.GameStartedServerEvent; -import org.spongepowered.api.event.game.state.GameStoppingServerEvent; import org.spongepowered.api.event.item.inventory.InteractItemEvent; -import org.spongepowered.api.event.network.ClientConnectionEvent; -import org.spongepowered.api.item.ItemType; -import org.spongepowered.api.item.inventory.ItemStack; -import org.spongepowered.api.plugin.Plugin; -import org.spongepowered.api.plugin.PluginContainer; +import org.spongepowered.api.event.lifecycle.ConstructPluginEvent; +import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; +import org.spongepowered.api.event.lifecycle.StartedEngineEvent; +import org.spongepowered.api.event.lifecycle.StartingEngineEvent; +import org.spongepowered.api.event.lifecycle.StoppingEngineEvent; +import org.spongepowered.api.event.network.ServerSideConnectionEvent; +import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.scheduler.Task; -import org.spongepowered.api.world.Location; -import org.spongepowered.api.world.World; +import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.math.vector.Vector3d; +import org.spongepowered.plugin.PluginContainer; +import org.spongepowered.plugin.builtin.jvm.Plugin; -import java.io.File; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collections; +import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.concurrent.TimeUnit; -import static com.google.common.base.Preconditions.checkNotNull; import static com.sk89q.worldedit.internal.anvil.ChunkDeleter.DELCHUNKS_FILE_NAME; +import static java.util.stream.Collectors.toList; /** * The Sponge implementation of WorldEdit. */ -@Plugin(id = SpongeWorldEdit.MOD_ID, name = "WorldEdit", - description = "WorldEdit is an easy-to-use in-game world editor for Minecraft", - url = "https://enginehub.org/worldedit/") +@Plugin(SpongeWorldEdit.MOD_ID) public class SpongeWorldEdit { - // I think this breaks right now b/c SpongeAPI 7 injects an slf4j logger - // But it should be fine in 8, where they're also Log4j - @Inject - private Logger logger; - - private final Metrics2 metrics; - public static final String MOD_ID = "worldedit"; private static final int BSTATS_PLUGIN_ID = 3329; - private SpongePermissionsProvider provider; - - @Inject - private PluginContainer container; - private static SpongeWorldEdit inst; - public static PluginContainer container() { - return inst.container; - } - public static SpongeWorldEdit inst() { return inst; } - private SpongePlatform platform; - private SpongeImplAdapter spongeAdapter; - - @Inject - private SpongeConfiguration config; + private final Logger logger; + private final PluginContainer container; + private final SpongeConfiguration config; + private final Path workingDir; - @Inject @ConfigDir(sharedRoot = false) - private File workingDir; + private SpongePermissionsProvider provider; + private SpongePlatform platform; @Inject - public SpongeWorldEdit(Metrics2.Factory metricsFactory) { + public SpongeWorldEdit(Logger logger, + PluginContainer container, + SpongeConfiguration config, + Metrics.Factory metricsFactory, + @ConfigDir(sharedRoot = false) + Path workingDir) { + this.logger = logger; + this.container = container; + this.config = config; + this.workingDir = workingDir; + metricsFactory.make(BSTATS_PLUGIN_ID); inst = this; - metrics = metricsFactory.make(BSTATS_PLUGIN_ID); } @Listener - public void preInit(GamePreInitializationEvent event) { - // Load configuration - config.load(); + public void onPluginConstruction(ConstructPluginEvent event) { + this.platform = new SpongePlatform(this); + WorldEdit.getInstance().getPlatformManager().register(platform); - Task.builder().interval(30, TimeUnit.SECONDS).execute(ThreadSafeCache.getInstance()).submit(this); - } + this.provider = new SpongePermissionsProvider(); - @Listener - public void init(GameInitializationEvent event) { - CUIChannelHandler.init(); - } + Task.builder() + .plugin(container) + .interval(30, TimeUnit.SECONDS) + .execute(ThreadSafeCache.getInstance()) + .build(); - @Listener - public void postInit(GamePostInitializationEvent event) { + event.game().eventManager().registerListeners( + container, + new CUIChannelHandler.RegistrationHandler() + ); logger.info("WorldEdit for Sponge (version " + getInternalVersion() + ") is loaded"); } @Listener - public void serverAboutToStart(GameAboutToStartServerEvent event) { - if (this.platform != null) { - logger.warn("GameAboutToStartServerEvent occurred when GameStoppingServerEvent hasn't"); - WorldEdit.getInstance().getPlatformManager().unregister(platform); - } - - final Path delChunks = workingDir.toPath().resolve(DELCHUNKS_FILE_NAME); + public void serverStarting(StartingEngineEvent event) { + final Path delChunks = workingDir.resolve(DELCHUNKS_FILE_NAME); if (Files.exists(delChunks)) { ChunkDeleter.runFromFile(delChunks, true); } + } - this.platform = new SpongePlatform(this); - this.provider = new SpongePermissionsProvider(); - - for (BlockType blockType : Sponge.getRegistry().getAllOf(BlockType.class)) { - // TODO Handle blockstate stuff - String id = blockType.getId(); + @Listener + public void serverStarted(StartedEngineEvent event) { + event.game().registry(RegistryTypes.BLOCK_TYPE).streamEntries().forEach(blockType -> { + String id = blockType.key().asString(); if (!com.sk89q.worldedit.world.block.BlockType.REGISTRY.keySet().contains(id)) { - com.sk89q.worldedit.world.block.BlockType.REGISTRY.register(id, new com.sk89q.worldedit.world.block.BlockType(id)); + com.sk89q.worldedit.world.block.BlockType.REGISTRY.register(id, new com.sk89q.worldedit.world.block.BlockType( + id, + input -> { + BlockType spongeBlockType = Sponge.game().registry(RegistryTypes.BLOCK_TYPE).value( + ResourceKey.resolve(input.getBlockType().getId()) + ); + return SpongeAdapter.adapt(spongeBlockType.defaultState()); + } + )); } - } + }); - for (ItemType itemType : Sponge.getRegistry().getAllOf(ItemType.class)) { - String id = itemType.getId(); + event.game().registry(RegistryTypes.ITEM_TYPE).streamEntries().forEach(itemType -> { + String id = itemType.key().asString(); if (!com.sk89q.worldedit.world.item.ItemType.REGISTRY.keySet().contains(id)) { com.sk89q.worldedit.world.item.ItemType.REGISTRY.register(id, new com.sk89q.worldedit.world.item.ItemType(id)); } + }); + + event.game().registry(RegistryTypes.ENTITY_TYPE).streamEntries().forEach(entityType -> { + String id = entityType.key().asString(); + if (!com.sk89q.worldedit.world.entity.EntityType.REGISTRY.keySet().contains(id)) { + com.sk89q.worldedit.world.entity.EntityType.REGISTRY.register(id, new com.sk89q.worldedit.world.entity.EntityType(id)); + } + }); + + for (ServerWorld world : event.engine().worldManager().worlds()) { + world.registry(RegistryTypes.BIOME).streamEntries().forEach(biomeType -> { + String id = biomeType.key().asString(); + if (!BiomeType.REGISTRY.keySet().contains(id)) { + BiomeType.REGISTRY.register(id, new BiomeType(id)); + } + }); } - WorldEdit.getInstance().getPlatformManager().register(platform); + event.game().registry(RegistryTypes.BLOCK_TYPE_TAGS).streamEntries().forEach(blockTypeTag -> { + String id = blockTypeTag.key().asString(); + if (!BlockCategory.REGISTRY.keySet().contains(id)) { + BlockCategory.REGISTRY.register(id, new BlockCategory(id)); + } + }); + event.game().registry(RegistryTypes.ITEM_TYPE_TAGS).streamEntries().forEach(itemTypeTag -> { + String id = itemTypeTag.key().asString(); + if (!ItemCategory.REGISTRY.keySet().contains(id)) { + ItemCategory.REGISTRY.register(id, new ItemCategory(id)); + } + }); + + config.load(); + WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent(platform)); } @Listener - public void serverStopping(GameStoppingServerEvent event) { + public void serverStopping(StoppingEngineEvent event) { WorldEdit worldEdit = WorldEdit.getInstance(); worldEdit.getSessionManager().unload(); - worldEdit.getPlatformManager().unregister(platform); + WorldEdit.getInstance().getEventBus().post(new PlatformUnreadyEvent(platform)); } @Listener - public void serverStarted(GameStartedServerEvent event) { - WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent(platform)); + public void registerCommand(RegisterCommandEvent event) { + WorldEdit.getInstance().getEventBus().post(new PlatformsRegisteredEvent()); + PlatformManager manager = WorldEdit.getInstance().getPlatformManager(); + Platform commandsPlatform = manager.queryCapability(Capability.USER_COMMANDS); + if (commandsPlatform != platform || !platform.isHookingEvents()) { + // We're not in control of commands/events -- do not register. + return; + } - loadAdapter(); + List commands = manager.getPlatformCommandManager().getCommandManager() + .getAllCommands().collect(toList()); + for (org.enginehub.piston.Command command : commands) { + registerAdaptedCommand(event, command); + + Set perms = command.getCondition().as(PermissionCondition.class) + .map(PermissionCondition::getPermissions) + .orElseGet(Collections::emptySet); + if (!perms.isEmpty()) { + perms.forEach(getPermissionsProvider()::registerPermission); + } + } } - private void loadAdapter() { - WorldEdit worldEdit = WorldEdit.getInstance(); + private String rebuildArguments(String commandLabel, String args) { + int plSep = commandLabel.indexOf(":"); + if (plSep >= 0 && plSep < commandLabel.length() + 1) { + commandLabel = commandLabel.substring(plSep + 1); + } - // Attempt to load a Sponge adapter - SpongeImplLoader adapterLoader = new SpongeImplLoader(); + StringBuilder sb = new StringBuilder("/").append(commandLabel); - try { - adapterLoader.addFromPath(getClass().getClassLoader()); - } catch (IOException e) { - logger.warn("Failed to search path for Sponge adapters"); + String[] split = args.split(" ", -1); + if (split.length > 0) { + sb.append(" "); } + return Joiner.on(" ").appendTo(sb, split).toString(); + } - try { - adapterLoader.addFromJar(container.getSource().get().toFile()); - } catch (IOException e) { - logger.warn("Failed to search " + container.getSource().get().toFile() + " for Sponge adapters", e); - } - try { - spongeAdapter = adapterLoader.loadAdapter(); - logger.info("Using " + spongeAdapter.getClass().getCanonicalName() + " as the Sponge adapter"); - } catch (AdapterLoadException e) { - Platform platform = worldEdit.getPlatformManager().queryCapability(Capability.WORLD_EDITING); - if (platform instanceof SpongePlatform) { - logger.warn(e.getMessage()); - } else { - logger.info("WorldEdit could not find a Sponge adapter for this MC version, " - + "but it seems that you have another implementation of WorldEdit installed (" + platform.getPlatformName() + ") " - + "that handles the world editing."); + private void registerAdaptedCommand(RegisterCommandEvent event, org.enginehub.piston.Command command) { + CommandAdapter adapter = new CommandAdapter(command) { + @Override + public CommandResult process(CommandCause cause, ArgumentReader.Mutable arguments) { + CommandEvent weEvent = new CommandEvent(SpongeWorldEdit.inst().wrapCommandCause(cause), rebuildArguments(command.getName(), arguments.remaining()).trim()); + WorldEdit.getInstance().getEventBus().post(weEvent); + return weEvent.isCancelled() ? CommandResult.success() : CommandResult.builder().build(); } - } + + @Override + public List complete(CommandCause cause, ArgumentReader.Mutable arguments) { + String args = rebuildArguments(command.getName(), arguments.remaining()); + CommandSuggestionEvent weEvent = new CommandSuggestionEvent(SpongeWorldEdit.inst().wrapCommandCause(cause), args); + WorldEdit.getInstance().getEventBus().post(weEvent); + return CommandUtil.fixSuggestions(args, weEvent.getSuggestions()) + .stream().map(CommandCompletion::of).collect(toList()); + } + }; + event.register( + container, adapter, command.getName(), command.getAliases().toArray(new String[0]) + ); } - public SpongeImplAdapter getAdapter() { - return this.spongeAdapter; + private boolean isHookingEvents() { + return platform != null && platform.isHookingEvents(); } @Listener - public void onPlayerItemInteract(InteractItemEvent.Secondary event, @Root Player spongePlayer) { - if (platform == null) { + public void onPlayerItemInteract(InteractItemEvent.Secondary event, @Root ServerPlayer spongePlayer) { + if (!isHookingEvents()) { return; } - if (!platform.isHookingEvents()) { - return; // We have to be told to catch these events - } - WorldEdit we = WorldEdit.getInstance(); - SpongePlayer player = wrapPlayer(spongePlayer); + SpongePlayer player = SpongeAdapter.adapt(spongePlayer); if (we.handleRightClick(player)) { event.setCancelled(true); } } @Listener - public void onPlayerInteract(InteractBlockEvent event, @Root Player spongePlayer) { + public void onPlayerInteract(InteractBlockEvent event, @Root ServerPlayer spongePlayer) { if (platform == null) { return; } @@ -250,62 +306,60 @@ public void onPlayerInteract(InteractBlockEvent event, @Root Player spongePlayer WorldEdit we = WorldEdit.getInstance(); - SpongePlayer player = wrapPlayer(spongePlayer); - com.sk89q.worldedit.world.World world = player.getWorld(); + SpongePlayer player = SpongeAdapter.adapt(spongePlayer); - BlockSnapshot targetBlock = event.getTargetBlock(); - Optional> optLoc = targetBlock.getLocation(); + BlockSnapshot targetBlock = event.block(); + Optional optLoc = targetBlock.location(); - BlockType interactedType = targetBlock.getState().getType(); - if (event instanceof InteractBlockEvent.Primary) { - if (interactedType != BlockTypes.AIR) { + BlockType interactedType = targetBlock.state().type(); + if (event instanceof InteractBlockEvent.Primary.Start) { + InteractBlockEvent.Primary.Start eventCast = ((InteractBlockEvent.Primary.Start) event); + if (interactedType != BlockTypes.AIR.get()) { if (!optLoc.isPresent()) { return; } - Location loc = optLoc.get(); - com.sk89q.worldedit.util.Location pos = new com.sk89q.worldedit.util.Location( - world, loc.getX(), loc.getY(), loc.getZ()); - - if (we.handleBlockLeftClick(player, pos)) { - event.setCancelled(true); - } + ServerLocation loc = optLoc.get(); + com.sk89q.worldedit.util.Location pos = SpongeAdapter.adapt( + loc, Vector3d.ZERO + ); - if (we.handleArmSwing(player)) { - event.setCancelled(true); - } - } else { - if (we.handleArmSwing(player)) { - event.setCancelled(true); + if (we.handleBlockLeftClick(player, pos, SpongeAdapter.adapt(eventCast.targetSide()))) { + eventCast.setCancelled(true); } } + if (we.handleArmSwing(player)) { + eventCast.setCancelled(true); + } } else if (event instanceof InteractBlockEvent.Secondary) { if (!optLoc.isPresent()) { return; } + InteractBlockEvent.Secondary eventCast = ((InteractBlockEvent.Secondary) event); - Location loc = optLoc.get(); - com.sk89q.worldedit.util.Location pos = new com.sk89q.worldedit.util.Location( - world, loc.getX(), loc.getY(), loc.getZ()); + ServerLocation loc = optLoc.get(); + com.sk89q.worldedit.util.Location pos = SpongeAdapter.adapt( + loc, Vector3d.ZERO + ); - if (we.handleBlockRightClick(player, pos)) { - event.setCancelled(true); + if (we.handleBlockRightClick(player, pos, SpongeAdapter.adapt(eventCast.targetSide()))) { + eventCast.setCancelled(true); } if (we.handleRightClick(player)) { - event.setCancelled(true); + eventCast.setCancelled(true); } } } @Listener - public void onPlayerQuit(ClientConnectionEvent.Disconnect event) { + public void onPlayerQuit(ServerSideConnectionEvent.Disconnect event) { WorldEdit.getInstance().getEventBus() - .post(new SessionIdleEvent(new SpongePlayer.SessionKeyImpl(event.getTargetEntity()))); + .post(new SessionIdleEvent(new SpongePlayer.SessionKeyImpl(event.player()))); } - public static ItemStack toSpongeItemStack(BaseItemStack item) { - return inst().getAdapter().makeSpongeStack(item); + public PluginContainer getPluginContainer() { + return container; } /** @@ -317,46 +371,18 @@ SpongeConfiguration getConfig() { return this.config; } - /** - * Get the WorldEdit proxy for the given player. - * - * @param player the player - * @return the WorldEdit player - */ - public SpongePlayer wrapPlayer(Player player) { - checkNotNull(player); - return new SpongePlayer(platform, player); - } - - public Actor wrapCommandSource(CommandSource sender) { - if (sender instanceof Player) { - return wrapPlayer((Player) sender); + public Actor wrapCommandCause(CommandCause cause) { + Object rootCause = cause.root(); + if (rootCause instanceof ServerPlayer) { + return SpongeAdapter.adapt((ServerPlayer) rootCause); + } + if (rootCause instanceof Audience) { + return new SpongeCommandSender((Audience) rootCause); } - return new SpongeCommandSender(this, sender); - } - - /** - * Get the session for a player. - * - * @param player the player - * @return the session - */ - public LocalSession getSession(Player player) { - checkNotNull(player); - return WorldEdit.getInstance().getSessionManager().get(wrapPlayer(player)); + throw new UnsupportedOperationException("Cannot wrap " + rootCause.getClass()); } - /** - * Get the WorldEdit proxy for the given world. - * - * @param world the world - * @return the WorldEdit world - */ - public SpongeWorld getWorld(World world) { - checkNotNull(world); - return getAdapter().getWorld(world); - } /** * Get the WorldEdit proxy for the platform. @@ -367,13 +393,17 @@ public Platform getPlatform() { return this.platform; } + SpongePlatform getInternalPlatform() { + return this.platform; + } + /** * Get the working directory where WorldEdit's files are stored. * * @return the working directory */ public Path getWorkingDir() { - return this.workingDir.toPath(); + return this.workingDir; } /** @@ -382,7 +412,7 @@ public Path getWorkingDir() { * @return a version string */ String getInternalVersion() { - return container.getVersion().orElse("Unknown"); + return container.metadata().version().toString(); } public void setPermissionsProvider(SpongePermissionsProvider provider) { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/ThreadSafeCache.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/ThreadSafeCache.java index fea9026657..b6f131444f 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/ThreadSafeCache.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/ThreadSafeCache.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.sponge; import org.spongepowered.api.Sponge; -import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.server.ServerPlayer; import java.util.ArrayList; import java.util.List; @@ -49,8 +49,8 @@ public Set getOnlineIds() { public void run() { List onlineIds = new ArrayList<>(); - for (Player player : Sponge.getServer().getOnlinePlayers()) { - onlineIds.add(player.getUniqueId()); + for (ServerPlayer player : Sponge.server().onlinePlayers()) { + onlineIds.add(player.uniqueId()); } this.onlineIds = new CopyOnWriteArraySet<>(onlineIds); diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplAdapter.java deleted file mode 100644 index fcb2dc333a..0000000000 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplAdapter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.sponge.adapter; - -import com.flowpowered.math.vector.Vector3d; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.math.Vector3; -import com.sk89q.worldedit.sponge.SpongeWorld; -import com.sk89q.worldedit.util.Location; -import org.spongepowered.api.entity.Entity; -import org.spongepowered.api.item.inventory.ItemStack; -import org.spongepowered.api.world.World; - -/** - * An interface for various things that can't be done through the Sponge API. - */ -public interface SpongeImplAdapter { - - BaseEntity createBaseEntity(Entity entity); - - ItemStack makeSpongeStack(BaseItemStack itemStack); - - SpongeWorld getWorld(World world); - - default boolean isBest() { - return true; - } - - default Location adapt(org.spongepowered.api.world.Location loc, Vector3d rot) { - Vector3 position = Vector3.at(loc.getX(), loc.getY(), loc.getZ()); - - return new Location(getWorld(loc.getExtent()), position, (float) rot.getY(), (float) rot.getX()); - } -} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplLoader.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplLoader.java deleted file mode 100644 index 47303b9d1f..0000000000 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/adapter/SpongeImplLoader.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.sponge.adapter; - -import com.google.common.collect.Lists; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.util.io.Closer; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -/** - * Loads Sponge implementation adapters. - */ -public class SpongeImplLoader { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - private final List adapterCandidates = new ArrayList<>(); - private String customCandidate; - - private static final String SEARCH_PACKAGE = "com.sk89q.worldedit.sponge.adapter.impl"; - private static final String SEARCH_PACKAGE_DOT = SEARCH_PACKAGE + "."; - private static final String SEARCH_PATH = SEARCH_PACKAGE.replace(".", "/"); - private static final String CLASS_SUFFIX = ".class"; - - private static final String LOAD_ERROR_MESSAGE = - "\n**********************************************\n" - + "** This WorldEdit version does not support your version of Sponge.\n" - + "** WorldEdit will not function! \n" - + "** \n" - + "** Please ensure you are running the latest version\n" - + "**********************************************\n"; - - /** - * Create a new instance. - */ - public SpongeImplLoader() { - addDefaults(); - } - - /** - * Add default candidates, such as any defined with - * {@code -Dworldedit.sponge.adapter}. - */ - private void addDefaults() { - String className = System.getProperty("worldedit.sponge.adapter"); - if (className != null) { - customCandidate = className; - adapterCandidates.add(className); - LOGGER.info("-Dworldedit.sponge.adapter used to add " + className + " to the list of available Sponge adapters"); - } - } - - /** - * Search the given JAR for candidate implementations. - * - * @param file the file - * @throws IOException thrown on I/O error - */ - public void addFromJar(File file) throws IOException { - Closer closer = Closer.create(); - JarFile jar = closer.register(new JarFile(file)); - try { - Enumeration entries = jar.entries(); - while (entries.hasMoreElements()) { - JarEntry jarEntry = (JarEntry) entries.nextElement(); - - String className = jarEntry.getName().replaceAll("[/\\\\]+", "."); - - if (!className.startsWith(SEARCH_PACKAGE_DOT) || jarEntry.isDirectory() || className.contains("$")) { - continue; - } - - int beginIndex = 0; - int endIndex = className.length() - CLASS_SUFFIX.length(); - className = className.substring(beginIndex, endIndex); - adapterCandidates.add(className); - } - } finally { - closer.close(); - } - } - - /** - * Search for classes stored as separate files available via the given - * class loader. - * - * @param classLoader the class loader - * @throws IOException thrown on error - */ - public void addFromPath(ClassLoader classLoader) throws IOException { - Enumeration resources = classLoader.getResources(SEARCH_PATH); - while (resources.hasMoreElements()) { - File file = new File(resources.nextElement().getFile()); - addFromPath(file); - } - } - - /** - * Search for classes stored as separate files available via the given - * path. - * - * @param file the path - */ - private void addFromPath(File file) { - String resource = SEARCH_PACKAGE_DOT + file.getName(); - if (file.isDirectory()) { - File[] files = file.listFiles(); - if (files != null) { - for (File child : files) { - addFromPath(child); - } - } - } else if (resource.endsWith(CLASS_SUFFIX)) { - int beginIndex = 0; - int endIndex = resource.length() - CLASS_SUFFIX.length(); - String className = resource.substring(beginIndex, endIndex); - if (!className.contains("$")) { - adapterCandidates.add(className); - } - } - } - - /** - * Iterate through the list of candidates and load an adapter. - * - * @return an adapter - * @throws AdapterLoadException thrown if no adapter could be found - */ - public SpongeImplAdapter loadAdapter() throws AdapterLoadException { - List suitableAdapters = Lists.newArrayList(); - for (String className : adapterCandidates) { - try { - Class cls = Class.forName(className); - if (SpongeImplAdapter.class.isAssignableFrom(cls)) { - suitableAdapters.add((SpongeImplAdapter) cls.newInstance()); - } else { - LOGGER.warn("Failed to load the Sponge adapter class '" + className - + "' because it does not implement " + SpongeImplAdapter.class.getCanonicalName()); - } - } catch (ClassNotFoundException e) { - LOGGER.warn("Failed to load the Sponge adapter class '" + className - + "' that is not supposed to be missing", e); - } catch (IllegalAccessException e) { - LOGGER.warn("Failed to load the Sponge adapter class '" + className - + "' that is not supposed to be raising this error", e); - } catch (Throwable e) { - if (className.equals(customCandidate)) { - LOGGER.warn("Failed to load the Sponge adapter class '" + className + "'", e); - } - } - } - - if (suitableAdapters.isEmpty()) { - throw new AdapterLoadException(LOAD_ERROR_MESSAGE); - } else { - if (suitableAdapters.size() == 1) { - return suitableAdapters.get(0); - } else { - return suitableAdapters.stream().sorted((o1, o2) -> { - if (o1.isBest() && !o2.isBest()) { - return -1; - } else if (!o1.isBest() && o2.isBest()) { - return 1; - } - return 0; - }).findFirst().orElse(suitableAdapters.get(0)); - } - } - } -} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/ConfigurateConfiguration.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/ConfigurateConfiguration.java index 7435d69887..6c88509858 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/ConfigurateConfiguration.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/ConfigurateConfiguration.java @@ -19,17 +19,17 @@ package com.sk89q.worldedit.sponge.config; -import com.google.common.reflect.TypeToken; +import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.session.SessionManager; import com.sk89q.worldedit.util.report.Unreported; import com.sk89q.worldedit.world.registry.LegacyMapper; -import ninja.leaping.configurate.ConfigurationOptions; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.loader.ConfigurationLoader; -import ninja.leaping.configurate.objectmapping.ObjectMappingException; import org.apache.logging.log4j.Logger; +import org.spongepowered.configurate.CommentedConfigurationNode; +import org.spongepowered.configurate.ConfigurationOptions; +import org.spongepowered.configurate.loader.ConfigurationLoader; +import org.spongepowered.configurate.serialize.SerializationException; import java.io.IOException; import java.util.HashSet; @@ -37,10 +37,13 @@ public class ConfigurateConfiguration extends LocalConfiguration { - @Unreported protected final ConfigurationLoader config; - @Unreported protected final Logger logger; + @Unreported + protected final ConfigurationLoader config; + @Unreported + protected final Logger logger; - @Unreported protected CommentedConfigurationNode node; + @Unreported + protected CommentedConfigurationNode node; public ConfigurateConfiguration(ConfigurationLoader config, Logger logger) { this.config = config; @@ -51,87 +54,94 @@ public ConfigurateConfiguration(ConfigurationLoader public void load() { try { ConfigurationOptions options = ConfigurationOptions.defaults(); - options = options.setShouldCopyDefaults(true); + options = options.shouldCopyDefaults(true); node = config.load(options); } catch (IOException e) { logger.warn("Error loading WorldEdit configuration", e); } - profile = node.getNode("debug").getBoolean(profile); - traceUnflushedSessions = node.getNode("debugging", "trace-unflushed-sessions").getBoolean(traceUnflushedSessions); - wandItem = node.getNode("wand-item").getString(wandItem).toLowerCase(Locale.ROOT); + profile = node.node("debug").getBoolean(profile); + traceUnflushedSessions = node.node("debugging", "trace-unflushed-sessions").getBoolean(traceUnflushedSessions); + wandItem = node.node("wand-item").getString(wandItem).toLowerCase(Locale.ROOT); try { wandItem = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(wandItem)).getId(); } catch (Throwable ignored) { } - defaultChangeLimit = Math.max(-1, node.getNode("limits", "max-blocks-changed", "default").getInt(defaultChangeLimit)); - maxChangeLimit = Math.max(-1, node.getNode("limits", "max-blocks-changed", "maximum").getInt(maxChangeLimit)); + defaultChangeLimit = Math.max(-1, node.node("limits", "max-blocks-changed", "default").getInt(defaultChangeLimit)); + maxChangeLimit = Math.max(-1, node.node("limits", "max-blocks-changed", "maximum").getInt(maxChangeLimit)); - defaultVerticalHeight = Math.max(1, node.getNode("limits", "vertical-height", "default").getInt(defaultVerticalHeight)); + defaultVerticalHeight = Math.max(1, node.node("limits", "vertical-height", "default").getInt(defaultVerticalHeight)); - defaultMaxPolygonalPoints = Math.max(-1, node.getNode("limits", "max-polygonal-points", "default").getInt(defaultMaxPolygonalPoints)); - maxPolygonalPoints = Math.max(-1, node.getNode("limits", "max-polygonal-points", "maximum").getInt(maxPolygonalPoints)); + defaultMaxPolygonalPoints = Math.max(-1, node.node("limits", "max-polygonal-points", "default").getInt(defaultMaxPolygonalPoints)); + maxPolygonalPoints = Math.max(-1, node.node("limits", "max-polygonal-points", "maximum").getInt(maxPolygonalPoints)); - maxRadius = Math.max(-1, node.getNode("limits", "max-radius").getInt(maxRadius)); - maxBrushRadius = node.getNode("limits", "max-brush-radius").getInt(maxBrushRadius); - maxSuperPickaxeSize = Math.max(1, node.getNode("limits", "max-super-pickaxe-size").getInt(maxSuperPickaxeSize)); + maxRadius = Math.max(-1, node.node("limits", "max-radius").getInt(maxRadius)); + maxBrushRadius = node.node("limits", "max-brush-radius").getInt(maxBrushRadius); + maxSuperPickaxeSize = Math.max(1, node.node("limits", "max-super-pickaxe-size").getInt(maxSuperPickaxeSize)); - butcherDefaultRadius = Math.max(-1, node.getNode("limits", "butcher-radius", "default").getInt(butcherDefaultRadius)); - butcherMaxRadius = Math.max(-1, node.getNode("limits", "butcher-radius", "maximum").getInt(butcherMaxRadius)); + butcherDefaultRadius = Math.max(-1, node.node("limits", "butcher-radius", "default").getInt(butcherDefaultRadius)); + butcherMaxRadius = Math.max(-1, node.node("limits", "butcher-radius", "maximum").getInt(butcherMaxRadius)); try { - disallowedBlocks = new HashSet<>(node.getNode("limits", "disallowed-blocks").getList(TypeToken.of(String.class))); - } catch (ObjectMappingException e) { + disallowedBlocks = new HashSet<>( + node.node("limits", "disallowed-blocks").getList( + String.class, + ImmutableList.copyOf(getDefaultDisallowedBlocks()) + ) + ); + } catch (SerializationException e) { logger.warn("Error loading WorldEdit configuration", e); } try { - allowedDataCycleBlocks = new HashSet<>(node.getNode("limits", "allowed-data-cycle-blocks").getList(TypeToken.of(String.class))); - } catch (ObjectMappingException e) { + allowedDataCycleBlocks = new HashSet<>( + node.node("limits", "allowed-data-cycle-blocks").getList(String.class, ImmutableList.of()) + ); + } catch (SerializationException e) { logger.warn("Error loading WorldEdit configuration", e); } - registerHelp = node.getNode("register-help").getBoolean(true); - logCommands = node.getNode("logging", "log-commands").getBoolean(logCommands); - logFile = node.getNode("logging", "file").getString(logFile); - logFormat = node.getNode("logging", "format").getString(logFormat); + registerHelp = node.node("register-help").getBoolean(true); + logCommands = node.node("logging", "log-commands").getBoolean(logCommands); + logFile = node.node("logging", "file").getString(logFile); + logFormat = node.node("logging", "format").getString(logFormat); - superPickaxeDrop = node.getNode("super-pickaxe", "drop-items").getBoolean(superPickaxeDrop); - superPickaxeManyDrop = node.getNode("super-pickaxe", "many-drop-items").getBoolean(superPickaxeManyDrop); + superPickaxeDrop = node.node("super-pickaxe", "drop-items").getBoolean(superPickaxeDrop); + superPickaxeManyDrop = node.node("super-pickaxe", "many-drop-items").getBoolean(superPickaxeManyDrop); - useInventory = node.getNode("use-inventory", "enable").getBoolean(useInventory); - useInventoryOverride = node.getNode("use-inventory", "allow-override").getBoolean(useInventoryOverride); - useInventoryCreativeOverride = node.getNode("use-inventory", "creative-mode-overrides").getBoolean(useInventoryCreativeOverride); + useInventory = node.node("use-inventory", "enable").getBoolean(useInventory); + useInventoryOverride = node.node("use-inventory", "allow-override").getBoolean(useInventoryOverride); + useInventoryCreativeOverride = node.node("use-inventory", "creative-mode-overrides").getBoolean(useInventoryCreativeOverride); - navigationWand = node.getNode("navigation-wand", "item").getString(navigationWand).toLowerCase(Locale.ROOT); + navigationWand = node.node("navigation-wand", "item").getString(navigationWand).toLowerCase(Locale.ROOT); try { navigationWand = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(navigationWand)).getId(); } catch (Throwable ignored) { } - navigationWandMaxDistance = node.getNode("navigation-wand", "max-distance").getInt(navigationWandMaxDistance); - navigationUseGlass = node.getNode("navigation", "use-glass").getBoolean(navigationUseGlass); + navigationWandMaxDistance = node.node("navigation-wand", "max-distance").getInt(navigationWandMaxDistance); + navigationUseGlass = node.node("navigation", "use-glass").getBoolean(navigationUseGlass); - scriptTimeout = node.getNode("scripting", "timeout").getInt(scriptTimeout); - scriptsDir = node.getNode("scripting", "dir").getString(scriptsDir); + scriptTimeout = node.node("scripting", "timeout").getInt(scriptTimeout); + scriptsDir = node.node("scripting", "dir").getString(scriptsDir); - saveDir = node.getNode("saving", "dir").getString(saveDir); + saveDir = node.node("saving", "dir").getString(saveDir); - allowSymlinks = node.getNode("files", "allow-symbolic-links").getBoolean(false); - LocalSession.MAX_HISTORY_SIZE = Math.max(0, node.getNode("history", "size").getInt(15)); - SessionManager.EXPIRATION_GRACE = node.getNode("history", "expiration").getInt(10) * 60 * 1000; + allowSymlinks = node.node("files", "allow-symbolic-links").getBoolean(false); + LocalSession.MAX_HISTORY_SIZE = Math.max(0, node.node("history", "size").getInt(15)); + SessionManager.EXPIRATION_GRACE = node.node("history", "expiration").getInt(10) * 60 * 1000; - showHelpInfo = node.getNode("show-help-on-first-use").getBoolean(true); - serverSideCUI = node.getNode("server-side-cui").getBoolean(true); + showHelpInfo = node.node("show-help-on-first-use").getBoolean(true); + serverSideCUI = node.node("server-side-cui").getBoolean(true); - String snapshotsDir = node.getNode("snapshots", "directory").getString(""); - boolean experimentalSnapshots = node.getNode("snapshots", "experimental").getBoolean(false); + String snapshotsDir = node.node("snapshots", "directory").getString(""); + boolean experimentalSnapshots = node.node("snapshots", "experimental").getBoolean(false); initializeSnapshotConfiguration(snapshotsDir, experimentalSnapshots); - String type = node.getNode("shell-save-type").getString("").trim(); + String type = node.node("shell-save-type").getString("").trim(); shellSaveType = type.equals("") ? null : type; - extendedYLimit = node.getNode("compat", "extended-y-limit").getBoolean(false); - setDefaultLocaleName(node.getNode("default-locale").getString(defaultLocaleName)); + extendedYLimit = node.node("compat", "extended-y-limit").getBoolean(false); + setDefaultLocaleName(node.node("default-locale").getString(defaultLocaleName)); } } diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/SpongeConfiguration.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/SpongeConfiguration.java index 05e9cd2e17..bb58a5d8c4 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/SpongeConfiguration.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/config/SpongeConfiguration.java @@ -21,10 +21,10 @@ import com.google.inject.Inject; import com.sk89q.worldedit.sponge.SpongeWorldEdit; -import ninja.leaping.configurate.commented.CommentedConfigurationNode; -import ninja.leaping.configurate.loader.ConfigurationLoader; import org.apache.logging.log4j.Logger; import org.spongepowered.api.config.DefaultConfig; +import org.spongepowered.configurate.CommentedConfigurationNode; +import org.spongepowered.configurate.loader.ConfigurationLoader; import java.io.IOException; import java.nio.file.Path; @@ -35,7 +35,9 @@ public class SpongeConfiguration extends ConfigurateConfiguration { public boolean cheatMode = false; @Inject - public SpongeConfiguration(@DefaultConfig(sharedRoot = false) ConfigurationLoader config, Logger logger) { + public SpongeConfiguration(@DefaultConfig(sharedRoot = false) + ConfigurationLoader config, + Logger logger) { super(config, logger); } @@ -43,8 +45,8 @@ public SpongeConfiguration(@DefaultConfig(sharedRoot = false) ConfigurationLoade public void load() { super.load(); - creativeEnable = node.getNode("use-in-creative").getBoolean(false); - cheatMode = node.getNode("cheat-mode").getBoolean(false); + creativeEnable = node.node("use-in-creative").getBoolean(false); + cheatMode = node.node("cheat-mode").getBoolean(false); try { config.save(node); diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/ExtendedChunk.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/ExtendedChunk.java new file mode 100644 index 0000000000..47e0451e27 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/ExtendedChunk.java @@ -0,0 +1,43 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge.internal; + +import com.sk89q.worldedit.util.SideEffect; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; + +import javax.annotation.Nullable; + +public interface ExtendedChunk { + /** + * {@link LevelChunk#setBlockState(BlockPos, BlockState, boolean)} with the extra + * {@link SideEffect#UPDATE} flag. + * + * @param pos the position to set + * @param state the state to set + * @param moved I honestly have no idea and can't be bothered to investigate, we pass {@code + * false} + * @param update the update flag, see side-effect for details + * @return the old block state, or {@code null} if unchanged + */ + @Nullable + BlockState setBlockState(BlockPos pos, BlockState state, boolean moved, boolean update); +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/LocaleResolver.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/LocaleResolver.java new file mode 100644 index 0000000000..4f7f4c8a54 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/LocaleResolver.java @@ -0,0 +1,35 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge.internal; + +import com.sk89q.worldedit.WorldEdit; +import net.kyori.adventure.audience.Audience; +import org.spongepowered.api.util.locale.LocaleSource; + +import java.util.Locale; + +public class LocaleResolver { + public static Locale resolveLocale(Audience audience) { + if (audience instanceof LocaleSource) { + return ((LocaleSource) audience).locale(); + } + return WorldEdit.getInstance().getConfiguration().defaultLocale; + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/NbtAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/NbtAdapter.java new file mode 100644 index 0000000000..5cf4229111 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/NbtAdapter.java @@ -0,0 +1,279 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge.internal; + +import com.sk89q.jnbt.ByteArrayTag; +import com.sk89q.jnbt.ByteTag; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.CompoundTagBuilder; +import com.sk89q.jnbt.DoubleTag; +import com.sk89q.jnbt.EndTag; +import com.sk89q.jnbt.FloatTag; +import com.sk89q.jnbt.IntArrayTag; +import com.sk89q.jnbt.IntTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.ListTagBuilder; +import com.sk89q.jnbt.LongArrayTag; +import com.sk89q.jnbt.LongTag; +import com.sk89q.jnbt.ShortTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; +import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.data.persistence.DataQuery; +import org.spongepowered.api.data.persistence.DataSerializable; +import org.spongepowered.api.data.persistence.DataView; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class NbtAdapter { + /** + * A separator to introduce errors if there is something to be separated. We should only see + * single-part keys. + */ + private static final String BREAKING_SEPARATOR = "if you see this, something is wrong"; + + public static CompoundTag adaptToWorldEdit(DataView view) { + CompoundTagBuilder builder = CompoundTagBuilder.create(); + for (Map.Entry entry : view.values(false).entrySet()) { + builder.put( + entry.getKey().asString(BREAKING_SEPARATOR), + adaptUnknownToWorldEdit(entry.getValue()) + ); + } + return builder.build(); + } + + private static Tag adaptUnknownToWorldEdit(Object object) { + if (object instanceof DataView) { + return adaptToWorldEdit((DataView) object); + } + if (object instanceof Boolean) { + return new ByteTag((byte) ((Boolean) object ? 1 : 0)); + } + if (object instanceof Byte) { + return new ByteTag((Byte) object); + } + if (object instanceof Short) { + return new ShortTag(((Short) object)); + } + if (object instanceof Integer) { + return new IntTag(((Integer) object)); + } + if (object instanceof Long) { + return new LongTag(((Long) object)); + } + if (object instanceof Float) { + return new FloatTag(((Float) object)); + } + if (object instanceof Double) { + return new DoubleTag(((Double) object)); + } + if (object instanceof String) { + return new StringTag((String) object); + } + if (object instanceof byte[]) { + return new ByteArrayTag(((byte[]) object)); + } + if (object instanceof Byte[]) { + Byte[] array = (Byte[]) object; + byte[] copy = new byte[array.length]; + for (int i = 0; i < copy.length; i++) { + copy[i] = array[i]; + } + return new ByteArrayTag(copy); + } + if (object instanceof int[]) { + return new IntArrayTag(((int[]) object)); + } + if (object instanceof Integer[]) { + Integer[] array = (Integer[]) object; + int[] copy = new int[array.length]; + for (int i = 0; i < copy.length; i++) { + copy[i] = array[i]; + } + return new IntArrayTag(copy); + } + if (object instanceof long[]) { + return new LongArrayTag(((long[]) object)); + } + if (object instanceof Long[]) { + Long[] array = (Long[]) object; + long[] copy = new long[array.length]; + for (int i = 0; i < copy.length; i++) { + copy[i] = array[i]; + } + return new LongArrayTag(copy); + } + if (object instanceof List) { + List objects = (List) object; + if (objects.isEmpty()) { + return new ListTag(EndTag.class, Collections.emptyList()); + } + Tag[] entries = new Tag[objects.size()]; + for (int i = 0; i < objects.size(); i++) { + Object value = objects.get(i); + entries[i] = adaptUnknownToWorldEdit(value); + } + return ListTagBuilder.createWith(entries).build(); + } + if (object instanceof Map) { + CompoundTagBuilder builder = CompoundTagBuilder.create(); + for (Map.Entry entry : ((Map) object).entrySet()) { + String key = entry.getKey() instanceof DataQuery + ? ((DataQuery) entry.getKey()).asString(BREAKING_SEPARATOR) + : entry.getKey().toString(); + builder.put(key, adaptUnknownToWorldEdit(entry.getValue())); + } + return builder.build(); + } + if (object instanceof DataSerializable) { + return adaptToWorldEdit(((DataSerializable) object).toContainer()); + } + throw new UnsupportedOperationException("Unable to translate into NBT: " + object.getClass()); + } + + public static DataContainer adaptFromWorldEdit(CompoundTag tag) { + // copy to container, no cloning used because it's unlikely to leak + // and it's cheaper this way + DataContainer container = DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + for (Map.Entry entry : tag.getValue().entrySet()) { + container.set(DataQuery.of(entry.getKey()), adaptTagFromWorldEdit(entry.getValue())); + } + return container; + } + + private static Object adaptTagFromWorldEdit(Tag value) { + if (value instanceof ListTag) { + return ((ListTag) value).getValue().stream() + .map(NbtAdapter::adaptTagFromWorldEdit) + .collect(Collectors.toList()); + } + if (value instanceof CompoundTag) { + return adaptFromWorldEdit(((CompoundTag) value)); + } + // everything else is raw JDK types, so we can use it directly + return value.getValue(); + } + + public static net.minecraft.nbt.Tag adaptNMSToWorldEdit(Tag tag) { + if (tag instanceof IntArrayTag) { + return adaptNMSToWorldEdit((IntArrayTag) tag); + + } else if (tag instanceof ListTag) { + return adaptNMSToWorldEdit((ListTag) tag); + + } else if (tag instanceof LongTag) { + return adaptNMSToWorldEdit((LongTag) tag); + + } else if (tag instanceof LongArrayTag) { + return adaptNMSToWorldEdit((LongArrayTag) tag); + + } else if (tag instanceof StringTag) { + return adaptNMSToWorldEdit((StringTag) tag); + + } else if (tag instanceof IntTag) { + return adaptNMSToWorldEdit((IntTag) tag); + + } else if (tag instanceof ByteTag) { + return adaptNMSToWorldEdit((ByteTag) tag); + + } else if (tag instanceof ByteArrayTag) { + return adaptNMSToWorldEdit((ByteArrayTag) tag); + + } else if (tag instanceof CompoundTag) { + return adaptNMSToWorldEdit((CompoundTag) tag); + + } else if (tag instanceof FloatTag) { + return adaptNMSToWorldEdit((FloatTag) tag); + + } else if (tag instanceof ShortTag) { + return adaptNMSToWorldEdit((ShortTag) tag); + + } else if (tag instanceof DoubleTag) { + return adaptNMSToWorldEdit((DoubleTag) tag); + } else { + throw new IllegalArgumentException("Can't convert tag of type " + tag.getClass().getCanonicalName()); + } + } + + public static net.minecraft.nbt.IntArrayTag adaptNMSToWorldEdit(IntArrayTag tag) { + int[] value = tag.getValue(); + return new net.minecraft.nbt.IntArrayTag(Arrays.copyOf(value, value.length)); + } + + public static net.minecraft.nbt.ListTag adaptNMSToWorldEdit(ListTag tag) { + net.minecraft.nbt.ListTag list = new net.minecraft.nbt.ListTag(); + for (Tag child : tag.getValue()) { + if (child instanceof EndTag) { + continue; + } + list.add(adaptNMSToWorldEdit(child)); + } + return list; + } + + public static net.minecraft.nbt.LongTag adaptNMSToWorldEdit(LongTag tag) { + return net.minecraft.nbt.LongTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.LongArrayTag adaptNMSToWorldEdit(LongArrayTag tag) { + return new net.minecraft.nbt.LongArrayTag(tag.getValue().clone()); + } + + public static net.minecraft.nbt.StringTag adaptNMSToWorldEdit(StringTag tag) { + return net.minecraft.nbt.StringTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.IntTag adaptNMSToWorldEdit(IntTag tag) { + return net.minecraft.nbt.IntTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.ByteTag adaptNMSToWorldEdit(ByteTag tag) { + return net.minecraft.nbt.ByteTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.ByteArrayTag adaptNMSToWorldEdit(ByteArrayTag tag) { + return new net.minecraft.nbt.ByteArrayTag(tag.getValue().clone()); + } + + public static net.minecraft.nbt.CompoundTag adaptNMSToWorldEdit(CompoundTag tag) { + net.minecraft.nbt.CompoundTag compound = new net.minecraft.nbt.CompoundTag(); + for (Map.Entry child : tag.getValue().entrySet()) { + compound.put(child.getKey(), adaptNMSToWorldEdit(child.getValue())); + } + return compound; + } + + public static net.minecraft.nbt.FloatTag adaptNMSToWorldEdit(FloatTag tag) { + return net.minecraft.nbt.FloatTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.ShortTag adaptNMSToWorldEdit(ShortTag tag) { + return net.minecraft.nbt.ShortTag.valueOf(tag.getValue()); + } + + public static net.minecraft.nbt.DoubleTag adaptNMSToWorldEdit(DoubleTag tag) { + return net.minecraft.nbt.DoubleTag.valueOf(tag.getValue()); + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeTransmogrifier.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeTransmogrifier.java new file mode 100644 index 0000000000..a557d40e96 --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeTransmogrifier.java @@ -0,0 +1,189 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge.internal; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableList; +import com.sk89q.worldedit.registry.state.BooleanProperty; +import com.sk89q.worldedit.registry.state.DirectionalProperty; +import com.sk89q.worldedit.registry.state.EnumProperty; +import com.sk89q.worldedit.registry.state.IntegerProperty; +import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.util.Direction; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockType; +import net.minecraft.util.StringRepresentable; +import org.spongepowered.api.ResourceKey; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.registry.RegistryTypes; +import org.spongepowered.api.state.BooleanStateProperty; +import org.spongepowered.api.state.EnumStateProperty; +import org.spongepowered.api.state.IntegerStateProperty; +import org.spongepowered.api.state.StateProperty; + +import java.util.Comparator; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; +import java.util.stream.Collectors; + +/** + * Raw, un-cached transformations. + */ +public class SpongeTransmogrifier { + + private static final LoadingCache, Property> PROPERTY_CACHE = CacheBuilder.newBuilder().build(new CacheLoader, Property>() { + @Override + public Property load(StateProperty property) throws Exception { + if (property instanceof BooleanStateProperty) { + return new BooleanProperty(property.name(), ImmutableList.copyOf(((BooleanStateProperty) property).possibleValues())); + } + if (property instanceof IntegerStateProperty) { + return new IntegerProperty(property.name(), ImmutableList.copyOf(((IntegerStateProperty) property).possibleValues())); + } + if (isDirectionProperty(property)) { + return new DirectionalProperty(property.name(), + ((EnumStateProperty) property).possibleValues().stream() + .map(x -> adaptDirection((net.minecraft.core.Direction) x)) + .collect(Collectors.toList()) + ); + } + if (property instanceof EnumStateProperty) { + return new EnumProperty(property.name(), ((EnumStateProperty) property).possibleValues().stream() + .map(x -> ((StringRepresentable) x).getSerializedName()) + .collect(Collectors.toList())); + } + throw new IllegalStateException("Unknown property type"); + } + }); + + public static Property transmogToWorldEditProperty(StateProperty property) { + return PROPERTY_CACHE.getUnchecked(property); + } + + private static Map, Object> transmogToWorldEditProperties(BlockType block, Map, ?> mcProps) { + Map, Object> props = new TreeMap<>(Comparator.comparing(Property::getName)); + for (Map.Entry, ?> prop : mcProps.entrySet()) { + Object value = prop.getValue(); + if (isDirectionProperty(prop.getKey())) { + value = adaptDirection((net.minecraft.core.Direction) value); + } else if (prop.getKey() instanceof EnumStateProperty) { + value = ((StringRepresentable) value).getSerializedName(); + } + props.put(block.getProperty(prop.getKey().name()), value); + } + return props; + } + + private static boolean isDirectionProperty(StateProperty property) { + return property instanceof EnumStateProperty + && property.valueClass().isAssignableFrom(net.minecraft.core.Direction.class); + } + + private static Direction adaptDirection(net.minecraft.core.Direction direction) { + switch (direction) { + case UP: + return Direction.UP; + case DOWN: + return Direction.DOWN; + case EAST: + return Direction.EAST; + case WEST: + return Direction.WEST; + case NORTH: + return Direction.NORTH; + case SOUTH: + return Direction.SOUTH; + default: + throw new AssertionError("New direction added: " + direction); + } + } + + private static net.minecraft.core.Direction adaptDirection(Direction direction) { + switch (direction) { + case UP: + return net.minecraft.core.Direction.UP; + case DOWN: + return net.minecraft.core.Direction.DOWN; + case EAST: + return net.minecraft.core.Direction.EAST; + case WEST: + return net.minecraft.core.Direction.WEST; + case NORTH: + return net.minecraft.core.Direction.NORTH; + case SOUTH: + return net.minecraft.core.Direction.SOUTH; + default: + throw new AssertionError("New direction added: " + direction); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static org.spongepowered.api.block.BlockState transmogToMinecraftProperties( + org.spongepowered.api.block.BlockState newState, + Map, Object> states + ) { + org.spongepowered.api.block.BlockType type = newState.type(); + for (Map.Entry, Object> state : states.entrySet()) { + StateProperty property = type.findStateProperty(state.getKey().getName()) + .orElseThrow(() -> new IllegalStateException( + "Missing property in " + type + ": " + state.getKey().getName()) + ); + Comparable value = (Comparable) state.getValue(); + // we may need to adapt this value, depending on the source prop + if (state.getKey() instanceof DirectionalProperty) { + Direction dir = (Direction) value; + value = adaptDirection(dir); + } else if (state.getKey() instanceof EnumProperty) { + String enumName = (String) value; + value = property.parseValue(enumName).orElseThrow(() -> new IllegalStateException( + "Failed to parse '" + enumName + "' into " + state.getKey().getName() + )); + } + + Optional optional = + newState.withStateProperty((StateProperty) property, value); + newState = optional.orElseThrow(() -> new IllegalStateException( + "Failed to change state property " + property.name() + )); + } + return newState; + } + + public static org.spongepowered.api.block.BlockState transmogToMinecraft(BlockState blockState) { + org.spongepowered.api.block.BlockType mcBlock = Sponge.game().registry(RegistryTypes.BLOCK_TYPE) + .value(ResourceKey.resolve(blockState.getBlockType().getId())); + org.spongepowered.api.block.BlockState newState = mcBlock.defaultState(); + Map, Object> states = blockState.getStates(); + return transmogToMinecraftProperties(newState, states); + } + + public static BlockState transmogToWorldEdit(org.spongepowered.api.block.BlockState blockState) { + BlockType blockType = BlockType.REGISTRY.get( + blockState.type().key(RegistryTypes.BLOCK_TYPE).asString() + ); + return blockType.getState(transmogToWorldEditProperties(blockType, blockState.statePropertyMap())); + } + + private SpongeTransmogrifier() { + } +} diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeWorldNativeAccess.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeWorldNativeAccess.java new file mode 100644 index 0000000000..0bd6436bfc --- /dev/null +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/internal/SpongeWorldNativeAccess.java @@ -0,0 +1,160 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.sponge.internal; + +import com.sk89q.jnbt.AdventureNBTConverter; +import com.sk89q.worldedit.internal.wna.WorldNativeAccess; +import com.sk89q.worldedit.sponge.SpongeAdapter; +import com.sk89q.worldedit.util.SideEffect; +import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.world.storage.ChunkStore; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; + +import java.lang.ref.WeakReference; +import java.util.Objects; +import javax.annotation.Nullable; + +public class SpongeWorldNativeAccess implements WorldNativeAccess { + private static final int UPDATE = 1; + private static final int NOTIFY = 2; + + private final WeakReference world; + private SideEffectSet sideEffectSet; + + public SpongeWorldNativeAccess(WeakReference world) { + this.world = world; + } + + private ServerLevel getWorld() { + return Objects.requireNonNull(world.get(), "The reference to the world was lost"); + } + + @Override + public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { + this.sideEffectSet = sideEffectSet; + } + + @Override + public LevelChunk getChunk(int x, int z) { + return getWorld().getChunk(x, z); + } + + @Override + public BlockState toNative(com.sk89q.worldedit.world.block.BlockState state) { + return (BlockState) SpongeAdapter.adapt(state); + } + + @Override + public BlockState getBlockState(LevelChunk chunk, BlockPos position) { + return chunk.getBlockState(position); + } + + @Nullable + @Override + public BlockState setBlockState(LevelChunk chunk, BlockPos position, BlockState state) { + if (chunk instanceof ExtendedChunk) { + return ((ExtendedChunk) chunk).setBlockState( + position, state, false, sideEffectSet.shouldApply(SideEffect.UPDATE) + ); + } + return chunk.setBlockState(position, state, false); + } + + @Override + public BlockState getValidBlockForPosition(BlockState block, BlockPos position) { + return Block.updateFromNeighbourShapes(block, getWorld(), position); + } + + @Override + public BlockPos getPosition(int x, int y, int z) { + return new BlockPos(x, y, z); + } + + @Override + public void updateLightingForBlock(BlockPos position) { + getWorld().getChunkSource().getLightEngine().checkBlock(position); + } + + @Override + public boolean updateTileEntity(BlockPos position, CompoundBinaryTag tag) { + CompoundTag nativeTag = (CompoundTag) NbtAdapter.adaptNMSToWorldEdit(AdventureNBTConverter.fromAdventure(tag)); + BlockEntity tileEntity = getWorld().getChunk(position).getBlockEntity(position); + if (tileEntity == null) { + return false; + } + tileEntity.setLevelAndPosition(getWorld(), position); + tileEntity.load(getWorld().getBlockState(position), nativeTag); + return true; + } + + @Override + public void notifyBlockUpdate(LevelChunk chunk, BlockPos position, BlockState oldState, BlockState newState) { + if (chunk.getSections()[position.getY() >> ChunkStore.CHUNK_SHIFTS] != null) { // TODO 1.17 - world.get().getSectionIndex(position.getY()) + getWorld().sendBlockUpdated(position, oldState, newState, UPDATE | NOTIFY); + } + } + + @Override + public boolean isChunkTicking(LevelChunk chunk) { + return chunk.getFullStatus().isOrAfter(ChunkHolder.FullChunkStatus.TICKING); + } + + @Override + public void markBlockChanged(LevelChunk chunk, BlockPos position) { + if (chunk.getSections()[position.getY() >> ChunkStore.CHUNK_SHIFTS] != null) { // TODO 1.17 - world.getSectionIndex(position.getY()) + getWorld().getChunkSource().blockChanged(position); + } + } + + @Override + public void notifyNeighbors(BlockPos pos, BlockState oldState, BlockState newState) { + getWorld().updateNeighborsAt(pos, oldState.getBlock()); + if (newState.hasAnalogOutputSignal()) { + getWorld().updateNeighbourForOutputSignal(pos, newState.getBlock()); + } + } + + @Override + public void updateBlock(BlockPos pos, BlockState oldState, BlockState newState) { + ServerLevel world = getWorld(); + newState.onPlace(world, pos, oldState, false); + } + + @Override + public void updateNeighbors(BlockPos pos, BlockState oldState, BlockState newState, int recursionLimit) { + ServerLevel world = getWorld(); + oldState.updateNeighbourShapes(world, pos, NOTIFY, recursionLimit); + newState.updateIndirectNeighbourShapes(world, pos, NOTIFY, recursionLimit); + newState.updateNeighbourShapes(world, pos, NOTIFY, recursionLimit); + } + + @Override + public void onBlockStateChange(BlockPos pos, BlockState oldState, BlockState newState) { + getWorld().onBlockStateChange(pos, oldState, newState); + } +} diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_10_Impl$1.class deleted file mode 100644 index 0194fc40b5e9500c7c0dfe4d752da3ed0f455271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 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 T(LfqZLke*#M~70`jI#d$c8(VM diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$1.class deleted file mode 100644 index 954d9f03a6485d9781395d909b291dec5f6015bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 zcmbu9ZExFD6vzKJP3t6e+pI0LjHg0P*YYqgT|4$r#+-+yS>w3a=>imFT*qp?xp8ou zO}s;b4}b(80EtPw1%?npXhMQlyh4HxfCL`^30@=4&E4us+ly&PiU0ncbM86k9$)+C zf4{p8U=H|*?rs?&D5u@|ZSK{rsXfz2-1g@V0o z*T|$4Brt~jRp+{+22N*BHFmFhZY*JlVdmcWlRS{&{KHq2Fv6hTZ+$=Z1GO1>Ue)V( zkrRiJ!m0UQ*OQQ8Sa`5S5^@ZgyDOg@;J@7>;Kt-Qx^W7`6S56AU&|lkp^;;)R~3Jr-+K zo0pLBj0k_0!p%y#Wf)}{im*M$AUCyo-9B`j5ROHL;bP4!ZOC|DSYDtpT;6U}>y+^& zVLC~xEuAmF>o_GG1@71|%;urvv~a92jEY#hxNTALGs6BdEua=`os6bo=rYa;$9abF zqG_}mM_g;d^$N9UwKRQ8#;d||iCWZ3TB)YVC<;@FCQ;VRP212mWmJT5ovP`Ts+R0} zLpbPcg}S!K6k-Op>)JT-y{|3fmsTMBVRr zjsC%|7d4&TfGlHH?6}wHDBt0n74{?7TlcwhqSA4Lu;+L7bT8fy+thZgL$6XPaC$wj zm!G4Pl%|gc%g^$I#qW^81oEUUAXUc@-GQxsi$`yNpSy+GulVnYZ!niOK1X_Ufb)dI z2`&(hB)CKDTxHKa&20U+^pGZ}=U5kp79k@Hgo{ z3~UIKEY0$4igcRIv3XL3onoiSpTg_(utx?D_W*Cuy@Q38L>~Ppqx a!`LBBL!#?j^ylrQNRiLbz(yfo%KisYDS`0- diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$SpongeNMSWorld.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_2_Impl$SpongeNMSWorld.class deleted file mode 100644 index ab33bdfa78b8271aa4d68048d0c7ca8666bd3de9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7255 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 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$1.class deleted file mode 100644 index 5b717772638132e4332f5766cbb66fa4d3aa45b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 zcmbu9ZExFD6vzKJP3t6e+pO(a8Bc|puH|7~wsv$6j5!ZYv&M0;(*-CfxQ^9&bM4?b zn|Ox=9{>qH01`;N1%?npXhMQlyqdIqfJyKHkl;1q+}y3MU@xX2CI0(&&bjBDdwlI* z|Nh}7fF-=caMlU;)ZW#VGw-R_!^rQr9WPdU-7wg3Rl8$%V>eR0y{@lX16#Y$E)?1| zGAIQJj3Ix;zGkbw9qg#a_7&HOB@8hf{&)0o9>%cpsMRElFsKh&-H$zAZAPwJbptoD z<1kVL5;6?)54T7{jv;e@CCx>#u6wbwtJ__LGAM%)Df=T*c-cXr|CVJ)ZPh5* zdB^txFTTJqw6J)Y;b=0dMrie&-Br)^JC!I3BMFBXMy}a@-|aChEi7);AFl2Fy`GaX zh3Oo!I4olf<5{F|gdyEDD;0*qBcyvAN3)df2?i;QI$mJ=gN@W=JcXxup=W51#agw^ zOUQUugg-~&W~JORjIs!CoiD%dI3XMb?pQO-=Dy>Ua4a#5ir98>)1u_3h5Z#;KrOU&GMa{=%Qzz(XBoze zrqOB~aGe*fSE)s-rRf_oUK5s!)S_0>N;OSJQJ6|JiLz#{w+(GwMnxD`shVD?YRRtG zgoDmTZZM8}TVEIEI^{LBMw$235GI2j;6|-Mvv^$?OlnlbBw3rnwMnt1u;VgJ)V;uM z^!K*isA+HeWErz!+qp_d`5x!2upc?@s>huZmB8`Co)_%sZoC_IsO?%nuTsgkdp)<8 zpQV$Orq2b-&+voA?~uU+@}w;wRmTwBfh~WJ$8P?ZyMdW+`0vT@Fq<~MM0$OIbA-bQ z&J&I#xJW1^_!40zL6tCnAo?Wd1L4b@55%u<&L->6an2=tf%9m>8fQ7-GUu^`tDMIZ zzQlPVVV!e6;SJ7*61F%`CVZLm)PTRHw>FDu9Kj@JFo${4V>pRr($mmTCaqut7HJdj z!XfRTiymo=5AY%BNB9_@kba8K@Hy!h_zE{jzr|1Zne-Rj!fnz!xQpLNf5#vAlk_hJ zHiSu*W_dP6I?ZO;9I3)iuv6qu;SGA&BZG&#hd1fo#(Ya6kN$v5gWLZ1h0fAjR49dE ZY>}oR(e-Wm^LA3C$Y*F^qmVCV{{ej#fH(jE diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$SpongeNMSWorld.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$SpongeNMSWorld.class deleted file mode 100644 index 4da53c21fa4722206f1f5e4af4930bd3684762d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7237 zcmbVRX<$^<75+{#$xB`ah>@g3ETRM%vN!~lEgCQh!I2P<#K536yv#hpz+_&Sc_9gE z7i+6_w>zy%wYIiaTT5#Oq_t>UYxjNMTWeQayStWt_r8}&B$Jf- z%$NT2z=HtJldA+9V$MJ~vv<|%ec@pzos8S@gd5HbI;nm;Y{jiX*G`8M1B1zMm+tFr z>}_o9jj*G}>*(CnwN1@4AcC`J5atc{#}*1IPZW609&5iPST%!;85J^6ESUX5tpwqG z;)dKrGTfcE?G1LyPFt>%u2FB@ql31A(rN6NI>|tppk#cepd;T}nUnElcOq%8Pq_(q zw8hHUElDS~*T8JSsd+vK*1YI-8V#HxD0X)zGBwL6=tXPXL@5^}QVF+Nuru`H#dJ97 zejjdw&aj=f<6&zs;XyI1!P2y}Cx}xqw-g0<2}2V)$tjhnHW9#Sf`Bqt5P8vBo&a^) zUZitHu;?U|5zOkhT^-Xd*K%#ami!LuQ(@19a|mc!I*oKaFgziV3f1I;#EAk8oJG~C zOe8KS3@wcWQG>-M7U68ZTgi-pkU;tf>QH292RoXAs70NLrKlGeoY`i%RuJcSv%(zA zjP(Y)dpNie%hlj>8K?Y#JyCT7=Tjx!%Q<-?bfOisHaIjGrzhK;beHXFOvHzp@=ort zW6W-Pk^_7%^*c^~(pJ1M;H1KR%(w8Cv>kI&WWI!xq7&2#vE6oTZ>QsS4keR%1;tL` zq?PIqZ|>VesgyaTD~JoxY~li}rDsM;aFL)Oe!xJh;Iw=J^0YIsUQjxYk?lcjQ0{HV z#e^>7K=@bU5)*CMsKgB!*d(Y9OM&Y@t&?O&gXs2T zU&fCIO0aFx#~ndLy^lMH2G{E6@}ApD2Az!djo|c|yiC5b1_zU)6Qrf!BDi9@ob}K^ zGPZ3^e&LCk`NKH{3rl+hCSBLrr=clW5L!A(#XYG$H{9wB3_3%pc(>J0i1s0-5YG%K zah*=fP3&hzo;5imr%cl531S!eO&HiMXq*Y$dCf7fM^HvZJDeETbW(y4HO((alS_Df zBy~<=pbUG#Ni`=k!@wY8$HlhmG;a$cjf{zXV6Lcc!eGDGG3<3P^rK$K0rGmNt*y;N z-PH<)*95T|YfRGbD-=s)ECa718H5xz)UZap+QhZEjx)U|3eKIzu$kgb+2lXL#%boh z&?y(pILg~NnwiIE&p0mUV!<4ZTyGEdP`i0L)cRQU#^%SVKSWWvKTH92aXt>1GSt8u zO}t3~G;cYTNUB;q9!LG>hfF8F(i%Bf&LPStO_;N+(7{{C-M!Hx8EJU3ib6 zV(NDTHxnYetxTsqLeO!qA;fOQZDqIx?<3|?x_j=p?8&qm#2t9Q8h0lZpI}&z;|zR| z#I=vrV;=rfVEhn1thn!PGG%7Kz&#wjD~OLOh~A5jsgiutnGiI-bCHY-Vvd2s zDl;Pye?NG@#1R~2q?pbc?NtAN@QIfcL3|nys$~9*O6EQL3_L_1G0Oa1FH2E@UoiumbUeXa4dOAivzqvga@+```CHl<+TpS6?@jy; ze^6icj~e)si6^|bk)(mYn0V5E;}Pp`92D{<{lmoH@lQR81;)SWuh0%(-qR+Y!ZYgA z@Q8uuxItR6n4Mw8zl=4%L6}&&So;r-b3bELaswKdEelG4*UckZd1yz3q2yqF(F;qF ziRXnUtx&=Vr)<|94Qrq0XsLTQ;}uuTn%ruo;?95}C0sQ&lui@xf_kohvQwLaVoI4Q zr4pnFMH&$$LRCePpv;yz>QlL==!Bl08>E76l~c7F978H6tX!_Fe2Hh}JXYtSiK(86 zrVm%AK?!+d zmMR$|bVZ#h^Po=zzu4e(=MVv9A^6!e1D6JviR=CL;Y2D2V z+m36B%&Z@Y*@G%S4QUSIr}!CpOV+8H#8sDJbvdAj@ERSfq#^C90PG;GHBH*IJQymK zn$$K_D;JxxK~YheVr*Yy!I}TlC|xZ3KNx5jXgX08to0SN<@e;c-FX+#HPPf#9~07< zM8_&sSmJeP`CNfZXy}r$iP<7@K$CQ+)O1jmFQ?UxoX+2gt zp>~RHbz#}q!5zJGXrRwd`#n`J9L6N|Kg{CkKem_KivM1{b%=+a0lO!WNl?~Bx!s6c zp_zledg*e8(lNVTZ;Qc5iU@2?TA7TU!9s520sfRH<>l%(55P z?`5@h_hVjdeHQaS&esCT@LI)>{Djl-Qr^|m0-V8bE}v(sX(XB=(vB%BxyVAC=?iV= zJTs^^R@}$l$+9bQvMaC>t2kfDE~bi*Cd%Ns!k2jyinO9@>kebx zwt97`t7tijwrKqrB3X2d;nKQ_F2AE^ykooHak<|yp};~wTN?9*M1W7sF6K}L}%R*Fj3b8Y8#HC zJz5@%WA=-BY3Y;zB+IOw+jwpo_hL#;27>&Q`AshG=`7db^I~ve=qgF?}hr;Q{u;QNL$jJ zv!t1pd_r5&j8Eczt{cR1&l0Vz=j_XzO6qB~Go9jGimgl`oB^8wx{188)#S1y|$M^}Qsrb|qHjpbBn_euGome6k8l(>^ zB!+boM+fg)Wf!_hfXV{|?Qt$|7$`8%Zs3T4YYjXqgzYn!_cT3HpteDRm&q-kqpr+D zX*`5q(-n`Ob2mlseTllToyv9vo6VMD8)kb2+l_2DvyHKRgY9Q*zi0ag+jE?%Fg2Tv zte|9h?I?a14P^1h`;OuX_3&ptJgFZ3%7?#4v-lV9PelWTSv5fCupu z2E@UB8RRb@`*1y-e-l&rPKNkFCgu+qy2oW0f0Ypy+oKYY12T($tyIa?vRJN>uw1Ky zTZvPiMZBb>#3-$(uAXI@MoG!+Qcm<3@#nmYTp$;E(d7ZSOrvdOZCzF_QdoWj_0<6% z>$FQ{Lc^G}u(h(aWo7-CTyhXb;4TCvLE0mnmE$&IrDr3TTPYi*LqP~D3Ey5ara=nX zB%MCJsAD4J2A&aa)E4mlIh=3EhIK+)!L$%^r^sf~j^1yilu4t=##L%=%9E>|^-NT1 z+r1{>J>iixMb$-*V98O;i7JXB4UrFc+6#x+p7g#&8jNHsANGBqpNT?CFrR z*!9!22#&YKF~Kj_30uft0xy+4vX{0raJN*cTclHW0et~^6W`v9YIzH5l$)5kZzE~F z9X;|+?T`78YtaYWB O!}oH&Gb@1dlK%qxUTYKp diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$TileEntityBaseBlock.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_11_Impl$TileEntityBaseBlock.class deleted file mode 100644 index 0f0a4f1e8dd2da9691a17362a0d35b08072472b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 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 Z*da|rqV+BM@^(_B$Y*F^qmVCU{{vAkf$;zU diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$SpongeNMSWorld.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$SpongeNMSWorld.class deleted file mode 100644 index 61ce0a7dbbe7e92053deed8845cebbb18335b99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9427 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 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$TileEntityBaseBlock.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl$TileEntityBaseBlock.class deleted file mode 100644 index 1c5b4c31ce8935dfb82ce81b8243d07a9edb28de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1495 zcmb_cZBG+H5PqgF7LEcHR0Kf~ik22Ri=ZIH7*LW+YGXo!@l$iXZtM;T`i#L_l~sJYzk-0U;Y%+9lW-+z4h24DfpguLa}bbohg`Gx+{^{Qo2 zwx#aZU1wY9X4$Mu;puj*Uez}PUol(E&hucfD_O9s;*le5xxZ%mVy)_0yD<7*24=pDVGZ3FVP;>*lj6sl``H$zwmph5Rnk>LM2Sgw(v;|b z9C?;EBKPaOO)}Ul2ThGAWeC$PP3x=|VdAu`?d^%-1|gg}(s4#Z3TeXB>8Ot6G0YNr zD-FjgW|x*1vx~(NVdG4CoMvyYiB*|{uHh#5f`p~HO_*%iZ-*dm(Yjma-VEei%dBph zo^6(@qM!yse~!;~zELX)@7SYlx(&|~8$mzghT{lty=wZt@G-%fVlt`!(&p)*g zzrE;V?*dy6uSa!RzSVl7IHJ+660fnbmh|+8H&>IZXTSoH@IL^JrUn(Z?6{%;3$UM%>9w7U4_9Od3 xP#GtV)=x4fpx6mr{LJGvqg0+gg`#)-lX{On`oP}10YeN+JZp>(@x|aX{u3Akn=}9b diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_1_Impl.class deleted file mode 100644 index cdc162c16a9c31b67b30fb5ea1144b37abb22b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15702 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 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$1.class deleted file mode 100644 index cb18d7835a9087ac528225e28bd07da62f29fd05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 zcmbu9ZExFD6vzKJP3t6e+pI0LjHg0P*YYqgT|4$r#+-+yS>w3a=>imFT*qp?xp8ou zO}s;b4}b(80EtPw1%?npXhMQlyh4HxfCL`^30@=4&E4us+ly&PiU0ncbM86k9$)+C zf4{p8U=H|*?rs?&D5u@|ZSK{rsXfz2-1g=Kr$ zu8~P8NMH>4tIl;t4V=!NYV2P1+*ra8!_2+$CwU;l`G>D4VT3`w-}-*+2Wm6&ysFpn zA}0<0g`1Uf%P`6^6k&UgL2hdGx_#(4AsmYg!^N6e+K}IvGvF&}Ezxj`IxT zMbl_Cj=0u@>lJFzYH9kGj8}!_61Aw6v{FrzQ52>UO`@!so3^2C%BTqAI#tsvRV~@| zhH%i?$PLDEXX~57T&KLI)+qD78p34I1Kg@LXcn&tgGr5wm?UdcxV9;_6t+EviMrqM z8vTP^FKRlw0a?bZ*m1AXQNF`DE9^(Ex9)T2M5W^fVbAaE>0Z1awyEt}hhC*p;PiT4 zFF!{oDNP>@mY?MZi{BxG3FJvzK&p-*x&vGN7LVTkK6eYVU-91)-(W6ne2(u1NpOi!O7KO(OoA$5{z&vP=Of{(oR7qx<(y5{U*Mce_#)@ggf-4`!e!2530FCf zCw!UnM8Z1fe8O9tk0oqzo=o@(=cxgINpEcy)0n{|W-*Ti(i2$5D(M+$D3eyO1&g$a zci@t?(M69m#{2ky^h11vk4Znlr}&KYCceNe(y#FYekA<~zu;HW-|##BApH}6;cwD^ z7}yXdS(@e96zMdZWAmg6JH<|uKZV!nVUG+R?g8GQdj|_Gi9Gs!E)8z`-xoSdZ&INY ahOtAMhD6u5=+E0pks_a=fsI1Gl>HB6F@f{| diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$SpongeNMSWorld.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl$SpongeNMSWorld.class deleted file mode 100644 index a684ee39b6a5e823a4ec1273a33ec0c324650986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9427 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 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_2_Impl.class deleted file mode 100644 index 6ac56f5fb720d67fab00945e624ea9c2cb28688a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15702 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 At^fc4 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$1.class deleted file mode 100644 index d3e8da1147a2079f78ee669b732c2cc4f0a03adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1735 zcmbu9ZExFD6vzKJP3t6e+pO(a8Bc|puH|7~x^{FAj5!ZYv&M0;(*-CfxQ^9&bM4?b zn|Ox=9{>qH01`;Ng>6Czp$Q3I@d^n(01|uvBzTQDH+QQm*o$dMiU0ncbM86k9$)*% zzrVQyU>R>QoO8l`wRdgx>^tg>F!DQY$BWfoHw<=N)$Z8c*o{9WSu`!A5E_p1_m5&{MR>Vy)Wd zC1gA;!k?jVvr=vuMp=d;Y|k>tO|4#UA2?13#{$D}v1XRmWjrS=&(jz#Z#AlQ%J`x% zout*4&X?bFoDz-#cdQ#`^T2UhIF=bkMQppcWl{1o!u}F1pcdLX8BN2`WtR#YB z`ujU>)Ud-NMXG{(Jl@%%+Xck=_{K9N}<+ z^MoS_E)q%!zCf5sP$kSCieBP;D13$Uq4-tK*<}5B&bfpyavn`s<18m!<~){gmGgMQ zmpM-)taHvMyvg}U!WQSrgs*U(8t|9&)@Ct{W0=GY<}gos0!vsSJp&D8(h4?Vkv8!* z9MTTD=#j>F5ATzHfDiEz>Bsm4pOSutFK~DwM)7 Zwn@{F==vu8c{?dmWv7mY-!QH2gvxcB^ z4H|1Qq@h%>emPeHpBuSZD;o2SCQb9888?%Ll}OgAuhF>~Q$u+kIaV*yP$4MGtP~8o z?UgD-m!r{`c_3~@t+`$!W%kAr;WHZ63vPB95bS;1`?P4dNlSabrZP=C zGx(NPy8GEG7p|w6I*l_tVaJ~e+WH(8Pb&}1D4#+xXv2soIADC2S&3o8ik{``{#>|P zwWt8M_F@uKIy6KDEo()rtFRi*2r4MXU?NP85^+Ht<#4BC}39QKrPY{{DW)>mOHP@Prp#*sC*h zy_30Ox&P;p_1#%)Y-{h_)1_iyX92*YHhmAiSI1NMKJwvsj9^b5HLc}a6r71ja465( zx#qmA!2}!ZC~=A*CqfSAi;#3&ICI@&B0WWcLwcGDik)tVwrZ+| z59s)y3I^A@HX3Jb95-SNp*XWt+#)XjF!Si};ZWb42GCNe)I+7X9ppa2p?hTYJ+ulOv8^c3ZvXZ)u)0@^!cS3!E`?<{5XE10?*<( zLDlMU4IgC!o-$Iy=6U8Yx-=d3C-GthUckrb!Ew8LV}^Ea_VD84_-QroXUOkW8g0110X(VZ0%V1rU>}6P-QD2

A@8J)Y9Ids>hS(i-!L`>aKmH^9vEuDd zSUWJ0Ns!@0xtLg1F3m`oBdl`2RP+K}xR~|A>e9kR>0F`oto(bqD%`a%*ceWltXFN1 z$R2D3VRt{ZcXU4kud=t}Lz8CQcZxgACQZkmvYV(_u_N=m&xpqpEZLc+eX1}uCSoQ> z_tuV_i(28SA!A0JRBG)DhgzGgioROKjC};plFS~+1w|)#Q27e}p&V8CN1|CG8Ho~i zz4&KUuj%-zpn185^7E?%X4w4;m0Ne*$<+U<6%9LB%J(@@>t%y3>!gw-RKDf8O1WQ<=WnT!o7K=pN7w>|C~%r%U)eEwx3Rh~jw#GqzLg_JuS)Z@+D^H%Txw;PIyS8_(ebEyU3N&r zvQ1i;SswIClS8KYtr*~(F+HP+PZz(6@PZXG!V7?S+^}O@T6Ni@Fs9(J?la29jmP3mE1}D^5?d=V zF>x~ssgl^``?{4FaMO=BYLwWgiUit>J)8E$B9-86#cBRJLl(2$vo2<_*nT^RYmcGJk zgPqG`CeIR0ctA+A6bQ8L@rQWizBNzwv=u=}dPv?;At&VF?8>&T4&IZ|{A)uL6U|96 zcxNh{n%R_BuPtiRhLw8A!*RFDR}nE4nNxy@yHyJLyQ6zmR(CIH9cbmv(FRp;-@exU zjqT@}@TRDQ$0=vwG_SHG&K}!d>fl$9W$1ha8EeqEFlXz1?aTG-G)-96_j7YseP za_}9nf7V7ARo%&~E|&0Y;pt06>~pWGMaGO|R29^t>cLzyNWdMQot`k0>7Gq?$&#H$ zkWCM)8&RhwR^RFGnxnJ4Q=B%(qNylp-IFcaDTAJcF7+{zm`#Sw0sA204aOPLeK8}I zGE>;jIM)x&d#{OeX>d{!$yNLerrg;PxFgTB+ja8%R zj$@gQ@pQ*S>5e4^wmamq4D7=@@UYq#`w+s(w3u7S3}he0+)puku~qu`Z%IGymH~=v zU?R=lC#lyGuI+003^tRaQ}Z}I+;|0qu)Us!=0yyQ*Ldb}Rz2p_aYrKl5 zn&unC9EMr}GAD*@u>#}uJ1TUIxW{YXio%nwIAUyIY*Lyk3>G=WnC{1os zwB!)HGK7tC7=Af|PPw0~{}A4vX8khtOd-*eX8jq(`X&766+Ew)ukl>LPYLg?HmkRn z1XuBMdrO*YO6Kv&mu`H8{C|r4Us}$86Dj^8K4VMLla-{0l6=;dqzCg@;J#k8I+EDj zI?8^4+>TMn$IvPd@;{+*D*L!RMh@4b=-b$&VOYZpZ_*b9mvP0BLQ1)p#yMk)SRALr z1=)_V(eSSfHO%8zui{nO_vA#9hE*d+#vr)&QOM z2DjHV6loaHu&CiF4cCNj`zAJjlNu>fWelB{!7ZnUFyMh zGuuOKCR?2C9NUv@PqRJ8HqZ7&wlA}NmF*3->s+dQYCRiKLD6#BBECNES-`(vT*T|@ zBUyv4d?IAbP#+MHD65vbMcriDe zm%A3^ZihSad*h-glyJ;#L!h)|3@RONj|K&BCqIHo0mvoeDx05}Dm6d7bRW&v1 zbX_YeTVF1ZlNp7Gf6rf${c?|ET|7@bR^Aq9Xk3s3%9me5Q;jF>>y%4HLi4-~upMN( zcR_;la`;(jo|oXsacKu|0vQ<*aAZ`Za(XPp%{UT3rm4^)Xv5m?Dd@7eLrzi?+EXC%KORNqzF;L0v_+F3mhA-?bsVR94 zyB4uwTtO6JNJ0#K38&u(r!rYnvLL5v!#jwxZsQA*Sh8x5!$VeLD;=gKNH{5u0e->` z*kb*;C{`XBl_Q*6%5aWd`?6B@Wu@%NO4*Q=a=Rm? zEn5|(g*->uo~LXdrED+I=@c{+vG1My-N6|})Ib@ZI$?a>{&H;KcO}0W6+mU#cL7G6 Bn;HNB diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$TileEntityBaseBlock.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_1_12_Impl$TileEntityBaseBlock.class deleted file mode 100644 index 2a5b4e62a67f42cf2c44b97f6a782fbecdac0690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 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 diff --git a/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl$1.class b/worldedit-sponge/src/main/resources/com/sk89q/worldedit/sponge/adapter/impl/Sponge_Dev_Impl$1.class deleted file mode 100644 index dcd0e9bb1ddc925972e37c0109b44d5974afcf6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1764 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