From 507b8d5e35d7a8894e7bedc1564d2698900deefd Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 13:38:32 +0100 Subject: [PATCH 01/81] ci: Switch deployment to gh actions and use semver & java 17 --- .github/workflows/build.yml | 41 +++++++++++------ build.gradle.kts | 8 ++-- buildSrc/build.gradle.kts | 1 + buildSrc/src/main/kotlin/CommonConfig.kt | 2 +- buildSrc/src/main/kotlin/CommonJavaConfig.kt | 4 +- buildSrc/src/main/kotlin/LibsConfig.kt | 47 +++++++++----------- buildSrc/src/main/kotlin/PlatformConfig.kt | 43 +++++++++--------- 7 files changed, 77 insertions(+), 69 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30201b465..3137c908c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,18 +7,9 @@ jobs: runs-on: "ubuntu-latest" steps: - name: "Checkout Repository" - uses: "actions/checkout@v2.3.4" + uses: "actions/checkout@v2.4.0" - name : "Validate Gradle Wrapper" uses : "gradle/wrapper-validation-action@v1.0.4" - - name: "Grab SHA" - uses: "benjlevesque/short-sha@v1.2" - id: "short-sha" - with: - length: "7" - - name: "Echo SHA" - run: "echo $SHA" - env: - SHA: "${{ steps.short-sha.outputs.sha }}" - name: "Setup Java" uses: "actions/setup-java@v2.3.1" with: @@ -27,8 +18,30 @@ jobs: java-version: "17" - name: "Clean Build" run: "./gradlew clean build --no-daemon" - - name: Archive Artifacts - uses: actions/upload-artifact@v2 + - name: "Determine release status" + if: "${{ runner.os == 'Linux' }}" + run: | + if [ "$(./gradlew properties | awk '/^version:/ { print $2; }' | grep '\-SNAPSHOT')" ]; then + echo "STATUS=snapshot" >> $GITHUB_ENV + else + echo "STATUS=release" >> $GITHUB_ENV + fi + - name: "Publish Release" + if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}" + run: "./gradlew publishToSonatype closeSonatypeStagingRepository" + env: + ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" + ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}" + ORG_GRADLE_PROJECT_signingKey: "${{ secrets.SIGNING_KEY }}" + ORG_GRADLE_PROJECT_signingPassword: "${{ secrets.SIGNING_PASSWORD }}" + - name: "Publish Snapshot" + if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}" + run: "./gradlew publishToSonatype" + env: + ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" + ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}" + - name: "Archive Artifacts" + uses: "actions/upload-artifact@v2.2.4" with: - name: FastAsyncWorldEdit-Bukkit-1.17-${{ env.SHA }} - path: worldedit-bukkit/build/libs/FastAsyncWorldEdit-Bukkit-1.17-${{ env.SHA }}.jar + name: "FastAsyncWorldEdit-Bukkit-SNAPSHOT" + path: "worldedit-bukkit/build/libs/FastAsyncWorldEdit-Bukkit-*.jar" diff --git a/build.gradle.kts b/build.gradle.kts index 018b45f39..05749e19e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,8 @@ logger.lifecycle(""" ******************************************* """) -var rootVersion by extra("1.17") +var rootVersion by extra("2.0.0") +var snapshot by extra("SNAPSHOT") var revision: String by extra("") var buildNumber by extra("") var date: String by extra("") @@ -27,15 +28,14 @@ ext { } date = git.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd")) revision = "-${git.head().abbreviatedId}" - val commit: String? = git.head().abbreviatedId buildNumber = if (project.hasProperty("buildnumber")) { project.properties["buildnumber"] as String } else { - commit.toString() + null.toString() //1.18 TODO: drop classifier if not used, otherwise the version is 'null' } } -version = String.format("%s-%s", rootVersion, buildNumber) +version = String.format("%s-%s+%s", rootVersion, snapshot, buildNumber) if (!project.hasProperty("gitCommitHash")) { apply(plugin = "org.ajoberstar.grgit") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 32d43750f..6a5085ec5 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -29,4 +29,5 @@ dependencies { implementation("org.ajoberstar.grgit:grgit-gradle:4.1.0") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.1.14") + implementation("io.github.gradle-nexus:publish-plugin:1.1.0") } diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index d746fcefa..c658cf173 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -42,7 +42,7 @@ fun Project.applyCommonConfiguration() { plugins.withId("java") { the().toolchain { - languageVersion.set(JavaLanguageVersion.of(16)) + languageVersion.set(JavaLanguageVersion.of(17)) } } diff --git a/buildSrc/src/main/kotlin/CommonJavaConfig.kt b/buildSrc/src/main/kotlin/CommonJavaConfig.kt index b0029429c..21c059715 100644 --- a/buildSrc/src/main/kotlin/CommonJavaConfig.kt +++ b/buildSrc/src/main/kotlin/CommonJavaConfig.kt @@ -24,7 +24,7 @@ fun Project.applyCommonJavaConfiguration(sourcesJar: Boolean, banSlf4j: Boolean val disabledLint = listOf( "processing", "path", "fallthrough", "serial" ) - options.release.set(11) + options.release.set(17) options.compilerArgs.addAll(listOf("-Xlint:all") + disabledLint.map { "-Xlint:-$it" }) options.isDeprecation = true options.encoding = "UTF-8" @@ -32,7 +32,7 @@ fun Project.applyCommonJavaConfiguration(sourcesJar: Boolean, banSlf4j: Boolean } configurations.all { - attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 16) + attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) } tasks.withType().configureEach { diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index e0eeb117d..bdcadc009 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import io.github.gradlenexus.publishplugin.NexusPublishExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.ExternalModuleDependency @@ -21,6 +22,8 @@ import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.register +import org.gradle.plugins.signing.SigningExtension +import java.net.URI import javax.inject.Inject fun Project.applyLibrariesConfiguration() { @@ -28,6 +31,8 @@ fun Project.applyLibrariesConfiguration() { apply(plugin = "java-base") apply(plugin = "maven-publish") apply(plugin = "com.github.johnrengelman.shadow") + apply(plugin = "signing") + apply(plugin = "io.github.gradle-nexus.publish-plugin") configurations { create("shade") @@ -112,7 +117,7 @@ fun Project.applyLibrariesConfiguration() { attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) - attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) } outgoing.artifact(tasks.named("jar")) } @@ -127,7 +132,7 @@ fun Project.applyLibrariesConfiguration() { attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) - attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) } outgoing.artifact(tasks.named("jar")) } @@ -158,6 +163,16 @@ fun Project.applyLibrariesConfiguration() { mapToMavenScope("runtime") } + configure { + if (!version.toString().endsWith("-SNAPSHOT")) { + val signingKey: String? by project + val signingPassword: String? by project + useInMemoryPgpKeys(signingKey, signingPassword) + isRequired + sign(tasks["publications"]) + } + } + configure { publications { register("maven") { @@ -212,31 +227,13 @@ fun Project.applyLibrariesConfiguration() { } } } + } + configure { repositories { - mavenLocal() - val nexusUsername: String? by project - val nexusPassword: String? by project - if (nexusUsername != null && nexusPassword != null) { - maven { - val releasesRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/releases/" - val snapshotRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/snapshots/" - /* Commenting this out for now - Fawe currently does not user semver or any sort of versioning that - differentiates between snapshots and releases, API & (past) deployment wise, this will come with a next major release. - url = uri( - if (version.toString().endsWith("-SNAPSHOT")) snapshotRepositoryUrl - else releasesRepositoryUrl - ) - */ - url = uri(releasesRepositoryUrl) - - credentials { - username = nexusUsername - password = nexusPassword - } - } - } else { - logger.warn("No nexus repository is added; nexusUsername or nexusPassword is null.") + sonatype { + nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/")) + snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")) } } } diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt index 6f805aece..0d0b09f75 100644 --- a/buildSrc/src/main/kotlin/PlatformConfig.kt +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -12,6 +12,9 @@ import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.the +import org.gradle.plugins.signing.SigningExtension +import io.github.gradlenexus.publishplugin.NexusPublishExtension +import java.net.URI fun Project.applyPlatformAndCoreConfiguration() { applyCommonConfiguration() @@ -20,6 +23,8 @@ fun Project.applyPlatformAndCoreConfiguration() { apply(plugin = "idea") apply(plugin = "maven-publish") apply(plugin = "com.github.johnrengelman.shadow") + apply(plugin = "signing") + apply(plugin = "io.github.gradle-nexus.publish-plugin") applyCommonJavaConfiguration( sourcesJar = name in setOf("worldedit-core", "worldedit-bukkit"), @@ -45,6 +50,16 @@ fun Project.applyPlatformAndCoreConfiguration() { skip() } + configure { + if (!version.toString().endsWith("-SNAPSHOT")) { + val signingKey: String? by project + val signingPassword: String? by project + useInMemoryPgpKeys(signingKey, signingPassword) + isRequired + sign(tasks["publications"]) + } + } + configure { publications { register("maven") { @@ -99,31 +114,13 @@ fun Project.applyPlatformAndCoreConfiguration() { } } } + } + configure { repositories { - mavenLocal() - val nexusUsername: String? by project - val nexusPassword: String? by project - if (nexusUsername != null && nexusPassword != null) { - maven { - val releasesRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/releases/" - val snapshotRepositoryUrl = "https://mvn.intellectualsites.com/content/repositories/snapshots/" - /* Commenting this out for now - Fawe currently does not user semver or any sort of versioning that - differentiates between snapshots and releases, API & (past) deployment wise, this will come with a next major release. - url = uri( - if (version.toString().endsWith("-SNAPSHOT")) snapshotRepositoryUrl - else releasesRepositoryUrl - ) - */ - url = uri(releasesRepositoryUrl) - - credentials { - username = nexusUsername - password = nexusPassword - } - } - } else { - logger.warn("No nexus repository is added; nexusUsername or nexusPassword is null.") + sonatype { + nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/")) + snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")) } } } From 705f580290ecd3cbcdb8d20b56c37b27165db92e Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 13:47:59 +0100 Subject: [PATCH 02/81] build: Update core dependencies - Drop paranamer, you can access parameter names at runtime with Java 8+ natively --- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/CommonConfig.kt | 6 +++--- gradle/libs.versions.toml | 8 +++----- renovate.json | 1 - worldedit-bukkit/build.gradle.kts | 2 +- worldedit-libs/core/build.gradle.kts | 1 - 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6a5085ec5..09bfa7632 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -28,6 +28,6 @@ dependencies { implementation(gradleApi()) implementation("org.ajoberstar.grgit:grgit-gradle:4.1.0") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") - implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.1.14") + implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.2.0") implementation("io.github.gradle-nexus:publish-plugin:1.1.0") } diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index c658cf173..2e7572e4f 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -54,15 +54,15 @@ fun Project.applyCommonConfiguration() { continue } add(conf.name, "com.google.guava:guava") { - version { require("21.0") } + version { require("31.0.1-jre") } because("Mojang provides Guava") } add(conf.name, "com.google.code.gson:gson") { - version { require("2.8.0") } + version { require("2.8.8") } because("Mojang provides Gson") } add(conf.name, "it.unimi.dsi:fastutil") { - version { require("8.2.1") } + version { require("8.5.6") } because("Mojang provides FastUtil") } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8b6f03ee5..4f7ac600b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] # Minecraft expectations -fastutil = "8.2.1" +fastutil = "8.5.6" log4j = "2.14.1" -guava = "21.0" -gson = "2.8.0" +guava = "31.0.1-jre" +gson = "2.8.8" # Platform expectations paper = "1.17.1-R0.1-SNAPSHOT" @@ -39,7 +39,6 @@ rhino-runtime = "1.7.13" zstd-jni = "1.4.8-1" # Not latest as it can be difficult to obtain latest ZSTD libs antlr4 = "4.9.3" json-simple = "1.1.1" -paranamer = "2.8" jlibnoise = "1.0.0" jchronic = "0.2.4a" lz4-java = "1.8.0" @@ -104,7 +103,6 @@ zstd = { group = "com.github.luben", name = "zstd-jni", version.ref = "zstd-jni" antlr4 = { group = "org.antlr", name = "antlr4", version.ref = "antlr4" } antlr4Runtime = { group = "org.antlr", name = "antlr4-runtime", version.ref = "antlr4" } jsonSimple = { group = "com.googlecode.json-simple", name = "json-simple", version.ref = "json-simple" } -paranamer = { group = "com.thoughtworks.paranamer", name = "paranamer", version.ref = "paranamer" } jlibnoise = { group = "com.sk89q.lib", name = "jlibnoise", version.ref = "jlibnoise" } jchronic = { group = "com.sk89q", name = "jchronic", version.ref = "jchronic" } lz4Java = { group = "org.lz4", name = "lz4-java", version.ref = "lz4-java" } diff --git a/renovate.json b/renovate.json index b6e9da95a..7da708f2e 100644 --- a/renovate.json +++ b/renovate.json @@ -10,7 +10,6 @@ "mockito-core", "org.antlr", "antlr4-runtime", - "paranamer", "fastutil", "it.unimi.dsi:fastutil", "auto-value-annotations", diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index 447c05dad..c8ba089d2 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -44,7 +44,7 @@ repositories { configurations.all { resolutionStrategy { - force("com.google.guava:guava:21.0") + force("com.google.guava:guava:31.0.1-jre") } } diff --git a/worldedit-libs/core/build.gradle.kts b/worldedit-libs/core/build.gradle.kts index 73022bc99..c5eb10887 100644 --- a/worldedit-libs/core/build.gradle.kts +++ b/worldedit-libs/core/build.gradle.kts @@ -8,7 +8,6 @@ dependencies { "shade"(libs.jchronic) { exclude(group = "junit", module = "junit") } - "shade"(libs.paranamer) "shade"(libs.jlibnoise) "shade"(libs.piston) "shade"(libs.pistonRuntime) From 7d5659aeac59bdeba1ec328cac4fdce173146809 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 14:35:40 +0100 Subject: [PATCH 03/81] ci: Snapshot builds are the default --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 05749e19e..2a9b28544 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,13 +29,13 @@ ext { date = git.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd")) revision = "-${git.head().abbreviatedId}" buildNumber = if (project.hasProperty("buildnumber")) { - project.properties["buildnumber"] as String + snapshot + "+" + project.properties["buildnumber"] as String } else { - null.toString() //1.18 TODO: drop classifier if not used, otherwise the version is 'null' + project.properties["snapshot"] as String } } -version = String.format("%s-%s+%s", rootVersion, snapshot, buildNumber) +version = String.format("%s-%s", rootVersion, buildNumber) if (!project.hasProperty("gitCommitHash")) { apply(plugin = "org.ajoberstar.grgit") From 52293f54e85db5342cd49dd2d00fe51509b4615e Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 16:56:20 +0100 Subject: [PATCH 04/81] ci: Cleanup and finish transition --- build.gradle.kts | 14 ++++++++++++++ buildSrc/build.gradle.kts | 1 - buildSrc/src/main/kotlin/LibsConfig.kt | 12 ------------ buildSrc/src/main/kotlin/PlatformConfig.kt | 12 ------------ 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2a9b28544..d0bc3b838 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,11 @@ import org.ajoberstar.grgit.Grgit import java.time.format.DateTimeFormatter import org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL import org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED +import java.net.URI + +plugins { + id("io.github.gradle-nexus.publish-plugin") version "1.1.0" +} logger.lifecycle(""" ******************************************* @@ -66,3 +71,12 @@ allprojects { } applyCommonConfiguration() + +nexusPublishing { + repositories { + sonatype { + nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/")) + snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")) + } + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 09bfa7632..cf95eca21 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -29,5 +29,4 @@ dependencies { implementation("org.ajoberstar.grgit:grgit-gradle:4.1.0") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.2.0") - implementation("io.github.gradle-nexus:publish-plugin:1.1.0") } diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index bdcadc009..099cb84a2 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -1,5 +1,4 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import io.github.gradlenexus.publishplugin.NexusPublishExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.ExternalModuleDependency @@ -23,7 +22,6 @@ import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.register import org.gradle.plugins.signing.SigningExtension -import java.net.URI import javax.inject.Inject fun Project.applyLibrariesConfiguration() { @@ -32,7 +30,6 @@ fun Project.applyLibrariesConfiguration() { apply(plugin = "maven-publish") apply(plugin = "com.github.johnrengelman.shadow") apply(plugin = "signing") - apply(plugin = "io.github.gradle-nexus.publish-plugin") configurations { create("shade") @@ -229,15 +226,6 @@ fun Project.applyLibrariesConfiguration() { } } - configure { - repositories { - sonatype { - nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/")) - snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")) - } - } - } - } // A horrible hack because `softwareComponentFactory` has to be gotten via plugin diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt index 0d0b09f75..c1fa3a153 100644 --- a/buildSrc/src/main/kotlin/PlatformConfig.kt +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -13,8 +13,6 @@ import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.the import org.gradle.plugins.signing.SigningExtension -import io.github.gradlenexus.publishplugin.NexusPublishExtension -import java.net.URI fun Project.applyPlatformAndCoreConfiguration() { applyCommonConfiguration() @@ -24,7 +22,6 @@ fun Project.applyPlatformAndCoreConfiguration() { apply(plugin = "maven-publish") apply(plugin = "com.github.johnrengelman.shadow") apply(plugin = "signing") - apply(plugin = "io.github.gradle-nexus.publish-plugin") applyCommonJavaConfiguration( sourcesJar = name in setOf("worldedit-core", "worldedit-bukkit"), @@ -116,15 +113,6 @@ fun Project.applyPlatformAndCoreConfiguration() { } } - configure { - repositories { - sonatype { - nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/")) - snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")) - } - } - } - if (name != "worldedit-fabric") { configurations["compileClasspath"].apply { resolutionStrategy.componentSelection { From 3a189f65f246e9cfefbc49e5fa43c1221a0c79b2 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 17:18:21 +0100 Subject: [PATCH 05/81] ci: Trigger initial sync with the OSSRH --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3137c908c..d43081038 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: echo "STATUS=release" >> $GITHUB_ENV fi - name: "Publish Release" - if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}" + if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18'}}" run: "./gradlew publishToSonatype closeSonatypeStagingRepository" env: ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" @@ -35,7 +35,7 @@ jobs: ORG_GRADLE_PROJECT_signingKey: "${{ secrets.SIGNING_KEY }}" ORG_GRADLE_PROJECT_signingPassword: "${{ secrets.SIGNING_PASSWORD }}" - name: "Publish Snapshot" - if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}" + if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18' }}" run: "./gradlew publishToSonatype" env: ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" From 64f393201fa0698778de9263cbd2ce305bcaf023 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 22 Nov 2021 18:11:27 +0100 Subject: [PATCH 06/81] revert: OSSRH snapshot deployment was successful, returning to baseline This reverts commit 3a189f65f246e9cfefbc49e5fa43c1221a0c79b2. --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d43081038..3137c908c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: echo "STATUS=release" >> $GITHUB_ENV fi - name: "Publish Release" - if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18'}}" + if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}" run: "./gradlew publishToSonatype closeSonatypeStagingRepository" env: ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" @@ -35,7 +35,7 @@ jobs: ORG_GRADLE_PROJECT_signingKey: "${{ secrets.SIGNING_KEY }}" ORG_GRADLE_PROJECT_signingPassword: "${{ secrets.SIGNING_PASSWORD }}" - name: "Publish Snapshot" - if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18' }}" + if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}" run: "./gradlew publishToSonatype" env: ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" From 121bd58029e166dc4e5d14f1b06401b8f05b9b09 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 23 Nov 2021 14:14:01 +0100 Subject: [PATCH 07/81] ci: Register javadoc jar for lib artifacts --- buildSrc/src/main/kotlin/LibsConfig.kt | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index 099cb84a2..b67bf4b4a 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -96,8 +96,14 @@ fun Project.applyLibrariesConfiguration() { archiveClassifier.set("sources") } + // This a dummy jar to comply with the requirements of the OSSRH, + // libs are not API and therefore no "proper" javadoc jar is necessary + tasks.register("javadocJar") { + archiveClassifier.set("javadoc") + } + tasks.named("assemble").configure { - dependsOn("jar", "sourcesJar") + dependsOn("jar", "sourcesJar", "javadocJar") } project.apply() @@ -148,6 +154,20 @@ fun Project.applyLibrariesConfiguration() { outgoing.artifact(tasks.named("sourcesJar")) } + val javadocElements = project.configurations.register("javadocElements") { + isVisible = false + description = "Javadoc elements for libs" + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.DOCUMENTATION)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType.JAVADOC)) + } + outgoing.artifact(tasks.named("javadocJar")) + } + libsComponent.addVariantsFromConfiguration(apiElements.get()) { mapToMavenScope("compile") } @@ -160,6 +180,10 @@ fun Project.applyLibrariesConfiguration() { mapToMavenScope("runtime") } + libsComponent.addVariantsFromConfiguration(javadocElements.get()) { + mapToMavenScope("runtime") + } + configure { if (!version.toString().endsWith("-SNAPSHOT")) { val signingKey: String? by project From 22f52fc4e15c0330f79dffb903bbeac5916a45b7 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Thu, 25 Nov 2021 13:14:49 +0100 Subject: [PATCH 08/81] ci: Sign artifacts --- buildSrc/src/main/kotlin/LibsConfig.kt | 5 ++++- buildSrc/src/main/kotlin/PlatformConfig.kt | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index b67bf4b4a..daf806a80 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -21,6 +21,7 @@ import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.the import org.gradle.plugins.signing.SigningExtension import javax.inject.Inject @@ -184,13 +185,15 @@ fun Project.applyLibrariesConfiguration() { mapToMavenScope("runtime") } + val publishingExtension = the() + configure { if (!version.toString().endsWith("-SNAPSHOT")) { val signingKey: String? by project val signingPassword: String? by project useInMemoryPgpKeys(signingKey, signingPassword) isRequired - sign(tasks["publications"]) + sign(publishingExtension.publications) } } diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt index c1fa3a153..eafb5681f 100644 --- a/buildSrc/src/main/kotlin/PlatformConfig.kt +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -47,13 +47,15 @@ fun Project.applyPlatformAndCoreConfiguration() { skip() } + val publishingExtension = the() + configure { if (!version.toString().endsWith("-SNAPSHOT")) { val signingKey: String? by project val signingPassword: String? by project useInMemoryPgpKeys(signingKey, signingPassword) isRequired - sign(tasks["publications"]) + sign(publishingExtension.publications) } } From 0af0d84cf747b33e7a9687bb09c1016ee7da4644 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Thu, 25 Nov 2021 18:23:18 +0100 Subject: [PATCH 09/81] build: Set kotlin jvm toolchain --- buildSrc/build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index cf95eca21..bc9685e0a 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -30,3 +30,9 @@ dependencies { implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.2.0") } + +kotlin { + jvmToolchain { + (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(17)) + } +} From 0b45248b8cee135e98c68fa671ef6cdc0b3834a0 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 29 Nov 2021 22:15:41 +0100 Subject: [PATCH 10/81] style: Use minimized `version` output --- .../worldedit/command/WorldEditCommands.java | 49 +++---------------- 1 file changed, 7 insertions(+), 42 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index 2c767fad2..cad6775ac 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -80,52 +80,17 @@ public class WorldEditCommands { ) @CommandPermissions(queued = false) public void version(Actor actor) { - //FAWE start - get own version format + //FAWE start - use own, minimized message that doesn't print "Platforms" and "Capabilities" FaweVersion fVer = Fawe.get().getVersion(); String fVerStr = fVer == null ? "unknown" : "-" + fVer.build; - actor.print(TextComponent.of("FastAsyncWorldEdit" + fVerStr + " created by Empire92, MattBDev, IronApollo, dordsor21 and NotMyFault")); - - if (fVer != null) { - FaweVersion version = Fawe.get().getVersion(); - Date date = new GregorianCalendar(2000 + version.year, version.month - 1, version.day) - .getTime(); - - TextComponent dateArg = TextComponent.of(date.toLocaleString()); - TextComponent commitArg = TextComponent.of(Integer.toHexString(version.hash)); - TextComponent buildArg = TextComponent.of(version.build); - TextComponent platformArg = TextComponent.of(Settings.IMP.PLATFORM); - - actor.print(Caption.of("worldedit.version.version", dateArg, commitArg, buildArg, platformArg)); - } - - actor.printInfo(TextComponent.of("Wiki: https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki")); + actor.print(TextComponent.of("FastAsyncWorldEdit" + fVerStr)); + actor.print(TextComponent.of("Authors: Empire92, MattBDev, IronApollo, dordsor21 and NotMyFault")); + actor.print(TextComponent.of("Wiki: https://git.io/JMEPa") + .clickEvent(ClickEvent.openUrl("https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki"))); + actor.print(TextComponent.of("Discord: https://discord.gg/intellectualsites") + .clickEvent(ClickEvent.openUrl("https://discord.gg/intellectualsites"))); UpdateNotification.doUpdateNotification(actor); //FAWE end - - PlatformManager pm = we.getPlatformManager(); - - TextComponentProducer producer = new TextComponentProducer(); - for (Platform platform : pm.getPlatforms()) { - producer.append( - TextComponent.of("* ", TextColor.GRAY) - .append(TextComponent.of(platform.getPlatformName()) - .hoverEvent(HoverEvent.showText(TextComponent.of(platform.getId())))) - .append(TextComponent.of("(" + platform.getPlatformVersion() + ")")) - ).newline(); - } - actor.print(new MessageBox("Platforms", producer, TextColor.GRAY).create()); - - producer.reset(); - for (Capability capability : Capability.values()) { - Platform platform = pm.queryCapability(capability); - producer.append( - TextComponent.of(capability.name(), TextColor.GRAY) - .append(TextComponent.of(": ") - .append(TextComponent.of(platform != null ? platform.getPlatformName() : "none"))) - ).newline(); - } - actor.print(new MessageBox("Capabilities", producer, TextColor.GRAY).create()); - } @Command( From 38130f701c31eed6e4b239134357acf7d1deecfb Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 00:16:19 +0100 Subject: [PATCH 11/81] feat: Setup project structure for 1.18 --- buildSrc/build.gradle.kts | 13 +++++++----- buildSrc/src/main/kotlin/AdapterConfig.kt | 5 +---- buildSrc/src/main/kotlin/LibsConfig.kt | 1 + settings.gradle.kts | 1 + .../adapters/adapter-1_17_1/build.gradle.kts | 20 ++++++++++++++---- .../resources/worldedit-adapter-1.17.1.jar | Bin 0 -> 229162 bytes .../adapters/adapter-1_18/build.gradle.kts | 17 +++++++++++++++ 7 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar create mode 100644 worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index bc9685e0a..89890f675 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -8,14 +8,17 @@ plugins { repositories { mavenCentral() gradlePluginPortal() - maven { - name = "PaperMC" - url = uri("https://papermc.io/repo/repository/maven-public/") - } maven { name = "EngineHub" url = uri("https://maven.enginehub.org/repo/") } + maven { + name = "PaperMC" + url = uri("https://papermc.io/repo/repository/maven-public/") + content { + includeGroupByRegex("io\\.papermc\\..*") + } + } } val properties = Properties().also { props -> @@ -28,7 +31,7 @@ dependencies { implementation(gradleApi()) implementation("org.ajoberstar.grgit:grgit-gradle:4.1.0") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.0") - implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.2.0") + implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.0-SNAPSHOT") } kotlin { diff --git a/buildSrc/src/main/kotlin/AdapterConfig.kt b/buildSrc/src/main/kotlin/AdapterConfig.kt index 575071a42..d6fc3df31 100644 --- a/buildSrc/src/main/kotlin/AdapterConfig.kt +++ b/buildSrc/src/main/kotlin/AdapterConfig.kt @@ -5,9 +5,7 @@ import org.gradle.kotlin.dsl.dependencies // For specific version pinning, see // https://papermc.io/repo/service/rest/repository/browse/maven-public/io/papermc/paper/dev-bundle/ -fun Project.applyPaperweightAdapterConfiguration( - paperVersion: String -) { +fun Project.applyPaperweightAdapterConfiguration() { applyCommonConfiguration() apply(plugin = "java-library") applyCommonJavaConfiguration( @@ -17,7 +15,6 @@ fun Project.applyPaperweightAdapterConfiguration( apply(plugin = "io.papermc.paperweight.userdev") dependencies { - paperDevBundle(paperVersion) "implementation"(project(":worldedit-bukkit")) } diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index daf806a80..caae699d7 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -52,6 +52,7 @@ fun Project.applyLibrariesConfiguration() { dependencies { exclude(dependency("com.google.guava:guava")) exclude(dependency("com.google.code.gson:gson")) + exclude(dependency("com.google.errorprone:error_prone_annotations")) exclude(dependency("org.checkerframework:checker-qual")) exclude(dependency("org.apache.logging.log4j:log4j-api")) exclude(dependency("com.google.code.findbugs:jsr305")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 284f76861..89dc64163 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,7 @@ include("worldedit-libs") include("worldedit-bukkit:adapters:adapter-legacy") include("worldedit-bukkit:adapters:adapter-1_17_1") +include("worldedit-bukkit:adapters:adapter-1_18") listOf("bukkit", "core", "cli").forEach { include("worldedit-libs:$it") diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts index 218701aae..7a44e517d 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts @@ -1,11 +1,19 @@ +// TODO await https://github.com/PaperMC/paperweight/issues/116 +//applyPaperweightAdapterConfiguration() +// +//dependencies { +// paperDevBundle("1.17.1-R0.1-20211120.192557-194") +//} + +// Until the above issue is resolved, we are bundling old versions using their last assembled JAR. +// Technically this means we cannot really update them, but that is is the price we pay for supporting older versions. + + plugins { + base java } -applyPaperweightAdapterConfiguration( - "1.17.1-R0.1-20211120.192557-194" -) - repositories { maven { name = "PaperMC" @@ -16,6 +24,10 @@ repositories { } } +artifacts { + add("default", file("./src/main/resources/worldedit-adapter-1.17.1.jar")) +} + dependencies { compileOnly(libs.paperlib) } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..a1d408d0ddee874b61fdaa866f72acc37dd8b7cb GIT binary patch literal 229162 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 z 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
  • =CnLX@w5EQ8?&l<-Ylg+L(Fb)qRr+mlKm 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Ì!7dv6_9PU^9}oI6j~bOoL;?(2=qO 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 literal 0 HcmV?d00001 diff --git a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts new file mode 100644 index 000000000..68d52c55a --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + java +} + +applyPaperweightAdapterConfiguration() + +repositories { + maven { + name = "PaperMC" + url = uri("https://papermc.io/repo/repository/maven-public/") + } +} + +dependencies { + paperDevBundle("1.18-rc3-R0.1-SNAPSHOT") + compileOnly(libs.paperlib) +} From 930025afac4fa1d8cec15f97871eb119a7ef1c7b Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 00:23:46 +0100 Subject: [PATCH 12/81] Exclude 1.17 --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 89dc64163..a9756b094 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ rootProject.name = "FastAsyncWorldEdit" include("worldedit-libs") include("worldedit-bukkit:adapters:adapter-legacy") -include("worldedit-bukkit:adapters:adapter-1_17_1") +// include("worldedit-bukkit:adapters:adapter-1_17_1") include("worldedit-bukkit:adapters:adapter-1_18") listOf("bukkit", "core", "cli").forEach { From e296a329c278d480ded6d7681979db0931289f11 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 12:35:34 +0100 Subject: [PATCH 13/81] Port initial paperweight classes to 1.18 folder structure --- gradle/libs.versions.toml | 4 +- .../adapters/adapter-1_18/build.gradle.kts | 3 +- .../ext/fawe/v1_18_R1/PaperweightAdapter.java | 1017 ++++++ .../v1_18_R1/PaperweightDataConverters.java | 2795 +++++++++++++++++ .../fawe/v1_18_R1/PaperweightFakePlayer.java | 98 + .../PaperweightWorldNativeAccess.java | 182 ++ .../v1_18_R1/PaperweightBlockMaterial.java | 191 ++ .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 673 ++++ .../PaperweightFaweWorldNativeAccess.java | 283 ++ .../fawe/v1_18_R1/PaperweightGetBlocks.java | 1054 +++++++ .../v1_18_R1/PaperweightGetBlocks_Copy.java | 253 ++ .../v1_18_R1/PaperweightMapChunkUtil.java | 32 + .../v1_18_R1/PaperweightPlatformAdapter.java | 449 +++ .../PaperweightStarlightRelighter.java | 239 ++ .../PaperweightStarlightRelighterFactory.java | 28 + .../nbt/PaperweightLazyCompoundTag.java | 159 + .../fawe/v1_18_R1/regen/PaperweightRegen.java | 721 +++++ .../sk89q/worldedit/bukkit/BukkitWorld.java | 2 +- worldedit-core/doctools/build.gradle.kts | 2 +- 19 files changed, 8180 insertions(+), 5 deletions(-) create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java create mode 100644 worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 402a9b576..36af80435 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ guava = "31.0.1-jre" gson = "2.8.8" # Platform expectations -paper = "1.17.1-R0.1-SNAPSHOT" +paper = "1.18-rc3-R0.1-SNAPSHOT" # Plugins vault = "1.7.1" @@ -25,7 +25,7 @@ redprotect = "1.9.6" # Third party flow-math = "1.0.3" -paperlib = "1.0.7" +paperlib = "1.0.8-SNAPSHOT" bstats = "2.2.1" serverlib = "2.3.1" paster = "1.1.1" diff --git a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts index 68d52c55a..ad9b832c6 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts @@ -12,6 +12,7 @@ repositories { } dependencies { - paperDevBundle("1.18-rc3-R0.1-SNAPSHOT") + paperDevBundle("1.18-rc3-R0.1-20211129.221606-5") compileOnly(libs.paperlib) + compileOnly(libs.paper) } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java new file mode 100644 index 000000000..973e38d3e --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -0,0 +1,1017 @@ +/* + * 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.ext.fawe.v1_18_R1; + +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.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.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.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.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; +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.chunk.PalettedContainer; +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_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_18_R1.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.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.OptionalInt; +import java.util.Set; +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 != 2858) { // 1.18 release should be 2859 + throw new UnsupportedClassVersionError("Not 1.18!"); + } + + serverWorldsField = CraftServer.class.getDeclaredField("worlds"); + serverWorldsField.setAccessible(true); + + getChunkFutureMethod = ServerChunkCache.class.getDeclaredMethod("getChunkFutureMainThread", + int.class, int.class, ChunkStatus.class, boolean.class); + getChunkFutureMethod.setAccessible(true); + + chunkProviderExecutorField = ServerChunkCache.class.getDeclaredField( + Refraction.pickName("mainThreadProcessor", "h") + ); + 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(); + + 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(); + + Entity createdEntity = createEntityFromId(state.getType().getId(), craftWorld.getHandle()); + + 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); + } + + createdEntity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + + worldServer.addFreshEntity(createdEntity, SpawnReason.CUSTOM); + return createdEntity.getBukkitEntity(); + } else { + return null; + } + } + + @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" }) + @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; + if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { + property = new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); + } else if (state instanceof DirectionProperty) { + property = 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(), + (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())); + } else { + throw new IllegalArgumentException("WorldEdit needs an update to support " + state.getClass().getSimpleName()); + } + + properties.put(property.getName(), property); + } + return properties; + } + + @Override + public void sendFakeNBT(Player player, BlockVector3 pos, CompoundTag 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(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() + ? replaceSeed(originalWorld, seed, originalOpts) + : 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.dimensionType(), + 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 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) { + 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()) { + PalettedContainer biomeIndex = chunk.getSection(chunk.getSectionIndex(vec.getBlockY())) + .getBiomes(); + Biome origBiome = biomeIndex.get(vec.getBlockX(), vec.getBlockY(), vec.getBlockZ()); + 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/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java new file mode 100644 index 000000000..fa0b99a96 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/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.ext.fawe.v1_18_R1; + +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/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java new file mode 100644 index 000000000..d67ed35a1 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/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.ext.fawe.v1_18_R1; + +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/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java new file mode 100644 index 000000000..3776a9e6d --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java @@ -0,0 +1,182 @@ +/* + * 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.ext.fawe.v1_18_R1; + +import com.sk89q.jnbt.CompoundTag; +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.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_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.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, CompoundTag 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(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/fawe/v1_18_R1/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java new file mode 100644 index 000000000..eab420564 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java @@ -0,0 +1,191 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.google.common.base.Suppliers; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.util.ReflectionUtil; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; +import com.sk89q.worldedit.world.registry.BlockMaterial; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.EmptyBlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Material; +import net.minecraft.world.level.material.PushReaction; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; + +public class PaperweightBlockMaterial implements BlockMaterial { + + private final Block block; + private final BlockState blockState; + private final Material material; + private final boolean isTranslucent; + private final CraftBlockData craftBlockData; + private final org.bukkit.Material craftMaterial; + private final int opacity; + //TODO 1.18 be a CompoundBinaryTag ? + private final CompoundTag tile; + + public PaperweightBlockMaterial(Block block) { + this(block, block.defaultBlockState()); + } + + public PaperweightBlockMaterial(Block block, BlockState blockState) { + this.block = block; + this.blockState = blockState; + this.material = blockState.getMaterial(); + this.craftBlockData = CraftBlockData.fromData(blockState); + this.craftMaterial = craftBlockData.getMaterial(); + BlockBehaviour.Properties blockInfo = ReflectionUtil.getField(BlockBehaviour.class, block, Refraction.pickName( + "properties", "aP")); + this.isTranslucent = !(boolean) ReflectionUtil.getField(BlockBehaviour.Properties.class, blockInfo, + Refraction.pickName("canOcclude", "n") + ); + opacity = blockState.getLightBlock(EmptyBlockGetter.INSTANCE, BlockPos.ZERO); + BlockEntity tileEntity = !(block instanceof EntityBlock) ? null : ((EntityBlock) block).newBlockEntity( + BlockPos.ZERO, + blockState + ); + tile = tileEntity == null + ? null + : new PaperweightLazyCompoundTag(Suppliers.memoize(() -> tileEntity.save(new net.minecraft.nbt.CompoundTag()))); + // TODO 1.18 save -> saveAdditional + } + + public Block getBlock() { + return block; + } + + public BlockState getState() { + return blockState; + } + + public CraftBlockData getCraftBlockData() { + return craftBlockData; + } + + public Material getMaterial() { + return material; + } + + @Override + public boolean isAir() { + return blockState.isAir(); + } + + @Override + public boolean isFullCube() { + return craftMaterial.isOccluding(); + } + + @Override + public boolean isOpaque() { + return material.isSolidBlocking(); + } + + @Override + public boolean isPowerSource() { + return blockState.isSignalSource(); + } + + @Override + public boolean isLiquid() { + return material.isLiquid(); + } + + @Override + public boolean isSolid() { + return material.isSolid(); + } + + @Override + public float getHardness() { + return craftBlockData.getState().destroySpeed; + } + + @Override + public float getResistance() { + return block.getExplosionResistance(); + } + + @Override + public float getSlipperiness() { + return block.getFriction(); + } + + @Override + public int getLightValue() { + return blockState.getLightEmission(); + } + + @Override + public int getLightOpacity() { + return opacity; + } + + @Override + public boolean isFragileWhenPushed() { + return material.getPushReaction() == PushReaction.DESTROY; + } + + @Override + public boolean isUnpushable() { + return material.getPushReaction() == PushReaction.BLOCK; + } + + @Override + public boolean isTicksRandomly() { + return block.isRandomlyTicking(blockState); + } + + @Override + public boolean isMovementBlocker() { + return material.isSolid(); + } + + @Override + public boolean isBurnable() { + return material.isFlammable(); + } + + @Override + public boolean isToolRequired() { + // Removed in 1.16.1, this is not present in higher versions + return false; + } + + @Override + public boolean isReplacedDuringPlacement() { + return material.isReplaceable(); + } + + @Override + public boolean isTranslucent() { + return isTranslucent; + } + + @Override + public boolean hasContainer() { + return block instanceof EntityBlock; + } + + @Override + public boolean isTile() { + return block instanceof EntityBlock; + } + + @Override + public CompoundTag getDefaultTile() { + return tile; + } + + @Override + public int getMapColor() { + // rgb field + return material.getColor().col; + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java new file mode 100644 index 000000000..160dcbed7 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -0,0 +1,673 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; +import com.fastasyncworldedit.bukkit.adapter.IDelegateBukkitImplAdapter; +import com.fastasyncworldedit.bukkit.adapter.NMSRelighterFactory; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.entity.LazyBaseEntity; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.TileEntityBlock; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; +import com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_18_R1.PaperweightAdapter; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen.PaperweightRegen; +import com.sk89q.worldedit.entity.BaseEntity; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.block.BlockStateIdAccess; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.internal.wna.WorldNativeAccess; +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.SideEffectSet; +import com.sk89q.worldedit.util.TreeGenerator; +import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.world.RegenOptions; +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.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; +import com.sk89q.worldedit.world.block.BlockTypesCache; +import com.sk89q.worldedit.world.entity.EntityType; +import com.sk89q.worldedit.world.item.ItemType; +import com.sk89q.worldedit.world.registry.BlockMaterial; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.nbt.IntTag; +import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.StringRepresentable; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import org.apache.logging.log4j.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.TreeType; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_18_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_18_R1.block.CraftBlockState; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey; +import org.bukkit.entity.Player; + +import javax.annotation.Nullable; +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.OptionalInt; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements + IDelegateBukkitImplAdapter { + + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private final PaperweightAdapter parent; + // ------------------------------------------------------------------------ + // Code that may break between versions of Minecraft + // ------------------------------------------------------------------------ + private final PaperweightMapChunkUtil mapUtil = new PaperweightMapChunkUtil(); + private char[] ibdToStateOrdinal = null; + private int[] ordinalToIbdID = null; + private boolean initialised = false; + private Map>> allBlockProperties = null; + + public PaperweightFaweAdapter() throws NoSuchFieldException, NoSuchMethodException { + this.parent = new PaperweightAdapter(); + } + + @Nullable + private static String getEntityId(Entity entity) { + ResourceLocation resourceLocation = net.minecraft.world.entity.EntityType.getKey(entity.getType()); + return resourceLocation == null ? null : resourceLocation.toString(); + } + + private static void readEntityIntoTag(Entity entity, net.minecraft.nbt.CompoundTag compoundTag) { + entity.save(compoundTag); + } + + @Override + public BukkitImplAdapter getParent() { + return parent; + } + + private synchronized boolean init() { + if (ibdToStateOrdinal != null && ibdToStateOrdinal[1] != 0) { + return false; + } + ibdToStateOrdinal = new char[BlockTypesCache.states.length]; // size + ordinalToIbdID = new int[ibdToStateOrdinal.length]; // size + for (int i = 0; i < ibdToStateOrdinal.length; i++) { + BlockState blockState = BlockTypesCache.states[i]; + PaperweightBlockMaterial material = (PaperweightBlockMaterial) blockState.getMaterial(); + int id = Block.BLOCK_STATE_REGISTRY.getId(material.getState()); + char ordinal = blockState.getOrdinalChar(); + ibdToStateOrdinal[id] = ordinal; + ordinalToIbdID[ordinal] = id; + } + Map>> properties = new HashMap<>(); + try { + for (Field field : BlockStateProperties.class.getDeclaredFields()) { + Object obj = field.get(null); + if (!(obj instanceof net.minecraft.world.level.block.state.properties.Property state)) { + continue; + } + Property property; + if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { + property = new BooleanProperty( + state.getName(), + (List) ImmutableList.copyOf(state.getPossibleValues()) + ); + } else if (state instanceof DirectionProperty) { + property = new DirectionalProperty( + state.getName(), + state + .getPossibleValues() + .stream() + .map(e -> Direction.valueOf(((StringRepresentable) e).getSerializedName().toUpperCase())) + .collect(Collectors.toList()) + ); + } else if (state instanceof net.minecraft.world.level.block.state.properties.EnumProperty) { + property = new EnumProperty( + state.getName(), + 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(), + (List) ImmutableList.copyOf(state.getPossibleValues()) + ); + } else { + throw new IllegalArgumentException("FastAsyncWorldEdit needs an update to support " + state + .getClass() + .getSimpleName()); + } + properties.compute(property.getName().toLowerCase(Locale.ROOT), (k, v) -> { + if (v == null) { + v = new ArrayList<>(Collections.singletonList(property)); + } else { + v.add(property); + } + return v; + }); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } finally { + allBlockProperties = ImmutableMap.copyOf(properties); + } + initialised = true; + return true; + } + + @Override + public BlockMaterial getMaterial(BlockType blockType) { + Block block = getBlock(blockType); + return new PaperweightBlockMaterial(block); + } + + @Override + public synchronized BlockMaterial getMaterial(BlockState state) { + net.minecraft.world.level.block.state.BlockState blockState = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); + return new PaperweightBlockMaterial(blockState.getBlock(), blockState); + } + + public Block getBlock(BlockType blockType) { + return Registry.BLOCK.get(new ResourceLocation(blockType.getNamespace(), blockType.getResource())); + } + + @SuppressWarnings("deprecation") + @Override + public BaseBlock getBlock(Location location) { + Preconditions.checkNotNull(location); + + CraftWorld craftWorld = ((CraftWorld) location.getWorld()); + int x = location.getBlockX(); + int y = location.getBlockY(); + int z = location.getBlockZ(); + + final ServerLevel serverLevel = craftWorld.getHandle(); + LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + final BlockPos blockPos = new BlockPos(x, y, z); + org.bukkit.block.Block bukkitBlock = location.getBlock(); + BlockState state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + if (state.getBlockType().getMaterial().hasContainer()) { + + // Read the NBT data + BlockEntity blockEntity = levelChunk.getBlockEntity(blockPos, LevelChunk.EntityCreationType.CHECK); + if (blockEntity != null) { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + //TODO save -> saveAdditional + blockEntity.save(tag); // readTileEntityIntoTag - load data + return state.toBaseBlock((CompoundTag) toNative(tag)); + } + } + + return state.toBaseBlock(); + } + + @Override + public Set getSupportedSideEffects() { + return SideEffectSet.defaults().getSideEffectsToApply(); + } + + //TODO 1.18 address raw access of BlockStateHolder + public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { + CraftChunk craftChunk = (CraftChunk) chunk; + LevelChunk levelChunk = craftChunk.getHandle(); + Level level = levelChunk.getLevel(); + + BlockPos blockPos = new BlockPos(x, y, z); + net.minecraft.world.level.block.state.BlockState blockState = ((PaperweightBlockMaterial) state.getMaterial()).getState(); + LevelChunkSection[] levelChunkSections = levelChunk.getSections(); + int y4 = y >> 4; + LevelChunkSection section = levelChunkSections[y4]; + + net.minecraft.world.level.block.state.BlockState existing; + if (section == null) { + existing = ((PaperweightBlockMaterial) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); + } else { + existing = section.getBlockState(x & 15, y & 15, z & 15); + } + + levelChunk.removeBlockEntity(blockPos); // Force delete the old tile entity + + CompoundTag compoundTag = state instanceof BaseBlock ? state.getNbtData() : null; + if (compoundTag != null || existing instanceof TileEntityBlock) { + level.setBlock(blockPos, blockState, 0); + // remove tile + if (compoundTag != null) { + // We will assume that the tile entity was created for us, + // though we do not do this on the Forge version + BlockEntity blockEntity = level.getBlockEntity(blockPos); + if (blockEntity != null) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) fromNative(compoundTag); + tag.put("x", IntTag.valueOf(x)); + tag.put("y", IntTag.valueOf(y)); + tag.put("z", IntTag.valueOf(z)); + blockEntity.load(tag); // readTagIntoTileEntity - load data + } + } + } else { + if (existing == blockState) { + return true; + } + if (section == null) { + if (blockState.isAir()) { + return true; + } + levelChunkSections[y4] = section = new LevelChunkSection(y4 << 4); + } + levelChunk.setBlockState(blockPos, blockState, false); + } + if (update) { + level.getMinecraftWorld().sendBlockUpdated(blockPos, existing, blockState, 0); + } + return true; + } + + @Override + public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { + return new PaperweightFaweWorldNativeAccess( + this, + new WeakReference<>(((CraftWorld) world).getHandle()) + ); + } + + @Override + public BaseEntity getEntity(org.bukkit.entity.Entity entity) { + Preconditions.checkNotNull(entity); + + CraftEntity craftEntity = ((CraftEntity) entity); + Entity mcEntity = craftEntity.getHandle(); + + String id = getEntityId(mcEntity); + + if (id != null) { + EntityType type = com.sk89q.worldedit.world.entity.EntityTypes.get(id); + //TODO 1.18 be a CBT ? + Supplier saveTag = () -> { + final net.minecraft.nbt.CompoundTag minecraftTag = new net.minecraft.nbt.CompoundTag(); + readEntityIntoTag(mcEntity, minecraftTag); + //add Id for AbstractChangeSet to work + final CompoundTag tag = (CompoundTag) toNative(minecraftTag); + final Map tags = new HashMap<>(tag.getValue()); + tags.put("Id", new StringTag(id)); + return new CompoundTag(tags); + }; + return new LazyBaseEntity(type, saveTag); + } else { + return null; + } + } + + @Override + public Component getRichBlockName(BlockType blockType) { + return parent.getRichBlockName(blockType); + } + + @Override + public Component getRichItemName(ItemType itemType) { + return parent.getRichItemName(itemType); + } + + @Override + public Component getRichItemName(BaseItemStack itemStack) { + return parent.getRichItemName(itemStack); + } + + @Override + public OptionalInt getInternalBlockStateId(BlockState state) { + PaperweightBlockMaterial material = (PaperweightBlockMaterial) state.getMaterial(); + net.minecraft.world.level.block.state.BlockState mcState = material.getCraftBlockData().getState(); + return OptionalInt.of(Block.BLOCK_STATE_REGISTRY.getId(mcState)); + } + + @Override + public BlockState adapt(BlockData blockData) { + CraftBlockData cbd = ((CraftBlockData) blockData); + net.minecraft.world.level.block.state.BlockState ibd = cbd.getState(); + return adapt(ibd); + } + + public BlockState adapt(net.minecraft.world.level.block.state.BlockState blockState) { + return BlockTypesCache.states[adaptToChar(blockState)]; + } + + public char adaptToChar(net.minecraft.world.level.block.state.BlockState blockState) { + int id = Block.BLOCK_STATE_REGISTRY.getId(blockState); + if (initialised) { + return ibdToStateOrdinal[id]; + } + synchronized (this) { + if (initialised) { + return ibdToStateOrdinal[id]; + } + try { + init(); + return ibdToStateOrdinal[id]; + } catch (ArrayIndexOutOfBoundsException e1) { + LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", + blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1 + ); + return 0; + } + } + } + + public char ibdIDToOrdinal(int id) { + if (initialised) { + return ibdToStateOrdinal[id]; + } + synchronized (this) { + if (initialised) { + return ibdToStateOrdinal[id]; + } + init(); + return ibdToStateOrdinal[id]; + } + } + + @Override + public char[] getIbdToStateOrdinal() { + if (initialised) { + return ibdToStateOrdinal; + } + synchronized (this) { + if (initialised) { + return ibdToStateOrdinal; + } + init(); + return ibdToStateOrdinal; + } + } + + public int ordinalToIbdID(char ordinal) { + if (initialised) { + return ordinalToIbdID[ordinal]; + } + synchronized (this) { + if (initialised) { + return ordinalToIbdID[ordinal]; + } + init(); + return ordinalToIbdID[ordinal]; + } + } + + @Override + public int[] getOrdinalToIbdID() { + if (initialised) { + return ordinalToIbdID; + } + synchronized (this) { + if (initialised) { + return ordinalToIbdID; + } + init(); + return ordinalToIbdID; + } + } + + @Override + public > BlockData adapt(B state) { + PaperweightBlockMaterial material = (PaperweightBlockMaterial) state.getMaterial(); + return material.getCraftBlockData(); + } + + @Override + public void sendFakeChunk(org.bukkit.World world, Player player, ChunkPacket chunkPacket) { + ServerLevel nmsWorld = ((CraftWorld) world).getHandle(); + ChunkHolder map = PaperweightPlatformAdapter.getPlayerChunk(nmsWorld, chunkPacket.getChunkX(), chunkPacket.getChunkZ()); + if (map != null && map.wasAccessibleSinceLastSave()) { + boolean flag = false; + // PlayerChunk.d players = map.players; + Stream stream = /*players.a(new ChunkCoordIntPair(packet.getChunkX(), packet.getChunkZ()), flag) + */ Stream.empty(); + + ServerPlayer checkPlayer = player == null ? null : ((CraftPlayer) player).getHandle(); + stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) + .forEach(entityPlayer -> { + synchronized (chunkPacket) { + ClientboundLevelChunkPacketData nmsPacket = (ClientboundLevelChunkPacketData) chunkPacket.getNativePacket(); + if (nmsPacket == null) { + nmsPacket = mapUtil.create(this, chunkPacket); + chunkPacket.setNativePacket(nmsPacket); + } + try { + FaweCache.IMP.CHUNK_FLAG.get().set(true); + entityPlayer.connection.send(nmsPacket); + } finally { + FaweCache.IMP.CHUNK_FLAG.get().set(false); + } + } + }); + } + } + + @Override + public Map> getProperties(BlockType blockType) { + return getParent().getProperties(blockType); + } + + @Override + public boolean canPlaceAt(org.bukkit.World world, BlockVector3 blockVector3, BlockState blockState) { + int internalId = BlockStateIdAccess.getBlockStateId(blockState); + net.minecraft.world.level.block.state.BlockState blockState1 = Block.stateById(internalId); + return blockState1.hasPostProcess( + ((CraftWorld) world).getHandle(), + new BlockPos(blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()) + ); + } + + @Override + public org.bukkit.inventory.ItemStack adapt(BaseItemStack baseItemStack) { + ItemStack stack = new ItemStack( + Registry.ITEM.get(ResourceLocation.tryParse(baseItemStack.getType().getId())), + baseItemStack.getAmount() + ); + stack.setTag(((net.minecraft.nbt.CompoundTag) fromNative(baseItemStack.getNbtData()))); + return CraftItemStack.asCraftMirror(stack); + } + + @Override + public boolean generateTree( + TreeGenerator.TreeType treeType, EditSession editSession, BlockVector3 blockVector3, + org.bukkit.World bukkitWorld + ) { + TreeType bukkitType = BukkitWorld.toBukkitTreeType(treeType); + if (bukkitType == TreeType.CHORUS_PLANT) { + blockVector3 = blockVector3.add( + 0, + 1, + 0 + ); // bukkit skips the feature gen which does this offset normally, so we have to add it back + } + ServerLevel serverLevel = ((CraftWorld) bukkitWorld).getHandle(); + serverLevel.captureTreeGeneration = true; + serverLevel.captureBlockStates = true; + boolean grownTree = bukkitWorld.generateTree(BukkitAdapter.adapt(bukkitWorld, blockVector3), bukkitType); + serverLevel.captureBlockStates = false; + serverLevel.captureTreeGeneration = false; + if (!grownTree) { + serverLevel.capturedBlockStates.clear(); + return false; + } else { + for (CraftBlockState craftBlockState : serverLevel.capturedBlockStates.values()) { + if (craftBlockState == null || craftBlockState.getType() == Material.AIR) { + continue; + } + editSession.setBlock(craftBlockState.getX(), craftBlockState.getY(), craftBlockState.getZ(), + BukkitAdapter.adapt(((org.bukkit.block.BlockState) craftBlockState).getBlockData()) + ); + } + + serverLevel.capturedBlockStates.clear(); + return true; + } + } + + @Override + public List getEntities(org.bukkit.World world) { + // Quickly add each entity to a list copy. + List mcEntities = new ArrayList<>(); + ((CraftWorld) world).getHandle().entityManager.getEntityGetter().getAll().forEach(mcEntities::add); + + List list = new ArrayList<>(); + mcEntities.forEach((mcEnt) -> { + org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity(); + if (bukkitEntity.isValid()) { + list.add(bukkitEntity); + } + + }); + return list; + } + + @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; + } + + @Override + public Tag toNative(net.minecraft.nbt.Tag foreign) { + return parent.toNative(foreign); + } + + @Override + public net.minecraft.nbt.Tag fromNative(Tag foreign) { + if (foreign instanceof PaperweightLazyCompoundTag) { + return ((PaperweightLazyCompoundTag) foreign).get(); + } + return parent.fromNative(foreign); + } + + @Override + public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { + return new PaperweightRegen(bukkitWorld, region, target, options).regenerate(); + } + + @Override + public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { + return new PaperweightGetBlocks(world, chunkX, chunkZ); + } + + @Override + public int getInternalBiomeId(BiomeType biomeType) { + if (biomeType.getId().startsWith("minecraft:")) { + Biome biomeBase = CraftBlock.biomeToBiomeBase( + MinecraftServer.getServer().registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY), + BukkitAdapter.adapt(biomeType) + ); + return MinecraftServer.getServer().registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).getId(biomeBase); + } else { + WritableRegistry biomeRegistry = MinecraftServer.getServer().registryAccess() + .ownedRegistryOrThrow(Registry.BIOME_REGISTRY); + + ResourceLocation resourceLocation = biomeRegistry.keySet().stream() + .filter(resource -> resource.toString().equals(biomeType.getId())) + .findAny().orElse(null); + + return biomeRegistry.getId(biomeRegistry.get(resourceLocation)); + } + } + + @Override + public Iterable getRegisteredBiomes() { + WritableRegistry biomeRegistry = ((CraftServer) Bukkit.getServer()) + .getServer() + .registryAccess() + .ownedRegistryOrThrow( + Registry.BIOME_REGISTRY); + return biomeRegistry.stream() + .map(biomeRegistry::getKey) + .map(CraftNamespacedKey::fromMinecraft) + .collect(Collectors.toList()); + } + + @Override + public RelighterFactory getRelighterFactory() { + try { + Class.forName("ca.spottedleaf.starlight.light.StarLightEngine"); + if (PaperweightStarlightRelighter.isUsable()) { + return new PaperweightStarlightRelighterFactory(); + } + } catch (ThreadDeath td) { + throw td; + } catch (Throwable ignored) { + + } + return new NMSRelighterFactory(); + } + + @Override + public Map>> getAllProperties() { + if (initialised) { + return allBlockProperties; + } + synchronized (this) { + if (initialised) { + return allBlockProperties; + } + init(); + return allBlockProperties; + } + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java new file mode 100644 index 000000000..d9575fc3f --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java @@ -0,0 +1,283 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.math.IntPair; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.task.RunnableVal; +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.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.world.level.Level; +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_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; +import org.bukkit.event.block.BlockPhysicsEvent; + +import javax.annotation.Nullable; +import java.lang.ref.WeakReference; +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess { + + private static final int UPDATE = 1; + private static final int NOTIFY = 2; + private static final Direction[] NEIGHBOUR_ORDER = { + Direction.EAST, + Direction.WEST, + Direction.DOWN, + Direction.UP, + Direction.NORTH, + Direction.SOUTH + }; + private final PaperweightFaweAdapter paperweightFaweAdapter; + private final WeakReference level; + private final AtomicInteger lastTick; + private final Set cachedChanges = new HashSet<>(); + private final Set cachedChunksToSend = new HashSet<>(); + private SideEffectSet sideEffectSet; + + public PaperweightFaweWorldNativeAccess(PaperweightFaweAdapter paperweightFaweAdapter, WeakReference level) { + this.paperweightFaweAdapter = paperweightFaweAdapter; + this.level = level; + // Use the actual tick as minecraft-defined so we don't try to force blocks into the world when the server's already lagging. + // - With the caveat that we don't want to have too many cached changed (1024) so we'd flush those at 1024 anyway. + this.lastTick = new AtomicInteger(MinecraftServer.currentTick); + } + + private Level getLevel() { + return Objects.requireNonNull(level.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 getLevel().getChunk(x, z); + } + + @Override + public net.minecraft.world.level.block.state.BlockState toNative(BlockState blockState) { + int stateId = paperweightFaweAdapter.ordinalToIbdID(blockState.getOrdinalChar()); + return BlockStateIdAccess.isValidInternalId(stateId) + ? Block.stateById(stateId) + : ((CraftBlockData) BukkitAdapter.adapt(blockState)).getState(); + } + + @Override + public net.minecraft.world.level.block.state.BlockState getBlockState(LevelChunk levelChunk, BlockPos blockPos) { + return levelChunk.getBlockState(blockPos); + } + + @Nullable + @Override + public synchronized net.minecraft.world.level.block.state.BlockState setBlockState( + LevelChunk levelChunk, BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState blockState + ) { + int currentTick = MinecraftServer.currentTick; + if (Fawe.isMainThread()) { + return levelChunk.setBlockState(blockPos, blockState, + this.sideEffectSet != null && this.sideEffectSet.shouldApply(SideEffect.UPDATE) + ); + } + // Since FAWE is.. Async we need to do it on the main thread (wooooo.. :( ) + cachedChanges.add(new CachedChange(levelChunk, blockPos, blockState)); + cachedChunksToSend.add(new IntPair(levelChunk.bukkitChunk.getX(), levelChunk.bukkitChunk.getZ())); + boolean nextTick = lastTick.get() > currentTick; + if (nextTick || cachedChanges.size() >= 1024) { + if (nextTick) { + lastTick.set(currentTick); + } + flushAsync(nextTick); + } + return blockState; + } + + @Override + public net.minecraft.world.level.block.state.BlockState getValidBlockForPosition( + net.minecraft.world.level.block.state.BlockState blockState, + BlockPos blockPos + ) { + return Block.updateFromNeighbourShapes(blockState, getLevel(), blockPos); + } + + @Override + public BlockPos getPosition(int x, int y, int z) { + return new BlockPos(x, y, z); + } + + @Override + public void updateLightingForBlock(BlockPos blockPos) { + getLevel().getChunkSource().getLightEngine().checkBlock(blockPos); + } + + @Override + public boolean updateTileEntity(BlockPos blockPos, CompoundBinaryTag tag) { + // We will assume that the tile entity was created for us, + // though we do not do this on the other versions + BlockEntity blockEntity = getLevel().getBlockEntity(blockPos); + if (blockEntity == null) { + return false; + } + net.minecraft.nbt.Tag nativeTag = paperweightFaweAdapter.fromNativeBinary(tag); + blockEntity.load((CompoundTag) nativeTag); + return true; + } + + @Override + public void notifyBlockUpdate( + LevelChunk levelChunk, BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState oldState, + net.minecraft.world.level.block.state.BlockState newState + ) { + if (levelChunk.getSections()[level.get().getSectionIndex(blockPos.getY())] != null) { + getLevel().sendBlockUpdated(blockPos, oldState, newState, UPDATE | NOTIFY); + } + } + + @Override + public boolean isChunkTicking(LevelChunk levelChunk) { + return levelChunk.getFullStatus().isOrAfter(ChunkHolder.FullChunkStatus.TICKING); + } + + @Override + public void markBlockChanged(LevelChunk levelChunk, BlockPos blockPos) { + if (levelChunk.getSections()[level.get().getSectionIndex(blockPos.getY())] != null) { + ((ServerChunkCache) getLevel().getChunkSource()).blockChanged(blockPos); + } + } + + @Override + public void notifyNeighbors( + BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState oldState, + net.minecraft.world.level.block.state.BlockState newState + ) { + Level level = getLevel(); + if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { + level.blockUpdated(blockPos, oldState.getBlock()); + } else { + // When we don't want events, manually run the physics without them. + // Un-nest neighbour updating + for (Direction direction : NEIGHBOUR_ORDER) { + BlockPos shifted = blockPos.relative(direction); + level.getBlockState(shifted).neighborChanged(level, shifted, oldState.getBlock(), blockPos, false); + } + } + if (newState.hasAnalogOutputSignal()) { + level.updateNeighbourForOutputSignal(blockPos, newState.getBlock()); + } + } + + @Override + public void updateNeighbors( + BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState oldState, + net.minecraft.world.level.block.state.BlockState newState, + int recursionLimit + ) { + Level level = getLevel(); + // a == updateNeighbors + // b == updateDiagonalNeighbors + oldState.updateIndirectNeighbourShapes(level, blockPos, NOTIFY, recursionLimit); + if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { + CraftWorld craftWorld = level.getWorld(); + if (craftWorld != null) { + BlockPhysicsEvent event = new BlockPhysicsEvent( + craftWorld.getBlockAt(blockPos.getX(), blockPos.getY(), blockPos.getZ()), + CraftBlockData.fromData(newState) + ); + level.getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + } + } + newState.triggerEvent(level, blockPos, NOTIFY, recursionLimit); + newState.updateIndirectNeighbourShapes(level, blockPos, NOTIFY, recursionLimit); + } + + @Override + public void onBlockStateChange( + BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState oldState, + net.minecraft.world.level.block.state.BlockState newState + ) { + getLevel().onBlockStateChange(blockPos, oldState, newState); + } + + private synchronized void flushAsync(final boolean sendChunks) { + final Set changes = Set.copyOf(cachedChanges); + cachedChanges.clear(); + final Set toSend; + if (sendChunks) { + toSend = Set.copyOf(cachedChunksToSend); + cachedChunksToSend.clear(); + } else { + toSend = Collections.emptySet(); + } + RunnableVal runnableVal = new RunnableVal<>() { + @Override + public void run(Object value) { + changes.forEach(cc -> cc.levelChunk.setBlockState(cc.blockPos, cc.blockState, + sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE) + )); + if (!sendChunks) { + return; + } + for (IntPair chunk : toSend) { + PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false); + } + } + }; + TaskManager.IMP.async(() -> TaskManager.IMP.sync(runnableVal)); + } + + @Override + public synchronized void flush() { + RunnableVal runnableVal = new RunnableVal<>() { + @Override + public void run(Object value) { + cachedChanges.forEach(cc -> cc.levelChunk.setBlockState(cc.blockPos, cc.blockState, + sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE) + )); + for (IntPair chunk : cachedChunksToSend) { + PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false); + } + } + }; + if (Fawe.isMainThread()) { + runnableVal.run(); + } else { + TaskManager.IMP.sync(runnableVal); + } + cachedChanges.clear(); + cachedChunksToSend.clear(); + } + + private record CachedChange(LevelChunk levelChunk, BlockPos blockPos, + net.minecraft.world.level.block.state.BlockState blockState) { + + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java new file mode 100644 index 000000000..83453fe8d --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -0,0 +1,1054 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.bukkit.adapter.BukkitGetBlocks; +import com.fastasyncworldedit.bukkit.adapter.DelegateSemaphore; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; +import com.fastasyncworldedit.core.math.BitArrayUnstretched; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.fastasyncworldedit.core.queue.implementation.QueueHandler; +import com.fastasyncworldedit.core.queue.implementation.blocks.CharGetBlocks; +import com.fastasyncworldedit.core.util.collection.AdaptedMap; +import com.google.common.base.Suppliers; +import com.google.common.collect.Iterables; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; +import com.sk89q.worldedit.internal.Constants; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockTypes; +import io.papermc.lib.PaperLib; +import io.papermc.paper.event.block.BeaconDeactivatedEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.SectionPos; +import net.minecraft.nbt.IntTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.BitStorage; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.entity.BeaconBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import net.minecraft.world.level.chunk.DataLayer; +import net.minecraft.world.level.chunk.HashMapPalette; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.LinearPalette; +import net.minecraft.world.level.chunk.Palette; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.lighting.LevelLightEngine; +import org.apache.logging.log4j.Logger; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.block.CraftBlock; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.AbstractSet; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBlocks { + + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private static final Function posNms2We = v -> BlockVector3.at(v.getX(), v.getY(), v.getZ()); + private static final Function nmsTile2We = + tileEntity -> new PaperweightLazyCompoundTag(Suppliers.memoize( + //TODO save -> saveAdditional + () -> tileEntity.save(new net.minecraft.nbt.CompoundTag()))); + private final PaperweightFaweAdapter adapter = ((PaperweightFaweAdapter) WorldEditPlugin + .getInstance() + .getBukkitImplAdapter()); + private final ReadWriteLock sectionLock = new ReentrantReadWriteLock(); + private final ServerLevel serverLevel; + private final int chunkX; + private final int chunkZ; + private final int minHeight; + private final int maxHeight; + private final int minSectionPosition; + private final int maxSectionPosition; + private LevelChunkSection[] sections; + private LevelChunk levelChunk; + private DataLayer[] blockLight; + private DataLayer[] skyLight; + private boolean createCopy = false; + private PaperweightGetBlocks_Copy copy = null; + private boolean forceLoadSections = true; + private boolean lightUpdate = false; + + public PaperweightGetBlocks(World world, int chunkX, int chunkZ) { + this(((CraftWorld) world).getHandle(), chunkX, chunkZ); + } + + public PaperweightGetBlocks(ServerLevel serverLevel, int chunkX, int chunkZ) { + super(serverLevel.getMinBuildHeight() >> 4, (serverLevel.getMaxBuildHeight() - 1) >> 4); + this.serverLevel = serverLevel; + this.chunkX = chunkX; + this.chunkZ = chunkZ; + this.minHeight = serverLevel.getMinBuildHeight(); + this.maxHeight = serverLevel.getMaxBuildHeight() - 1; // Minecraft max limit is exclusive. + this.minSectionPosition = minHeight >> 4; + this.maxSectionPosition = maxHeight >> 4; + this.skyLight = new DataLayer[getSectionCount()]; + this.blockLight = new DataLayer[getSectionCount()]; + } + + public int getChunkX() { + return chunkX; + } + + public int getChunkZ() { + return chunkZ; + } + + @Override + public boolean isCreateCopy() { + return createCopy; + } + + @Override + public void setCreateCopy(boolean createCopy) { + this.createCopy = createCopy; + } + + @Override + public IChunkGet getCopy() { + return copy; + } + + @Override + public void setLightingToGet(char[][] light, int minSectionPosition, int maxSectionPosition) { + if (light != null) { + lightUpdate = true; + try { + fillLightNibble(light, LightLayer.SKY, minSectionPosition, maxSectionPosition); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + + @Override + public void setSkyLightingToGet(char[][] light, int minSectionPosition, int maxSectionPosition) { + if (light != null) { + lightUpdate = true; + try { + fillLightNibble(light, LightLayer.SKY, minSectionPosition, maxSectionPosition); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + + @Override + public void setHeightmapToGet(HeightMapType type, int[] data) { + BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256); + bitArray.fromRaw(data); + Heightmap.Types nativeType = Heightmap.Types.valueOf(type.name()); + Heightmap heightMap = getChunk().heightmaps.get(nativeType); + heightMap.setRawData(getChunk(), nativeType, bitArray.getData()); + } + + @Override + public int getMaxY() { + return maxHeight; + } + + @Override + public int getMinY() { + return minHeight; + } + + @Override + public BiomeType getBiomeType(int x, int y, int z) { + ChunkBiomeContainer index = getChunk().getBiomes(); + Biome biomes = null; + if (y == -1) { + for (y = serverLevel.getMinBuildHeight(); y < serverLevel.getMaxBuildHeight(); y += 4) { + biomes = index.getNoiseBiome(x >> 2, y >> 2, z >> 2); + if (biomes != null) { + break; + } + } + } else { + biomes = index.getNoiseBiome(x >> 2, y >> 2, z >> 2); + } + return biomes != null ? PaperweightPlatformAdapter.adapt(biomes, serverLevel) : null; + } + + @Override + public void removeSectionLighting(int layer, boolean sky) { + SectionPos sectionPos = SectionPos.of(getChunk().getPos(), layer); + DataLayer dataLayer = serverLevel.getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getDataLayerData( + sectionPos); + if (dataLayer != null) { + lightUpdate = true; + synchronized (dataLayer) { + byte[] bytes = PaperLib.isPaper() ? dataLayer.getIfSet() : dataLayer.getData(); + if (!PaperLib.isPaper() || bytes != DataLayer.EMPTY_NIBBLE) { + Arrays.fill(bytes, (byte) 0); + } + } + } + if (sky) { + SectionPos sectionPos1 = SectionPos.of(getChunk().getPos(), layer); + DataLayer dataLayer1 = serverLevel + .getChunkSource() + .getLightEngine() + .getLayerListener(LightLayer.SKY) + .getDataLayerData(sectionPos1); + if (dataLayer1 != null) { + lightUpdate = true; + synchronized (dataLayer1) { + byte[] bytes = PaperLib.isPaper() ? dataLayer1.getIfSet() : dataLayer1.getData(); + if (!PaperLib.isPaper() || bytes != DataLayer.EMPTY_NIBBLE) { + Arrays.fill(bytes, (byte) 0); + } + } + } + } + } + + @Override + //TODO 1.18 be CBT? + public CompoundTag getTile(int x, int y, int z) { + BlockEntity blockEntity = getChunk().getBlockEntity(new BlockPos((x & 15) + ( + chunkX << 4), y, (z & 15) + ( + chunkZ << 4))); + if (blockEntity == null) { + return null; + } + return new PaperweightLazyCompoundTag(Suppliers.memoize(() -> blockEntity.save(new net.minecraft.nbt.CompoundTag()))); + } + + @Override + public Map getTiles() { + Map nmsTiles = getChunk().getBlockEntities(); + if (nmsTiles.isEmpty()) { + return Collections.emptyMap(); + } + return AdaptedMap.immutable(nmsTiles, posNms2We, nmsTile2We); + } + + @Override + public int getSkyLight(int x, int y, int z) { + int layer = y >> 4; + int alayer = layer - getMinSectionPosition(); + if (skyLight[alayer] == null) { + SectionPos sectionPos = SectionPos.of(getChunk().getPos(), layer); + DataLayer dataLayer = + serverLevel.getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getDataLayerData(sectionPos); + // If the server hasn't generated the section's NibbleArray yet, it will be null + if (dataLayer == null) { + byte[] LAYER_COUNT = new byte[2048]; + // Safe enough to assume if it's not created, it's under the sky. Unlikely to be created before lighting is fixed anyway. + Arrays.fill(LAYER_COUNT, (byte) 15); + dataLayer = new DataLayer(LAYER_COUNT); + ((LevelLightEngine) serverLevel.getChunkSource().getLightEngine()).queueSectionData( + LightLayer.BLOCK, + sectionPos, + dataLayer, + true + ); + } + skyLight[alayer] = dataLayer; + } + return skyLight[alayer].get(x & 15, y & 15, z & 15); + } + + @Override + public int getEmittedLight(int x, int y, int z) { + int layer = y >> 4; + int alayer = layer - getMinSectionPosition(); + if (blockLight[alayer] == null) { + serverLevel.getRawBrightness(new BlockPos(1, 1, 1), 5); + SectionPos sectionPos = SectionPos.of(getChunk().getPos(), layer); + DataLayer dataLayer = serverLevel + .getChunkSource() + .getLightEngine() + .getLayerListener(LightLayer.BLOCK) + .getDataLayerData(sectionPos); + // If the server hasn't generated the section's DataLayer yet, it will be null + if (dataLayer == null) { + byte[] LAYER_COUNT = new byte[2048]; + // Safe enough to assume if it's not created, it's under the sky. Unlikely to be created before lighting is fixed anyway. + Arrays.fill(LAYER_COUNT, (byte) 15); + dataLayer = new DataLayer(LAYER_COUNT); + ((LevelLightEngine) serverLevel.getChunkSource().getLightEngine()).queueSectionData(LightLayer.BLOCK, sectionPos, + dataLayer, true + ); + } + blockLight[alayer] = dataLayer; + } + return blockLight[alayer].get(x & 15, y & 15, z & 15); + } + + @Override + public int[] getHeightMap(HeightMapType type) { + long[] longArray = getChunk().heightmaps.get(Heightmap.Types.valueOf(type.name())).getRawData(); + BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256, longArray); + return bitArray.toRaw(new int[256]); + } + + @Override + public CompoundTag getEntity(UUID uuid) { + Entity entity = serverLevel.getEntity(uuid); + if (entity != null) { + org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); + //TODO 1.18 CBT & #getNbt? + return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); + } + for (List entry : /*getChunk().getEntitySlices()*/ new List[0]) { + if (entry != null) { + for (Entity ent : entry) { + if (uuid.equals(ent.getUUID())) { + org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); + return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); + } + } + } + } + return null; + } + + @Override + public Set getEntities() { + List[] slices = /*getChunk().getEntitySlices()*/ new List[0]; + int size = 0; + for (List slice : slices) { + if (slice != null) { + size += slice.size(); + } + } + if (slices.length == 0) { + return Collections.emptySet(); + } + int finalSize = size; + return new AbstractSet() { + @Override + public int size() { + return finalSize; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public boolean contains(Object get) { + if (!(get instanceof CompoundTag getTag)) { + return false; + } + Map value = getTag.getValue(); + CompoundTag getParts = (CompoundTag) value.get("UUID"); + UUID getUUID = new UUID(getParts.getLong("Most"), getParts.getLong("Least")); + for (List slice : slices) { + if (slice != null) { + for (Entity entity : slice) { + UUID uuid = entity.getUUID(); + if (uuid.equals(getUUID)) { + return true; + } + } + } + } + return false; + } + + @NotNull + @Override + public Iterator iterator() { + Iterable result = StreamSupport.stream(Iterables.concat(slices).spliterator(), false).map(input -> { + net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); + return (CompoundTag) adapter.toNative(input.saveWithoutId(tag)); + }).collect(Collectors.toList()); + return result.iterator(); + } + }; + } + + private void removeEntity(Entity entity) { + entity.discard(); + } + + public LevelChunk ensureLoaded(ServerLevel nmsWorld, int chunkX, int chunkZ) { + return PaperweightPlatformAdapter.ensureLoaded(nmsWorld, chunkX, chunkZ); + } + + @Override + public synchronized > T call(IChunkSet set, Runnable finalizer) { + forceLoadSections = false; + copy = createCopy ? new PaperweightGetBlocks_Copy(serverLevel) : null; + try { + ServerLevel nmsWorld = serverLevel; + LevelChunk nmsChunk = ensureLoaded(nmsWorld, chunkX, chunkZ); + boolean fastmode = set.isFastMode() && Settings.IMP.QUEUE.NO_TICK_FASTMODE; + + // Remove existing tiles. Create a copy so that we can remove blocks + Map chunkTiles = new HashMap<>(nmsChunk.getBlockEntities()); + List beacons = null; + if (!chunkTiles.isEmpty()) { + for (Map.Entry entry : chunkTiles.entrySet()) { + final BlockPos pos = entry.getKey(); + final int lx = pos.getX() & 15; + final int ly = pos.getY(); + final int lz = pos.getZ() & 15; + final int layer = ly >> 4; + if (!set.hasSection(layer)) { + continue; + } + + int ordinal = set.getBlock(lx, ly, lz).getOrdinal(); + if (ordinal != 0) { + BlockEntity tile = entry.getValue(); + if (PaperLib.isPaper() && tile instanceof BeaconBlockEntity) { + if (beacons == null) { + beacons = new ArrayList<>(); + } + beacons.add(tile); + PaperweightPlatformAdapter.removeBeacon(tile, nmsChunk); + continue; + } + nmsChunk.removeBlockEntity(tile.getBlockPos()); + if (createCopy) { + copy.storeTile(tile); + } + } + } + } + + int bitMask = 0; + synchronized (nmsChunk) { + LevelChunkSection[] levelChunkSections = nmsChunk.getSections(); + + for (int layerNo = getMinSectionPosition(); layerNo <= getMaxSectionPosition(); layerNo++) { + if (!set.hasSection(layerNo)) { + continue; + } + int layer = layerNo - getMinSectionPosition(); + + bitMask |= 1 << layer; + + char[] tmp = set.load(layerNo); + char[] setArr = new char[4096]; + System.arraycopy(tmp, 0, setArr, 0, 4096); + + // synchronise on internal section to avoid circular locking with a continuing edit if the chunk was + // submitted to keep loaded internal chunks to queue target size. + synchronized (super.sectionLocks[layer]) { + if (createCopy) { + char[] tmpLoad = loadPrivately(layerNo); + char[] copyArr = new char[4096]; + System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); + copy.storeSection(layer, copyArr); + } + + LevelChunkSection newSection; + LevelChunkSection existingSection = levelChunkSections[layer]; + if (existingSection == null) { + newSection = PaperweightPlatformAdapter.newChunkSection(layerNo, setArr, fastmode, adapter); + if (PaperweightPlatformAdapter.setSectionAtomic(levelChunkSections, null, newSection, layer)) { + updateGet(nmsChunk, levelChunkSections, newSection, setArr, layer); + continue; + } else { + existingSection = levelChunkSections[layer]; + if (existingSection == null) { + LOGGER.error("Skipping invalid null section. chunk: {}, {} layer: {}", chunkX, chunkZ, + +layer + ); + continue; + } + } + } + PaperweightPlatformAdapter.fieldTickingBlockCount.set(existingSection, (short) 0); + + //ensure that the server doesn't try to tick the chunksection while we're editing it. + DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(existingSection); + + synchronized (lock) { + // lock.acquire(); + try { + sectionLock.writeLock().lock(); + if (this.getChunk() != nmsChunk) { + this.levelChunk = nmsChunk; + this.sections = null; + this.reset(); + } else if (existingSection != getSections(false)[layer]) { + this.sections[layer] = existingSection; + this.reset(); + } else if (!Arrays.equals(update(layer, new char[4096], true), loadPrivately(layerNo))) { + this.reset(layerNo); + /*} else if (lock.isModified()) { + this.reset(layerNo);*/ + } + } finally { + sectionLock.writeLock().unlock(); + } + newSection = + PaperweightPlatformAdapter.newChunkSection( + layerNo, + this::loadPrivately, + setArr, + fastmode, + adapter + ); + if (!PaperweightPlatformAdapter.setSectionAtomic( + levelChunkSections, + existingSection, + newSection, + layer + )) { + LOGGER.error("Skipping invalid null section. chunk: {}, {} layer: {}", chunkX, chunkZ, + +layer + ); + } else { + updateGet(nmsChunk, levelChunkSections, newSection, setArr, layer); + } + } + } + } + + // Biomes + BiomeType[] biomes = set.getBiomes(); + if (biomes != null) { + // set biomes + ChunkBiomeContainer currentBiomes = nmsChunk.getBiomes(); + if (createCopy) { + copy.storeBiomes(currentBiomes); + } + for (int y = 0, i = 0; y < 64; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++, i++) { + final BiomeType biome = biomes[i]; + if (biome != null) { + Biome nmsBiome = + nmsWorld.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).get( + ResourceLocation.tryParse(biome.getId())); + if (nmsBiome == null) { + throw new NullPointerException("BiomeBase null for BiomeType " + biome.getId()); + } + currentBiomes.setBiome(x, y, z, nmsBiome); + } + } + } + } + } + + Map heightMaps = set.getHeightMaps(); + for (Map.Entry entry : heightMaps.entrySet()) { + PaperweightGetBlocks.this.setHeightmapToGet(entry.getKey(), entry.getValue()); + } + PaperweightGetBlocks.this.setLightingToGet( + set.getLight(), + set.getMinSectionPosition(), + set.getMaxSectionPosition() + ); + PaperweightGetBlocks.this.setSkyLightingToGet( + set.getSkyLight(), + set.getMinSectionPosition(), + set.getMaxSectionPosition() + ); + + Runnable[] syncTasks = null; + + int bx = chunkX << 4; + int bz = chunkZ << 4; + + // Call beacon deactivate events here synchronously + // list will be null on spigot, so this is an implicit isPaper check + if (beacons != null && !beacons.isEmpty()) { + final List finalBeacons = beacons; + + syncTasks = new Runnable[4]; + + syncTasks[3] = () -> { + for (BlockEntity beacon : finalBeacons) { + BeaconBlockEntity.playSound(beacon.getLevel(), beacon.getBlockPos(), SoundEvents.BEACON_DEACTIVATE); + new BeaconDeactivatedEvent(CraftBlock.at(beacon.getLevel(), beacon.getBlockPos())).callEvent(); + } + }; + } + + Set entityRemoves = set.getEntityRemoves(); + if (entityRemoves != null && !entityRemoves.isEmpty()) { + if (syncTasks == null) { + syncTasks = new Runnable[3]; + } + + syncTasks[2] = () -> { + final List[] entities = /*nmsChunk.e()*/ new List[0]; + + for (final Collection ents : entities) { + if (!ents.isEmpty()) { + final Iterator iter = ents.iterator(); + while (iter.hasNext()) { + final Entity entity = iter.next(); + if (entityRemoves.contains(entity.getUUID())) { + if (createCopy) { + copy.storeEntity(entity); + } + iter.remove(); + removeEntity(entity); + } + } + } + } + }; + } + + Set entities = set.getEntities(); + if (entities != null && !entities.isEmpty()) { + if (syncTasks == null) { + syncTasks = new Runnable[2]; + } + + syncTasks[1] = () -> { + //TODO 1.18 be a CBT & ListBinaryTag ? + for (final CompoundTag nativeTag : entities) { + final Map entityTagMap = nativeTag.getValue(); + final StringTag idTag = (StringTag) entityTagMap.get("Id"); + final ListTag posTag = (ListTag) entityTagMap.get("Pos"); + final ListTag rotTag = (ListTag) entityTagMap.get("Rotation"); + if (idTag == null || posTag == null || rotTag == null) { + LOGGER.error("Unknown entity tag: {}", nativeTag); + continue; + } + final double x = posTag.getDouble(0); + final double y = posTag.getDouble(1); + final double z = posTag.getDouble(2); + final float yaw = rotTag.getFloat(0); + final float pitch = rotTag.getFloat(1); + final String id = idTag.getValue(); + + EntityType type = EntityType.byString(id).orElse(null); + if (type != null) { + Entity entity = type.create(nmsWorld); + if (entity != null) { + final net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative( + nativeTag); + for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.remove(name); + } + entity.load(tag); + entity.absMoveTo(x, y, z, yaw, pitch); + nmsWorld.addEntity(entity, CreatureSpawnEvent.SpawnReason.CUSTOM); + } + } + } + }; + + } + + // set tiles + Map tiles = set.getTiles(); + if (tiles != null && !tiles.isEmpty()) { + if (syncTasks == null) { + syncTasks = new Runnable[1]; + } + + syncTasks[0] = () -> { + for (final Map.Entry entry : tiles.entrySet()) { + final CompoundTag nativeTag = entry.getValue(); + final BlockVector3 blockHash = entry.getKey(); + final int x = blockHash.getX() + bx; + final int y = blockHash.getY(); + final int z = blockHash.getZ() + bz; + final BlockPos pos = new BlockPos(x, y, z); + + synchronized (nmsWorld) { + BlockEntity tileEntity = nmsWorld.getBlockEntity(pos); + if (tileEntity == null || tileEntity.isRemoved()) { + nmsWorld.removeBlockEntity(pos); + tileEntity = nmsWorld.getBlockEntity(pos); + } + if (tileEntity != null) { + final net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative( + nativeTag); + tag.put("x", IntTag.valueOf(x)); + tag.put("y", IntTag.valueOf(y)); + tag.put("z", IntTag.valueOf(z)); + tileEntity.load(tag); + } + } + } + }; + } + + Runnable callback; + if (bitMask == 0 && biomes == null && !lightUpdate) { + callback = null; + } else { + int finalMask = bitMask != 0 ? bitMask : lightUpdate ? set.getBitMask() : 0; + boolean finalLightUpdate = lightUpdate; + callback = () -> { + // Set Modified + nmsChunk.setLightCorrect(true); // Set Modified + nmsChunk.mustNotSave = false; + nmsChunk.isUnsaved(); // TODO 1.18 revisit + // send to player + if (Settings.IMP.LIGHTING.MODE == 0 || !Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) { + this.send(finalMask, finalLightUpdate); + } + if (finalizer != null) { + finalizer.run(); + } + }; + } + if (syncTasks != null) { + QueueHandler queueHandler = Fawe.get().getQueueHandler(); + Runnable[] finalSyncTasks = syncTasks; + + // Chain the sync tasks and the callback + //TODO 1.18 address raw access + Callable chain = () -> { + try { + // Run the sync tasks + for (Runnable task : finalSyncTasks) { + if (task != null) { + task.run(); + } + } + if (callback == null) { + if (finalizer != null) { + finalizer.run(); + } + return null; + } else { + return queueHandler.async(callback, null); + } + } catch (Throwable e) { + e.printStackTrace(); + throw e; + } + }; + return (T) (Future) queueHandler.sync(chain); + } else { + if (callback == null) { + if (finalizer != null) { + finalizer.run(); + } + } else { + callback.run(); + } + } + } + return null; + } catch (Throwable e) { + e.printStackTrace(); + return null; + } finally { + forceLoadSections = true; + } + } + + private void updateGet( + LevelChunk nmsChunk, + LevelChunkSection[] chunkSections, + LevelChunkSection section, + char[] arr, + int layer + ) { + try { + sectionLock.writeLock().lock(); + if (this.getChunk() != nmsChunk) { + this.levelChunk = nmsChunk; + this.sections = new LevelChunkSection[chunkSections.length]; + System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); + this.reset(); + } + if (this.sections == null) { + this.sections = new LevelChunkSection[chunkSections.length]; + System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); + } + if (this.sections[layer] != section) { + // Not sure why it's funky, but it's what I did in commit fda7d00747abe97d7891b80ed8bb88d97e1c70d1 and I don't want to touch it >dords + this.sections[layer] = new LevelChunkSection[]{section}.clone()[0]; + } + } finally { + sectionLock.writeLock().unlock(); + } + this.blocks[layer] = arr; + } + + private char[] loadPrivately(int layer) { + layer -= getMinSectionPosition(); + if (super.sections[layer] != null) { + synchronized (super.sectionLocks[layer]) { + if (super.sections[layer].isFull() && super.blocks[layer] != null) { + char[] blocks = new char[4096]; + System.arraycopy(super.blocks[layer], 0, blocks, 0, 4096); + return blocks; + } + } + } + return PaperweightGetBlocks.this.update(layer, null, true); + } + + @Override + public synchronized void send(int mask, boolean lighting) { + PaperweightPlatformAdapter.sendChunk(serverLevel, chunkX, chunkZ, lighting); + } + + /** + * Update a given (nullable) data array to the current data stored in the server's chunk, associated with this + * {@link PaperweightPlatformAdapter} instance. Not synchronised to the {@link PaperweightPlatformAdapter} instance as synchronisation + * is handled where necessary in the method, and should otherwise be handled correctly by this method's caller. + * + * @param layer layer index (0 may denote a negative layer in the world, e.g. at y=-32) + * @param data array to be updated/filled with data or null + * @param aggressive if the cached section array should be re-acquired. + * @return the given array to be filled with data, or a new array if null is given. + */ + @Override + public char[] update(int layer, char[] data, boolean aggressive) { + LevelChunkSection section = getSections(aggressive)[layer]; + // Section is null, return empty array + if (section == null) { + data = new char[4096]; + Arrays.fill(data, (char) 1); + return data; + } + if (data != null && data.length != 4096) { + data = new char[4096]; + Arrays.fill(data, (char) 1); + } + if (data == null || data == FaweCache.IMP.EMPTY_CHAR_4096) { + data = new char[4096]; + Arrays.fill(data, (char) 1); + } + DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section); + synchronized (lock) { + // Efficiently convert ChunkSection to raw data + try { + lock.acquire(); + + final PalettedContainer blocks = section.getStates(); + final BitStorage bits = (BitStorage) PaperweightPlatformAdapter.fieldStorage.get(blocks); + final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get(blocks); + + final int bitsPerEntry = (int) PaperweightPlatformAdapter.fieldBitsPerEntry.get(bits); + final long[] blockStates = bits.getRaw(); + + new BitArrayUnstretched(bitsPerEntry, 4096, blockStates).toRaw(data); + + int num_palette; + if (palette instanceof LinearPalette || palette instanceof HashMapPalette) { + num_palette = palette.getSize(); + } else { + // The section's palette is the global block palette. + for (int i = 0; i < 4096; i++) { + char paletteVal = data[i]; + char ordinal = adapter.ibdIDToOrdinal(paletteVal); + // Don't read "empty". + data[i] = ordinal == 0 ? 1 : ordinal; + } + return data; + } + + char[] paletteToOrdinal = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); + try { + if (num_palette != 1) { + for (int i = 0; i < num_palette; i++) { + char ordinal = ordinal(palette.valueFor(i), adapter); + paletteToOrdinal[i] = ordinal; + } + for (int i = 0; i < 4096; i++) { + char paletteVal = data[i]; + char val = paletteToOrdinal[paletteVal]; + if (val == Character.MAX_VALUE) { + val = ordinal(palette.valueFor(i), adapter); + paletteToOrdinal[i] = val; + } + // Don't read "empty". + if (val == 0) { + val = 1; + } + data[i] = val; + } + } else { + char ordinal = ordinal(palette.valueFor(0), adapter); + // Don't read "empty". + if (ordinal == 0) { + ordinal = 1; + } + Arrays.fill(data, ordinal); + } + } finally { + for (int i = 0; i < num_palette; i++) { + paletteToOrdinal[i] = Character.MAX_VALUE; + } + } + return data; + } catch (IllegalAccessException | InterruptedException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } finally { + lock.release(); + } + } + } + + private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) { + if (ibd == null) { + return BlockTypes.AIR.getDefaultState().getOrdinalChar(); + } else { + return adapter.adaptToChar(ibd); + } + } + + public LevelChunkSection[] getSections(boolean force) { + force &= forceLoadSections; + sectionLock.readLock().lock(); + LevelChunkSection[] tmp = sections; + sectionLock.readLock().unlock(); + if (tmp == null || force) { + try { + sectionLock.writeLock().lock(); + tmp = sections; + if (tmp == null || force) { + LevelChunkSection[] chunkSections = getChunk().getSections(); + tmp = new LevelChunkSection[chunkSections.length]; + System.arraycopy(chunkSections, 0, tmp, 0, chunkSections.length); + sections = tmp; + } + } finally { + sectionLock.writeLock().unlock(); + } + } + return tmp; + } + + public LevelChunk getChunk() { + LevelChunk levelChunk = this.levelChunk; + if (levelChunk == null) { + synchronized (this) { + levelChunk = this.levelChunk; + if (levelChunk == null) { + this.levelChunk = levelChunk = ensureLoaded(this.serverLevel, chunkX, chunkZ); + } + } + } + return levelChunk; + } + + private void fillLightNibble(char[][] light, LightLayer lightLayer, int minSectionPosition, int maxSectionPosition) { + for (int Y = 0; Y <= maxSectionPosition - minSectionPosition; Y++) { + if (light[Y] == null) { + continue; + } + SectionPos sectionPos = SectionPos.of(levelChunk.getPos(), Y + minSectionPosition); + DataLayer dataLayer = serverLevel.getChunkSource().getLightEngine().getLayerListener(lightLayer).getDataLayerData( + sectionPos); + if (dataLayer == null) { + byte[] LAYER_COUNT = new byte[2048]; + Arrays.fill(LAYER_COUNT, lightLayer == LightLayer.SKY ? (byte) 15 : (byte) 0); + dataLayer = new DataLayer(LAYER_COUNT); + ((LevelLightEngine) serverLevel.getChunkSource().getLightEngine()).queueSectionData( + lightLayer, + sectionPos, + dataLayer, + true + ); + } + synchronized (dataLayer) { + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for (int z = 0; z < 16; z++) { + int i = y << 8 | z << 4 | x; + if (light[Y][i] < 16) { + dataLayer.set(x, y, z, light[Y][i]); + } + } + } + } + } + } + } + + @Override + public boolean hasSection(int layer) { + layer -= getMinSectionPosition(); + return getSections(false)[layer] != null; + } + + @Override + public synchronized boolean trim(boolean aggressive) { + skyLight = new DataLayer[getSectionCount()]; + blockLight = new DataLayer[getSectionCount()]; + if (aggressive) { + sectionLock.writeLock().lock(); + sections = null; + levelChunk = null; + sectionLock.writeLock().unlock(); + return super.trim(true); + } else if (sections == null) { + // don't bother trimming if there are no sections stored. + return true; + } else { + for (int i = getMinSectionPosition(); i <= getMaxSectionPosition(); i++) { + int layer = i - getMinSectionPosition(); + if (!hasSection(i) || !super.sections[layer].isFull()) { + continue; + } + LevelChunkSection existing = getSections(true)[layer]; + try { + final PalettedContainer blocksExisting = existing.getStates(); + + final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get( + blocksExisting); + int paletteSize; + + if (palette instanceof LinearPalette || palette instanceof HashMapPalette) { + paletteSize = palette.getSize(); + } else { + super.trim(false, i); + continue; + } + if (paletteSize == 1) { + //If the cached palette size is 1 then no blocks can have been changed i.e. do not need to update these chunks. + continue; + } + super.trim(false, i); + } catch (IllegalAccessException ignored) { + super.trim(false, i); + } + } + return true; + } + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java new file mode 100644 index 000000000..2915de82e --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java @@ -0,0 +1,253 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; +import com.fastasyncworldedit.core.queue.IBlocks; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.queue.IChunkSet; +import com.google.common.base.Suppliers; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; +import com.sk89q.worldedit.math.BlockVector3; +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.BlockTypesCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.ChunkBiomeContainer; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Future; + +public class PaperweightGetBlocks_Copy implements IChunkGet { + + private final Map tiles = new HashMap<>(); + private final Set entities = new HashSet<>(); + private final char[][] blocks; + private final int minHeight; + private final int maxHeight; + private final ServerLevel serverLevel; + private ChunkBiomeContainer chunkBiomeContainer; + + protected PaperweightGetBlocks_Copy(ServerLevel world) { + this.serverLevel = world; + this.minHeight = world.getMinBuildHeight(); + this.maxHeight = world.getMaxBuildHeight() - 1; // Minecraft max limit is exclusive. + this.blocks = new char[getSectionCount()][]; + } + + protected void storeTile(BlockEntity blockEntity) { + tiles.put( + BlockVector3.at( + blockEntity.getBlockPos().getX(), + blockEntity.getBlockPos().getY(), + blockEntity.getBlockPos().getZ() + ), + new PaperweightLazyCompoundTag(Suppliers.memoize(() -> blockEntity.save(new net.minecraft.nbt.CompoundTag()))) + //TODO 1.18 save -> saveAdditional + ); + } + + @Override + public Map getTiles() { + return tiles; + } + + @Override + @Nullable + public CompoundTag getTile(int x, int y, int z) { + return tiles.get(BlockVector3.at(x, y, z)); + } + + protected void storeEntity(Entity entity) { + //TODO 1.18 address raw access & possibly be a CBT ? + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag(); + entities.add((CompoundTag) adapter.toNative(entity.save(compoundTag))); + } + + @Override + public Set getEntities() { + return this.entities; + } + + @Override + public CompoundTag getEntity(UUID uuid) { + for (CompoundTag tag : entities) { + UUID tagUUID; + if (tag.containsKey("UUID")) { + int[] arr = tag.getIntArray("UUID"); + tagUUID = new UUID((long) arr[0] << 32 | (arr[1] & 0xFFFFFFFFL), (long) arr[2] << 32 | (arr[3] & 0xFFFFFFFFL)); + } else if (tag.containsKey("UUIDMost")) { + tagUUID = new UUID(tag.getLong("UUIDMost"), tag.getLong("UUIDLeast")); + } else if (tag.containsKey("PersistentIDMSB")) { + tagUUID = new UUID(tag.getLong("PersistentIDMSB"), tag.getLong("PersistentIDLSB")); + } else { + return null; + } + if (uuid.equals(tagUUID)) { + return tag; + } + } + return null; + } + + @Override + public boolean isCreateCopy() { + return false; + } + + @Override + public void setCreateCopy(boolean createCopy) { + } + + @Override + public void setLightingToGet(char[][] lighting, int minSectionPosition, int maxSectionPosition) { + } + + @Override + public void setSkyLightingToGet(char[][] lighting, int minSectionPosition, int maxSectionPosition) { + } + + @Override + public void setHeightmapToGet(HeightMapType type, int[] data) { + } + + @Override + public int getMaxY() { + return maxHeight; + } + + @Override + public int getMinY() { + return minHeight; + } + + @Override + public int getMaxSectionPosition() { + return maxHeight >> 4; + } + + @Override + public int getMinSectionPosition() { + return minHeight >> 4; + } + + protected void storeBiomes(ChunkBiomeContainer chunkBiomeContainer) { + // The to do one line below is pre-paperweight and needs to be revised + // TODO revisit last parameter, BiomeStorage[] *would* be more efficient + this.chunkBiomeContainer = new ChunkBiomeContainer(chunkBiomeContainer.biomeRegistry, serverLevel, + chunkBiomeContainer.writeBiomes() + ); + } + + @Override + public BiomeType getBiomeType(int x, int y, int z) { + Biome biome = null; + if (y == -1) { + for (y = serverLevel.getMinBuildHeight(); y <= serverLevel.getMaxBuildHeight(); y += 4) { + biome = this.chunkBiomeContainer.getNoiseBiome(x >> 2, y >> 2, z >> 2); + if (biome != null) { + break; + } + } + } else { + biome = this.chunkBiomeContainer.getNoiseBiome(x >> 2, y >> 2, z >> 2); + } + return biome != null ? PaperweightPlatformAdapter.adapt(biome, serverLevel) : null; + } + + @Override + public void removeSectionLighting(int layer, boolean sky) { + } + + @Override + public boolean trim(boolean aggressive, int layer) { + return false; + } + + @Override + public IBlocks reset() { + return null; + } + + @Override + public int getSectionCount() { + return serverLevel.getSectionsCount(); + } + + protected void storeSection(int layer, char[] data) { + blocks[layer] = data; + } + + @Override + public BaseBlock getFullBlock(int x, int y, int z) { + BlockState state = BlockTypesCache.states[get(x, y, z)]; + return state.toBaseBlock(this, x, y, z); + } + + @Override + public boolean hasSection(int layer) { + layer -= getMinSectionPosition(); + return blocks[layer] != null; + } + + @Override + public char[] load(int layer) { + layer -= getMinSectionPosition(); + return blocks[layer]; + } + + @Override + public char[] loadIfPresent(int layer) { + layer -= getMinSectionPosition(); + return blocks[layer]; + } + + @Override + public BlockState getBlock(int x, int y, int z) { + return BlockTypesCache.states[get(x, y, z)]; + } + + @Override + public int getSkyLight(int x, int y, int z) { + return 0; + } + + @Override + public int getEmittedLight(int x, int y, int z) { + return 0; + } + + @Override + public int[] getHeightMap(HeightMapType type) { + return new int[0]; + } + + @Override + public > T call(IChunkSet set, Runnable finalize) { + return null; + } + + public char get(int x, int y, int z) { + final int layer = (y >> 4) - getMinSectionPosition(); + final int index = (y & 15) << 8 | z << 4 | x; + return blocks[layer][index]; + } + + + @Override + public boolean trim(boolean aggressive) { + return false; + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java new file mode 100644 index 000000000..093648f3e --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java @@ -0,0 +1,32 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.bukkit.adapter.MapChunkUtil; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; + +public class PaperweightMapChunkUtil extends MapChunkUtil { + + public PaperweightMapChunkUtil() throws NoSuchFieldException { + fieldX = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("TWO_MEGABYTES", "a")); + fieldZ = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("x", "b")); + fieldBitMask = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("z", "c")); + fieldHeightMap = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("availableSections", "d")); + fieldChunkData = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("biomes", "f")); + fieldBlockEntities = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("buffer", "g")); + fieldFull = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("blockEntitiesTags", "h")); + fieldX.setAccessible(true); + fieldZ.setAccessible(true); + fieldBitMask.setAccessible(true); + fieldHeightMap.setAccessible(true); + fieldChunkData.setAccessible(true); + fieldBlockEntities.setAccessible(true); + fieldFull.setAccessible(true); + } + + @Override + public ClientboundLevelChunkPacketData createPacket() { + // TODO ??? return new ClientboundLevelChunkPacket(); + throw new UnsupportedOperationException(); + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java new file mode 100644 index 000000000..ce8e613e8 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java @@ -0,0 +1,449 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; +import com.fastasyncworldedit.bukkit.adapter.DelegateSemaphore; +import com.fastasyncworldedit.bukkit.adapter.NMSAdapter; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.math.BitArrayUnstretched; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.TaskManager; +import com.mojang.datafixers.util.Either; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.math.BlockVector3; +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.block.BlockTypesCache; +import io.papermc.lib.PaperLib; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.core.SectionPos; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; +import net.minecraft.network.protocol.game.ClientboundLightUpdatePacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.BitStorage; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import net.minecraft.world.level.chunk.HashMapPalette; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.LinearPalette; +import net.minecraft.world.level.chunk.Palette; +import net.minecraft.world.level.chunk.PalettedContainer; +import net.minecraft.world.level.gameevent.GameEventDispatcher; +import net.minecraft.world.level.gameevent.GameEventListener; +import org.bukkit.craftbukkit.v1_18_R1.CraftChunk; +import sun.misc.Unsafe; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Semaphore; +import java.util.function.Function; +import java.util.stream.Stream; + +public final class PaperweightPlatformAdapter extends NMSAdapter { + + public static final Field fieldStorage; + public static final Field fieldPalette; + public static final Field fieldBits; + + public static final Field fieldBitsPerEntry; + + public static final Field fieldTickingFluidContent; + public static final Field fieldTickingBlockCount; + public static final Field fieldNonEmptyBlockCount; + + private static final Field fieldBiomes; + + private static final MethodHandle methodGetVisibleChunk; + + private static final int CHUNKSECTION_BASE; + private static final int CHUNKSECTION_SHIFT; + + private static final Field fieldLock; + private static final long fieldLockOffset; + + private static final Field fieldGameEventDispatcherSections; + private static final MethodHandle methodremoveTickingBlockEntity; + + private static final Field fieldRemove; + + static { + try { + fieldBits = PalettedContainer.class.getDeclaredField(Refraction.pickName("bits", "l")); + fieldBits.setAccessible(true); + fieldStorage = PalettedContainer.class.getDeclaredField(Refraction.pickName("storage", "c")); + fieldStorage.setAccessible(true); + fieldPalette = PalettedContainer.class.getDeclaredField(Refraction.pickName("palette", "k")); + fieldPalette.setAccessible(true); + + fieldBitsPerEntry = BitStorage.class.getDeclaredField(Refraction.pickName("bits", "c")); + fieldBitsPerEntry.setAccessible(true); + + fieldTickingFluidContent = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingFluidCount", "h")); + fieldTickingFluidContent.setAccessible(true); + fieldTickingBlockCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingBlockCount", "g")); + fieldTickingBlockCount.setAccessible(true); + fieldNonEmptyBlockCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("nonEmptyBlockCount", "f")); + fieldNonEmptyBlockCount.setAccessible(true); + + fieldBiomes = ChunkBiomeContainer.class.getDeclaredField(Refraction.pickName("biomes", "f")); + fieldBiomes.setAccessible(true); + + Method getVisibleChunkIfPresent = ChunkMap.class.getDeclaredMethod(Refraction.pickName( + "getVisibleChunkIfPresent", + "getVisibleChunk" + ), long.class); + getVisibleChunkIfPresent.setAccessible(true); + methodGetVisibleChunk = MethodHandles.lookup().unreflect(getVisibleChunkIfPresent); + + Unsafe unsafe = ReflectionUtils.getUnsafe(); + fieldLock = PalettedContainer.class.getDeclaredField(Refraction.pickName("lock", "m")); + fieldLockOffset = unsafe.objectFieldOffset(fieldLock); + + fieldGameEventDispatcherSections = LevelChunk.class.getDeclaredField(Refraction.pickName( + "gameEventDispatcherSections", "x")); + fieldGameEventDispatcherSections.setAccessible(true); + Method removeBlockEntityTicker = LevelChunk.class.getDeclaredMethod( + Refraction.pickName( + "removeBlockEntityTicker", + "l" + ), BlockPos.class + ); + removeBlockEntityTicker.setAccessible(true); + methodremoveTickingBlockEntity = MethodHandles.lookup().unreflect(removeBlockEntityTicker); + + fieldRemove = BlockEntity.class.getDeclaredField(Refraction.pickName("remove", "p")); + fieldRemove.setAccessible(true); + + CHUNKSECTION_BASE = unsafe.arrayBaseOffset(LevelChunkSection[].class); + int scale = unsafe.arrayIndexScale(LevelChunkSection[].class); + if ((scale & (scale - 1)) != 0) { + throw new Error("data type scale not a power of two"); + } + CHUNKSECTION_SHIFT = 31 - Integer.numberOfLeadingZeros(scale); + } catch (RuntimeException e) { + throw e; + } catch (Throwable rethrow) { + rethrow.printStackTrace(); + throw new RuntimeException(rethrow); + } + } + + static boolean setSectionAtomic( + LevelChunkSection[] sections, + LevelChunkSection expected, + LevelChunkSection value, + int layer + ) { + long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; + if (layer >= 0 && layer < sections.length) { + return ReflectionUtils.getUnsafe().compareAndSwapObject(sections, offset, expected, value); + } + return false; + } + + static DelegateSemaphore applyLock(LevelChunkSection section) { + //todo there has to be a better way to do this. Maybe using a() in DataPaletteBlock which acquires the lock in NMS? + try { + synchronized (section) { + Unsafe unsafe = ReflectionUtils.getUnsafe(); + PalettedContainer blocks = section.getStates(); + Semaphore currentLock = (Semaphore) unsafe.getObject(blocks, fieldLockOffset); + if (currentLock instanceof DelegateSemaphore) { + return (DelegateSemaphore) currentLock; + } + DelegateSemaphore newLock = new DelegateSemaphore(1, currentLock); + unsafe.putObject(blocks, fieldLockOffset, newLock); + return newLock; + } + } catch (Throwable e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public static LevelChunk ensureLoaded(ServerLevel serverLevel, int chunkX, int chunkZ) { + if (!PaperLib.isPaper()) { + LevelChunk nmsChunk = serverLevel.getChunkSource().getChunk(chunkX, chunkZ, false); + if (nmsChunk != null) { + return nmsChunk; + } + if (Fawe.isMainThread()) { + return serverLevel.getChunk(chunkX, chunkZ); + } + } else { + LevelChunk nmsChunk = serverLevel.getChunkSource().getChunkAtIfCachedImmediately(chunkX, chunkZ); + if (nmsChunk != null) { + return nmsChunk; + } + nmsChunk = serverLevel.getChunkSource().getChunkAtIfLoadedImmediately(chunkX, chunkZ); + if (nmsChunk != null) { + return nmsChunk; + } + // Avoid "async" methods from the main thread. + if (Fawe.isMainThread()) { + return serverLevel.getChunk(chunkX, chunkZ); + } + CompletableFuture future = serverLevel.getWorld().getChunkAtAsync(chunkX, chunkZ, true, true); + try { + CraftChunk chunk = (CraftChunk) future.get(); + return chunk.getHandle(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + return TaskManager.IMP.sync(() -> serverLevel.getChunk(chunkX, chunkZ)); + } + + public static ChunkHolder getPlayerChunk(ServerLevel nmsWorld, final int chunkX, final int chunkZ) { + ChunkMap chunkMap = nmsWorld.getChunkSource().chunkMap; + try { + return (ChunkHolder) methodGetVisibleChunk.invoke(chunkMap, ChunkPos.asLong(chunkX, chunkZ)); + } catch (Throwable thr) { + throw new RuntimeException(thr); + } + } + + public static void sendChunk(ServerLevel nmsWorld, int chunkX, int chunkZ, boolean lighting) { + ChunkHolder chunkHolder = getPlayerChunk(nmsWorld, chunkX, chunkZ); + if (chunkHolder == null) { + return; + } + ChunkPos coordIntPair = new ChunkPos(chunkX, chunkZ); + // UNLOADED_CHUNK + Optional optional = ((Either) chunkHolder + .getTickingChunkFuture() + .getNow(ChunkHolder.UNLOADED_LEVEL_CHUNK)).left(); + if (PaperLib.isPaper()) { + // getChunkAtIfLoadedImmediately is paper only + optional = optional.or(() -> Optional.ofNullable(nmsWorld + .getChunkSource() + .getChunkAtIfLoadedImmediately(chunkX, chunkZ))); + } + if (optional.isEmpty()) { + return; + } + LevelChunk levelChunk = optional.get(); + TaskManager.IMP.task(() -> { + ClientboundLevelChunkPacketData chunkPacket = new ClientboundLevelChunkPacketData(levelChunk); + nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(chunkPacket)); + if (lighting) { + //This needs to be true otherwise Minecraft will update lighting from/at the chunk edges (bad) + boolean trustEdges = true; + ClientboundLightUpdatePacket packet = + new ClientboundLightUpdatePacket(coordIntPair, nmsWorld.getChunkSource().getLightEngine(), null, null, + trustEdges + ); + nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(packet)); + } + }); + } + + private static Stream nearbyPlayers(ServerLevel serverLevel, ChunkPos coordIntPair) { + return serverLevel.getChunkSource().chunkMap.getPlayers(coordIntPair, false); + } + + /* + NMS conversion + */ + public static LevelChunkSection newChunkSection( + final int layer, final char[] blocks, boolean fastmode, + CachedBukkitAdapter adapter + ) { + return newChunkSection(layer, null, blocks, fastmode, adapter); + } + + public static LevelChunkSection newChunkSection( + final int layer, final Function get, char[] set, + boolean fastmode, CachedBukkitAdapter adapter + ) { + if (set == null) { + return newChunkSection(layer); + } + final int[] blockToPalette = FaweCache.IMP.BLOCK_TO_PALETTE.get(); + final int[] paletteToBlock = FaweCache.IMP.PALETTE_TO_BLOCK.get(); + final long[] blockStates = FaweCache.IMP.BLOCK_STATES.get(); + final int[] blocksCopy = FaweCache.IMP.SECTION_BLOCKS.get(); + try { + int[] num_palette_buffer = new int[1]; + Map ticking_blocks = new HashMap<>(); + int air; + if (get == null) { + air = createPalette(blockToPalette, paletteToBlock, blocksCopy, num_palette_buffer, + set, ticking_blocks, fastmode, adapter + ); + } else { + air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, + num_palette_buffer, get, set, ticking_blocks, fastmode, adapter + ); + } + int num_palette = num_palette_buffer[0]; + // BlockStates + int bitsPerEntry = MathMan.log2nlz(num_palette - 1); + if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { + bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry + } else { + bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries + } + if (bitsPerEntry > 8) { + bitsPerEntry = MathMan.log2nlz(Block.BLOCK_STATE_REGISTRY.size() - 1); + } + + final int blocksPerLong = MathMan.floorZero((double) 64 / bitsPerEntry); + final int blockBitArrayEnd = MathMan.ceilZero((float) 4096 / blocksPerLong); + + if (num_palette == 1) { + for (int i = 0; i < blockBitArrayEnd; i++) { + blockStates[i] = 0; + } + } else { + final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntry, 4096, blockStates); + bitArray.fromRaw(blocksCopy); + } + + LevelChunkSection levelChunkSection = newChunkSection(layer); + // set palette & data bits + final PalettedContainer dataPaletteBlocks = + levelChunkSection.getStates(); + // private DataPalette h; + // protected DataBits a; + final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); + final BitStorage nmsBits = new BitStorage(bitsPerEntry, 4096, bits); + final Palette blockStatePalettedContainer; + if (bitsPerEntry <= 4) { + blockStatePalettedContainer = new LinearPalette<>(Block.BLOCK_STATE_REGISTRY, bitsPerEntry, dataPaletteBlocks, + NbtUtils::readBlockState + ); + } else if (bitsPerEntry < 9) { + blockStatePalettedContainer = new HashMapPalette<>( + Block.BLOCK_STATE_REGISTRY, + bitsPerEntry, + dataPaletteBlocks, + NbtUtils::readBlockState, + NbtUtils::writeBlockState + ); + } else { + blockStatePalettedContainer = LevelChunkSection.GLOBAL_BLOCKSTATE_PALETTE; + } + + // set palette if required + if (bitsPerEntry < 9) { + for (int i = 0; i < num_palette; i++) { + final int ordinal = paletteToBlock[i]; + blockToPalette[ordinal] = Integer.MAX_VALUE; + final BlockState state = BlockTypesCache.states[ordinal]; + final net.minecraft.world.level.block.state.BlockState blockState = ((PaperweightBlockMaterial) state.getMaterial()).getState(); + blockStatePalettedContainer.idFor(blockState); + } + } + try { + fieldStorage.set(dataPaletteBlocks, nmsBits); + fieldPalette.set(dataPaletteBlocks, blockStatePalettedContainer); + fieldBits.set(dataPaletteBlocks, bitsPerEntry); + setCount(ticking_blocks.size(), 4096 - air, levelChunkSection); + if (!fastmode) { + ticking_blocks.forEach((pos, ordinal) -> levelChunkSection + .setBlockState(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), + Block.stateById(ordinal) + )); + } + } catch (final IllegalAccessException e) { + throw new RuntimeException(e); + } + + return levelChunkSection; + } catch (final Throwable e) { + Arrays.fill(blockToPalette, Integer.MAX_VALUE); + throw e; + } + } + + private static LevelChunkSection newChunkSection(int layer) { + return new LevelChunkSection(layer); + } + + public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final LevelChunkSection section) throws + IllegalAccessException { + fieldTickingFluidContent.setShort(section, (short) 0); // TODO FIXME + fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); + fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); + } + + public static Biome[] getBiomeArray(ChunkBiomeContainer chunkBiomeContainer) { + try { + return (Biome[]) fieldBiomes.get(chunkBiomeContainer); + } catch (IllegalAccessException e) { + e.printStackTrace(); + return null; + } + } + + public static BiomeType adapt(Biome biome, LevelAccessor levelAccessor) { + ResourceLocation resourceLocation = levelAccessor.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).getKey( + biome); + if (resourceLocation == null) { + return levelAccessor.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).getId(biome) == -1 + ? BiomeTypes.OCEAN + : null; + } + return BiomeTypes.get(resourceLocation.toString().toLowerCase(Locale.ROOT)); + } + + static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) { + try { + // Do the method ourselves to avoid trying to reflect generic method parameters + if (levelChunk.loaded || levelChunk.level.isClientSide()) { + BlockEntity blockEntity = levelChunk.blockEntities.remove(beacon.getBlockPos()); + if (blockEntity != null) { + if (!levelChunk.level.isClientSide) { + Block block = beacon.getBlockState().getBlock(); + if (block instanceof EntityBlock) { + GameEventListener gameEventListener = ((EntityBlock) block).getListener(levelChunk.level, beacon); + if (gameEventListener != null) { + int i = SectionPos.blockToSectionCoord(beacon.getBlockPos().getY()); + GameEventDispatcher gameEventDispatcher = levelChunk.getEventDispatcher(i); + gameEventDispatcher.unregister(gameEventListener); + if (gameEventDispatcher.isEmpty()) { + try { + ((Int2ObjectMap) fieldGameEventDispatcherSections.get(levelChunk)) + .remove(i); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + } + } + fieldRemove.set(beacon, true); + } + } + methodremoveTickingBlockEntity.invoke(levelChunk, beacon.getBlockPos()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java new file mode 100644 index 000000000..8b7042d63 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java @@ -0,0 +1,239 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.extent.processor.lighting.NMSRelighter; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.TaskManager; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.longs.LongArraySet; +import it.unimi.dsi.fastutil.longs.LongIterator; +import it.unimi.dsi.fastutil.longs.LongSet; +import net.minecraft.server.MCUtil; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ThreadedLevelLightEngine; +import net.minecraft.server.level.TicketType; +import net.minecraft.util.Unit; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.ChunkStatus; +import org.apache.logging.log4j.Logger; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.IntConsumer; + +public class PaperweightStarlightRelighter implements Relighter { + + public static final MethodHandle RELIGHT; + private static final Logger LOGGER = LogManagerCompat.getLogger(); + private static final int CHUNKS_PER_BATCH = 1024; // 32 * 32 + private static final int CHUNKS_PER_BATCH_SQRT_LOG2 = 5; // for shifting + + private static final TicketType FAWE_TICKET = TicketType.create("fawe_ticket", (a, b) -> 0); + private static final int LIGHT_LEVEL = MCUtil.getTicketLevelFor(ChunkStatus.LIGHT); + + static { + MethodHandle tmp = null; + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + tmp = lookup.findVirtual( + ThreadedLevelLightEngine.class, + "relight", + MethodType.methodType( + int.class, // return type + // params + Set.class, + Consumer.class, + IntConsumer.class + ) + ); + } catch (NoSuchMethodException | IllegalAccessException e) { + LOGGER.error("Failed to locate 'relight' method in ThreadedLevelLightEngine. Is everything up to date?", e); + } + RELIGHT = tmp; + } + + private final ServerLevel serverLevel; + private final ReentrantLock lock = new ReentrantLock(); + private final Long2ObjectLinkedOpenHashMap regions = new Long2ObjectLinkedOpenHashMap<>(); + private final ReentrantLock areaLock = new ReentrantLock(); + private final NMSRelighter delegate; + + //TODO 1.18 address raw access of IQueueChunk + public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent queue) { + this.serverLevel = serverLevel; + this.delegate = new NMSRelighter(queue); + } + + public static boolean isUsable() { + return RELIGHT != null; + } + + @Override + public boolean addChunk(int cx, int cz, byte[] skipReason, int bitmask) { + areaLock.lock(); + try { + long key = MathMan.pairInt(cx >> CHUNKS_PER_BATCH_SQRT_LOG2, cz >> CHUNKS_PER_BATCH_SQRT_LOG2); + // TODO probably submit here already if chunks.size == CHUNKS_PER_BATCH? + LongSet chunks = this.regions.computeIfAbsent(key, k -> new LongArraySet(CHUNKS_PER_BATCH >> 2)); + chunks.add(ChunkPos.asLong(cx, cz)); + } finally { + areaLock.unlock(); + } + return true; + } + + @Override + public void addLightUpdate(int x, int y, int z) { + delegate.addLightUpdate(x, y, z); + } + + /* + * This method is called "recursively", iterating and removing elements + * from the regions linked map. This way, chunks are loaded in batches to avoid + * OOMEs. + */ + @Override + public void fixLightingSafe(boolean sky) { + this.areaLock.lock(); + try { + if (regions.isEmpty()) { + return; + } + LongSet first = regions.removeFirst(); + fixLighting(first, () -> fixLightingSafe(true)); + } finally { + this.areaLock.unlock(); + } + } + + /* + * Processes a set of chunks and runs an action afterwards. + * The action is run async, the chunks are partly processed on the main thread + * (as required by the server). + */ + private void fixLighting(LongSet chunks, Runnable andThen) { + // convert from long keys to ChunkPos + Set coords = new HashSet<>(); + LongIterator iterator = chunks.iterator(); + while (iterator.hasNext()) { + coords.add(new ChunkPos(iterator.nextLong())); + } + TaskManager.IMP.task(() -> { + // trigger chunk load and apply ticket on main thread + List> futures = new ArrayList<>(); + for (ChunkPos pos : coords) { + futures.add(serverLevel.getWorld().getChunkAtAsync(pos.x, pos.z) + .thenAccept(c -> serverLevel.getChunkSource().addTicketAtLevel( + FAWE_TICKET, + pos, + LIGHT_LEVEL, + Unit.INSTANCE + )) + ); + } + // collect futures and trigger relight once all chunks are loaded + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(v -> + invokeRelight( + coords, + c -> { + }, // no callback for single chunks required + i -> { + if (i != coords.size()) { + LOGGER.warn("Processed {} chunks instead of {}", i, coords.size()); + } + // post process chunks on main thread + TaskManager.IMP.task(() -> postProcessChunks(coords)); + // call callback on our own threads + TaskManager.IMP.async(andThen); + } + ) + ); + }); + } + + private void invokeRelight( + Set coords, + Consumer chunkCallback, + IntConsumer processCallback + ) { + try { + int unused = (int) RELIGHT.invokeExact( + serverLevel.getChunkSource().getLightEngine(), + coords, + chunkCallback, // callback per chunk + processCallback // callback for all chunks + ); + } catch (Throwable throwable) { + LOGGER.error("Error occurred on relighting", throwable); + } + } + + /* + * Allow the server to unload the chunks again. + * Also, if chunk packets are sent delayed, we need to do that here + */ + private void postProcessChunks(Set coords) { + boolean delay = Settings.IMP.LIGHTING.DELAY_PACKET_SENDING; + for (ChunkPos pos : coords) { + int x = pos.x; + int z = pos.z; + if (delay) { // we still need to send the block changes of that chunk + PaperweightPlatformAdapter.sendChunk(serverLevel, x, z, false); + } + serverLevel.getChunkSource().removeTicketAtLevel(FAWE_TICKET, pos, LIGHT_LEVEL, Unit.INSTANCE); + } + } + + @Override + public void clear() { + + } + + @Override + public void removeLighting() { + this.delegate.removeLighting(); + } + + @Override + public void fixBlockLighting() { + fixLightingSafe(true); + } + + @Override + public void fixSkyLighting() { + fixLightingSafe(true); + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public ReentrantLock getLock() { + return this.lock; + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public void close() throws Exception { + fixLightingSafe(true); + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java new file mode 100644 index 000000000..c8c9c0046 --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java @@ -0,0 +1,28 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; + +import com.fastasyncworldedit.core.extent.processor.lighting.NullRelighter; +import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; +import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; +import com.fastasyncworldedit.core.queue.IQueueChunk; +import com.fastasyncworldedit.core.queue.IQueueExtent; +import com.sk89q.worldedit.world.World; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; + +import javax.annotation.Nonnull; + +public class PaperweightStarlightRelighterFactory implements RelighterFactory { + + @Override + public @Nonnull + //TODO 1.18 address raw access of IQueueChunk + Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { + org.bukkit.World w = Bukkit.getWorld(world.getName()); + if (w == null) { + return NullRelighter.INSTANCE; + } + return new PaperweightStarlightRelighter(((CraftWorld) w).getHandle(), queue); + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java new file mode 100644 index 000000000..33c1f545a --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java @@ -0,0 +1,159 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt; + +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.LazyCompoundTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.StringTag; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import net.minecraft.nbt.NumericTag; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +public class PaperweightLazyCompoundTag extends LazyCompoundTag { + + private final Supplier compoundTagSupplier; + private CompoundTag compoundTag; + + public PaperweightLazyCompoundTag(Supplier compoundTagSupplier) { + super(new HashMap<>()); + this.compoundTagSupplier = compoundTagSupplier; + } + + public PaperweightLazyCompoundTag(net.minecraft.nbt.CompoundTag compoundTag) { + this(() -> compoundTag); + } + + public net.minecraft.nbt.CompoundTag get() { + return compoundTagSupplier.get(); + } + + @Override + public Map getValue() { + if (compoundTag == null) { + compoundTag = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(compoundTagSupplier.get()); + } + return compoundTag.getValue(); + } + + @Override + public CompoundBinaryTag asBinaryTag() { + getValue(); + return compoundTag.asBinaryTag(); + } + + public boolean containsKey(String key) { + return compoundTagSupplier.get().contains(key); + } + + public byte[] getByteArray(String key) { + return compoundTagSupplier.get().getByteArray(key); + } + + public byte getByte(String key) { + return compoundTagSupplier.get().getByte(key); + } + + public double getDouble(String key) { + return compoundTagSupplier.get().getDouble(key); + } + + public double asDouble(String key) { + net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); + if (tag instanceof NumericTag) { + return ((NumericTag) tag).getAsDouble(); + } + return 0; + } + + public float getFloat(String key) { + return compoundTagSupplier.get().getFloat(key); + } + + public int[] getIntArray(String key) { + return compoundTagSupplier.get().getIntArray(key); + } + + public int getInt(String key) { + return compoundTagSupplier.get().getInt(key); + } + + public int asInt(String key) { + net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); + if (tag instanceof NumericTag) { + return ((NumericTag) tag).getAsInt(); + } + return 0; + } + + public List getList(String key) { + net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); + if (tag instanceof net.minecraft.nbt.ListTag nbtList) { + ArrayList list = new ArrayList<>(); + for (net.minecraft.nbt.Tag elem : nbtList) { + if (elem instanceof net.minecraft.nbt.CompoundTag) { + list.add(new PaperweightLazyCompoundTag((net.minecraft.nbt.CompoundTag) elem)); + } else { + list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); + } + } + return list; + } + return Collections.emptyList(); + } + + //TODO 1.18 be a ListBinaryTag ? + public ListTag getListTag(String key) { + net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); + if (tag instanceof net.minecraft.nbt.ListTag) { + return (ListTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(tag); + } + return new ListTag(StringTag.class, Collections.emptyList()); + } + + @SuppressWarnings("unchecked") + public List getList(String key, Class listType) { + ListTag listTag = getListTag(key); + if (listTag.getType().equals(listType)) { + return (List) listTag.getValue(); + } else { + return Collections.emptyList(); + } + } + + public long[] getLongArray(String key) { + return compoundTagSupplier.get().getLongArray(key); + } + + public long getLong(String key) { + return compoundTagSupplier.get().getLong(key); + } + + public long asLong(String key) { + net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); + if (tag instanceof NumericTag) { + return ((NumericTag) tag).getAsLong(); + } + return 0; + } + + public short getShort(String key) { + return compoundTagSupplier.get().getShort(key); + } + + public String getString(String key) { + return compoundTagSupplier.get().getString(key); + } + + @Override + public String toString() { + return compoundTagSupplier.get().toString(); + } + +} diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java new file mode 100644 index 000000000..3fa31eebe --- /dev/null +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -0,0 +1,721 @@ +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen; + +import com.fastasyncworldedit.bukkit.adapter.Regenerator; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.TaskManager; +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.Lifecycle; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightGetBlocks; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.io.file.SafeFiles; +import com.sk89q.worldedit.world.RegenOptions; +import io.papermc.lib.PaperLib; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.biome.Biomes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.resources.RegistryReadOps; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ThreadedLevelLightEngine; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.util.LinearCongruentialGenerator; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.LevelSettings; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.OverworldBiomeSource; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.ProtoChunk; +import net.minecraft.world.level.chunk.UpgradeData; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.SimpleRandomSource; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.synth.ImprovedNoise; +import net.minecraft.world.level.newbiome.area.Area; +import net.minecraft.world.level.newbiome.area.AreaFactory; +import net.minecraft.world.level.newbiome.context.BigContext; +import net.minecraft.world.level.newbiome.layer.Layer; +import net.minecraft.world.level.newbiome.layer.Layers; +import net.minecraft.world.level.newbiome.layer.traits.PixelTransformer; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.PrimaryLevelData; +import org.apache.logging.log4j.Logger; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.generator.CustomChunkGenerator; +import org.bukkit.generator.BlockPopulator; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BooleanSupplier; +import java.util.function.LongFunction; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +public class PaperweightRegen extends Regenerator { + + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private static final Field serverWorldsField; + private static final Field worldPaperConfigField; + private static final Field flatBedrockField; + private static final Field generatorSettingFlatField; + private static final Field generatorSettingBaseSupplierField; + private static final Field delegateField; + private static final Field chunkProviderField; + + //list of chunk stati in correct order without FULL + private static final Map chunkStati = new LinkedHashMap<>(); + + static { + chunkStati.put(ChunkStatus.EMPTY, Concurrency.FULL); // empty: radius -1, does nothing + chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Concurrency.NONE); // structure starts: uses unsynchronized maps + chunkStati.put( + ChunkStatus.STRUCTURE_REFERENCES, + Concurrency.FULL + ); // structure refs: radius 8, but only writes to current chunk + chunkStati.put(ChunkStatus.BIOMES, Concurrency.FULL); // biomes: radius 0 + chunkStati.put(ChunkStatus.NOISE, Concurrency.RADIUS); // noise: radius 8 + chunkStati.put(ChunkStatus.SURFACE, Concurrency.NONE); // surface: radius 0, requires NONE + chunkStati.put(ChunkStatus.CARVERS, Concurrency.NONE); // carvers: radius 0, but RADIUS and FULL change results + chunkStati.put( + ChunkStatus.LIQUID_CARVERS, + Concurrency.NONE + ); // liquid carvers: radius 0, but RADIUS and FULL change results + chunkStati.put(ChunkStatus.FEATURES, Concurrency.NONE); // features: uses unsynchronized maps + chunkStati.put( + ChunkStatus.LIGHT, + Concurrency.FULL + ); // light: radius 1, but no writes to other chunks, only current chunk + chunkStati.put(ChunkStatus.SPAWN, Concurrency.FULL); // spawn: radius 0 + chunkStati.put(ChunkStatus.HEIGHTMAPS, Concurrency.FULL); // heightmaps: radius 0 + + try { + serverWorldsField = CraftServer.class.getDeclaredField("worlds"); + serverWorldsField.setAccessible(true); + + Field tmpPaperConfigField; + Field tmpFlatBedrockField; + try { //only present on paper + tmpPaperConfigField = Level.class.getDeclaredField("paperConfig"); + tmpPaperConfigField.setAccessible(true); + + tmpFlatBedrockField = tmpPaperConfigField.getType().getDeclaredField("generateFlatBedrock"); + tmpFlatBedrockField.setAccessible(true); + } catch (Exception e) { + tmpPaperConfigField = null; + tmpFlatBedrockField = null; + } + worldPaperConfigField = tmpPaperConfigField; + flatBedrockField = tmpFlatBedrockField; + + generatorSettingBaseSupplierField = NoiseBasedChunkGenerator.class.getDeclaredField(Refraction.pickName( + "settings", "g")); + generatorSettingBaseSupplierField.setAccessible(true); + + generatorSettingFlatField = FlatLevelSource.class.getDeclaredField(Refraction.pickName("settings", "e")); + generatorSettingFlatField.setAccessible(true); + + delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); + delegateField.setAccessible(true); + + chunkProviderField = ServerLevel.class.getDeclaredField(Refraction.pickName("chunkSource", "C")); + chunkProviderField.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + //runtime + private ServerLevel originalServerWorld; + private ServerChunkCache originalChunkProvider; + private ServerLevel freshWorld; + private ServerChunkCache freshChunkProvider; + private LevelStorageSource.LevelStorageAccess session; + private StructureManager structureManager; + private ThreadedLevelLightEngine threadedLevelLightEngine; + private ChunkGenerator chunkGenerator; + + private Path tempDir; + + private boolean generateFlatBedrock = false; + + public PaperweightRegen(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { + super(originalBukkitWorld, region, target, options); + } + + @Override + protected boolean prepare() { + this.originalServerWorld = ((CraftWorld) originalBukkitWorld).getHandle(); + originalChunkProvider = originalServerWorld.getChunkSource(); + if (!(originalChunkProvider instanceof ServerChunkCache)) { + return false; + } + + //flat bedrock? (only on paper) + if (worldPaperConfigField != null) { + try { + generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalServerWorld)); + } catch (Exception ignored) { + } + } + + seed = options.getSeed().orElse(originalServerWorld.getSeed()); + chunkStati.forEach((s, c) -> super.chunkStati.put(new ChunkStatusWrap(s), c)); + + return true; + } + + @Override + protected boolean initNewWorld() throws Exception { + //world folder + tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen"); + + //prepare for world init (see upstream implementation for reference) + org.bukkit.World.Environment environment = originalBukkitWorld.getEnvironment(); + org.bukkit.generator.ChunkGenerator generator = originalBukkitWorld.getGenerator(); + LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(tempDir); + ResourceKey levelStemResourceKey = getWorldDimKey(environment); + session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); + PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; + + MinecraftServer server = originalServerWorld.getCraftServer().getServer(); + PrimaryLevelData levelProperties = (PrimaryLevelData) server.getWorldData(); + RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( + NbtOps.INSTANCE, server.resources.getResourceManager(), + RegistryAccess.builtin() + ); + WorldGenSettings newOpts = WorldGenSettings.CODEC + .encodeStart(nbtRegOps, levelProperties.worldGenSettings()) + .flatMap(tag -> WorldGenSettings.CODEC.parse(this.recursivelySetSeed( + new Dynamic<>(nbtRegOps, tag), + seed, + new HashSet<>() + ))) + .result() + .orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); + LevelSettings newWorldSettings = new LevelSettings( + "worldeditregentempworld", + originalWorldData.settings.gameType(), + originalWorldData.settings.hardcore(), + originalWorldData.settings.difficulty(), + originalWorldData.settings.allowCommands(), + originalWorldData.settings.gameRules(), + originalWorldData.settings.getDataPackConfig() + ); + PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); + + //init world + freshWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new ServerLevel( + server, + server.executor, + session, + newWorldData, + originalServerWorld.dimension(), + originalServerWorld.dimensionType(), + new RegenNoOpWorldLoadListener(), + // placeholder. Required for new ChunkProviderServer, but we create and then set it later + newOpts.dimensions().get(levelStemResourceKey).generator(), + originalServerWorld.isDebug(), + seed, + ImmutableList.of(), + false, + environment, + generator, + originalBukkitWorld.getBiomeProvider() + ) { + private final Biome singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.get(ResourceLocation.tryParse( + options + .getBiomeType() + .getId())) : null; + + @Override + public void tick(BooleanSupplier shouldKeepTicking) { //no ticking + } + + @Override + public Biome getUncachedNoiseBiome(int biomeX, int biomeY, int biomeZ) { + if (options.hasBiomeType()) { + return singleBiome; + } + return PaperweightRegen.this.chunkGenerator.getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ); + } + }).get(); + freshWorld.noSave = true; + removeWorldFromWorldsMap(); + newWorldData.checkName(originalServerWorld.serverLevelData.getLevelName()); //rename to original world name + if (worldPaperConfigField != null) { + worldPaperConfigField.set(freshWorld, originalServerWorld.paperConfig); + } + + //generator + if (originalChunkProvider.getGenerator() instanceof FlatLevelSource) { + FlatLevelGeneratorSettings generatorSettingFlat = (FlatLevelGeneratorSettings) generatorSettingFlatField.get( + originalChunkProvider.getGenerator()); + chunkGenerator = new FlatLevelSource(generatorSettingFlat); + } else if (originalChunkProvider.getGenerator() instanceof NoiseBasedChunkGenerator) { + Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField + .get(originalChunkProvider.getGenerator()); + BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); + if (biomeSource instanceof OverworldBiomeSource) { + biomeSource = fastOverworldBiomeSource(biomeSource); + } + chunkGenerator = new NoiseBasedChunkGenerator(biomeSource, seed, generatorSettingBaseSupplier); + } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator) { + chunkGenerator = (ChunkGenerator) delegateField.get(originalChunkProvider.getGenerator()); + } else { + LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); + return false; + } + if (generator != null) { + chunkGenerator = new CustomChunkGenerator(freshWorld, chunkGenerator, generator); + generateConcurrent = generator.isParallelCapable(); + } + + freshChunkProvider = new ServerChunkCache( + freshWorld, + session, + server.getFixerUpper(), + server.getStructureManager(), + server.executor, + chunkGenerator, + freshWorld.spigotConfig.viewDistance, + server.forceSynchronousWrites(), + new RegenNoOpWorldLoadListener(), + (chunkCoordIntPair, state) -> { + }, + () -> server.overworld().getDataStorage() + ) { + // redirect to LevelChunks created in #createChunks + @Override + public ChunkAccess getChunk(int x, int z, ChunkStatus chunkstatus, boolean flag) { + return getChunkAt(x, z); + } + }; + + ReflectionUtils.unsafeSet(chunkProviderField, freshWorld, freshChunkProvider); + //let's start then + structureManager = server.getStructureManager(); + threadedLevelLightEngine = freshChunkProvider.getLightEngine(); + + return true; + } + + @Override + protected void cleanup() { + try { + session.close(); + } catch (Exception ignored) { + } + + //shutdown chunk provider + try { + Fawe.get().getQueueHandler().sync(() -> { + try { + freshChunkProvider.close(false); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (Exception ignored) { + } + + //remove world from server + try { + Fawe.get().getQueueHandler().sync(this::removeWorldFromWorldsMap); + } catch (Exception ignored) { + } + + //delete directory + try { + SafeFiles.tryHardToDeleteDir(tempDir); + } catch (Exception ignored) { + } + } + + @Override + protected ProtoChunk createProtoChunk(int x, int z) { + return PaperLib.isPaper() + ? new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld, freshWorld) // paper + : new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld); // spigot + } + + @Override + protected LevelChunk createChunk(ProtoChunk protoChunk) { + return new LevelChunk( + freshWorld, + protoChunk, + null // we don't want to add entities + ); + } + + @Override + protected ChunkStatusWrap getFullChunkStatus() { + return new ChunkStatusWrap(ChunkStatus.FULL); + } + + @Override + protected List getBlockPopulators() { + return originalServerWorld.getWorld().getPopulators(); + } + + @Override + protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { + // BlockPopulator#populate has to be called synchronously for TileEntity access + TaskManager.IMP.task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); + } + + @Override + protected IChunkCache initSourceQueueCache() { + return (chunkX, chunkZ) -> new PaperweightGetBlocks(freshWorld, chunkX, chunkZ) { + @Override + public LevelChunk ensureLoaded(ServerLevel nmsWorld, int x, int z) { + return getChunkAt(x, z); + } + }; + } + + //util + private void removeWorldFromWorldsMap() { + Fawe.get().getQueueHandler().sync(() -> { + try { + Map map = (Map) serverWorldsField.get(Bukkit.getServer()); + map.remove("worldeditregentempworld"); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + } + + private ResourceKey getWorldDimKey(org.bukkit.World.Environment env) { + switch (env) { + case NETHER: + return LevelStem.NETHER; + case THE_END: + return LevelStem.END; + case NORMAL: + default: + return LevelStem.OVERWORLD; + } + } + + private Dynamic recursivelySetSeed( + Dynamic dynamic, + long seed, + Set> dynamicSet + ) { + return !dynamicSet.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { + if (pair.getFirst().asString("").equals("seed")) { + return pair.mapSecond((v) -> v.createLong(seed)); + } else { + //TODO 1.18 address raw access + return ((Dynamic) pair.getSecond()).getValue() instanceof CompoundTag + ? pair.mapSecond((v) -> this.recursivelySetSeed((Dynamic) v, seed, dynamicSet)) + : pair; + + } + }); + } + + private BiomeSource fastOverworldBiomeSource(BiomeSource biomeSource) throws Exception { + Field legacyBiomeInitLayerField = OverworldBiomeSource.class.getDeclaredField( + Refraction.pickName("legacyBiomeInitLayer", "i")); + legacyBiomeInitLayerField.setAccessible(true); + Field largeBiomesField = OverworldBiomeSource.class.getDeclaredField(Refraction.pickName("largeBiomes", "j")); + largeBiomesField.setAccessible(true); + Field biomeRegistryField = OverworldBiomeSource.class.getDeclaredField(Refraction.pickName("biomes", "k")); + biomeRegistryField.setAccessible(true); + Field areaLazyField = Layer.class.getDeclaredField(Refraction.pickName("area", "b")); + areaLazyField.setAccessible(true); + Method initAreaFactoryMethod = Layers.class.getDeclaredMethod( + Refraction.pickName("getDefaultLayer", "a"), + boolean.class, + int.class, + int.class, + LongFunction.class + ); + initAreaFactoryMethod.setAccessible(true); + + //init new WorldChunkManagerOverworld + boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(biomeSource); + boolean largebiomes = largeBiomesField.getBoolean(biomeSource); + Registry biomeRegistryMojang = (Registry) biomeRegistryField.get(biomeSource); + Registry biomeRegistry; + if (options.hasBiomeType()) { + Biome biome = BuiltinRegistries.BIOME.get(ResourceLocation.tryParse(options.getBiomeType().getId())); + biomeRegistry = new MappedRegistry<>( + ResourceKey.createRegistryKey(new ResourceLocation("fawe_biomes")), + Lifecycle.experimental() + ); + ((MappedRegistry) biomeRegistry).registerMapping(0, BuiltinRegistries.BIOME.getResourceKey(biome).get(), biome, + Lifecycle.experimental() + ); + } else { + biomeRegistry = biomeRegistryMojang; + } + + //replace genLayer + AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke( + null, + legacyBiomeInitLayer, + largebiomes ? 6 : 4, + 4, + (LongFunction) (salt -> new FastWorldGenContextArea(seed, salt)) + ); + biomeSource = new FastOverworldBiomeSource(biomeRegistry, new FastGenLayer(factory)); + + return biomeSource; + } + + private static class FastOverworldBiomeSource extends BiomeSource { + + private final Registry biomeRegistry; + private final boolean isSingleRegistry; + private final FastGenLayer fastGenLayer; + + public FastOverworldBiomeSource( + Registry biomeRegistry, + FastGenLayer genLayer + ) { + super(biomeRegistry.stream().collect(Collectors.toList())); + this.biomeRegistry = biomeRegistry; + this.isSingleRegistry = biomeRegistry.entrySet().size() == 1; + this.fastGenLayer = genLayer; + } + + @Override + protected Codec codec() { + return OverworldBiomeSource.CODEC; + } + + @Override + public BiomeSource withSeed(final long seed) { + return null; + } + + @Override + public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { + if (this.isSingleRegistry) { + return this.biomeRegistry.byId(0); + } + return this.fastGenLayer.get(this.biomeRegistry, biomeX, biomeZ); + } + + } + + private static class FastWorldGenContextArea implements BigContext { + + private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); + private final ImprovedNoise improvedNoise; + private final long magicrandom; + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); //needed for multithreaded generation + + public FastWorldGenContextArea(long seed, long lconst) { + this.magicrandom = mix(seed, lconst); + this.improvedNoise = new ImprovedNoise(new XoroshiroRandomSource(seed)); + } + + private static long mix(long seed, long salt) { + long l = LinearCongruentialGenerator.next(salt, salt); + l = LinearCongruentialGenerator.next(l, salt); + l = LinearCongruentialGenerator.next(l, salt); + long m = LinearCongruentialGenerator.next(seed, l); + m = LinearCongruentialGenerator.next(m, l); + m = LinearCongruentialGenerator.next(m, l); + return m; + } + + @Override + public FastAreaLazy createResult(PixelTransformer pixelTransformer) { + return new FastAreaLazy(sharedAreaMap, pixelTransformer); + } + + @Override + public void initRandom(long x, long z) { + long l = this.magicrandom; + l = LinearCongruentialGenerator.next(l, x); + l = LinearCongruentialGenerator.next(l, z); + l = LinearCongruentialGenerator.next(l, x); + l = LinearCongruentialGenerator.next(l, z); + this.map.put(Thread.currentThread().getId(), l); + } + + @Override + public int nextRandom(int y) { + long tid = Thread.currentThread().getId(); + long e = this.map.computeIfAbsent(tid, i -> 0L); + int mod = (int) Math.floorMod(e >> 24L, (long) y); + this.map.put(tid, LinearCongruentialGenerator.next(e, this.magicrandom)); + return mod; + } + + @Override + public ImprovedNoise getBiomeNoise() { + return this.improvedNoise; + } + + } + + private static class FastGenLayer extends Layer { + + private final FastAreaLazy fastAreaLazy; + + public FastGenLayer(AreaFactory factory) { + super(() -> null); + this.fastAreaLazy = factory.make(); + } + + @Override + public Biome get(Registry registry, int x, int z) { + ResourceKey key = Biomes.byId(this.fastAreaLazy.get(x, z)); + if (key == null) { + return registry.get(Biomes.byId(0)); + } + Biome biome = registry.get(key); + if (biome == null) { + return registry.get(Biomes.byId(0)); + } + return biome; + } + + } + + private record FastAreaLazy(ConcurrentHashMap sharedMap, + PixelTransformer transformer) implements Area { + //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a synchronized context + //using a map for each thread worsens the performance significantly due to cache misses (factor 5) + + @Override + public int get(int x, int z) { + long zx = ChunkPos.asLong(x, z); + return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); + } + + } + + private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { + + private RegenNoOpWorldLoadListener() { + } + + @Override + public void updateSpawnPos(ChunkPos spawnPos) { + } + + @Override + public void onStatusChange(ChunkPos pos, @Nullable ChunkStatus status) { + } + + @Override + public void start() { + + } + + @Override + public void stop() { + } + + // TODO Paper only(?) @Override + public void setChunkRadius(int radius) { + } + + } + + private class FastProtoChunk extends ProtoChunk { + + // avoid warning on paper + public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world, ServerLevel serverLevel) { + super(pos, upgradeData, world, serverLevel); + } + + // compatibility with spigot + public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor) { + super(pos, upgradeData, levelHeightAccessor); + } + + public boolean generateFlatBedrock() { + return generateFlatBedrock; + } + + // no one will ever see the entities! + @Override + public List getEntities() { + return Collections.emptyList(); + } + + } + + protected class ChunkStatusWrap extends ChunkStatusWrapper { + + private final ChunkStatus chunkStatus; + + public ChunkStatusWrap(ChunkStatus chunkStatus) { + this.chunkStatus = chunkStatus; + } + + @Override + public int requiredNeighborChunkRadius() { + return chunkStatus.getRange(); + } + + @Override + public String name() { + return chunkStatus.getName(); + } + + @Override + public CompletableFuture processChunk(Long xz, List accessibleChunks) { + return chunkStatus.generate( + Runnable::run, // TODO revisit, we might profit from this somehow? + freshWorld, + chunkGenerator, + structureManager, + threadedLevelLightEngine, + c -> CompletableFuture.completedFuture(Either.left(c)), + accessibleChunks + ); + } + + } + +} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index cad10dd42..9208881ef 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -555,7 +555,7 @@ public class BukkitWorld extends AbstractWorld { @Override public boolean fullySupports3DBiomes() { // Supports if API does and we're not in the overworld - return HAS_3D_BIOMES && getWorld().getEnvironment() != World.Environment.NORMAL; + return HAS_3D_BIOMES && getWorld().getEnvironment() != World.Environment.NORMAL || PaperLib.isVersion(18); } @SuppressWarnings("deprecation") diff --git a/worldedit-core/doctools/build.gradle.kts b/worldedit-core/doctools/build.gradle.kts index cdb07e08f..8f4555040 100644 --- a/worldedit-core/doctools/build.gradle.kts +++ b/worldedit-core/doctools/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("jvm") version "1.5.0-RC" + kotlin("jvm") version "1.5.30" application } From d3aaf7acff64b01c6a0ffef69494c36f4e8021a2 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 18:04:47 +0100 Subject: [PATCH 14/81] Move to Paper 1.18 --- gradle/libs.versions.toml | 2 +- worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts | 2 +- .../bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 36af80435..601d7d6bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ guava = "31.0.1-jre" gson = "2.8.8" # Platform expectations -paper = "1.18-rc3-R0.1-SNAPSHOT" +paper = "1.18-R0.1-SNAPSHOT" # Plugins vault = "1.7.1" diff --git a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts index ad9b832c6..c1f95639f 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts @@ -12,7 +12,7 @@ repositories { } dependencies { - paperDevBundle("1.18-rc3-R0.1-20211129.221606-5") + paperDevBundle("1.18-rc3-R0.1-20211129.221606-5") //TODO 1.18 switch to mainline compileOnly(libs.paperlib) compileOnly(libs.paper) } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index 973e38d3e..a8ce1e036 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -186,7 +186,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { CraftServer.class.cast(Bukkit.getServer()); int dataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); - if (dataVersion != 2858) { // 1.18 release should be 2859 + if (dataVersion != 2860) { throw new UnsupportedClassVersionError("Not 1.18!"); } From 1f975ac0447740a99018bf0b66143f5c244fb092 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 21:30:46 +0100 Subject: [PATCH 15/81] Update templates, address JEP deprecations and place a few TODOs --- .github/ISSUE_TEMPLATE/bug_report.yml | 5 +- COMPILING.md | 2 +- README.md | 4 +- buildSrc/src/main/kotlin/CommonJavaConfig.kt | 6 +- .../ext/fawe/v1_18_R1/PaperweightAdapter.java | 6 +- .../worldedit/bukkit/WorldEditPlugin.java | 2 - .../com/fastasyncworldedit/core/Fawe.java | 1 + .../fastasyncworldedit/core/FaweVersion.java | 1 + .../core/configuration/Config.java | 126 ++++++++---------- .../core/util/TextureUtil.java | 9 +- .../core/util/UpdateNotification.java | 7 +- .../sk89q/worldedit/internal/Constants.java | 7 + 12 files changed, 89 insertions(+), 87 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e9824a0f1..289b5db07 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -29,6 +29,7 @@ body: description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. multiple: false options: + - '1.18' - '1.17.1' - '1.16.5' - '1.15.2' @@ -82,7 +83,7 @@ body: attributes: label: Fawe Version description: What version of Fawe are you running? (`/version FastAsyncWorldEdit`) - placeholder: "For example: FastAsyncWorldEdit version 1.17-89;8c01959" + placeholder: "For example: FastAsyncWorldEdit version 2.0.0-SNAPSHOT+1" validations: required: true @@ -93,7 +94,7 @@ body: options: - label: I have included a Fawe debugpaste. required: true - - label: I am using the newest build from https://ci.athion.net/job/FastAsyncWorldEdit-1.17/ and the issue still persists. + - label: I am using the newest build from https://ci.athion.net/job/FastAsyncWorldEdit-1.18/ and the issue still persists. required: true - type: textarea diff --git a/COMPILING.md b/COMPILING.md index 0f2f9faa4..31703d4f5 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -38,7 +38,7 @@ You will find: * FastAsyncWorldEdit for Bukkit in **worldedit-bukkit/build/libs** * the CLI version in **worldedit-cli/build/libs** -If you want to use FastAsyncWorldEdit, use the `FastAsyncWorldEdit-1.17-` version obtained in **worldedit-bukkit/build/libs**. +If you want to use FastAsyncWorldEdit, use the `FastAsyncWorldEdit-` version obtained in **worldedit-bukkit/build/libs**. (The `-#` version includes FastAsyncWorldEdit + necessary libraries.) diff --git a/README.md b/README.md index d5f0ffe60..2ff28be7f 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ Java Edition required. FastAsyncWorldEdit is compatible with Bukkit, Spigot, Pap * [Wiki](https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki) * [Report Issue](https://github.com/IntellectualSites/FastAsyncWorldEdit/issues) * [Crowdin (Translations)](https://intellectualsites.crowdin.com/fastasyncworldedit) -* [JavaDocs for the -bukkit module](https://ci.athion.net/job/FastAsyncWorldEdit-1.17-Bukkit-Javadocs/javadoc/) -* [JavaDocs for the -core module](https://ci.athion.net/job/FastAsyncWorldEdit-1.17-Core-Javadocs/javadoc/) +* [JavaDocs for the -bukkit module](https://javadoc.io/doc/com.fastasyncworldedit/FastAsyncWorldEdit-Bukkit/latest/index.html) +* [JavaDocs for the -core module](https://javadoc.io/doc/com.fastasyncworldedit/FastAsyncWorldEdit-Core/latest/index.html) ## Edit The Code diff --git a/buildSrc/src/main/kotlin/CommonJavaConfig.kt b/buildSrc/src/main/kotlin/CommonJavaConfig.kt index 21c059715..a01093e68 100644 --- a/buildSrc/src/main/kotlin/CommonJavaConfig.kt +++ b/buildSrc/src/main/kotlin/CommonJavaConfig.kt @@ -60,13 +60,13 @@ fun Project.applyCommonJavaConfiguration(sourcesJar: Boolean, banSlf4j: Boolean options.encoding = "UTF-8" links( "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/", - "https://jd.adventure.kyori.net/api/4.9.1/", + "https://jd.adventure.kyori.net/api/4.9.3/", "https://javadoc.io/doc/org.apache.logging.log4j/log4j-api/2.14.1/", - "https://javadoc.io/doc/com.google.guava/guava/21.0/", + "https://javadoc.io/doc/com.google.guava/guava/31.0.1/", "https://www.antlr.org/api/Java/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/core/0.5.7/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/default-impl/0.5.7/", - "https://papermc.io/javadocs/paper/1.17/", + "https://papermc.io/javadocs/paper/1.18/", "https://ci.athion.net/job/FastAsyncWorldEdit-1.17-Core-Javadocs/javadoc/" // needed for other module linking ) } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index a8ce1e036..9522d3ced 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -193,8 +193,10 @@ public final class PaperweightAdapter implements BukkitImplAdapter { serverWorldsField = CraftServer.class.getDeclaredField("worlds"); serverWorldsField.setAccessible(true); - getChunkFutureMethod = ServerChunkCache.class.getDeclaredMethod("getChunkFutureMainThread", - int.class, int.class, ChunkStatus.class, boolean.class); + getChunkFutureMethod = ServerChunkCache.class.getDeclaredMethod( + Refraction.pickName("getChunkFutureMainThread", "c"), + int.class, int.class, ChunkStatus.class, boolean.class + ); getChunkFutureMethod.setAccessible(true); chunkProviderExecutorField = ServerChunkCache.class.getDeclaredField( diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 6e93f0c19..75946fe01 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -220,8 +220,6 @@ public class WorldEditPlugin extends JavaPlugin { // Enable metrics new Metrics(this, BSTATS_ID); - // Check whether the server runs on 11 or greater - ServerLib.checkJavaLTS(); // Check if we are in a safe environment ServerLib.checkUnsafeForks(); // Check if a new build is available diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 01b602e24..46f934d4a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -305,6 +305,7 @@ public class Fawe { br.close(); this.version = FaweVersion.tryParse(versionString, commitString, dateString); Settings.IMP.DATE = new Date(100 + version.year, version.month, version.day).toString(); + //TODO 1.18 revisit Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit-1.17/" + version.build; Settings.IMP.COMMIT = "https://github.com/IntellectualSites/FastAsyncWorldEdit/commit/" + Integer.toHexString(version.hash); } catch (Throwable ignored) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java index 344a9d401..811aaad41 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java @@ -3,6 +3,7 @@ package com.fastasyncworldedit.core; /** * An internal FAWE class not meant for public use. **/ +//TODO 18 update to semver public class FaweVersion { public final int year; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java index aa6d4dda0..83dd34d95 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java @@ -34,7 +34,7 @@ public class Config { /** * Get the value for a node. Probably throws some error if you try to get a non-existent key. */ - private T get(String key, Class root) { + private T get(String key, Class root) { String[] split = key.split("\\."); Object instance = getInstance(split, root); if (instance != null) { @@ -57,7 +57,7 @@ public class Config { * @param key config node * @param value value */ - private void set(String key, Object value, Class root) { + private void set(String key, Object value, Class root) { String[] split = key.split("\\."); Object instance = getInstance(split, root); if (instance != null) { @@ -201,7 +201,7 @@ public class Config { /** * Get the static fields in a section. */ - private Map getFields(Class clazz) { + private Map getFields(Class clazz) { HashMap map = new HashMap<>(); for (Field field : clazz.getFields()) { if (Modifier.isStatic(field.getModifiers())) { @@ -223,12 +223,11 @@ public class Config { } StringBuilder m = new StringBuilder(); for (Object obj : listValue) { - m.append(System.lineSeparator() + spacing + "- " + toYamlString(obj, spacing)); + m.append(System.lineSeparator()).append(spacing).append("- ").append(toYamlString(obj, spacing)); } return m.toString(); } - if (value instanceof String) { - String stringValue = (String) value; + if (value instanceof String stringValue) { if (stringValue.isEmpty()) { return "''"; } @@ -237,11 +236,11 @@ public class Config { return value != null ? value.toString() : "null"; } - private void save(PrintWriter writer, Class clazz, final Object instance, int indent) { + private void save(PrintWriter writer, Class clazz, final Object instance, int indent) { try { String CTRF = System.lineSeparator(); String spacing = StringMan.repeat(" ", indent); - HashMap instances = new HashMap<>(); + HashMap, Object> instances = new HashMap<>(); for (Field field : clazz.getFields()) { if (field.getAnnotation(Ignore.class) != null) { continue; @@ -272,7 +271,7 @@ public class Config { configBlock = new ConfigBlock(); field.set(instance, configBlock); for (String blockName : blockNames.value()) { - configBlock.put(blockName, current.newInstance()); + configBlock.put(blockName, current.getDeclaredConstructor().newInstance()); } } // Save each instance @@ -299,11 +298,10 @@ public class Config { } writer.write(spacing + toNodeName(current.getSimpleName()) + ":" + CTRF); if (value == null) { - field.set(instance, value = current.newInstance()); + field.set(instance, value = current.getDeclaredConstructor().newInstance()); instances.put(current, value); } save(writer, current, value, indent + 2); - continue; } else { writer.write(spacing + toNodeName(field.getName() + ": ") + toYamlString( field.get(instance), @@ -321,7 +319,7 @@ public class Config { * * @param split the node (split by period) */ - private Field getField(String[] split, Class root) { + private Field getField(String[] split, Class root) { Object instance = getInstance(split, root); if (instance == null) { return null; @@ -352,74 +350,64 @@ public class Config { } } - private Object getInstance(Object instance, Class clazz) throws IllegalAccessException, InstantiationException { - try { - Field instanceField = clazz.getDeclaredField(clazz.getSimpleName()); - } catch (Throwable ignored) { - } - return clazz.newInstance(); - } - /** * Get the instance for a specific config node. * * @param split the node (split by period) * @return The instance or null */ - private Object getInstance(String[] split, Class root) { + private Object getInstance(String[] split, Class root) { try { Class clazz = root == null ? MethodHandles.lookup().lookupClass() : root; Object instance = this; while (split.length > 0) { - switch (split.length) { - case 1: - return instance; - default: - Class found = null; - Class[] classes = clazz.getDeclaredClasses(); - for (Class current : classes) { - if (StringMan.isEqual(current.getSimpleName(), toFieldName(split[0]))) { - found = current; - break; - } - } - try { - Field instanceField = clazz.getDeclaredField(toFieldName(split[0])); - setAccessible(instanceField); - if (instanceField.getType() != ConfigBlock.class) { - Object value = instanceField.get(instance); - if (value == null) { - value = found.newInstance(); - instanceField.set(instance, value); - } - clazz = found; - instance = value; - split = Arrays.copyOfRange(split, 1, split.length); - continue; - } - ConfigBlock value = (ConfigBlock) instanceField.get(instance); - if (value == null) { - value = new ConfigBlock(); - instanceField.set(instance, value); - } - instance = value.get(split[1]); - if (instance == null) { - instance = found.newInstance(); - value.put(split[1], instance); - } - clazz = found; - split = Arrays.copyOfRange(split, 2, split.length); - continue; - } catch (NoSuchFieldException ignored) { - } - if (found != null) { - split = Arrays.copyOfRange(split, 1, split.length); - clazz = found; - instance = clazz.newInstance(); - continue; - } - return null; + if (split.length == 1) { + return instance; } + Class found = null; + Class[] classes = clazz.getDeclaredClasses(); + for (Class current : classes) { + if (StringMan.isEqual(current.getSimpleName(), toFieldName(split[0]))) { + found = current; + break; + } + } + try { + Field instanceField = clazz.getDeclaredField(toFieldName(split[0])); + setAccessible(instanceField); + if (instanceField.getType() != ConfigBlock.class) { + Object value = instanceField.get(instance); + if (value == null) { + value = found.getDeclaredConstructor().newInstance(); + instanceField.set(instance, value); + } + clazz = found; + instance = value; + split = Arrays.copyOfRange(split, 1, split.length); + continue; + } + ConfigBlock value = (ConfigBlock) instanceField.get(instance); + if (value == null) { + value = new ConfigBlock(); + instanceField.set(instance, value); + } + instance = value.get(split[1]); + if (instance == null) { + instance = found.getDeclaredConstructor().newInstance(); + value.put(split[1], instance); + } + clazz = found; + split = Arrays.copyOfRange(split, 2, split.length); + continue; + } catch (NoSuchFieldException ignored) { + } + if (found != null) { + split = Arrays.copyOfRange(split, 1, split.length); + clazz = found; + instance = clazz.getDeclaredConstructor().newInstance(); + continue; + } + return null; } } catch (Throwable e) { e.printStackTrace(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index ead803939..747ed625b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -354,10 +354,10 @@ public class TextureUtil implements TextureHolder { LOGGER.info("Downloading asset jar from Mojang, please wait..."); new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/").mkdirs(); try (BufferedInputStream in = new BufferedInputStream( - new URL("https://launcher.mojang.com/v1/objects/8d9b65467c7913fcf6f5b2e729d44a1e00fde150/client.jar") + new URL("https://launcher.mojang.com/v1/objects/d49eb6caed53d23927648c97451503442f9e26fd/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.17.1.jar")) { + Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { @@ -370,6 +370,7 @@ public class TextureUtil implements TextureHolder { "folder with a `.minecraft/versions` jar in it."); LOGGER.error("If the file exists, please make sure the server has read access to the directory."); } + //TODO 1.18 AccessControlException is deprecated and scheduled for removal as of Java 17. Exchange on sight to be prepared for future releases } catch (AccessControlException e) { LOGGER.error( "Could not download asset jar. It's likely your file permission are setup improperly and do not allow fetching data from the Mojang servers."); @@ -811,10 +812,10 @@ public class TextureUtil implements TextureHolder { new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/") .mkdirs(); try (BufferedInputStream in = new BufferedInputStream( - new URL("https://launcher.mojang.com/v1/objects/8d9b65467c7913fcf6f5b2e729d44a1e00fde150/client.jar") + new URL("https://launcher.mojang.com/v1/objects/d49eb6caed53d23927648c97451503442f9e26fd/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.17.1.jar")) { + Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java index 14a987396..97efe95b4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java @@ -30,6 +30,7 @@ public class UpdateNotification { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); + //TODO 1.18 revisit and update to semver parsing after updating FaweVersion.java Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit-1.17/api/xml/").openStream()); faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent(); FaweVersion faweVersion = Fawe.get().getVersion(); @@ -42,8 +43,10 @@ public class UpdateNotification { hasUpdate = true; int versionDifference = Integer.parseInt(UpdateNotification.faweVersion) - faweVersion.build; LOGGER.warn( - "An update for FastAsyncWorldEdit is available. You are {} build(s) out of date.\nYou are running " + - "version {}, the latest version is {}-{}.\nUpdate at https://www.spigotmc.org/resources/13932/", + """ + An update for FastAsyncWorldEdit is available. You are {} build(s) out of date. + You are running version {}, the latest version is {}-{}. + Update at https://www.spigotmc.org/resources/13932/""", versionDifference, faweVersion.toString(), faweVersion.getSimpleVersionName(), diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java index 713458e65..a55b90f36 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java @@ -72,4 +72,11 @@ public final class Constants { */ public static final int DATA_VERSION_MC_1_17 = 2724; + //FAWE start - add data version for 1.18 + /** + * The DataVersion for Minecraft 1.18 + */ + public static final int DATA_VERSION_MC_1_18 = 2860; + //FAWE end + } From 6afde13a018167c133e3c82d859d8d93b5dea1b6 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 30 Nov 2021 22:13:13 +0100 Subject: [PATCH 16/81] Drop Guava 21 enforcement --- worldedit-bukkit/build.gradle.kts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index c8ba089d2..dcddb468e 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -42,12 +42,6 @@ repositories { flatDir { dir(File("src/main/resources")) } } -configurations.all { - resolutionStrategy { - force("com.google.guava:guava:31.0.1-jre") - } -} - val localImplementation = configurations.create("localImplementation") { description = "Dependencies used locally, but provided by the runtime Bukkit implementation" isCanBeConsumed = false From d6e3c331d4a11c6077af47a5c35809927a758597 Mon Sep 17 00:00:00 2001 From: Jordan Date: Mon, 20 Dec 2021 21:12:04 +0000 Subject: [PATCH 17/81] Make 1.18 to be effectively in a usable state (#1452) * Update swathes of easy-to-update-sort-of-code. - Untested - Should compile but NMF broken something - Several todos: - biome history//better support (move to biome sections in core) - regen (haha lol no thanks, someone else can do that) - probably actually do the palette stuff that probably won't work in PaperweightPlatformAdapter * ci: Provide basic Jenkinsfile for ghprb pipeline * build: Update paperweight * upstream: Update Upstream de6fa17 Add getBrush helper for use with instanceof pattern matching (1926) * FAWE will now load on startup * it....works? * Begin to allow biome edits (and fix biomes reverting to plains upon editing blocks) * Add new blocks/block properties * Only create biome palette if supplies is null * Fix biome operations * Finally get removing BlockID done (major version change allows it) * refactor!: Drop PlotSquared v4 Fawe 2.0.0 and newer requires Java 17, PlotSquared v4 supports 1.13 and 1.14, Fawe wont work on these versions nevertheless and refuses to load due Java version incompatiblities with older versions. Newer versions can use PlotSquared v6. * docs: Update readme * Added and removed some comments * Added and removed some comments * refactor: Rename worldedit configuration * build: Re-add 1.17 module This the a very nasty commit * chore: Implement missing methods * build: Update paperweight * upstream: Update upstream 6df194e Remove finalize, use a Cleaner instead (1943) 9843a4f Fix snapshots in 1.18 (1959) * ci: Escape workflows * build: Update paperweight to 1.18.1 * build: Update Paster * Fix compilation * Bump to 1.18.1 * Do both 1.18 and 1.18.1 Co-authored-by: Alex * Fix single-block lookups * Reserve ordinals 0 through 3 for air/"reserved" * Create block palette data with values * Fix classpath for testing for starlight * Correctly use block rather than sky light layer [not used in paper] Co-authored-by: NotMyFault Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/stale.yml | 2 +- .github/workflows/build.yml | 64 +- .github/workflows/release-drafter.yml | 6 +- COMPILING.md | 6 +- Jenkinsfile | 10 - README.md | 2 +- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/CommonJavaConfig.kt | 1 - gradle/libs.versions.toml | 8 +- settings.gradle.kts | 2 +- .../adapters/adapter-1_17_1/build.gradle.kts | 36 +- .../adapter/ext/fawe/PaperweightAdapter.java | 44 +- .../v1_17_R1_2/PaperweightFaweAdapter.java | 37 +- .../fawe/v1_17_R1_2/PaperweightGetBlocks.java | 31 +- .../adapters/adapter-1_18/build.gradle.kts | 3 +- .../ext/fawe/v1_18_R1/PaperweightAdapter.java | 236 +-- .../v1_18_R1/PaperweightDataConverters.java | 238 ++- .../fawe/v1_18_R1/PaperweightFakePlayer.java | 7 +- .../PaperweightWorldNativeAccess.java | 69 +- .../v1_18_R1/PaperweightBlockMaterial.java | 3 +- .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 54 +- .../PaperweightFaweWorldNativeAccess.java | 17 +- .../fawe/v1_18_R1/PaperweightGetBlocks.java | 230 ++- .../v1_18_R1/PaperweightGetBlocks_Copy.java | 34 +- .../v1_18_R1/PaperweightMapChunkUtil.java | 19 +- .../v1_18_R1/PaperweightPlatformAdapter.java | 396 +++-- .../nbt/PaperweightLazyCompoundTag.java | 3 +- .../fawe/v1_18_R1/regen/PaperweightRegen.java | 1443 +++++++++-------- worldedit-bukkit/build.gradle.kts | 1 - .../fastasyncworldedit/bukkit/FaweBukkit.java | 8 +- .../adapter/IDelegateBukkitImplAdapter.java | 2 +- .../bukkit/adapter/NMSAdapter.java | 43 +- .../plotsquared/PlotSquaredFeature.java | 12 +- .../plotsquaredv4/FaweChunkManager.java | 172 -- .../plotsquaredv4/FaweLocalBlockQueue.java | 131 -- .../plotsquaredv4/FaweSchematicHandler.java | 154 -- .../regions/plotsquaredv4/FaweTrim.java | 58 - .../regions/plotsquaredv4/PlotSetBiome.java | 105 -- .../plotsquaredv4/PlotSquaredFeature.java | 225 --- .../sk89q/worldedit/bukkit/BukkitWorld.java | 2 +- .../worldedit/bukkit/WorldEditPlugin.java | 19 +- .../bukkit/adapter/BukkitImplAdapter.java | 10 +- ...config-legacy.yml => worldedit-config.yml} | 106 +- .../fastasyncworldedit/util/StubServer.java | 10 + worldedit-core/build.gradle.kts | 3 +- .../core/configuration/Settings.java | 15 +- .../core/function/generator/CavesGen.java | 22 +- .../history/changeset/AbstractChangeSet.java | 20 +- .../core/queue/IBlocks.java | 19 +- .../core/queue/IChunkSet.java | 2 +- .../implementation/blocks/BitSetBlocks.java | 2 +- .../implementation/blocks/CharSetBlocks.java | 24 +- .../implementation/chunk/ChunkHolder.java | 2 +- .../queue/implementation/chunk/NullChunk.java | 2 +- .../core/registry/state/PropertyKey.java | 35 +- .../core/world/block/BlockID.java | 695 -------- .../java/com/sk89q/worldedit/EditSession.java | 5 +- .../sk89q/worldedit/LocalConfiguration.java | 2 +- .../com/sk89q/worldedit/LocalSession.java | 15 +- .../sk89q/worldedit/TracedEditSession.java | 41 +- .../worldedit/command/BrushCommands.java | 7 +- .../worldedit/command/WorldEditCommands.java | 6 +- .../worldedit/command/tool/QueryTool.java | 4 +- .../platform/PlatformCommandManager.java | 4 +- .../worldedit/function/mask/BlockMask.java | 12 +- .../sk89q/worldedit/internal/Constants.java | 8 +- .../internal/util/ErrorReporting.java | 43 + .../worldedit/world/block/BlockTypes.java | 141 +- .../world/block/BlockTypesCache.java | 34 +- .../worldedit/world/chunk/AnvilChunk16.java | 2 +- .../worldedit/world/chunk/AnvilChunk18.java | 218 +++ .../world/storage/ChunkStoreHelper.java | 45 +- .../storage/TrueZipMcRegionChunkStore.java | 2 +- .../storage/ZippedMcRegionChunkStore.java | 2 - .../src/main/resources/lang/strings.json | 4 +- 76 files changed, 2447 insertions(+), 3052 deletions(-) delete mode 100644 Jenkinsfile delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java delete mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java rename worldedit-bukkit/src/main/resources/defaults/{config-legacy.yml => worldedit-config.yml} (61%) delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ErrorReporting.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk18.java diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 289b5db07..0d8a2cc90 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -29,7 +29,7 @@ body: description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. multiple: false options: - - '1.18' + - '1.18.1' - '1.17.1' - '1.16.5' - '1.15.2' diff --git a/.github/stale.yml b/.github/stale.yml index 7d95c1f66..c6ad3e8fe 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,4 +1,4 @@ -daysUntilStale: 60 +daysUntilStale: 30 daysUntilClose: 7 only: issues exemptLabels: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3137c908c..d793bb26e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,47 +1,47 @@ -name: "build" +name: build -on: ["pull_request", "push"] +on: [pull_request, push] jobs: build: - runs-on: "ubuntu-latest" + runs-on: ubuntu-latest steps: - - name: "Checkout Repository" - uses: "actions/checkout@v2.4.0" - - name : "Validate Gradle Wrapper" - uses : "gradle/wrapper-validation-action@v1.0.4" - - name: "Setup Java" - uses: "actions/setup-java@v2.3.1" + - name: Checkout Repository + uses: actions/checkout@v2.4.0 + - name : Validate Gradle Wrapper + uses : gradle/wrapper-validation-action@v1.0.4 + - name: Setup Java + uses: actions/setup-java@v2.3.1 with: - distribution: "temurin" - cache: 'gradle' - java-version: "17" - - name: "Clean Build" - run: "./gradlew clean build --no-daemon" - - name: "Determine release status" - if: "${{ runner.os == 'Linux' }}" + distribution: temurin + cache: gradle + java-version: 17 + - name: Clean Build + run: ./gradlew clean build --no-daemon + - name: Determine release status + if: ${{ runner.os == 'Linux' }} run: | if [ "$(./gradlew properties | awk '/^version:/ { print $2; }' | grep '\-SNAPSHOT')" ]; then echo "STATUS=snapshot" >> $GITHUB_ENV else echo "STATUS=release" >> $GITHUB_ENV fi - - name: "Publish Release" - if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}" - run: "./gradlew publishToSonatype closeSonatypeStagingRepository" + - name: Publish Release + if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} + run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository env: - ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" - ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}" - ORG_GRADLE_PROJECT_signingKey: "${{ secrets.SIGNING_KEY }}" - ORG_GRADLE_PROJECT_signingPassword: "${{ secrets.SIGNING_PASSWORD }}" - - name: "Publish Snapshot" - if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}" - run: "./gradlew publishToSonatype" + ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} + ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} + - name: Publish Snapshot + if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }} + run: ./gradlew publishToSonatype env: - ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" - ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}" - - name: "Archive Artifacts" - uses: "actions/upload-artifact@v2.2.4" + ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} + ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} + - name: Archive Artifacts + uses: actions/upload-artifact@v2.2.4 with: - name: "FastAsyncWorldEdit-Bukkit-SNAPSHOT" - path: "worldedit-bukkit/build/libs/FastAsyncWorldEdit-Bukkit-*.jar" + name: FastAsyncWorldEdit-Bukkit-SNAPSHOT + path: worldedit-bukkit/build/libs/FastAsyncWorldEdit-Bukkit-*.jar diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 021ad30ce..976495eda 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -1,4 +1,4 @@ -name: "draft release" +name: draft release on: push: @@ -7,8 +7,8 @@ on: jobs: update_release_draft: - runs-on: "ubuntu-latest" + runs-on: ubuntu-latest steps: - - uses: "release-drafter/release-drafter@v5.15.0" + - uses: release-drafter/release-drafter@v5.15.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/COMPILING.md b/COMPILING.md index 31703d4f5..b80ee040c 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -1,12 +1,12 @@ Compiling ========= -You can compile FastAsyncWorldEdit as long as you have some version of Java greater than or equal to 16 installed. Gradle will download JDK 16 specifically if needed, +You can compile FastAsyncWorldEdit as long as you have some version of Java greater than or equal to 17 installed. Gradle will download JDK 17 specifically if needed, but it needs some version of Java to bootstrap from. Note that if you have JRE 8 installed, Gradle will currently attempt to use that to compile, which will not work. It is easiest to uninstall JRE 8 and replace it with JDK 16. -You can get the JDK 16 [here](https://adoptium.net/). +You can get the JDK 17 [here](https://adoptium.net/). The build process uses Gradle, which you do *not* need to download. FastAsyncWorldEdit is a multi-module project with three active modules: @@ -44,7 +44,7 @@ If you want to use FastAsyncWorldEdit, use the `FastAsyncWorldEdit-` ## Other commands -* `gradlew idea` will generate an [IntelliJ IDEA](http://www.jetbrains.com/idea/) module for each folder. +* `gradlew idea` will generate an [IntelliJ IDEA](https://www.jetbrains.com/idea/) module for each folder. _Possibly broken_: * `gradlew eclipse` will generate an [Eclipse](https://www.eclipse.org/downloads/) project for each folder. diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 466a35458..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,10 +0,0 @@ -pipeline { - agent any - stages { - stage('Build pull request') { - steps { - sh './gradlew clean build' - } - } - } -} diff --git a/README.md b/README.md index 2ff28be7f..3cb346f35 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ FastAsyncWorldEdit is a fork of WorldEdit that has huge speed and memory improve * Use it in creative, survival in single player or on your server. * Use it on your Minecraft server to fix grieving and mistakes. -Java Edition required. FastAsyncWorldEdit is compatible with Bukkit, Spigot, Paper, and Tuinity. +Java Edition required. FastAsyncWorldEdit is compatible with Bukkit, Spigot and Paper. ## Download FastAsyncWorldEdit * Spigot: https://www.spigotmc.org/resources/fast-async-worldedit.13932/ diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 564784f81..f0f8bf4b2 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation(gradleApi()) implementation("org.ajoberstar.grgit:grgit-gradle:4.1.1") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.1") - implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.0-SNAPSHOT") + implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.2") } kotlin { diff --git a/buildSrc/src/main/kotlin/CommonJavaConfig.kt b/buildSrc/src/main/kotlin/CommonJavaConfig.kt index a01093e68..0f4d2e857 100644 --- a/buildSrc/src/main/kotlin/CommonJavaConfig.kt +++ b/buildSrc/src/main/kotlin/CommonJavaConfig.kt @@ -62,7 +62,6 @@ fun Project.applyCommonJavaConfiguration(sourcesJar: Boolean, banSlf4j: Boolean "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/", "https://jd.adventure.kyori.net/api/4.9.3/", "https://javadoc.io/doc/org.apache.logging.log4j/log4j-api/2.14.1/", - "https://javadoc.io/doc/com.google.guava/guava/31.0.1/", "https://www.antlr.org/api/Java/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/core/0.5.7/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/default-impl/0.5.7/", diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8396e75dd..d50d7f988 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,10 +3,10 @@ fastutil = "8.5.6" log4j = "2.17.0" guava = "31.0.1-jre" -gson = "2.8.8" +gson = "2.8.9" # Platform expectations -paper = "1.18-R0.1-SNAPSHOT" +paper = "1.18.1-R0.1-SNAPSHOT" # Plugins vault = "1.7.1" @@ -20,7 +20,6 @@ residence = "4.5._13.1" towny = "0.97.5.0" protocollib = "4.7.0" plotsquaredV6 = "6.2.0" -plotsquaredV4 = "4.514" redprotect = "1.9.6" # Third party @@ -28,7 +27,7 @@ flow-math = "1.0.3" paperlib = "1.0.8-SNAPSHOT" bstats = "2.2.1" serverlib = "2.3.1" -paster = "1.1.1" +paster = "1.1.3" sparsebitset = "1.2" parallelgzip = "1.0.5" adventure = "4.9.3" @@ -80,7 +79,6 @@ towny = { group = "com.github.TownyAdvanced", name = "Towny", version.ref = "tow protocollib = { group = "com.comphenix.protocol", name = "ProtocolLib", version.ref = "protocollib" } plotsquaredV6Bukkit = { group = "com.plotsquared", name = "PlotSquared-Bukkit", version.ref = "plotsquaredV6" } plotsquaredV6Core = { group = "com.plotsquared", name = "PlotSquared-Core", version.ref = "plotsquaredV6" } -plotsquaredV4 = { group = "com.github.intellectualsites.plotsquared", name = "PlotSquared-API", version.ref = "plotsquaredV4" } redprotect = { group = "net.fabiozumbi12", name = "redprotect", version.ref = "redprotect" } # Third Party diff --git a/settings.gradle.kts b/settings.gradle.kts index a9756b094..89dc64163 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,7 +3,7 @@ rootProject.name = "FastAsyncWorldEdit" include("worldedit-libs") include("worldedit-bukkit:adapters:adapter-legacy") -// include("worldedit-bukkit:adapters:adapter-1_17_1") +include("worldedit-bukkit:adapters:adapter-1_17_1") include("worldedit-bukkit:adapters:adapter-1_18") listOf("bukkit", "core", "cli").forEach { diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts index 7a44e517d..d9c2fcc45 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts @@ -15,19 +15,49 @@ plugins { } repositories { + mavenCentral() maven { name = "PaperMC" url = uri("https://papermc.io/repo/repository/maven-public/") + } + maven { + name = "Athion" + url = uri("https://ci.athion.net/plugin/repository/tools/") content { - includeModule("io.papermc", "paperlib") + includeModule("io.papermc", "paper-server") } } + maven { + name = "OSS Sonatype Snapshots" + url = uri("https://oss.sonatype.org/content/repositories/snapshots/") + } + maven { + name = "Mojang" + url = uri("https://libraries.minecraft.net/") + } } artifacts { add("default", file("./src/main/resources/worldedit-adapter-1.17.1.jar")) } -dependencies { - compileOnly(libs.paperlib) +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(17)) +} + +configurations.all { + attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17) +} + + +dependencies { + compileOnly("io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT") + compileOnly(project(":worldedit-bukkit")) + compileOnly(project(":worldedit-core")) + compileOnly("io.papermc:paper-server:1_17_r1_2") + compileOnly(libs.paperlib) + compileOnly("com.mojang:datafixerupper:4.0.26") + compileOnly("com.mojang:authlib:2.3.31") + compileOnly("com.mojang:brigadier:1.0.18") + compileOnly("io.netty:netty-all:4.1.25.Final") } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java index 3cc940eb7..ab2530fed 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.bukkit.adapter.ext.fawe; +import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -35,8 +36,10 @@ 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.WorldEditPlugin; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_17_R1_2.PaperweightFaweAdapter; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extension.platform.Watchdog; import com.sk89q.worldedit.extent.Extent; @@ -316,9 +319,31 @@ public final class PaperweightAdapter implements BukkitImplAdapter> 4, z >> 4); + final BlockPos blockPos = new BlockPos(x, y, z); + final CraftBlockData blockData = chunk.getBlockState(blockPos).createCraftBlockData(); + BlockState state = BukkitAdapter.adapt(blockData); + 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(); @@ -328,19 +353,11 @@ public final class PaperweightAdapter implements BukkitImplAdapter> 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()); - } // Read the NBT data BlockEntity te = chunk.getBlockEntity(blockPos); if (te != null) { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - readTileEntityIntoTag(te, tag); // Load data + net.minecraft.nbt.CompoundTag tag = te.save(new net.minecraft.nbt.CompoundTag()); //FAWE start - BinaryTag return state.toBaseBlock((CompoundBinaryTag) toNativeBinary(tag)); //FAWE end @@ -748,8 +765,9 @@ public final class PaperweightAdapter implements BukkitImplAdapter state = BlockStateIdAccess.getBlockStateById(internalId); + BlockStateHolder state = ((PaperweightFaweAdapter) WorldEditPlugin + .getInstance() + .getBukkitImplAdapter()).adapt(blockData); Objects.requireNonNull(state); BlockEntity blockEntity = chunk.getBlockEntity(pos); if (blockEntity != null) { diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java index 2a7af851f..8433a9fc1 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java @@ -230,9 +230,24 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements return Registry.BLOCK.get(new ResourceLocation(blockType.getNamespace(), blockType.getResource())); } - @SuppressWarnings("deprecation") + @Deprecated @Override - public BaseBlock getBlock(Location location) { + public BlockState getBlock(Location location) { + Preconditions.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); + return adapt(blockData); + } + + @Override + public BaseBlock getFullBlock(final Location location) { Preconditions.checkNotNull(location); CraftWorld craftWorld = ((CraftWorld) location.getWorld()); @@ -240,18 +255,22 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements int y = location.getBlockY(); int z = location.getBlockZ(); - final ServerLevel serverLevel = craftWorld.getHandle(); - LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + final ServerLevel handle = craftWorld.getHandle(); + LevelChunk chunk = handle.getChunk(x >> 4, z >> 4); final BlockPos blockPos = new BlockPos(x, y, z); - org.bukkit.block.Block bukkitBlock = location.getBlock(); - BlockState state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + final net.minecraft.world.level.block.state.BlockState blockData = chunk.getBlockState(blockPos); + BlockState state = adapt(blockData); + if (state == null) { + org.bukkit.block.Block bukkitBlock = location.getBlock(); + state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + } if (state.getBlockType().getMaterial().hasContainer()) { // Read the NBT data - BlockEntity blockEntity = levelChunk.getBlockEntity(blockPos, LevelChunk.EntityCreationType.CHECK); + BlockEntity blockEntity = chunk.getBlockEntity(blockPos, LevelChunk.EntityCreationType.CHECK); if (blockEntity != null) { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - blockEntity.save(tag); // readTileEntityIntoTag - load data + //TODO 1.18 recheck logic, I may skipped loading - NMF + net.minecraft.nbt.CompoundTag tag = blockEntity.save(new net.minecraft.nbt.CompoundTag()); return state.toBaseBlock((CompoundTag) toNative(tag)); } } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java index 725ce504d..61dcd63f8 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java @@ -25,7 +25,6 @@ import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.block.BlockTypes; import io.papermc.lib.PaperLib; import io.papermc.paper.event.block.BeaconDeactivatedEvent; import net.minecraft.core.BlockPos; @@ -151,7 +150,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc if (light != null) { lightUpdate = true; try { - fillLightNibble(light, LightLayer.SKY, minSectionPosition, maxSectionPosition); + fillLightNibble(light, LightLayer.BLOCK, minSectionPosition, maxSectionPosition); } catch (Throwable e) { e.printStackTrace(); } @@ -546,25 +545,27 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } // Biomes - BiomeType[] biomes = set.getBiomes(); + BiomeType[][] biomes = set.getBiomes(); if (biomes != null) { // set biomes ChunkBiomeContainer currentBiomes = nmsChunk.getBiomes(); if (createCopy) { copy.storeBiomes(currentBiomes); } - for (int y = 0, i = 0; y < 64; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++, i++) { - final BiomeType biome = biomes[i]; - if (biome != null) { - Biome nmsBiome = - nmsWorld.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).get( - ResourceLocation.tryParse(biome.getId())); - if (nmsBiome == null) { - throw new NullPointerException("BiomeBase null for BiomeType " + biome.getId()); + for (int layer = 0; layer < 16; layer++) { + for (int y = 0, i = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++, i++) { + final BiomeType biome = biomes[layer][i]; + if (biome != null) { + Biome nmsBiome = + nmsWorld.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).get( + ResourceLocation.tryParse(biome.getId())); + if (nmsBiome == null) { + throw new NullPointerException("BiomeBase null for BiomeType " + biome.getId()); + } + currentBiomes.setBiome(x, (layer << 2) + y, z, nmsBiome); } - currentBiomes.setBiome(x, y, z, nmsBiome); } } } @@ -925,7 +926,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) { if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); + return 1; } else { return adapter.adaptToChar(ibd); } diff --git a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts index c1f95639f..241ab7d14 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts @@ -12,7 +12,6 @@ repositories { } dependencies { - paperDevBundle("1.18-rc3-R0.1-20211129.221606-5") //TODO 1.18 switch to mainline + paperDevBundle("1.18.1-R0.1-20211218.091106-15") compileOnly(libs.paperlib) - compileOnly(libs.paper) } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index 9522d3ced..01b5ac23f 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -30,27 +30,15 @@ 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.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.WorldEditPlugin; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightFaweAdapter; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extension.platform.Watchdog; import com.sk89q.worldedit.extent.Extent; @@ -70,6 +58,20 @@ 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.BinaryTag; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; @@ -142,6 +144,7 @@ import org.bukkit.generator.ChunkGenerator; import org.spigotmc.SpigotConfig; import org.spigotmc.WatchdogThread; +import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -163,12 +166,11 @@ 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 { +public final class PaperweightAdapter implements BukkitImplAdapter { private final Logger logger = Logger.getLogger(getClass().getCanonicalName()); @@ -186,8 +188,8 @@ public final class PaperweightAdapter implements BukkitImplAdapter { CraftServer.class.cast(Bukkit.getServer()); int dataVersion = CraftMagicNumbers.INSTANCE.getDataVersion(); - if (dataVersion != 2860) { - throw new UnsupportedClassVersionError("Not 1.18!"); + if (dataVersion != 2860 && dataVersion != 2865) { + throw new UnsupportedClassVersionError("Not 1.18 or 1.18.1!"); } serverWorldsField = CraftServer.class.getDeclaredField("worlds"); @@ -235,7 +237,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * Read the given NBT data into the given tile entity. * * @param tileEntity the tile entity - * @param tag the tag + * @param tag the tag */ static void readTagIntoTileEntity(net.minecraft.nbt.CompoundTag tag, BlockEntity tileEntity) { tileEntity.load(tag); @@ -255,7 +257,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { /** * Create an entity using the given entity ID. * - * @param id the entity ID + * @param id the entity ID * @param world the world * @return an entity or null */ @@ -268,7 +270,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * Write the given NBT data into the given entity. * * @param entity the entity - * @param tag the tag + * @param tag the tag */ private static void readTagIntoEntity(net.minecraft.nbt.CompoundTag tag, Entity entity) { entity.load(tag); @@ -278,7 +280,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * Write the entity's NBT data to the given tag. * * @param entity the entity - * @param tag the tag + * @param tag the tag */ private static void readEntityIntoTag(Entity entity, net.minecraft.nbt.CompoundTag tag) { entity.save(tag); @@ -321,9 +323,8 @@ public final class PaperweightAdapter implements BukkitImplAdapter { 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); + final CraftBlockData blockData = chunk.getBlockState(blockPos).createCraftBlockData(); + BlockState state = BukkitAdapter.adapt(blockData); if (state == null) { org.bukkit.block.Block bukkitBlock = location.getBlock(); state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); @@ -349,7 +350,9 @@ public final class PaperweightAdapter implements BukkitImplAdapter { BlockEntity te = chunk.getBlockEntity(blockPos); if (te != null) { net.minecraft.nbt.CompoundTag tag = te.saveWithId(); - return state.toBaseBlock((CompoundTag) toNative(tag)); + //FAWE start - BinaryTag + return state.toBaseBlock((CompoundBinaryTag) toNativeBinary(tag)); + //FAWE end } return state.toBaseBlock(); @@ -357,8 +360,10 @@ public final class PaperweightAdapter implements BukkitImplAdapter { @Override public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { - return new PaperweightWorldNativeAccess(this, - new WeakReference<>(((CraftWorld) world).getHandle())); + return new PaperweightWorldNativeAccess( + this, + new WeakReference<>(((CraftWorld) world).getHandle()) + ); } private static net.minecraft.core.Direction adapt(Direction face) { @@ -470,7 +475,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { return TranslatableComponent.of(CraftItemStack.asNMSCopy(BukkitAdapter.adapt(itemStack)).getDescriptionId()); } - @SuppressWarnings({ "unchecked", "rawtypes" }) + @SuppressWarnings({"unchecked", "rawtypes"}) @Override public Map> getProperties(BlockType blockType) { Map> properties = Maps.newTreeMap(String::compareTo); @@ -482,11 +487,25 @@ public final class PaperweightAdapter implements BukkitImplAdapter { if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) { property = new BooleanProperty(state.getName(), ImmutableList.copyOf(state.getPossibleValues())); } else if (state instanceof DirectionProperty) { - property = new DirectionalProperty(state.getName(), - (List) state.getPossibleValues().stream().map(e -> Direction.valueOf(((StringRepresentable) e).getSerializedName().toUpperCase(Locale.ROOT))).collect(Collectors.toList())); + property = 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(), - (List) state.getPossibleValues().stream().map(e -> ((StringRepresentable) e).getSerializedName()).collect(Collectors.toList())); + property = 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())); } else { @@ -499,13 +518,13 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } @Override - public void sendFakeNBT(Player player, BlockVector3 pos, CompoundTag nbtData) { + 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(nbtData) + __ -> (net.minecraft.nbt.CompoundTag) fromNativeBinary(nbtData) )); } @@ -550,7 +569,8 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } fakePlayer.setItemInHand(InteractionHand.MAIN_HAND, stack); fakePlayer.absMoveTo(position.getBlockX(), position.getBlockY(), position.getBlockZ(), - (float) face.toVector().toYaw(), (float) face.toVector().toPitch()); + (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); @@ -559,7 +579,10 @@ public final class PaperweightAdapter implements BukkitImplAdapter { 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()) { + 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(); @@ -573,7 +596,10 @@ public final class PaperweightAdapter implements BukkitImplAdapter { 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())); + return blockData.canSurvive( + ((CraftWorld) world).getHandle(), + new BlockPos(position.getX(), position.getY(), position.getZ()) + ); } @Override @@ -591,7 +617,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { Environment env = bukkitWorld.getEnvironment(); ChunkGenerator gen = bukkitWorld.getGenerator(); - Path tempDir = Files.createTempDirectory("WorldEditWorldGen"); + Path tempDir = Files.createTempDirectory("FastAsyncWorldEditWorldGen"); LevelStorageSource levelStorage = LevelStorageSource.createDefault(tempDir); ResourceKey worldDimKey = getWorldDimKey(env); try (LevelStorageSource.LevelStorageAccess session = levelStorage.createAccess("worldeditregentempworld", worldDimKey)) { @@ -675,7 +701,11 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { + private Dynamic recursivelySetSeed( + Dynamic dynamic, + long seed, + Set> seen + ) { if (!seen.add(dynamic)) { return dynamic; } @@ -699,7 +729,8 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } @SuppressWarnings("unchecked") - private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws WorldEditException { + private void regenForWorld(Region region, Extent extent, ServerLevel serverWorld, RegenOptions options) throws + WorldEditException { List> chunkLoadings = submitChunkLoadTasks(region, serverWorld); BlockableEventLoop executor; try { @@ -728,13 +759,16 @@ public final class PaperweightAdapter implements BukkitImplAdapter { 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); + BlockStateHolder state = ((PaperweightFaweAdapter) WorldEditPlugin + .getInstance() + .getBukkitImplAdapter()).adapt(blockData); Objects.requireNonNull(state); BlockEntity blockEntity = chunk.getBlockEntity(pos); if (blockEntity != null) { net.minecraft.nbt.CompoundTag tag = blockEntity.saveWithId(); - state = state.toBaseBlock(((CompoundTag) toNative(tag))); + //FAWE start - BinaryTag + state = state.toBaseBlock(((CompoundBinaryTag) toNativeBinary(tag))); + //FAWE end } extent.setBlock(vec, state.toBaseBlock()); if (options.shouldRegenBiomes()) { @@ -818,48 +852,50 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * @param foreign non-native NMS NBT structure * @return native WorldEdit NBT structure */ - Tag toNative(net.minecraft.nbt.Tag foreign) { + //FAWE start - BinaryTag + @Override + public BinaryTag toNativeBinary(net.minecraft.nbt.Tag foreign) { if (foreign == null) { return null; } if (foreign instanceof net.minecraft.nbt.CompoundTag) { - Map values = new HashMap<>(); + 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)); + values.put(str, toNativeBinary(base)); } - return new CompoundTag(values); + return CompoundBinaryTag.from(values); } else if (foreign instanceof net.minecraft.nbt.ByteTag) { - return new ByteTag(((net.minecraft.nbt.ByteTag) foreign).getAsByte()); + return ByteBinaryTag.of(((net.minecraft.nbt.ByteTag) foreign).getAsByte()); } else if (foreign instanceof net.minecraft.nbt.ByteArrayTag) { - return new ByteArrayTag(((net.minecraft.nbt.ByteArrayTag) foreign).getAsByteArray()); + return ByteArrayBinaryTag.of(((net.minecraft.nbt.ByteArrayTag) foreign).getAsByteArray()); } else if (foreign instanceof net.minecraft.nbt.DoubleTag) { - return new DoubleTag(((net.minecraft.nbt.DoubleTag) foreign).getAsDouble()); + return DoubleBinaryTag.of(((net.minecraft.nbt.DoubleTag) foreign).getAsDouble()); } else if (foreign instanceof net.minecraft.nbt.FloatTag) { - return new FloatTag(((net.minecraft.nbt.FloatTag) foreign).getAsFloat()); + return FloatBinaryTag.of(((net.minecraft.nbt.FloatTag) foreign).getAsFloat()); } else if (foreign instanceof net.minecraft.nbt.IntTag) { - return new IntTag(((net.minecraft.nbt.IntTag) foreign).getAsInt()); + return IntBinaryTag.of(((net.minecraft.nbt.IntTag) foreign).getAsInt()); } else if (foreign instanceof net.minecraft.nbt.IntArrayTag) { - return new IntArrayTag(((net.minecraft.nbt.IntArrayTag) foreign).getAsIntArray()); + return IntArrayBinaryTag.of(((net.minecraft.nbt.IntArrayTag) foreign).getAsIntArray()); } else if (foreign instanceof net.minecraft.nbt.LongArrayTag) { - return new LongArrayTag(((net.minecraft.nbt.LongArrayTag) foreign).getAsLongArray()); + return LongArrayBinaryTag.of(((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()); + return ListBinaryTag.empty(); } } else if (foreign instanceof net.minecraft.nbt.LongTag) { - return new LongTag(((net.minecraft.nbt.LongTag) foreign).getAsLong()); + return LongBinaryTag.of(((net.minecraft.nbt.LongTag) foreign).getAsLong()); } else if (foreign instanceof net.minecraft.nbt.ShortTag) { - return new ShortTag(((net.minecraft.nbt.ShortTag) foreign).getAsShort()); + return ShortBinaryTag.of(((net.minecraft.nbt.ShortTag) foreign).getAsShort()); } else if (foreign instanceof net.minecraft.nbt.StringTag) { - return new StringTag(foreign.getAsString()); + return StringBinaryTag.of(foreign.getAsString()); } else if (foreign instanceof net.minecraft.nbt.EndTag) { - return new EndTag(); + return EndBinaryTag.get(); } else { throw new IllegalArgumentException("Don't know how to make native " + foreign.getClass().getCanonicalName()); } @@ -870,19 +906,17 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * * @param foreign the foreign tag * @return the converted tag - * @throws SecurityException on error + * @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(); + private ListBinaryTag toNativeList(net.minecraft.nbt.ListTag foreign) throws SecurityException, IllegalArgumentException { + ListBinaryTag.Builder values = ListBinaryTag.builder(); for (net.minecraft.nbt.Tag tag : foreign) { - values.add(toNative(tag)); + values.add(toNativeBinary(tag)); } - Class cls = NBTConstants.getClassFromType(type); - return new ListTag(cls, values); + return values.build(); } /** @@ -891,50 +925,51 @@ public final class PaperweightAdapter implements BukkitImplAdapter { * @param foreign structure to convert * @return non-native structure */ - net.minecraft.nbt.Tag fromNative(Tag foreign) { + @Override + public net.minecraft.nbt.Tag fromNativeBinary(BinaryTag foreign) { if (foreign == null) { return null; } - if (foreign instanceof CompoundTag) { + if (foreign instanceof CompoundBinaryTag) { 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())); + for (String key : ((CompoundBinaryTag) foreign).keySet()) { + tag.put(key, fromNativeBinary(((CompoundBinaryTag) foreign).get(key))); } 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) { + } else if (foreign instanceof ByteBinaryTag) { + return net.minecraft.nbt.ByteTag.valueOf(((ByteBinaryTag) foreign).value()); + } else if (foreign instanceof ByteArrayBinaryTag) { + return new net.minecraft.nbt.ByteArrayTag(((ByteArrayBinaryTag) foreign).value()); + } else if (foreign instanceof DoubleBinaryTag) { + return net.minecraft.nbt.DoubleTag.valueOf(((DoubleBinaryTag) foreign).value()); + } else if (foreign instanceof FloatBinaryTag) { + return net.minecraft.nbt.FloatTag.valueOf(((FloatBinaryTag) foreign).value()); + } else if (foreign instanceof IntBinaryTag) { + return net.minecraft.nbt.IntTag.valueOf(((IntBinaryTag) foreign).value()); + } else if (foreign instanceof IntArrayBinaryTag) { + return new net.minecraft.nbt.IntArrayTag(((IntArrayBinaryTag) foreign).value()); + } else if (foreign instanceof LongArrayBinaryTag) { + return new net.minecraft.nbt.LongArrayTag(((LongArrayBinaryTag) foreign).value()); + } else if (foreign instanceof ListBinaryTag) { net.minecraft.nbt.ListTag tag = new net.minecraft.nbt.ListTag(); - ListTag foreignList = (ListTag) foreign; - for (Tag t : foreignList.getValue()) { - tag.add(fromNative(t)); + ListBinaryTag foreignList = (ListBinaryTag) foreign; + for (BinaryTag t : foreignList) { + tag.add(fromNativeBinary(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) { + } else if (foreign instanceof LongBinaryTag) { + return net.minecraft.nbt.LongTag.valueOf(((LongBinaryTag) foreign).value()); + } else if (foreign instanceof ShortBinaryTag) { + return net.minecraft.nbt.ShortTag.valueOf(((ShortBinaryTag) foreign).value()); + } else if (foreign instanceof StringBinaryTag) { + return net.minecraft.nbt.StringTag.valueOf(((StringBinaryTag) foreign).value()); + } else if (foreign instanceof EndBinaryTag) { return net.minecraft.nbt.EndTag.INSTANCE; } else { throw new IllegalArgumentException("Don't know how to make NMS " + foreign.getClass().getCanonicalName()); } } + //FAWE end @Override public boolean supportsWatchdog() { @@ -947,6 +982,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } private class SpigotWatchdog implements Watchdog { + private final Field instanceField; private final Field lastTickField; @@ -971,9 +1007,11 @@ public final class PaperweightAdapter implements BukkitImplAdapter { logger.log(Level.WARNING, "Failed to tick watchdog", e); } } + } private static class MojangWatchdog implements Watchdog { + private final DedicatedServer server; private final Field tickField; @@ -993,9 +1031,11 @@ public final class PaperweightAdapter implements BukkitImplAdapter { } catch (IllegalAccessException ignored) { } } + } private static class NoOpWorldLoadListener implements ChunkProgressListener { + @Override public void updateSpawnPos(ChunkPos spawnPos) { } @@ -1015,5 +1055,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter { @Override public void setChunkRadius(int radius) { } + } + } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java index fa0b99a96..a445ed37d 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightDataConverters.java @@ -34,7 +34,7 @@ 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 com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import net.minecraft.core.Direction; import net.minecraft.nbt.NbtOps; import net.minecraft.network.chat.Component; @@ -49,6 +49,7 @@ import net.minecraft.world.item.DyeColor; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.annotation.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.EnumMap; @@ -62,31 +63,31 @@ 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" }) +@SuppressWarnings({"rawtypes", "unchecked"}) class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.worldedit.world.DataFixer { + //FAWE start - BinaryTag @SuppressWarnings("unchecked") @Override public T fixUp(FixType type, T original, int srcVer) { if (type == FixTypes.CHUNK) { - return (T) fixChunk((CompoundTag) original, srcVer); + return (T) fixChunk((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_ENTITY) { - return (T) fixBlockEntity((CompoundTag) original, srcVer); + return (T) fixBlockEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.ENTITY) { - return (T) fixEntity((CompoundTag) original, srcVer); + return (T) fixEntity((CompoundBinaryTag) original, srcVer); } else if (type == FixTypes.BLOCK_STATE) { return (T) fixBlockState((String) original, srcVer); } else if (type == FixTypes.ITEM_TYPE) { @@ -97,28 +98,34 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return original; } - private CompoundTag fixChunk(CompoundTag originalChunk, int srcVer) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(originalChunk); + private CompoundBinaryTag fixChunk(CompoundBinaryTag originalChunk, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNativeBinary(originalChunk); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.CHUNK, tag, srcVer); - return (CompoundTag) adapter.toNative(fixed); + return (CompoundBinaryTag) adapter.toNativeBinary(fixed); } - private CompoundTag fixBlockEntity(CompoundTag origTileEnt, int srcVer) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(origTileEnt); + private CompoundBinaryTag fixBlockEntity(CompoundBinaryTag origTileEnt, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNativeBinary(origTileEnt); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.BLOCK_ENTITY, tag, srcVer); - return (CompoundTag) adapter.toNative(fixed); + return (CompoundBinaryTag) adapter.toNativeBinary(fixed); } - private CompoundTag fixEntity(CompoundTag origEnt, int srcVer) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNative(origEnt); + private CompoundBinaryTag fixEntity(CompoundBinaryTag origEnt, int srcVer) { + net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) adapter.fromNativeBinary(origEnt); net.minecraft.nbt.CompoundTag fixed = convert(LegacyType.ENTITY, tag, srcVer); - return (CompoundTag) adapter.toNative(fixed); + return (CompoundBinaryTag) adapter.toNativeBinary(fixed); } + //FAWE end 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(); + net.minecraft.nbt.CompoundTag fixed = (net.minecraft.nbt.CompoundTag) INSTANCE.fixer.update( + References.BLOCK_STATE, + dynamic, + srcVer, + DATA_VERSION + ).getValue(); return nbtToState(fixed); } @@ -128,7 +135,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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(props + .getAllKeys() + .stream() + .map(k -> k + "=" + props.getString(k).replace("\"", "")) + .collect(Collectors.joining(","))); sb.append(']'); } return sb.toString(); @@ -220,6 +231,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo @SuppressWarnings("unchecked") private class WrappedDataFixer implements DataFixer { + private final DataFixer realFixer; WrappedDataFixer(DataFixer realFixer) { @@ -240,7 +252,12 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return realFixer.update(type, dynamic, sourceVer, targetVer); } - private net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp, int sourceVer, int desiredVersion) { + 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) { @@ -265,6 +282,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo public Schema getSchema(int i) { return realFixer.getSchema(i); } + } public static net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp) { @@ -275,7 +293,12 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return convert(type.getDFUType(), cmp, sourceVer); } - public static net.minecraft.nbt.CompoundTag convert(LegacyType type, net.minecraft.nbt.CompoundTag cmp, int sourceVer, int targetVer) { + 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); } @@ -288,16 +311,25 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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) { + 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(); + 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 { @@ -305,6 +337,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo int getDataVersion(); net.minecraft.nbt.CompoundTag convert(net.minecraft.nbt.CompoundTag cmp); + } @@ -582,7 +615,13 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return key; } - private static void convertCompound(LegacyType type, net.minecraft.nbt.CompoundTag cmp, String key, int sourceVer, int targetVer) { + 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)); } @@ -658,6 +697,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataInspectorBlockEntity implements DataInspector { @@ -840,6 +880,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } @@ -859,7 +900,12 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } - abstract net.minecraft.nbt.CompoundTag inspectChecked(net.minecraft.nbt.CompoundTag nbttagcompound, int sourceVer, int targetVer); + abstract net.minecraft.nbt.CompoundTag inspectChecked( + net.minecraft.nbt.CompoundTag nbttagcompound, + int sourceVer, + int targetVer + ); + } private static class DataInspectorItemList extends DataInspectorTagged { @@ -878,6 +924,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return nbttagcompound; } + } private static class DataInspectorItem extends DataInspectorTagged { @@ -896,6 +943,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return nbttagcompound; } + } private static class DataConverterMaterialId implements DataConverter { @@ -1296,6 +1344,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterBanner implements DataConverter { @@ -1342,6 +1391,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterPotionId implements DataConverter { @@ -1619,7 +1669,15 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo private static class DataConverterMinecart implements DataConverter { - private static final List a = Lists.newArrayList("MinecartRideable", "MinecartChest", "MinecartFurnace", "MinecartTNT", "MinecartSpawner", "MinecartHopper", "MinecartCommandBlock"); + private static final List a = Lists.newArrayList( + "MinecartRideable", + "MinecartChest", + "MinecartFurnace", + "MinecartTNT", + "MinecartSpawner", + "MinecartHopper", + "MinecartCommandBlock" + ); DataConverterMinecart() { } @@ -1643,6 +1701,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterMobSpawner implements DataConverter { @@ -1687,6 +1746,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } } + } private static class DataConverterUUID implements DataConverter { @@ -1705,11 +1765,47 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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"); + 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() { } @@ -1738,6 +1834,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterSaddle implements DataConverter { @@ -1762,6 +1859,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterHanging implements DataConverter { @@ -1800,6 +1898,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterDropChances implements DataConverter { @@ -1823,13 +1922,15 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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) { + 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 { @@ -1865,6 +1966,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo nbttagcompound.remove("Riding"); return nbttagcompound1; } + } private static class DataConverterBook implements DataConverter { @@ -1933,6 +2035,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterCookedFish implements DataConverter { @@ -1953,6 +2056,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterZombie implements DataConverter { @@ -1995,6 +2099,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo private int convert(int i) { return i >= 0 && i < 6 ? i : -1; } + } private static class DataConverterVBO implements DataConverter { @@ -2010,6 +2115,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo cmp.putString("useVbo", "true"); return cmp; } + } private static class DataConverterGuardian implements DataConverter { @@ -2032,6 +2138,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterSkeleton implements DataConverter { @@ -2060,6 +2167,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterZombieType implements DataConverter { @@ -2098,6 +2206,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterHorse implements DataConverter { @@ -2140,6 +2249,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterTileEntity implements DataConverter { @@ -2302,7 +2412,8 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)) { + 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)) { @@ -2316,6 +2427,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterShulker implements DataConverter { @@ -2334,11 +2446,12 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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" }; + 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() { } @@ -2375,6 +2488,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterShulkerBoxBlock implements DataConverter { @@ -2393,6 +2507,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterLang implements DataConverter { @@ -2411,6 +2526,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterTotem implements DataConverter { @@ -2429,6 +2545,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterBedBlock implements DataConverter { @@ -2476,6 +2593,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataConverterBedItem implements DataConverter { @@ -2494,12 +2612,14 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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 { + MutableComponent a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws + JsonParseException { if (jsonelement.isJsonPrimitive()) { return new TextComponent(jsonelement.getAsString()); } else if (jsonelement.isJsonArray()) { @@ -2509,7 +2629,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo while (iterator.hasNext()) { JsonElement jsonelement1 = (JsonElement) iterator.next(); - MutableComponent ichatbasecomponent1 = this.a(jsonelement1, jsonelement1.getClass(), jsondeserializationcontext); + MutableComponent ichatbasecomponent1 = this.a( + jsonelement1, + jsonelement1.getClass(), + jsondeserializationcontext + ); if (ichatbasecomponent == null) { ichatbasecomponent = ichatbasecomponent1; @@ -2524,7 +2648,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo } } - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { + public Object deserialize( + JsonElement jsonelement, + Type type, + JsonDeserializationContext jsondeserializationcontext + ) throws JsonParseException { return this.a(jsonelement, type, jsondeserializationcontext); } }).create(); @@ -2590,9 +2718,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)) { @@ -2605,9 +2735,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)) { @@ -2616,9 +2748,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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; @@ -2649,9 +2783,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)) { @@ -2663,7 +2799,15 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)); + nbttaglist.set( + j, + convert( + LegacyType.ENTITY, + (net.minecraft.nbt.CompoundTag) nbttaglist.get(j), + sourceVer, + targetVer + ) + ); } } @@ -2671,16 +2815,26 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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)); + 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)) { @@ -2693,9 +2847,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo 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); @@ -2710,9 +2866,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataInspectorVillagers implements DataInspector { + ResourceLocation entityVillager = getKey("EntityVillager"); @Override @@ -2736,9 +2894,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataInspectorMobSpawnerMinecart implements DataInspector { + ResourceLocation entityMinecartMobSpawner = getKey("EntityMinecartMobSpawner"); ResourceLocation tileEntityMobSpawner = getKey("TileEntityMobSpawner"); @@ -2753,9 +2913,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataInspectorMobSpawnerMobs implements DataInspector { + ResourceLocation tileEntityMobSpawner = getKey("TileEntityMobSpawner"); @Override @@ -2776,9 +2938,11 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } private static class DataInspectorCommandBlock implements DataInspector { + ResourceLocation tileEntityCommand = getKey("TileEntityCommand"); @Override @@ -2791,5 +2955,7 @@ class PaperweightDataConverters extends DataFixerBuilder implements com.sk89q.wo return cmp; } + } + } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java index d67ed35a1..33656c5f8 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightFakePlayer.java @@ -37,7 +37,11 @@ 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 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) { @@ -95,4 +99,5 @@ class PaperweightFakePlayer extends ServerPlayer { @Override public void openTextEdit(SignBlockEntity sign) { } + } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java index 3776a9e6d..82f13cfb7 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightWorldNativeAccess.java @@ -19,29 +19,29 @@ package com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_18_R1; -import com.sk89q.jnbt.CompoundTag; 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_R1.CraftWorld; import org.bukkit.craftbukkit.v1_18_R1.block.data.CraftBlockData; import org.bukkit.event.block.BlockPhysicsEvent; +import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.Objects; -import javax.annotation.Nullable; -public class PaperweightWorldNativeAccess implements WorldNativeAccess { +public class PaperweightWorldNativeAccess implements + WorldNativeAccess { + private static final int UPDATE = 1; private static final int NOTIFY = 2; @@ -83,12 +83,19 @@ public class PaperweightWorldNativeAccess implements WorldNativeAccess tileEntity.save(new net.minecraft.nbt.CompoundTag()))); - // TODO 1.18 save -> saveAdditional + : new PaperweightLazyCompoundTag(Suppliers.memoize(tileEntity::saveWithId)); } public Block getBlock() { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index 160dcbed7..d7e1c8914 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -1,5 +1,6 @@ package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1; +import ca.spottedleaf.starlight.common.light.StarLightEngine; import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; import com.fastasyncworldedit.bukkit.adapter.IDelegateBukkitImplAdapter; import com.fastasyncworldedit.bukkit.adapter.NMSRelighterFactory; @@ -22,7 +23,6 @@ import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_18_R1.PaperweightAdapter; import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; -import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen.PaperweightRegen; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; @@ -55,7 +55,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.core.WritableRegistry; import net.minecraft.nbt.IntTag; -import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; +import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ChunkHolder; @@ -229,9 +229,24 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements return Registry.BLOCK.get(new ResourceLocation(blockType.getNamespace(), blockType.getResource())); } - @SuppressWarnings("deprecation") + @Deprecated @Override - public BaseBlock getBlock(Location location) { + public BlockState getBlock(Location location) { + Preconditions.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); + return adapt(blockData); + } + + @Override + public BaseBlock getFullBlock(final Location location) { Preconditions.checkNotNull(location); CraftWorld craftWorld = ((CraftWorld) location.getWorld()); @@ -239,19 +254,21 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements int y = location.getBlockY(); int z = location.getBlockZ(); - final ServerLevel serverLevel = craftWorld.getHandle(); - LevelChunk levelChunk = serverLevel.getChunk(x >> 4, z >> 4); + final ServerLevel handle = craftWorld.getHandle(); + LevelChunk chunk = handle.getChunk(x >> 4, z >> 4); final BlockPos blockPos = new BlockPos(x, y, z); - org.bukkit.block.Block bukkitBlock = location.getBlock(); - BlockState state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + final net.minecraft.world.level.block.state.BlockState blockData = chunk.getBlockState(blockPos); + BlockState state = adapt(blockData); + if (state == null) { + org.bukkit.block.Block bukkitBlock = location.getBlock(); + state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + } if (state.getBlockType().getMaterial().hasContainer()) { // Read the NBT data - BlockEntity blockEntity = levelChunk.getBlockEntity(blockPos, LevelChunk.EntityCreationType.CHECK); + BlockEntity blockEntity = chunk.getBlockEntity(blockPos, LevelChunk.EntityCreationType.CHECK); if (blockEntity != null) { - net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag(); - //TODO save -> saveAdditional - blockEntity.save(tag); // readTileEntityIntoTag - load data + net.minecraft.nbt.CompoundTag tag = blockEntity.saveWithId(); return state.toBaseBlock((CompoundTag) toNative(tag)); } } @@ -305,12 +322,6 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements if (existing == blockState) { return true; } - if (section == null) { - if (blockState.isAir()) { - return true; - } - levelChunkSections[y4] = section = new LevelChunkSection(y4 << 4); - } levelChunk.setBlockState(blockPos, blockState, false); } if (update) { @@ -482,7 +493,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) .forEach(entityPlayer -> { synchronized (chunkPacket) { - ClientboundLevelChunkPacketData nmsPacket = (ClientboundLevelChunkPacketData) chunkPacket.getNativePacket(); + ClientboundLevelChunkWithLightPacket nmsPacket = (ClientboundLevelChunkWithLightPacket) chunkPacket.getNativePacket(); if (nmsPacket == null) { nmsPacket = mapUtil.create(this, chunkPacket); chunkPacket.setNativePacket(nmsPacket); @@ -600,7 +611,8 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements @Override public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { - return new PaperweightRegen(bukkitWorld, region, target, options).regenerate(); +// return new PaperweightRegen(bukkitWorld, region, target, options).regenerate(); + return false; } @Override @@ -644,7 +656,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements @Override public RelighterFactory getRelighterFactory() { try { - Class.forName("ca.spottedleaf.starlight.light.StarLightEngine"); + Class.forName("ca.spottedleaf.starlight.common.light.StarLightEngine"); if (PaperweightStarlightRelighter.isUsable()) { return new PaperweightStarlightRelighterFactory(); } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java index d9575fc3f..e6bb23523 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java @@ -275,8 +275,21 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess posNms2We = v -> BlockVector3.at(v.getX(), v.getY(), v.getZ()); private static final Function nmsTile2We = - tileEntity -> new PaperweightLazyCompoundTag(Suppliers.memoize( - //TODO save -> saveAdditional - () -> tileEntity.save(new net.minecraft.nbt.CompoundTag()))); + tileEntity -> new PaperweightLazyCompoundTag(Suppliers.memoize(tileEntity::saveWithId)); private final PaperweightFaweAdapter adapter = ((PaperweightFaweAdapter) WorldEditPlugin .getInstance() .getBukkitImplAdapter()); @@ -100,6 +97,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc private final int maxHeight; private final int minSectionPosition; private final int maxSectionPosition; + private final Registry biomeRegistry; private LevelChunkSection[] sections; private LevelChunk levelChunk; private DataLayer[] blockLight; @@ -124,6 +122,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc this.maxSectionPosition = maxHeight >> 4; this.skyLight = new DataLayer[getSectionCount()]; this.blockLight = new DataLayer[getSectionCount()]; + this.biomeRegistry = serverLevel.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); } public int getChunkX() { @@ -154,7 +153,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc if (light != null) { lightUpdate = true; try { - fillLightNibble(light, LightLayer.SKY, minSectionPosition, maxSectionPosition); + fillLightNibble(light, LightLayer.BLOCK, minSectionPosition, maxSectionPosition); } catch (Throwable e) { e.printStackTrace(); } @@ -194,19 +193,9 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc @Override public BiomeType getBiomeType(int x, int y, int z) { - ChunkBiomeContainer index = getChunk().getBiomes(); - Biome biomes = null; - if (y == -1) { - for (y = serverLevel.getMinBuildHeight(); y < serverLevel.getMaxBuildHeight(); y += 4) { - biomes = index.getNoiseBiome(x >> 2, y >> 2, z >> 2); - if (biomes != null) { - break; - } - } - } else { - biomes = index.getNoiseBiome(x >> 2, y >> 2, z >> 2); - } - return biomes != null ? PaperweightPlatformAdapter.adapt(biomes, serverLevel) : null; + LevelChunkSection section = getSections(false)[(y >> 4) - getMinSectionPosition()]; + Biome biomes = section.getNoiseBiome(x >> 2, (y & 15) >> 2, z >> 2); + return PaperweightPlatformAdapter.adapt(biomes, serverLevel); } @Override @@ -217,10 +206,8 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc if (dataLayer != null) { lightUpdate = true; synchronized (dataLayer) { - byte[] bytes = PaperLib.isPaper() ? dataLayer.getIfSet() : dataLayer.getData(); - if (!PaperLib.isPaper() || bytes != DataLayer.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } + byte[] bytes = dataLayer.getData(); + Arrays.fill(bytes, (byte) 0); } } if (sky) { @@ -233,10 +220,8 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc if (dataLayer1 != null) { lightUpdate = true; synchronized (dataLayer1) { - byte[] bytes = PaperLib.isPaper() ? dataLayer1.getIfSet() : dataLayer1.getData(); - if (!PaperLib.isPaper() || bytes != DataLayer.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } + byte[] bytes = dataLayer1.getData(); + Arrays.fill(bytes, (byte) 0); } } } @@ -251,7 +236,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc if (blockEntity == null) { return null; } - return new PaperweightLazyCompoundTag(Suppliers.memoize(() -> blockEntity.save(new net.minecraft.nbt.CompoundTag()))); + return new PaperweightLazyCompoundTag(Suppliers.memoize(blockEntity::saveWithId)); } @Override @@ -450,18 +435,67 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } } } + final BiomeType[][] biomes = set.getBiomes(); int bitMask = 0; synchronized (nmsChunk) { LevelChunkSection[] levelChunkSections = nmsChunk.getSections(); for (int layerNo = getMinSectionPosition(); layerNo <= getMaxSectionPosition(); layerNo++) { + + int getSectionIndex = layerNo - getMinSectionPosition(); + int setSectionIndex = layerNo - set.getMinSectionPosition(); + if (!set.hasSection(layerNo)) { + // No blocks, but might be biomes present. Handle this lazily. + if (biomes == null) { + continue; + } + if (layerNo < set.getMinSectionPosition() || layerNo > set.getMaxSectionPosition()) { + continue; + } + if (biomes[setSectionIndex] != null) { + synchronized (super.sectionLocks[getSectionIndex]) { + LevelChunkSection existingSection = levelChunkSections[getSectionIndex]; + if (createCopy && existingSection != null) { + copy.storeBiomes(getSectionIndex, existingSection.getBiomes().copy()); + } + + if (existingSection == null) { + PalettedContainer biomeData = PaperweightPlatformAdapter.getBiomePalettedContainer( + biomes[setSectionIndex], + biomeRegistry + ); + LevelChunkSection newSection = PaperweightPlatformAdapter.newChunkSection( + layerNo, + new char[4096], + fastmode, + adapter, + biomeRegistry, + biomeData + ); + if (PaperweightPlatformAdapter.setSectionAtomic(levelChunkSections, null, newSection, getSectionIndex)) { + updateGet(nmsChunk, levelChunkSections, newSection, new char[4096], getSectionIndex); + continue; + } else { + existingSection = levelChunkSections[getSectionIndex]; + if (existingSection == null) { + LOGGER.error("Skipping invalid null section. chunk: {}, {} layer: {}", chunkX, chunkZ, + getSectionIndex + ); + continue; + } + } + } else { + PalettedContainer biomeData = existingSection.getBiomes(); + setBiomesToPalettedContainer(biomes[setSectionIndex], biomeData); + } + } + } continue; } - int layer = layerNo - getMinSectionPosition(); - bitMask |= 1 << layer; + bitMask |= 1 << getSectionIndex; char[] tmp = set.load(layerNo); char[] setArr = new char[4096]; @@ -469,26 +503,44 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc // synchronise on internal section to avoid circular locking with a continuing edit if the chunk was // submitted to keep loaded internal chunks to queue target size. - synchronized (super.sectionLocks[layer]) { + synchronized (super.sectionLocks[getSectionIndex]) { + + LevelChunkSection newSection; + LevelChunkSection existingSection = levelChunkSections[getSectionIndex]; + if (createCopy) { char[] tmpLoad = loadPrivately(layerNo); char[] copyArr = new char[4096]; System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); - copy.storeSection(layer, copyArr); + copy.storeSection(getSectionIndex, copyArr); + if (biomes != null && existingSection != null) { + copy.storeBiomes(getSectionIndex, existingSection.getBiomes().copy()); + } } - LevelChunkSection newSection; - LevelChunkSection existingSection = levelChunkSections[layer]; if (existingSection == null) { - newSection = PaperweightPlatformAdapter.newChunkSection(layerNo, setArr, fastmode, adapter); - if (PaperweightPlatformAdapter.setSectionAtomic(levelChunkSections, null, newSection, layer)) { - updateGet(nmsChunk, levelChunkSections, newSection, setArr, layer); + PalettedContainer biomeData = biomes == null ? new PalettedContainer<>( + biomeRegistry, + biomeRegistry.getOrThrow(Biomes.PLAINS), + PalettedContainer.Strategy.SECTION_BIOMES, + null + ) : PaperweightPlatformAdapter.getBiomePalettedContainer(biomes[setSectionIndex], biomeRegistry); + newSection = PaperweightPlatformAdapter.newChunkSection( + layerNo, + setArr, + fastmode, + adapter, + biomeRegistry, + biomeData + ); + if (PaperweightPlatformAdapter.setSectionAtomic(levelChunkSections, null, newSection, getSectionIndex)) { + updateGet(nmsChunk, levelChunkSections, newSection, setArr, getSectionIndex); continue; } else { - existingSection = levelChunkSections[layer]; + existingSection = levelChunkSections[getSectionIndex]; if (existingSection == null) { LOGGER.error("Skipping invalid null section. chunk: {}, {} layer: {}", chunkX, chunkZ, - +layer + getSectionIndex ); continue; } @@ -507,10 +559,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc this.levelChunk = nmsChunk; this.sections = null; this.reset(); - } else if (existingSection != getSections(false)[layer]) { - this.sections[layer] = existingSection; + } else if (existingSection != getSections(false)[getSectionIndex]) { + this.sections[getSectionIndex] = existingSection; this.reset(); - } else if (!Arrays.equals(update(layer, new char[4096], true), loadPrivately(layerNo))) { + } else if (!Arrays.equals(update(getSectionIndex, new char[4096], true), loadPrivately(layerNo))) { this.reset(layerNo); /*} else if (lock.isModified()) { this.reset(layerNo);*/ @@ -518,51 +570,34 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } finally { sectionLock.writeLock().unlock(); } + + PalettedContainer biomeData = existingSection.getBiomes(); + + if (biomes != null && biomes[setSectionIndex] != null) { + setBiomesToPalettedContainer(biomes[setSectionIndex], biomeData); + } + newSection = PaperweightPlatformAdapter.newChunkSection( layerNo, this::loadPrivately, setArr, fastmode, - adapter + adapter, + biomeRegistry, + biomeData ); if (!PaperweightPlatformAdapter.setSectionAtomic( levelChunkSections, existingSection, newSection, - layer + getSectionIndex )) { LOGGER.error("Skipping invalid null section. chunk: {}, {} layer: {}", chunkX, chunkZ, - +layer + getSectionIndex ); } else { - updateGet(nmsChunk, levelChunkSections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - ChunkBiomeContainer currentBiomes = nmsChunk.getBiomes(); - if (createCopy) { - copy.storeBiomes(currentBiomes); - } - for (int y = 0, i = 0; y < 64; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++, i++) { - final BiomeType biome = biomes[i]; - if (biome != null) { - Biome nmsBiome = - nmsWorld.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).get( - ResourceLocation.tryParse(biome.getId())); - if (nmsBiome == null) { - throw new NullPointerException("BiomeBase null for BiomeType " + biome.getId()); - } - currentBiomes.setBiome(x, y, z, nmsBiome); - } + updateGet(nmsChunk, levelChunkSections, newSection, setArr, getSectionIndex); } } } @@ -665,7 +700,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } entity.load(tag); entity.absMoveTo(x, y, z, yaw, pitch); - nmsWorld.addEntity(entity, CreatureSpawnEvent.SpawnReason.CUSTOM); + nmsWorld.addFreshEntity(entity, CreatureSpawnEvent.SpawnReason.CUSTOM); } } } @@ -718,7 +753,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc // Set Modified nmsChunk.setLightCorrect(true); // Set Modified nmsChunk.mustNotSave = false; - nmsChunk.isUnsaved(); // TODO 1.18 revisit + nmsChunk.setUnsaved(true); // send to player if (Settings.IMP.LIGHTING.MODE == 0 || !Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) { this.send(finalMask, finalLightUpdate); @@ -857,10 +892,17 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc lock.acquire(); final PalettedContainer blocks = section.getStates(); - final BitStorage bits = (BitStorage) PaperweightPlatformAdapter.fieldStorage.get(blocks); - final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get(blocks); + final Object dataObject = PaperweightPlatformAdapter.fieldData.get(blocks); + final BitStorage bits = (BitStorage) PaperweightPlatformAdapter.fieldStorage.get(dataObject); - final int bitsPerEntry = (int) PaperweightPlatformAdapter.fieldBitsPerEntry.get(bits); + if (bits instanceof ZeroBitStorage) { + Arrays.fill(data, (char) 0); + return data; + } + + final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get(dataObject); + + final int bitsPerEntry = bits.getBits(); final long[] blockStates = bits.getRaw(); new BitArrayUnstretched(bitsPerEntry, 4096, blockStates).toRaw(data); @@ -924,7 +966,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) { if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); + return 1; } else { return adapter.adaptToChar(ibd); } @@ -999,6 +1041,32 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } } + private void setBiomesToPalettedContainer( + final BiomeType[] biomes, + PalettedContainer data + ) { + int index = 0; + if (biomes == null) { + return; + } + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++, index++) { + BiomeType biomeType = biomes[index]; + if (biomeType == null) { + continue; + } + data.set( + x, + y, + z, + biomeRegistry.get(ResourceLocation.tryParse(biomeType.getId())) + ); + } + } + } + } + @Override public boolean hasSection(int layer) { layer -= getMinSectionPosition(); @@ -1028,8 +1096,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc try { final PalettedContainer blocksExisting = existing.getStates(); + final Object dataObject = PaperweightPlatformAdapter.fieldData.get(blocksExisting); + //TODO this field doesn't exist in 1.18 final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get( - blocksExisting); + dataObject); int paletteSize; if (palette instanceof LinearPalette || palette instanceof HashMapPalette) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java index 2915de82e..d07b8b9b1 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java @@ -18,7 +18,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.chunk.ChunkBiomeContainer; +import net.minecraft.world.level.chunk.PalettedContainer; import javax.annotation.Nullable; import java.util.HashMap; @@ -36,7 +36,7 @@ public class PaperweightGetBlocks_Copy implements IChunkGet { private final int minHeight; private final int maxHeight; private final ServerLevel serverLevel; - private ChunkBiomeContainer chunkBiomeContainer; + private PalettedContainer[] biomes = null; protected PaperweightGetBlocks_Copy(ServerLevel world) { this.serverLevel = world; @@ -52,8 +52,7 @@ public class PaperweightGetBlocks_Copy implements IChunkGet { blockEntity.getBlockPos().getY(), blockEntity.getBlockPos().getZ() ), - new PaperweightLazyCompoundTag(Suppliers.memoize(() -> blockEntity.save(new net.minecraft.nbt.CompoundTag()))) - //TODO 1.18 save -> saveAdditional + new PaperweightLazyCompoundTag(Suppliers.memoize(blockEntity::saveWithId)) ); } @@ -142,27 +141,9 @@ public class PaperweightGetBlocks_Copy implements IChunkGet { return minHeight >> 4; } - protected void storeBiomes(ChunkBiomeContainer chunkBiomeContainer) { - // The to do one line below is pre-paperweight and needs to be revised - // TODO revisit last parameter, BiomeStorage[] *would* be more efficient - this.chunkBiomeContainer = new ChunkBiomeContainer(chunkBiomeContainer.biomeRegistry, serverLevel, - chunkBiomeContainer.writeBiomes() - ); - } - @Override public BiomeType getBiomeType(int x, int y, int z) { - Biome biome = null; - if (y == -1) { - for (y = serverLevel.getMinBuildHeight(); y <= serverLevel.getMaxBuildHeight(); y += 4) { - biome = this.chunkBiomeContainer.getNoiseBiome(x >> 2, y >> 2, z >> 2); - if (biome != null) { - break; - } - } - } else { - biome = this.chunkBiomeContainer.getNoiseBiome(x >> 2, y >> 2, z >> 2); - } + Biome biome = biomes[(y >> 4) - getMinSectionPosition()].get(x >> 2, (y & 15) >> 2, z >> 2); return biome != null ? PaperweightPlatformAdapter.adapt(biome, serverLevel) : null; } @@ -189,6 +170,13 @@ public class PaperweightGetBlocks_Copy implements IChunkGet { blocks[layer] = data; } + protected void storeBiomes(int layer, PalettedContainer biomeData) { + if (biomes == null) { + biomes = new PalettedContainer[getSectionCount()]; + } + biomes[layer] = biomeData; + } + @Override public BaseBlock getFullBlock(int x, int y, int z) { BlockState state = BlockTypesCache.states[get(x, y, z)]; diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java index 093648f3e..5f59cc498 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightMapChunkUtil.java @@ -4,16 +4,19 @@ import com.fastasyncworldedit.bukkit.adapter.MapChunkUtil; import com.sk89q.worldedit.bukkit.adapter.Refraction; import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; -public class PaperweightMapChunkUtil extends MapChunkUtil { +import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; + +//TODO un-very-break-this +public class PaperweightMapChunkUtil extends MapChunkUtil { public PaperweightMapChunkUtil() throws NoSuchFieldException { fieldX = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("TWO_MEGABYTES", "a")); - fieldZ = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("x", "b")); - fieldBitMask = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("z", "c")); - fieldHeightMap = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("availableSections", "d")); - fieldChunkData = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("biomes", "f")); - fieldBlockEntities = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("buffer", "g")); - fieldFull = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("blockEntitiesTags", "h")); + fieldZ = ClientboundLevelChunkWithLightPacket.class.getDeclaredField(Refraction.pickName("x", "a")); + fieldBitMask = ClientboundLevelChunkWithLightPacket.class.getDeclaredField(Refraction.pickName("z", "b")); + fieldHeightMap = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("heightmaps", "b")); + fieldChunkData = ClientboundLevelChunkWithLightPacket.class.getDeclaredField(Refraction.pickName("chunkData", "c")); + fieldBlockEntities = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("buffer", "c")); + fieldFull = ClientboundLevelChunkPacketData.class.getDeclaredField(Refraction.pickName("blockEntitiesData", "d")); fieldX.setAccessible(true); fieldZ.setAccessible(true); fieldBitMask.setAccessible(true); @@ -24,7 +27,7 @@ public class PaperweightMapChunkUtil extends MapChunkUtil dataConstructor; + public static final Field fieldStorage; public static final Field fieldPalette; - public static final Field fieldBits; - public static final Field fieldBitsPerEntry; public static final Field fieldTickingFluidContent; public static final Field fieldTickingBlockCount; public static final Field fieldNonEmptyBlockCount; - private static final Field fieldBiomes; - private static final MethodHandle methodGetVisibleChunk; private static final int CHUNKSECTION_BASE; private static final int CHUNKSECTION_SHIFT; + private static final Field fieldThreadingDetector; + private static final long fieldThreadingDetectorOffset; + private static final Field fieldLock; private static final long fieldLockOffset; @@ -92,15 +107,18 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { static { try { - fieldBits = PalettedContainer.class.getDeclaredField(Refraction.pickName("bits", "l")); - fieldBits.setAccessible(true); - fieldStorage = PalettedContainer.class.getDeclaredField(Refraction.pickName("storage", "c")); - fieldStorage.setAccessible(true); - fieldPalette = PalettedContainer.class.getDeclaredField(Refraction.pickName("palette", "k")); - fieldPalette.setAccessible(true); + fieldData = PalettedContainer.class.getDeclaredField(Refraction.pickName("data", "d")); + fieldData.setAccessible(true); - fieldBitsPerEntry = BitStorage.class.getDeclaredField(Refraction.pickName("bits", "c")); - fieldBitsPerEntry.setAccessible(true); + Class dataClazz = fieldData.getType(); + dataConstructor = dataClazz.getDeclaredConstructors()[0]; + dataConstructor.setAccessible(true); + + //TODO FIXME 1.18 + fieldStorage = dataClazz.getDeclaredField(Refraction.pickName("storage", "b")); + fieldStorage.setAccessible(true); + fieldPalette = dataClazz.getDeclaredField(Refraction.pickName("palette", "c")); + fieldPalette.setAccessible(true); fieldTickingFluidContent = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingFluidCount", "h")); fieldTickingFluidContent.setAccessible(true); @@ -109,27 +127,27 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { fieldNonEmptyBlockCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("nonEmptyBlockCount", "f")); fieldNonEmptyBlockCount.setAccessible(true); - fieldBiomes = ChunkBiomeContainer.class.getDeclaredField(Refraction.pickName("biomes", "f")); - fieldBiomes.setAccessible(true); - Method getVisibleChunkIfPresent = ChunkMap.class.getDeclaredMethod(Refraction.pickName( "getVisibleChunkIfPresent", - "getVisibleChunk" + "b" ), long.class); getVisibleChunkIfPresent.setAccessible(true); methodGetVisibleChunk = MethodHandles.lookup().unreflect(getVisibleChunkIfPresent); Unsafe unsafe = ReflectionUtils.getUnsafe(); - fieldLock = PalettedContainer.class.getDeclaredField(Refraction.pickName("lock", "m")); + fieldThreadingDetector = PalettedContainer.class.getDeclaredField(Refraction.pickName("threadingDetector", "f")); + fieldThreadingDetectorOffset = unsafe.objectFieldOffset(fieldThreadingDetector); + + fieldLock = ThreadingDetector.class.getDeclaredField(Refraction.pickName("lock", "c")); fieldLockOffset = unsafe.objectFieldOffset(fieldLock); fieldGameEventDispatcherSections = LevelChunk.class.getDeclaredField(Refraction.pickName( - "gameEventDispatcherSections", "x")); + "gameEventDispatcherSections", "t")); fieldGameEventDispatcherSections.setAccessible(true); Method removeBlockEntityTicker = LevelChunk.class.getDeclaredMethod( Refraction.pickName( "removeBlockEntityTicker", - "l" + "m" ), BlockPos.class ); removeBlockEntityTicker.setAccessible(true); @@ -166,18 +184,21 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } static DelegateSemaphore applyLock(LevelChunkSection section) { - //todo there has to be a better way to do this. Maybe using a() in DataPaletteBlock which acquires the lock in NMS? try { synchronized (section) { Unsafe unsafe = ReflectionUtils.getUnsafe(); PalettedContainer blocks = section.getStates(); - Semaphore currentLock = (Semaphore) unsafe.getObject(blocks, fieldLockOffset); - if (currentLock instanceof DelegateSemaphore) { - return (DelegateSemaphore) currentLock; + ThreadingDetector currentThreadingDetector = (ThreadingDetector) unsafe.getObject(blocks, + fieldThreadingDetectorOffset) ; + synchronized(currentThreadingDetector) { + Semaphore currentLock = (Semaphore) unsafe.getObject(currentThreadingDetector, fieldLockOffset); + if (currentLock instanceof DelegateSemaphore) { + return (DelegateSemaphore) currentLock; + } + DelegateSemaphore newLock = new DelegateSemaphore(1, currentLock); + unsafe.putObject(currentThreadingDetector, fieldLockOffset, newLock); + return newLock; } - DelegateSemaphore newLock = new DelegateSemaphore(1, currentLock); - unsafe.putObject(blocks, fieldLockOffset, newLock); - return newLock; } } catch (Throwable e) { e.printStackTrace(); @@ -248,21 +269,14 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } LevelChunk levelChunk = optional.get(); TaskManager.IMP.task(() -> { - ClientboundLevelChunkPacketData chunkPacket = new ClientboundLevelChunkPacketData(levelChunk); - nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(chunkPacket)); - if (lighting) { - //This needs to be true otherwise Minecraft will update lighting from/at the chunk edges (bad) - boolean trustEdges = true; - ClientboundLightUpdatePacket packet = - new ClientboundLightUpdatePacket(coordIntPair, nmsWorld.getChunkSource().getLightEngine(), null, null, - trustEdges - ); - nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(packet)); - } + ClientboundLevelChunkWithLightPacket packet = + new ClientboundLevelChunkWithLightPacket(levelChunk, nmsWorld.getChunkSource().getLightEngine(), null, null + , true, false); // last false is to not bother with x-ray + nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(packet)); }); } - private static Stream nearbyPlayers(ServerLevel serverLevel, ChunkPos coordIntPair) { + private static List nearbyPlayers(ServerLevel serverLevel, ChunkPos coordIntPair) { return serverLevel.getChunkSource().chunkMap.getPlayers(coordIntPair, false); } @@ -271,17 +285,19 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { */ public static LevelChunkSection newChunkSection( final int layer, final char[] blocks, boolean fastmode, - CachedBukkitAdapter adapter + CachedBukkitAdapter adapter, Registry biomeRegistry, + @Nullable PalettedContainer biomes ) { - return newChunkSection(layer, null, blocks, fastmode, adapter); + return newChunkSection(layer, null, blocks, fastmode, adapter, biomeRegistry, biomes); } public static LevelChunkSection newChunkSection( final int layer, final Function get, char[] set, - boolean fastmode, CachedBukkitAdapter adapter + boolean fastmode, CachedBukkitAdapter adapter, Registry biomeRegistry, + @Nullable PalettedContainer biomes ) { if (set == null) { - return newChunkSection(layer); + return newChunkSection(layer, biomeRegistry, biomes); } final int[] blockToPalette = FaweCache.IMP.BLOCK_TO_PALETTE.get(); final int[] paletteToBlock = FaweCache.IMP.PALETTE_TO_BLOCK.get(); @@ -302,17 +318,18 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } int num_palette = num_palette_buffer[0]; // BlockStates + int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { - bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry - } else { - bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries - } - if (bitsPerEntry > 8) { + Object configuration = + PalettedContainer.Strategy.SECTION_STATES.getConfiguration(new FakeIdMapBlock(num_palette), bitsPerEntry); + if (bitsPerEntry > 0 && bitsPerEntry < 5) { + bitsPerEntry = 4; + } else if (bitsPerEntry > 8) { bitsPerEntry = MathMan.log2nlz(Block.BLOCK_STATE_REGISTRY.size() - 1); } - final int blocksPerLong = MathMan.floorZero((double) 64 / bitsPerEntry); + int bitsPerEntryNonZero = Math.max(bitsPerEntry, 1); // We do want to use zero sometimes + final int blocksPerLong = MathMan.floorZero((double) 64 / bitsPerEntryNonZero); final int blockBitArrayEnd = MathMan.ceilZero((float) 4096 / blocksPerLong); if (num_palette == 1) { @@ -320,55 +337,63 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { blockStates[i] = 0; } } else { - final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntry, 4096, blockStates); + final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntryNonZero, 4096, blockStates); bitArray.fromRaw(blocksCopy); } - LevelChunkSection levelChunkSection = newChunkSection(layer); - // set palette & data bits - final PalettedContainer dataPaletteBlocks = - levelChunkSection.getStates(); - // private DataPalette h; - // protected DataBits a; final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final BitStorage nmsBits = new BitStorage(bitsPerEntry, 4096, bits); - final Palette blockStatePalettedContainer; - if (bitsPerEntry <= 4) { - blockStatePalettedContainer = new LinearPalette<>(Block.BLOCK_STATE_REGISTRY, bitsPerEntry, dataPaletteBlocks, - NbtUtils::readBlockState - ); - } else if (bitsPerEntry < 9) { - blockStatePalettedContainer = new HashMapPalette<>( - Block.BLOCK_STATE_REGISTRY, - bitsPerEntry, - dataPaletteBlocks, - NbtUtils::readBlockState, - NbtUtils::writeBlockState - ); + final BitStorage nmsBits; + if (bitsPerEntry == 0) { + nmsBits = new ZeroBitStorage(4096); } else { - blockStatePalettedContainer = LevelChunkSection.GLOBAL_BLOCKSTATE_PALETTE; + nmsBits = new SimpleBitStorage(bitsPerEntry, 4096, bits); } - - // set palette if required + final Palette blockStatePalette; + List palette; if (bitsPerEntry < 9) { + palette = new ArrayList<>(); for (int i = 0; i < num_palette; i++) { - final int ordinal = paletteToBlock[i]; + int ordinal = paletteToBlock[i]; blockToPalette[ordinal] = Integer.MAX_VALUE; final BlockState state = BlockTypesCache.states[ordinal]; - final net.minecraft.world.level.block.state.BlockState blockState = ((PaperweightBlockMaterial) state.getMaterial()).getState(); - blockStatePalettedContainer.idFor(blockState); + palette.add(((PaperweightBlockMaterial) state.getMaterial()).getState()); } + } else { + palette = List.of(); } + + // Create palette with data + final PalettedContainer blockStatePalettedContainer = + new PalettedContainer<>( + Block.BLOCK_STATE_REGISTRY, + PalettedContainer.Strategy.SECTION_STATES, + PalettedContainer.Strategy.SECTION_STATES.getConfiguration(Block.BLOCK_STATE_REGISTRY, bitsPerEntry), + nmsBits, + palette, + null, + null + ); + LevelChunkSection levelChunkSection; try { - fieldStorage.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, blockStatePalettedContainer); - fieldBits.set(dataPaletteBlocks, bitsPerEntry); + //fieldStorage.set(dataPaletteBlocks, nmsBits); + //fieldPalette.set(dataPaletteBlocks, blockStatePalettedContainer); + if (biomes == null) { + biomes = new PalettedContainer<>( + biomeRegistry, + biomeRegistry.getOrThrow(Biomes.PLAINS), + PalettedContainer.Strategy.SECTION_BIOMES, + null + ); + } + levelChunkSection = new LevelChunkSection(layer, blockStatePalettedContainer, biomes); setCount(ticking_blocks.size(), 4096 - air, levelChunkSection); if (!fastmode) { - ticking_blocks.forEach((pos, ordinal) -> levelChunkSection - .setBlockState(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), - Block.stateById(ordinal) - )); + ticking_blocks.forEach((pos, ordinal) -> levelChunkSection.setBlockState( + pos.getBlockX(), + pos.getBlockY(), + pos.getBlockZ(), + Block.stateById(ordinal) + )); } } catch (final IllegalAccessException e) { throw new RuntimeException(e); @@ -381,8 +406,123 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } } - private static LevelChunkSection newChunkSection(int layer) { - return new LevelChunkSection(layer); + private static LevelChunkSection newChunkSection( + int layer, Registry biomeRegistry, + @Nullable PalettedContainer biomes + ) { + PalettedContainer dataPaletteBlocks = new PalettedContainer<>( + Block.BLOCK_STATE_REGISTRY, + Blocks.AIR.defaultBlockState(), + PalettedContainer.Strategy.SECTION_STATES, + null + ); + PalettedContainer biomesPalette = biomes != null ? biomes : new PalettedContainer<>( + biomeRegistry, + biomeRegistry.getOrThrow(Biomes.PLAINS), + PalettedContainer.Strategy.SECTION_BIOMES, + null + ); + return new LevelChunkSection(layer, dataPaletteBlocks, biomesPalette); + } + + /** + * Create a new {@link PalettedContainer}. Should only be used if no biome container existed beforehand. + */ + public static PalettedContainer getBiomePalettedContainer(BiomeType[] biomes, Registry biomeRegistry) { + if (biomes == null) { + return null; + } + // Don't stream this as typically will see 1-4 biomes; stream overhead is large for the small length + Map palette = new HashMap<>(); + for (BiomeType biomeType : new LinkedList<>(Arrays.asList(biomes))) { + Biome biome; + if (biomeType == null) { + biome = biomeRegistry.getOrThrow(Biomes.PLAINS); + } else { + biome = biomeRegistry.get(ResourceLocation.tryParse(biomeType.getId())); + } + palette.put(biomeType, biome); + } + int biomeCount = palette.size(); + int bitsPerEntry = MathMan.log2nlz(biomeCount - 1); + Object configuration = PalettedContainer.Strategy.SECTION_STATES.getConfiguration( + new FakeIdMapBiome(biomeCount), + bitsPerEntry + ); + if (bitsPerEntry > 3) { + bitsPerEntry = MathMan.log2nlz(biomeRegistry.size() - 1); + } + PalettedContainer biomePalettedContainer = new PalettedContainer<>( + biomeRegistry, + biomeRegistry.getOrThrow(Biomes.PLAINS), + PalettedContainer.Strategy.SECTION_BIOMES, + null + ); + + final Palette biomePalette; + if (bitsPerEntry == 0) { + biomePalette = new SingleValuePalette<>( + biomePalettedContainer.registry, + biomePalettedContainer, + new ArrayList<>(palette.values()) // Must be modifiable + ); + } else if (bitsPerEntry == 4) { + biomePalette = LinearPalette.create( + 4, + biomePalettedContainer.registry, + biomePalettedContainer, + new ArrayList<>(palette.values()) // Must be modifiable + ); + } else if (bitsPerEntry < 9) { + biomePalette = HashMapPalette.create( + bitsPerEntry, + biomePalettedContainer.registry, + biomePalettedContainer, + new ArrayList<>(palette.values()) // Must be modifiable + ); + } else { + biomePalette = GlobalPalette.create( + bitsPerEntry, + biomePalettedContainer.registry, + biomePalettedContainer, + null // unused + ); + } + + int bitsPerEntryNonZero = Math.max(bitsPerEntry, 1); // We do want to use zero sometimes + final int blocksPerLong = MathMan.floorZero((double) 64 / bitsPerEntryNonZero); + final int arrayLength = MathMan.ceilZero(64f / blocksPerLong); + + + BitStorage bitStorage = bitsPerEntry == 0 ? new ZeroBitStorage(64) : new SimpleBitStorage( + bitsPerEntry, + 64, + new long[arrayLength] + ); + + try { + Object data = dataConstructor.newInstance(configuration, bitStorage, biomePalette); + fieldData.set(biomePalettedContainer, data); + int index = 0; + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++, index++) { + BiomeType biomeType = biomes[index]; + if (biomeType == null) { + continue; + } + Biome biome = biomeRegistry.get(ResourceLocation.tryParse(biomeType.getId())); + if (biome == null) { + continue; + } + biomePalettedContainer.set(x, y, z, biome); + } + } + } + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + return biomePalettedContainer; } public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final LevelChunkSection section) throws @@ -392,15 +532,6 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); } - public static Biome[] getBiomeArray(ChunkBiomeContainer chunkBiomeContainer) { - try { - return (Biome[]) fieldBiomes.get(chunkBiomeContainer); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } - public static BiomeType adapt(Biome biome, LevelAccessor levelAccessor) { ResourceLocation resourceLocation = levelAccessor.registryAccess().ownedRegistryOrThrow(Registry.BIOME_REGISTRY).getKey( biome); @@ -415,6 +546,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) { try { // Do the method ourselves to avoid trying to reflect generic method parameters + // similar to removeGameEventListener if (levelChunk.loaded || levelChunk.level.isClientSide()) { BlockEntity blockEntity = levelChunk.blockEntities.remove(beacon.getBlockPos()); if (blockEntity != null) { @@ -446,4 +578,68 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } } + static class FakeIdMapBlock implements IdMap { + + private final int size; + + FakeIdMapBlock(int size) { + this.size = size; + } + + @Override + public int getId(final net.minecraft.world.level.block.state.BlockState entry) { + return 0; + } + + @Nullable + @Override + public net.minecraft.world.level.block.state.BlockState byId(final int index) { + return null; + } + + @Override + public int size() { + return size; + } + + @NotNull + @Override + public Iterator iterator() { + return Collections.emptyIterator(); + } + + } + + static class FakeIdMapBiome implements IdMap { + + private final int size; + + FakeIdMapBiome(int size) { + this.size = size; + } + + @Override + public int getId(final Biome entry) { + return 0; + } + + @Nullable + @Override + public Biome byId(final int index) { + return null; + } + + @Override + public int size() { + return size; + } + + @NotNull + @Override + public Iterator iterator() { + return Collections.emptyIterator(); + } + + } + } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java index 33c1f545a..3dfebd31c 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java @@ -94,8 +94,9 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public List getList(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof net.minecraft.nbt.ListTag nbtList) { + if (tag instanceof net.minecraft.nbt.ListTag) { ArrayList list = new ArrayList<>(); + net.minecraft.nbt.ListTag nbtList = (net.minecraft.nbt.ListTag) tag; for (net.minecraft.nbt.Tag elem : nbtList) { if (elem instanceof net.minecraft.nbt.CompoundTag) { list.add(new PaperweightLazyCompoundTag((net.minecraft.nbt.CompoundTag) elem)); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java index 3fa31eebe..f916ebb91 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -1,721 +1,722 @@ -package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen; - -import com.fastasyncworldedit.bukkit.adapter.Regenerator; -import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.queue.IChunkCache; -import com.fastasyncworldedit.core.queue.IChunkGet; -import com.fastasyncworldedit.core.util.ReflectionUtils; -import com.fastasyncworldedit.core.util.TaskManager; -import com.google.common.collect.ImmutableList; -import com.mojang.datafixers.util.Either; -import com.mojang.serialization.Codec; -import com.mojang.serialization.Dynamic; -import com.mojang.serialization.Lifecycle; -import com.sk89q.worldedit.bukkit.adapter.Refraction; -import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightGetBlocks; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.io.file.SafeFiles; -import com.sk89q.worldedit.world.RegenOptions; -import io.papermc.lib.PaperLib; -import net.minecraft.core.MappedRegistry; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.biome.Biomes; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtOps; -import net.minecraft.resources.RegistryReadOps; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ThreadedLevelLightEngine; -import net.minecraft.server.level.progress.ChunkProgressListener; -import net.minecraft.util.LinearCongruentialGenerator; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.LevelSettings; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.OverworldBiomeSource; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.ProtoChunk; -import net.minecraft.world.level.chunk.UpgradeData; -import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.FlatLevelSource; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.SimpleRandomSource; -import net.minecraft.world.level.levelgen.WorldGenSettings; -import net.minecraft.world.level.levelgen.XoroshiroRandomSource; -import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; -import net.minecraft.world.level.levelgen.synth.ImprovedNoise; -import net.minecraft.world.level.newbiome.area.Area; -import net.minecraft.world.level.newbiome.area.AreaFactory; -import net.minecraft.world.level.newbiome.context.BigContext; -import net.minecraft.world.level.newbiome.layer.Layer; -import net.minecraft.world.level.newbiome.layer.Layers; -import net.minecraft.world.level.newbiome.layer.traits.PixelTransformer; -import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraft.world.level.storage.PrimaryLevelData; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_18_R1.CraftServer; -import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_18_R1.generator.CustomChunkGenerator; -import org.bukkit.generator.BlockPopulator; - -import javax.annotation.Nullable; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.file.Path; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BooleanSupplier; -import java.util.function.LongFunction; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -public class PaperweightRegen extends Regenerator { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private static final Field serverWorldsField; - private static final Field worldPaperConfigField; - private static final Field flatBedrockField; - private static final Field generatorSettingFlatField; - private static final Field generatorSettingBaseSupplierField; - private static final Field delegateField; - private static final Field chunkProviderField; - - //list of chunk stati in correct order without FULL - private static final Map chunkStati = new LinkedHashMap<>(); - - static { - chunkStati.put(ChunkStatus.EMPTY, Concurrency.FULL); // empty: radius -1, does nothing - chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Concurrency.NONE); // structure starts: uses unsynchronized maps - chunkStati.put( - ChunkStatus.STRUCTURE_REFERENCES, - Concurrency.FULL - ); // structure refs: radius 8, but only writes to current chunk - chunkStati.put(ChunkStatus.BIOMES, Concurrency.FULL); // biomes: radius 0 - chunkStati.put(ChunkStatus.NOISE, Concurrency.RADIUS); // noise: radius 8 - chunkStati.put(ChunkStatus.SURFACE, Concurrency.NONE); // surface: radius 0, requires NONE - chunkStati.put(ChunkStatus.CARVERS, Concurrency.NONE); // carvers: radius 0, but RADIUS and FULL change results - chunkStati.put( - ChunkStatus.LIQUID_CARVERS, - Concurrency.NONE - ); // liquid carvers: radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.FEATURES, Concurrency.NONE); // features: uses unsynchronized maps - chunkStati.put( - ChunkStatus.LIGHT, - Concurrency.FULL - ); // light: radius 1, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.SPAWN, Concurrency.FULL); // spawn: radius 0 - chunkStati.put(ChunkStatus.HEIGHTMAPS, Concurrency.FULL); // heightmaps: radius 0 - - try { - serverWorldsField = CraftServer.class.getDeclaredField("worlds"); - serverWorldsField.setAccessible(true); - - Field tmpPaperConfigField; - Field tmpFlatBedrockField; - try { //only present on paper - tmpPaperConfigField = Level.class.getDeclaredField("paperConfig"); - tmpPaperConfigField.setAccessible(true); - - tmpFlatBedrockField = tmpPaperConfigField.getType().getDeclaredField("generateFlatBedrock"); - tmpFlatBedrockField.setAccessible(true); - } catch (Exception e) { - tmpPaperConfigField = null; - tmpFlatBedrockField = null; - } - worldPaperConfigField = tmpPaperConfigField; - flatBedrockField = tmpFlatBedrockField; - - generatorSettingBaseSupplierField = NoiseBasedChunkGenerator.class.getDeclaredField(Refraction.pickName( - "settings", "g")); - generatorSettingBaseSupplierField.setAccessible(true); - - generatorSettingFlatField = FlatLevelSource.class.getDeclaredField(Refraction.pickName("settings", "e")); - generatorSettingFlatField.setAccessible(true); - - delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); - delegateField.setAccessible(true); - - chunkProviderField = ServerLevel.class.getDeclaredField(Refraction.pickName("chunkSource", "C")); - chunkProviderField.setAccessible(true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - //runtime - private ServerLevel originalServerWorld; - private ServerChunkCache originalChunkProvider; - private ServerLevel freshWorld; - private ServerChunkCache freshChunkProvider; - private LevelStorageSource.LevelStorageAccess session; - private StructureManager structureManager; - private ThreadedLevelLightEngine threadedLevelLightEngine; - private ChunkGenerator chunkGenerator; - - private Path tempDir; - - private boolean generateFlatBedrock = false; - - public PaperweightRegen(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { - super(originalBukkitWorld, region, target, options); - } - - @Override - protected boolean prepare() { - this.originalServerWorld = ((CraftWorld) originalBukkitWorld).getHandle(); - originalChunkProvider = originalServerWorld.getChunkSource(); - if (!(originalChunkProvider instanceof ServerChunkCache)) { - return false; - } - - //flat bedrock? (only on paper) - if (worldPaperConfigField != null) { - try { - generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalServerWorld)); - } catch (Exception ignored) { - } - } - - seed = options.getSeed().orElse(originalServerWorld.getSeed()); - chunkStati.forEach((s, c) -> super.chunkStati.put(new ChunkStatusWrap(s), c)); - - return true; - } - - @Override - protected boolean initNewWorld() throws Exception { - //world folder - tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen"); - - //prepare for world init (see upstream implementation for reference) - org.bukkit.World.Environment environment = originalBukkitWorld.getEnvironment(); - org.bukkit.generator.ChunkGenerator generator = originalBukkitWorld.getGenerator(); - LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(tempDir); - ResourceKey levelStemResourceKey = getWorldDimKey(environment); - session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); - PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; - - MinecraftServer server = originalServerWorld.getCraftServer().getServer(); - PrimaryLevelData levelProperties = (PrimaryLevelData) server.getWorldData(); - RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( - NbtOps.INSTANCE, server.resources.getResourceManager(), - RegistryAccess.builtin() - ); - WorldGenSettings newOpts = WorldGenSettings.CODEC - .encodeStart(nbtRegOps, levelProperties.worldGenSettings()) - .flatMap(tag -> WorldGenSettings.CODEC.parse(this.recursivelySetSeed( - new Dynamic<>(nbtRegOps, tag), - seed, - new HashSet<>() - ))) - .result() - .orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); - LevelSettings newWorldSettings = new LevelSettings( - "worldeditregentempworld", - originalWorldData.settings.gameType(), - originalWorldData.settings.hardcore(), - originalWorldData.settings.difficulty(), - originalWorldData.settings.allowCommands(), - originalWorldData.settings.gameRules(), - originalWorldData.settings.getDataPackConfig() - ); - PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); - - //init world - freshWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new ServerLevel( - server, - server.executor, - session, - newWorldData, - originalServerWorld.dimension(), - originalServerWorld.dimensionType(), - new RegenNoOpWorldLoadListener(), - // placeholder. Required for new ChunkProviderServer, but we create and then set it later - newOpts.dimensions().get(levelStemResourceKey).generator(), - originalServerWorld.isDebug(), - seed, - ImmutableList.of(), - false, - environment, - generator, - originalBukkitWorld.getBiomeProvider() - ) { - private final Biome singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.get(ResourceLocation.tryParse( - options - .getBiomeType() - .getId())) : null; - - @Override - public void tick(BooleanSupplier shouldKeepTicking) { //no ticking - } - - @Override - public Biome getUncachedNoiseBiome(int biomeX, int biomeY, int biomeZ) { - if (options.hasBiomeType()) { - return singleBiome; - } - return PaperweightRegen.this.chunkGenerator.getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ); - } - }).get(); - freshWorld.noSave = true; - removeWorldFromWorldsMap(); - newWorldData.checkName(originalServerWorld.serverLevelData.getLevelName()); //rename to original world name - if (worldPaperConfigField != null) { - worldPaperConfigField.set(freshWorld, originalServerWorld.paperConfig); - } - - //generator - if (originalChunkProvider.getGenerator() instanceof FlatLevelSource) { - FlatLevelGeneratorSettings generatorSettingFlat = (FlatLevelGeneratorSettings) generatorSettingFlatField.get( - originalChunkProvider.getGenerator()); - chunkGenerator = new FlatLevelSource(generatorSettingFlat); - } else if (originalChunkProvider.getGenerator() instanceof NoiseBasedChunkGenerator) { - Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField - .get(originalChunkProvider.getGenerator()); - BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); - if (biomeSource instanceof OverworldBiomeSource) { - biomeSource = fastOverworldBiomeSource(biomeSource); - } - chunkGenerator = new NoiseBasedChunkGenerator(biomeSource, seed, generatorSettingBaseSupplier); - } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator) { - chunkGenerator = (ChunkGenerator) delegateField.get(originalChunkProvider.getGenerator()); - } else { - LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); - return false; - } - if (generator != null) { - chunkGenerator = new CustomChunkGenerator(freshWorld, chunkGenerator, generator); - generateConcurrent = generator.isParallelCapable(); - } - - freshChunkProvider = new ServerChunkCache( - freshWorld, - session, - server.getFixerUpper(), - server.getStructureManager(), - server.executor, - chunkGenerator, - freshWorld.spigotConfig.viewDistance, - server.forceSynchronousWrites(), - new RegenNoOpWorldLoadListener(), - (chunkCoordIntPair, state) -> { - }, - () -> server.overworld().getDataStorage() - ) { - // redirect to LevelChunks created in #createChunks - @Override - public ChunkAccess getChunk(int x, int z, ChunkStatus chunkstatus, boolean flag) { - return getChunkAt(x, z); - } - }; - - ReflectionUtils.unsafeSet(chunkProviderField, freshWorld, freshChunkProvider); - //let's start then - structureManager = server.getStructureManager(); - threadedLevelLightEngine = freshChunkProvider.getLightEngine(); - - return true; - } - - @Override - protected void cleanup() { - try { - session.close(); - } catch (Exception ignored) { - } - - //shutdown chunk provider - try { - Fawe.get().getQueueHandler().sync(() -> { - try { - freshChunkProvider.close(false); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception ignored) { - } - - //remove world from server - try { - Fawe.get().getQueueHandler().sync(this::removeWorldFromWorldsMap); - } catch (Exception ignored) { - } - - //delete directory - try { - SafeFiles.tryHardToDeleteDir(tempDir); - } catch (Exception ignored) { - } - } - - @Override - protected ProtoChunk createProtoChunk(int x, int z) { - return PaperLib.isPaper() - ? new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld, freshWorld) // paper - : new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld); // spigot - } - - @Override - protected LevelChunk createChunk(ProtoChunk protoChunk) { - return new LevelChunk( - freshWorld, - protoChunk, - null // we don't want to add entities - ); - } - - @Override - protected ChunkStatusWrap getFullChunkStatus() { - return new ChunkStatusWrap(ChunkStatus.FULL); - } - - @Override - protected List getBlockPopulators() { - return originalServerWorld.getWorld().getPopulators(); - } - - @Override - protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { - // BlockPopulator#populate has to be called synchronously for TileEntity access - TaskManager.IMP.task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); - } - - @Override - protected IChunkCache initSourceQueueCache() { - return (chunkX, chunkZ) -> new PaperweightGetBlocks(freshWorld, chunkX, chunkZ) { - @Override - public LevelChunk ensureLoaded(ServerLevel nmsWorld, int x, int z) { - return getChunkAt(x, z); - } - }; - } - - //util - private void removeWorldFromWorldsMap() { - Fawe.get().getQueueHandler().sync(() -> { - try { - Map map = (Map) serverWorldsField.get(Bukkit.getServer()); - map.remove("worldeditregentempworld"); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - }); - } - - private ResourceKey getWorldDimKey(org.bukkit.World.Environment env) { - switch (env) { - case NETHER: - return LevelStem.NETHER; - case THE_END: - return LevelStem.END; - case NORMAL: - default: - return LevelStem.OVERWORLD; - } - } - - private Dynamic recursivelySetSeed( - Dynamic dynamic, - long seed, - Set> dynamicSet - ) { - return !dynamicSet.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { - if (pair.getFirst().asString("").equals("seed")) { - return pair.mapSecond((v) -> v.createLong(seed)); - } else { - //TODO 1.18 address raw access - return ((Dynamic) pair.getSecond()).getValue() instanceof CompoundTag - ? pair.mapSecond((v) -> this.recursivelySetSeed((Dynamic) v, seed, dynamicSet)) - : pair; - - } - }); - } - - private BiomeSource fastOverworldBiomeSource(BiomeSource biomeSource) throws Exception { - Field legacyBiomeInitLayerField = OverworldBiomeSource.class.getDeclaredField( - Refraction.pickName("legacyBiomeInitLayer", "i")); - legacyBiomeInitLayerField.setAccessible(true); - Field largeBiomesField = OverworldBiomeSource.class.getDeclaredField(Refraction.pickName("largeBiomes", "j")); - largeBiomesField.setAccessible(true); - Field biomeRegistryField = OverworldBiomeSource.class.getDeclaredField(Refraction.pickName("biomes", "k")); - biomeRegistryField.setAccessible(true); - Field areaLazyField = Layer.class.getDeclaredField(Refraction.pickName("area", "b")); - areaLazyField.setAccessible(true); - Method initAreaFactoryMethod = Layers.class.getDeclaredMethod( - Refraction.pickName("getDefaultLayer", "a"), - boolean.class, - int.class, - int.class, - LongFunction.class - ); - initAreaFactoryMethod.setAccessible(true); - - //init new WorldChunkManagerOverworld - boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(biomeSource); - boolean largebiomes = largeBiomesField.getBoolean(biomeSource); - Registry biomeRegistryMojang = (Registry) biomeRegistryField.get(biomeSource); - Registry biomeRegistry; - if (options.hasBiomeType()) { - Biome biome = BuiltinRegistries.BIOME.get(ResourceLocation.tryParse(options.getBiomeType().getId())); - biomeRegistry = new MappedRegistry<>( - ResourceKey.createRegistryKey(new ResourceLocation("fawe_biomes")), - Lifecycle.experimental() - ); - ((MappedRegistry) biomeRegistry).registerMapping(0, BuiltinRegistries.BIOME.getResourceKey(biome).get(), biome, - Lifecycle.experimental() - ); - } else { - biomeRegistry = biomeRegistryMojang; - } - - //replace genLayer - AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke( - null, - legacyBiomeInitLayer, - largebiomes ? 6 : 4, - 4, - (LongFunction) (salt -> new FastWorldGenContextArea(seed, salt)) - ); - biomeSource = new FastOverworldBiomeSource(biomeRegistry, new FastGenLayer(factory)); - - return biomeSource; - } - - private static class FastOverworldBiomeSource extends BiomeSource { - - private final Registry biomeRegistry; - private final boolean isSingleRegistry; - private final FastGenLayer fastGenLayer; - - public FastOverworldBiomeSource( - Registry biomeRegistry, - FastGenLayer genLayer - ) { - super(biomeRegistry.stream().collect(Collectors.toList())); - this.biomeRegistry = biomeRegistry; - this.isSingleRegistry = biomeRegistry.entrySet().size() == 1; - this.fastGenLayer = genLayer; - } - - @Override - protected Codec codec() { - return OverworldBiomeSource.CODEC; - } - - @Override - public BiomeSource withSeed(final long seed) { - return null; - } - - @Override - public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { - if (this.isSingleRegistry) { - return this.biomeRegistry.byId(0); - } - return this.fastGenLayer.get(this.biomeRegistry, biomeX, biomeZ); - } - - } - - private static class FastWorldGenContextArea implements BigContext { - - private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); - private final ImprovedNoise improvedNoise; - private final long magicrandom; - private final ConcurrentHashMap map = new ConcurrentHashMap<>(); //needed for multithreaded generation - - public FastWorldGenContextArea(long seed, long lconst) { - this.magicrandom = mix(seed, lconst); - this.improvedNoise = new ImprovedNoise(new XoroshiroRandomSource(seed)); - } - - private static long mix(long seed, long salt) { - long l = LinearCongruentialGenerator.next(salt, salt); - l = LinearCongruentialGenerator.next(l, salt); - l = LinearCongruentialGenerator.next(l, salt); - long m = LinearCongruentialGenerator.next(seed, l); - m = LinearCongruentialGenerator.next(m, l); - m = LinearCongruentialGenerator.next(m, l); - return m; - } - - @Override - public FastAreaLazy createResult(PixelTransformer pixelTransformer) { - return new FastAreaLazy(sharedAreaMap, pixelTransformer); - } - - @Override - public void initRandom(long x, long z) { - long l = this.magicrandom; - l = LinearCongruentialGenerator.next(l, x); - l = LinearCongruentialGenerator.next(l, z); - l = LinearCongruentialGenerator.next(l, x); - l = LinearCongruentialGenerator.next(l, z); - this.map.put(Thread.currentThread().getId(), l); - } - - @Override - public int nextRandom(int y) { - long tid = Thread.currentThread().getId(); - long e = this.map.computeIfAbsent(tid, i -> 0L); - int mod = (int) Math.floorMod(e >> 24L, (long) y); - this.map.put(tid, LinearCongruentialGenerator.next(e, this.magicrandom)); - return mod; - } - - @Override - public ImprovedNoise getBiomeNoise() { - return this.improvedNoise; - } - - } - - private static class FastGenLayer extends Layer { - - private final FastAreaLazy fastAreaLazy; - - public FastGenLayer(AreaFactory factory) { - super(() -> null); - this.fastAreaLazy = factory.make(); - } - - @Override - public Biome get(Registry registry, int x, int z) { - ResourceKey key = Biomes.byId(this.fastAreaLazy.get(x, z)); - if (key == null) { - return registry.get(Biomes.byId(0)); - } - Biome biome = registry.get(key); - if (biome == null) { - return registry.get(Biomes.byId(0)); - } - return biome; - } - - } - - private record FastAreaLazy(ConcurrentHashMap sharedMap, - PixelTransformer transformer) implements Area { - //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a synchronized context - //using a map for each thread worsens the performance significantly due to cache misses (factor 5) - - @Override - public int get(int x, int z) { - long zx = ChunkPos.asLong(x, z); - return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); - } - - } - - private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { - - private RegenNoOpWorldLoadListener() { - } - - @Override - public void updateSpawnPos(ChunkPos spawnPos) { - } - - @Override - public void onStatusChange(ChunkPos pos, @Nullable ChunkStatus status) { - } - - @Override - public void start() { - - } - - @Override - public void stop() { - } - - // TODO Paper only(?) @Override - public void setChunkRadius(int radius) { - } - - } - - private class FastProtoChunk extends ProtoChunk { - - // avoid warning on paper - public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world, ServerLevel serverLevel) { - super(pos, upgradeData, world, serverLevel); - } - - // compatibility with spigot - public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor) { - super(pos, upgradeData, levelHeightAccessor); - } - - public boolean generateFlatBedrock() { - return generateFlatBedrock; - } - - // no one will ever see the entities! - @Override - public List getEntities() { - return Collections.emptyList(); - } - - } - - protected class ChunkStatusWrap extends ChunkStatusWrapper { - - private final ChunkStatus chunkStatus; - - public ChunkStatusWrap(ChunkStatus chunkStatus) { - this.chunkStatus = chunkStatus; - } - - @Override - public int requiredNeighborChunkRadius() { - return chunkStatus.getRange(); - } - - @Override - public String name() { - return chunkStatus.getName(); - } - - @Override - public CompletableFuture processChunk(Long xz, List accessibleChunks) { - return chunkStatus.generate( - Runnable::run, // TODO revisit, we might profit from this somehow? - freshWorld, - chunkGenerator, - structureManager, - threadedLevelLightEngine, - c -> CompletableFuture.completedFuture(Either.left(c)), - accessibleChunks - ); - } - - } - -} +//package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen; +// +//import com.fastasyncworldedit.bukkit.adapter.Regenerator; +//import com.fastasyncworldedit.core.Fawe; +//import com.fastasyncworldedit.core.queue.IChunkCache; +//import com.fastasyncworldedit.core.queue.IChunkGet; +//import com.fastasyncworldedit.core.util.ReflectionUtils; +//import com.fastasyncworldedit.core.util.TaskManager; +//import com.google.common.collect.ImmutableList; +//import com.mojang.datafixers.util.Either; +//import com.mojang.serialization.Codec; +//import com.mojang.serialization.Dynamic; +//import com.mojang.serialization.Lifecycle; +//import com.sk89q.worldedit.bukkit.adapter.Refraction; +//import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightGetBlocks; +//import com.sk89q.worldedit.extent.Extent; +//import com.sk89q.worldedit.internal.util.LogManagerCompat; +//import com.sk89q.worldedit.regions.Region; +//import com.sk89q.worldedit.util.io.file.SafeFiles; +//import com.sk89q.worldedit.world.RegenOptions; +//import io.papermc.lib.PaperLib; +//import net.minecraft.core.MappedRegistry; +//import net.minecraft.core.Registry; +//import net.minecraft.core.RegistryAccess; +//import net.minecraft.data.BuiltinRegistries; +//import net.minecraft.data.worldgen.biome.Biomes; +//import net.minecraft.nbt.CompoundTag; +//import net.minecraft.nbt.NbtOps; +//import net.minecraft.resources.RegistryReadOps; +//import net.minecraft.resources.ResourceKey; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.server.MinecraftServer; +//import net.minecraft.server.level.ServerChunkCache; +//import net.minecraft.server.level.ServerLevel; +//import net.minecraft.server.level.ThreadedLevelLightEngine; +//import net.minecraft.server.level.progress.ChunkProgressListener; +//import net.minecraft.util.LinearCongruentialGenerator; +//import net.minecraft.world.level.ChunkPos; +//import net.minecraft.world.level.Level; +//import net.minecraft.world.level.LevelHeightAccessor; +//import net.minecraft.world.level.LevelSettings; +//import net.minecraft.world.level.biome.Biome; +//import net.minecraft.world.level.biome.BiomeSource; +//import net.minecraft.world.level.biome.MultiNoiseBiomeSource; +//import net.minecraft.world.level.chunk.ChunkAccess; +//import net.minecraft.world.level.chunk.ChunkGenerator; +//import net.minecraft.world.level.chunk.ChunkStatus; +//import net.minecraft.world.level.chunk.LevelChunk; +//import net.minecraft.world.level.chunk.ProtoChunk; +//import net.minecraft.world.level.chunk.UpgradeData; +//import net.minecraft.world.level.dimension.LevelStem; +//import net.minecraft.world.level.levelgen.FlatLevelSource; +//import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +//import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +//import net.minecraft.world.level.levelgen.WorldGenSettings; +//import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; +//import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +//import net.minecraft.world.level.levelgen.synth.ImprovedNoise; +//import net.minecraft.world.level.storage.LevelStorageSource; +//import net.minecraft.world.level.storage.PrimaryLevelData; +//import org.apache.logging.log4j.Logger; +//import org.bukkit.Bukkit; +//import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +//import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +//import org.bukkit.craftbukkit.v1_18_R1.generator.CustomChunkGenerator; +//import org.bukkit.generator.BlockPopulator; +// +//import javax.annotation.Nullable; +//import java.io.IOException; +//import java.lang.reflect.Field; +//import java.lang.reflect.Method; +//import java.nio.file.Path; +//import java.util.Collections; +//import java.util.HashSet; +//import java.util.LinkedHashMap; +//import java.util.List; +//import java.util.Map; +//import java.util.Random; +//import java.util.Set; +//import java.util.concurrent.CompletableFuture; +//import java.util.concurrent.ConcurrentHashMap; +//import java.util.function.BooleanSupplier; +//import java.util.function.LongFunction; +//import java.util.function.Supplier; +//import java.util.stream.Collectors; +// +//public class PaperweightRegen extends Regenerator { +// +// private static final Logger LOGGER = LogManagerCompat.getLogger(); +// +// private static final Field serverWorldsField; +// private static final Field worldPaperConfigField; +// private static final Field flatBedrockField; +// private static final Field generatorSettingFlatField; +// private static final Field generatorSettingBaseSupplierField; +// private static final Field delegateField; +// private static final Field chunkProviderField; +// +// //list of chunk stati in correct order without FULL +// private static final Map chunkStati = new LinkedHashMap<>(); +// +// static { +// chunkStati.put(ChunkStatus.EMPTY, Concurrency.FULL); // empty: radius -1, does nothing +// chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Concurrency.NONE); // structure starts: uses unsynchronized maps +// chunkStati.put( +// ChunkStatus.STRUCTURE_REFERENCES, +// Concurrency.FULL +// ); // structure refs: radius 8, but only writes to current chunk +// chunkStati.put(ChunkStatus.BIOMES, Concurrency.FULL); // biomes: radius 0 +// chunkStati.put(ChunkStatus.NOISE, Concurrency.RADIUS); // noise: radius 8 +// chunkStati.put(ChunkStatus.SURFACE, Concurrency.NONE); // surface: radius 0, requires NONE +// chunkStati.put(ChunkStatus.CARVERS, Concurrency.NONE); // carvers: radius 0, but RADIUS and FULL change results +// chunkStati.put( +// ChunkStatus.LIQUID_CARVERS, +// Concurrency.NONE +// ); // liquid carvers: radius 0, but RADIUS and FULL change results +// chunkStati.put(ChunkStatus.FEATURES, Concurrency.NONE); // features: uses unsynchronized maps +// chunkStati.put( +// ChunkStatus.LIGHT, +// Concurrency.FULL +// ); // light: radius 1, but no writes to other chunks, only current chunk +// chunkStati.put(ChunkStatus.SPAWN, Concurrency.FULL); // spawn: radius 0 +// chunkStati.put(ChunkStatus.HEIGHTMAPS, Concurrency.FULL); // heightmaps: radius 0 +// +// try { +// serverWorldsField = CraftServer.class.getDeclaredField("worlds"); +// serverWorldsField.setAccessible(true); +// +// Field tmpPaperConfigField; +// Field tmpFlatBedrockField; +// try { //only present on paper +// tmpPaperConfigField = Level.class.getDeclaredField("paperConfig"); +// tmpPaperConfigField.setAccessible(true); +// +// tmpFlatBedrockField = tmpPaperConfigField.getType().getDeclaredField("generateFlatBedrock"); +// tmpFlatBedrockField.setAccessible(true); +// } catch (Exception e) { +// tmpPaperConfigField = null; +// tmpFlatBedrockField = null; +// } +// worldPaperConfigField = tmpPaperConfigField; +// flatBedrockField = tmpFlatBedrockField; +// +// generatorSettingBaseSupplierField = NoiseBasedChunkGenerator.class.getDeclaredField(Refraction.pickName( +// "settings", "g")); +// generatorSettingBaseSupplierField.setAccessible(true); +// +// generatorSettingFlatField = FlatLevelSource.class.getDeclaredField(Refraction.pickName("settings", "e")); +// generatorSettingFlatField.setAccessible(true); +// +// delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); +// delegateField.setAccessible(true); +// +// chunkProviderField = ServerLevel.class.getDeclaredField(Refraction.pickName("chunkSource", "C")); +// chunkProviderField.setAccessible(true); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } +// +// //runtime +// private ServerLevel originalServerWorld; +// private ServerChunkCache originalChunkProvider; +// private ServerLevel freshWorld; +// private ServerChunkCache freshChunkProvider; +// private LevelStorageSource.LevelStorageAccess session; +// private StructureManager structureManager; +// private ThreadedLevelLightEngine threadedLevelLightEngine; +// private ChunkGenerator chunkGenerator; +// +// private Path tempDir; +// +// private boolean generateFlatBedrock = false; +// +// public PaperweightRegen(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { +// super(originalBukkitWorld, region, target, options); +// } +// +// @Override +// protected boolean prepare() { +// this.originalServerWorld = ((CraftWorld) originalBukkitWorld).getHandle(); +// originalChunkProvider = originalServerWorld.getChunkSource(); +// if (!(originalChunkProvider instanceof ServerChunkCache)) { +// return false; +// } +// +// //flat bedrock? (only on paper) +// if (worldPaperConfigField != null) { +// try { +// generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalServerWorld)); +// } catch (Exception ignored) { +// } +// } +// +// seed = options.getSeed().orElse(originalServerWorld.getSeed()); +// chunkStati.forEach((s, c) -> super.chunkStati.put(new ChunkStatusWrap(s), c)); +// +// return true; +// } +// +// @Override +// protected boolean initNewWorld() throws Exception { +// //world folder +// tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen"); +// +// //prepare for world init (see upstream implementation for reference) +// org.bukkit.World.Environment environment = originalBukkitWorld.getEnvironment(); +// org.bukkit.generator.ChunkGenerator generator = originalBukkitWorld.getGenerator(); +// LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(tempDir); +// ResourceKey levelStemResourceKey = getWorldDimKey(environment); +// session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); +// PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; +// +// MinecraftServer server = originalServerWorld.getCraftServer().getServer(); +// PrimaryLevelData levelProperties = (PrimaryLevelData) server.getWorldData(); +// RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( +// NbtOps.INSTANCE, server.resources.getResourceManager(), +// RegistryAccess.builtin() +// ); +// WorldGenSettings newOpts = WorldGenSettings.CODEC +// .encodeStart(nbtRegOps, levelProperties.worldGenSettings()) +// .flatMap(tag -> WorldGenSettings.CODEC.parse(this.recursivelySetSeed( +// new Dynamic<>(nbtRegOps, tag), +// seed, +// new HashSet<>() +// ))) +// .result() +// .orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); +// LevelSettings newWorldSettings = new LevelSettings( +// "worldeditregentempworld", +// originalWorldData.settings.gameType(), +// originalWorldData.settings.hardcore(), +// originalWorldData.settings.difficulty(), +// originalWorldData.settings.allowCommands(), +// originalWorldData.settings.gameRules(), +// originalWorldData.settings.getDataPackConfig() +// ); +// PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); +// +// //init world +// freshWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new ServerLevel( +// server, +// server.executor, +// session, +// newWorldData, +// originalServerWorld.dimension(), +// originalServerWorld.dimensionType(), +// new RegenNoOpWorldLoadListener(), +// // placeholder. Required for new ChunkProviderServer, but we create and then set it later +// newOpts.dimensions().get(levelStemResourceKey).generator(), +// originalServerWorld.isDebug(), +// seed, +// ImmutableList.of(), +// false, +// environment, +// generator, +// originalBukkitWorld.getBiomeProvider() +// ) { +// private final Biome singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.get(ResourceLocation.tryParse( +// options +// .getBiomeType() +// .getId())) : null; +// +// @Override +// public void tick(BooleanSupplier shouldKeepTicking) { //no ticking +// } +// +// @Override +// public Biome getUncachedNoiseBiome(int biomeX, int biomeY, int biomeZ) { +// if (options.hasBiomeType()) { +// return singleBiome; +// } +// return PaperweightRegen.this.chunkGenerator.getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ, +// PaperweightRegen.this.chunkGenerator.climateSampler()); +// } +// }).get(); +// freshWorld.noSave = true; +// removeWorldFromWorldsMap(); +// newWorldData.checkName(originalServerWorld.serverLevelData.getLevelName()); //rename to original world name +// if (worldPaperConfigField != null) { +// worldPaperConfigField.set(freshWorld, originalServerWorld.paperConfig); +// } +// +// //generator +// if (originalChunkProvider.getGenerator() instanceof FlatLevelSource) { +// FlatLevelGeneratorSettings generatorSettingFlat = (FlatLevelGeneratorSettings) generatorSettingFlatField.get( +// originalChunkProvider.getGenerator()); +// chunkGenerator = new FlatLevelSource(generatorSettingFlat); +// } else if (originalChunkProvider.getGenerator() instanceof NoiseBasedChunkGenerator) { +// Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField +// .get(originalChunkProvider.getGenerator()); +// BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); +// if (biomeSource instanceof MultiNoiseBiomeSource) { +// biomeSource = fastMultiNoiseBiomeSource(biomeSource); +// } +// chunkGenerator = new NoiseBasedChunkGenerator(((NoiseBasedChunkGenerator) chunkGenerator).noises, biomeSource, seed, +// generatorSettingBaseSupplier +// ); +// } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator) { +// chunkGenerator = (ChunkGenerator) delegateField.get(originalChunkProvider.getGenerator()); +// } else { +// LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); +// return false; +// } +// if (generator != null) { +// chunkGenerator = new CustomChunkGenerator(freshWorld, chunkGenerator, generator); +// generateConcurrent = generator.isParallelCapable(); +// } +// +// freshChunkProvider = new ServerChunkCache( +// freshWorld, +// session, +// server.getFixerUpper(), +// server.getStructureManager(), +// server.executor, +// chunkGenerator, +// freshWorld.spigotConfig.viewDistance, +// server.forceSynchronousWrites(), +// new RegenNoOpWorldLoadListener(), +// (chunkCoordIntPair, state) -> { +// }, +// () -> server.overworld().getDataStorage() +// ) { +// // redirect to LevelChunks created in #createChunks +// @Override +// public ChunkAccess getChunk(int x, int z, ChunkStatus chunkstatus, boolean flag) { +// return getChunkAt(x, z); +// } +// }; +// +// ReflectionUtils.unsafeSet(chunkProviderField, freshWorld, freshChunkProvider); +// //let's start then +// structureManager = server.getStructureManager(); +// threadedLevelLightEngine = freshChunkProvider.getLightEngine(); +// +// return true; +// } +// +// @Override +// protected void cleanup() { +// try { +// session.close(); +// } catch (Exception ignored) { +// } +// +// //shutdown chunk provider +// try { +// Fawe.get().getQueueHandler().sync(() -> { +// try { +// freshChunkProvider.close(false); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// }); +// } catch (Exception ignored) { +// } +// +// //remove world from server +// try { +// Fawe.get().getQueueHandler().sync(this::removeWorldFromWorldsMap); +// } catch (Exception ignored) { +// } +// +// //delete directory +// try { +// SafeFiles.tryHardToDeleteDir(tempDir); +// } catch (Exception ignored) { +// } +// } +// +// @Override +// protected ProtoChunk createProtoChunk(int x, int z) { +// return PaperLib.isPaper() +// ? new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld, freshWorld) // paper +// : new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld); // spigot +// } +// +// @Override +// protected LevelChunk createChunk(ProtoChunk protoChunk) { +// return new LevelChunk( +// freshWorld, +// protoChunk, +// null // we don't want to add entities +// ); +// } +// +// @Override +// protected ChunkStatusWrap getFullChunkStatus() { +// return new ChunkStatusWrap(ChunkStatus.FULL); +// } +// +// @Override +// protected List getBlockPopulators() { +// return originalServerWorld.getWorld().getPopulators(); +// } +// +// @Override +// protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { +// // BlockPopulator#populate has to be called synchronously for TileEntity access +// TaskManager.IMP.task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); +// } +// +// @Override +// protected IChunkCache initSourceQueueCache() { +// return (chunkX, chunkZ) -> new PaperweightGetBlocks(freshWorld, chunkX, chunkZ) { +// @Override +// public LevelChunk ensureLoaded(ServerLevel nmsWorld, int x, int z) { +// return getChunkAt(x, z); +// } +// }; +// } +// +// //util +// private void removeWorldFromWorldsMap() { +// Fawe.get().getQueueHandler().sync(() -> { +// try { +// Map map = (Map) serverWorldsField.get(Bukkit.getServer()); +// map.remove("worldeditregentempworld"); +// } catch (IllegalAccessException e) { +// throw new RuntimeException(e); +// } +// }); +// } +// +// private ResourceKey getWorldDimKey(org.bukkit.World.Environment env) { +// switch (env) { +// case NETHER: +// return LevelStem.NETHER; +// case THE_END: +// return LevelStem.END; +// case NORMAL: +// default: +// return LevelStem.OVERWORLD; +// } +// } +// +// private Dynamic recursivelySetSeed( +// Dynamic dynamic, +// long seed, +// Set> dynamicSet +// ) { +// return !dynamicSet.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { +// if (pair.getFirst().asString("").equals("seed")) { +// return pair.mapSecond((v) -> v.createLong(seed)); +// } else { +// return ((Dynamic) pair.getSecond()).getValue() instanceof CompoundTag +// ? pair.mapSecond((v) -> this.recursivelySetSeed((Dynamic) v, seed, dynamicSet)) +// : pair; +// +// } +// }); +// } +// +// private BiomeSource fastMultiNoiseBiomeSource(BiomeSource biomeSource) throws Exception { +// Field legacyBiomeInitLayerField = MultiNoiseBiomeSource.class.getDeclaredField( +// Refraction.pickName("legacyBiomeInitLayer", "i")); +// legacyBiomeInitLayerField.setAccessible(true); +// Field largeBiomesField = NoiseGeneratorSettings.class.getDeclaredField(Refraction.pickName("largeBiomes", "j")); +// largeBiomesField.setAccessible(true); +// Field biomeRegistryField = MultiNoiseBiomeSource.class.getDeclaredField(Refraction.pickName("biomes", "k")); +// biomeRegistryField.setAccessible(true); +// Field areaLazyField = Layer.class.getDeclaredField(Refraction.pickName("area", "b")); +// areaLazyField.setAccessible(true); +// Method initAreaFactoryMethod = Layers.class.getDeclaredMethod( +// Refraction.pickName("getDefaultLayer", "a"), +// boolean.class, +// int.class, +// int.class, +// LongFunction.class +// ); +// initAreaFactoryMethod.setAccessible(true); +// +// //init new WorldChunkManagerOverworld +// boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(biomeSource); +// boolean largebiomes = largeBiomesField.getBoolean(biomeSource); +// Registry biomeRegistryMojang = (Registry) biomeRegistryField.get(biomeSource); +// Registry biomeRegistry; +// if (options.hasBiomeType()) { +// Biome biome = BuiltinRegistries.BIOME.get(ResourceLocation.tryParse(options.getBiomeType().getId())); +// biomeRegistry = new MappedRegistry<>( +// ResourceKey.createRegistryKey(new ResourceLocation("fawe_biomes")), +// Lifecycle.experimental() +// ); +// ((MappedRegistry) biomeRegistry).registerMapping(0, BuiltinRegistries.BIOME.getResourceKey(biome).get(), biome, +// Lifecycle.experimental() +// ); +// } else { +// biomeRegistry = biomeRegistryMojang; +// } +// +// //replace genLayer +// AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke( +// null, +// legacyBiomeInitLayer, +// largebiomes ? 6 : 4, +// 4, +// (LongFunction) (salt -> new FastWorldGenContextArea(seed, salt)) +// ); +// biomeSource = new FastOverworldBiomeSource(biomeRegistry, new FastGenLayer(factory)); +// +// return biomeSource; +// } +// +// private static class FastOverworldBiomeSource extends BiomeSource { +// +// private final Registry biomeRegistry; +// private final boolean isSingleRegistry; +// private final FastGenLayer fastGenLayer; +// +// public FastOverworldBiomeSource( +// Registry biomeRegistry, +// FastGenLayer genLayer +// ) { +// super(biomeRegistry.stream().collect(Collectors.toList())); +// this.biomeRegistry = biomeRegistry; +// this.isSingleRegistry = biomeRegistry.entrySet().size() == 1; +// this.fastGenLayer = genLayer; +// } +// +// @Override +// protected Codec codec() { +// return MultiNoiseBiomeSource.CODEC; +// } +// +// @Override +// public BiomeSource withSeed(final long seed) { +// return null; +// } +// +// @Override +// public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { +// if (this.isSingleRegistry) { +// return this.biomeRegistry.byId(0); +// } +// return this.fastGenLayer.get(this.biomeRegistry, biomeX, biomeZ); +// } +// +// } +// +// private static class FastWorldGenContextArea implements BigContext { +// +// private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); +// private final ImprovedNoise improvedNoise; +// private final long magicrandom; +// private final ConcurrentHashMap map = new ConcurrentHashMap<>(); //needed for multithreaded generation +// +// public FastWorldGenContextArea(long seed, long lconst) { +// this.magicrandom = mix(seed, lconst); +// this.improvedNoise = new ImprovedNoise(new SimpleRandomSource(seed)); +// } +// +// private static long mix(long seed, long salt) { +// long l = LinearCongruentialGenerator.next(salt, salt); +// l = LinearCongruentialGenerator.next(l, salt); +// l = LinearCongruentialGenerator.next(l, salt); +// long m = LinearCongruentialGenerator.next(seed, l); +// m = LinearCongruentialGenerator.next(m, l); +// m = LinearCongruentialGenerator.next(m, l); +// return m; +// } +// +// @Override +// public FastAreaLazy createResult(PixelTransformer pixelTransformer) { +// return new FastAreaLazy(sharedAreaMap, pixelTransformer); +// } +// +// @Override +// public void initRandom(long x, long z) { +// long l = this.magicrandom; +// l = LinearCongruentialGenerator.next(l, x); +// l = LinearCongruentialGenerator.next(l, z); +// l = LinearCongruentialGenerator.next(l, x); +// l = LinearCongruentialGenerator.next(l, z); +// this.map.put(Thread.currentThread().getId(), l); +// } +// +// @Override +// public int nextRandom(int y) { +// long tid = Thread.currentThread().getId(); +// long e = this.map.computeIfAbsent(tid, i -> 0L); +// int mod = (int) Math.floorMod(e >> 24L, (long) y); +// this.map.put(tid, LinearCongruentialGenerator.next(e, this.magicrandom)); +// return mod; +// } +// +// @Override +// public ImprovedNoise getBiomeNoise() { +// return this.improvedNoise; +// } +// +// } +// +// private static class FastGenLayer extends Layer { +// +// private final FastAreaLazy fastAreaLazy; +// +// public FastGenLayer(AreaFactory factory) { +// super(() -> null); +// this.fastAreaLazy = factory.make(); +// } +// +// @Override +// public Biome get(Registry registry, int x, int z) { +// ResourceKey key = Biomes.byId(this.fastAreaLazy.get(x, z)); +// if (key == null) { +// return registry.get(Biomes.byId(0)); +// } +// Biome biome = registry.get(key); +// if (biome == null) { +// return registry.get(Biomes.byId(0)); +// } +// return biome; +// } +// +// } +// +// private static class FastAreaLazy implements Area { +// +// private final PixelTransformer transformer; +// //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a synchronized context +// //using a map for each thread worsens the performance significantly due to cache misses (factor 5) +// private final ConcurrentHashMap sharedMap; +// +// public FastAreaLazy(ConcurrentHashMap sharedMap, PixelTransformer transformer) { +// this.sharedMap = sharedMap; +// this.transformer = transformer; +// } +// +// @Override +// public int get(int x, int z) { +// long zx = ChunkPos.asLong(x, z); +// return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); +// } +// +// } +// +// private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { +// +// private RegenNoOpWorldLoadListener() { +// } +// +// @Override +// public void updateSpawnPos(ChunkPos spawnPos) { +// } +// +// @Override +// public void onStatusChange(ChunkPos pos, @Nullable ChunkStatus status) { +// } +// +// @Override +// public void start() { +// +// } +// +// @Override +// public void stop() { +// } +// +// // TODO Paper only(?) @Override +// public void setChunkRadius(int radius) { +// } +// +// } +// +// private class FastProtoChunk extends ProtoChunk { +// +// // avoid warning on paper +// public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world, ServerLevel serverLevel) { +// super(pos, upgradeData, world, serverLevel); +// } +// +// // compatibility with spigot +// public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor) { +// super(pos, upgradeData, levelHeightAccessor); +// } +// +// public boolean generateFlatBedrock() { +// return generateFlatBedrock; +// } +// +// // no one will ever see the entities! +// @Override +// public List getEntities() { +// return Collections.emptyList(); +// } +// +// } +// +// protected class ChunkStatusWrap extends ChunkStatusWrapper { +// +// private final ChunkStatus chunkStatus; +// +// public ChunkStatusWrap(ChunkStatus chunkStatus) { +// this.chunkStatus = chunkStatus; +// } +// +// @Override +// public int requiredNeighborChunkRadius() { +// return chunkStatus.getRange(); +// } +// +// @Override +// public String name() { +// return chunkStatus.getName(); +// } +// +// @Override +// public CompletableFuture processChunk(Long xz, List accessibleChunks) { +// return chunkStatus.generate( +// Runnable::run, // TODO revisit, we might profit from this somehow? +// freshWorld, +// chunkGenerator, +// structureManager, +// threadedLevelLightEngine, +// c -> CompletableFuture.completedFuture(Either.left(c)), +// accessibleChunks +// ); +// } +// +// } +// +//} diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index dcddb468e..89dc6a653 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -102,7 +102,6 @@ dependencies { compileOnly(libs.protocollib) { isTransitive = false } compileOnly(libs.plotsquaredV6Bukkit) { isTransitive = false } compileOnly(libs.plotsquaredV6Core) { isTransitive = false } - compileOnly(libs.plotsquaredV4) { isTransitive = false } // Third party compileOnly(libs.flowmath) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 5e5671dcf..3d02b0de7 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -310,14 +310,12 @@ public class FaweBukkit implements IFawe, Listener { if (plotSquared == null) { return; } - if (plotSquared.getClass().getPackage().toString().contains("intellectualsites")) { - WEManager.IMP.addManager(new com.fastasyncworldedit.bukkit.regions.plotsquaredv4.PlotSquaredFeature()); - LOGGER.info("Plugin 'PlotSquared' found. Using it now."); - } else if (PlotSquared.get().getVersion().version[0] == 6) { + if (PlotSquared.get().getVersion().version[0] == 6) { WEManager.IMP.addManager(new com.fastasyncworldedit.bukkit.regions.plotsquared.PlotSquaredFeature()); - LOGGER.info("Plugin 'PlotSquared' found. Using it now."); + LOGGER.info("Plugin 'PlotSquared' v6 found. Using it now."); } else { LOGGER.error("Incompatible version of PlotSquared found. Please use PlotSquared v6."); + LOGGER.info("https://www.spigotmc.org/resources/77506/"); } } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java index f8d8cef2e..e0d13a36b 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java @@ -59,7 +59,7 @@ public interface IDelegateBukkitImplAdapter extends BukkitImplAdapter { } @Override - default BaseBlock getBlock(Location location) { + default BlockState getBlock(Location location) { return getParent().getBlock(location); } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 2f6dd6863..9f6b97d6a 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -4,7 +4,6 @@ import com.fastasyncworldedit.core.FAWEPlatformAdapterImpl; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.util.MathMan; -import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; @@ -24,8 +23,8 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { int num_palette = 0; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; - if (ordinal == BlockID.__RESERVED__) { - ordinal = BlockID.AIR; + if (ordinal == 0) { + ordinal = 1; } int palette = blockToPalette[ordinal]; if (palette == Integer.MAX_VALUE) { @@ -43,17 +42,17 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length); } - char lastOrdinal = BlockID.__RESERVED__; + char lastOrdinal = 0; boolean lastticking = false; boolean tick_placed = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_PLACED; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { - case BlockID.__RESERVED__: - ordinal = BlockID.AIR; - case BlockID.AIR: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: + case 0: + ordinal = 1; + case 1: + case 2: + case 3: air++; break; default: @@ -95,13 +94,13 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { char[] getArr = null; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; - if (ordinal == BlockID.__RESERVED__) { + if (ordinal == 0) { if (getArr == null) { getArr = get.apply(layer); } ordinal = getArr[i]; - if (ordinal == BlockID.__RESERVED__) { - ordinal = BlockID.AIR; + if (ordinal == 0) { + ordinal = 1; } } int palette = blockToPalette[ordinal]; @@ -120,24 +119,24 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length); } - char lastOrdinal = BlockID.__RESERVED__; + char lastOrdinal = 0; boolean lastticking = false; boolean tick_placed = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_PLACED; boolean tick_existing = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_EXISTING; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { - case BlockID.__RESERVED__: { + case 0: { if (getArr == null) { getArr = get.apply(layer); } ordinal = getArr[i]; switch (ordinal) { - case BlockID.__RESERVED__: - ordinal = BlockID.AIR; - case BlockID.AIR: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: + case 0: + ordinal = 1; + case 1: + case 2: + case 3: air++; break; default: @@ -164,9 +163,9 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { set[i] = ordinal; break; } - case BlockID.AIR: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: + case 1: + case 2: + case 3: air++; break; } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java index 5dfc76ee9..33ddb4fa8 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java @@ -4,9 +4,6 @@ import com.fastasyncworldedit.core.FaweAPI; import com.fastasyncworldedit.core.configuration.Caption; import com.fastasyncworldedit.core.regions.FaweMask; import com.fastasyncworldedit.core.regions.FaweMaskManager; -import com.fastasyncworldedit.core.regions.filter.RegionFilter; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; -import com.plotsquared.core.PlotSquared; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.player.PlotPlayer; @@ -62,6 +59,15 @@ public class PlotSquaredFeature extends FaweMaskManager { */ } + /** + * Whether the player is allowed to use FAWE on a PlotSquared plot. + * + * @param player the {@link Player} + * @param plot the {@link Plot} + * @param type the {@link MaskType} + * @return {@code true} if the player is the plot owner, trusted, has the permission fawe.plotsquared.member + * or fawe.plotsquared.admin and the NoWorldeditFlag is not set; otherwise {@code false} + */ public boolean isAllowed(Player player, Plot plot, MaskType type) { if (plot == null) { return false; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java deleted file mode 100644 index 4f50f63ac..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MaxChangedBlocksException; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.function.operation.ForwardExtentCopy; -import com.sk89q.worldedit.function.operation.Operations; -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.World; - -import java.util.concurrent.CompletableFuture; - -import static org.bukkit.Bukkit.getWorld; - -public class FaweChunkManager extends ChunkManager { - - private final ChunkManager parent; - - public FaweChunkManager(ChunkManager parent) { - this.parent = parent; - } - - @Override - public int[] countEntities(Plot plot) { - return parent.countEntities(plot); - } - - @Override - public CompletableFuture loadChunk(String world, BlockVector2 loc, boolean force) { - return parent.loadChunk(world, loc, force); - } - - @Override - public void unloadChunk(String world, BlockVector2 loc, boolean save) { - parent.unloadChunk(world, loc, save); - } - - @Override - public void clearAllEntities(Location pos1, Location pos2) { - parent.clearAllEntities(pos1, pos2); - } - - @Override - public void swap( - final Location pos1, - final Location pos2, - final Location pos3, - final Location pos4, - final Runnable whenDone - ) { - if (!Settings.IMP.PLOTSQUARED_INTEGRATION.COPY_AND_SWAP) { - parent.swap(pos1, pos2, pos3, pos4, whenDone); - } - TaskManager.IMP.async(() -> { - synchronized (FaweChunkManager.class) { - //todo because of the following code this should proably be in the Bukkit module - World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorld())); - World pos3World = BukkitAdapter.adapt(getWorld(pos3.getWorld())); - EditSession sessionA = WorldEdit.getInstance().newEditSessionBuilder().world(pos1World) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build(); - EditSession sessionB = WorldEdit.getInstance().newEditSessionBuilder().world(pos3World) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build(); - CuboidRegion regionA = new CuboidRegion( - BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), - BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ()) - ); - CuboidRegion regionB = new CuboidRegion( - BlockVector3.at(pos3.getX(), pos3.getY(), pos3.getZ()), - BlockVector3.at(pos4.getX(), pos4.getY(), pos4.getZ()) - ); - ForwardExtentCopy copyA = new ForwardExtentCopy(sessionA, regionA, sessionB, regionB.getMinimumPoint()); - ForwardExtentCopy copyB = new ForwardExtentCopy(sessionB, regionB, sessionA, regionA.getMinimumPoint()); - try { - Operations.completeLegacy(copyA); - Operations.completeLegacy(copyB); - sessionA.flushQueue(); - sessionB.flushQueue(); - } catch (MaxChangedBlocksException e) { - e.printStackTrace(); - } - TaskManager.IMP.task(whenDone); - } - }); - } - - @Override - public boolean copyRegion(final Location pos1, final Location pos2, final Location pos3, final Runnable whenDone) { - if (!Settings.IMP.PLOTSQUARED_INTEGRATION.COPY_AND_SWAP) { - return parent.copyRegion(pos1, pos2, pos3, whenDone); - } - TaskManager.IMP.async(() -> { - synchronized (FaweChunkManager.class) { - World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorld())); - World pos3World = BukkitAdapter.adapt(getWorld(pos3.getWorld())); - EditSession from = WorldEdit.getInstance().newEditSessionBuilder().world(pos1World) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build(); - EditSession to = WorldEdit.getInstance().newEditSessionBuilder().world(pos3World) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build(); - CuboidRegion region = new CuboidRegion( - BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), - BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ()) - ); - ForwardExtentCopy copy = new ForwardExtentCopy( - from, - region, - to, - BlockVector3.at(pos3.getX(), pos3.getY(), pos3.getZ()) - ); - try { - Operations.completeLegacy(copy); - to.flushQueue(); - } catch (MaxChangedBlocksException e) { - e.printStackTrace(); - } - } - TaskManager.IMP.task(whenDone); - }); - return true; - } - - @Override - public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) { - TaskManager.IMP.async(() -> { - synchronized (FaweChunkManager.class) { - World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorld())); - try (EditSession editSession = WorldEdit - .getInstance() - .newEditSessionBuilder() - .world(pos1World) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build()) { - CuboidRegion region = new CuboidRegion( - BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), - BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ()) - ); - editSession.regenerate(region); - editSession.flushQueue(); - } - TaskManager.IMP.task(whenDone); - } - }); - return true; - } - -} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java deleted file mode 100644 index fb27c01ed..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.math.MutableBlockVector3; -import com.fastasyncworldedit.core.queue.IQueueChunk; -import com.fastasyncworldedit.core.queue.IQueueExtent; -import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.function.pattern.Pattern; -import com.sk89q.worldedit.math.BlockVector3; -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; - -// TODO FIXME -public class FaweLocalBlockQueue extends LocalBlockQueue { - - public final IQueueExtent instance; - private final World world; - private final BlockVector3 mutable = new MutableBlockVector3(); - - public FaweLocalBlockQueue(String worldName) { - super(worldName); - this.world = FaweAPI.getWorld(worldName); - instance = Fawe.get().getQueueHandler().getQueue(world); - Fawe.get().getQueueHandler().unCache(); - } - - @Override - public boolean next() { - if (!instance.isEmpty()) { - instance.flush(); - } - return false; - } - - @Override - public void startSet(boolean parallel) { - Fawe.get().getQueueHandler().startSet(parallel); - } - - @Override - public void endSet(boolean parallel) { - Fawe.get().getQueueHandler().endSet(parallel); - } - - @Override - public int size() { - return instance.isEmpty() ? 0 : 1; - } - - @Override - public void optimize() { - } - - @Override - public void setModified(long l) { - } - - @Override - public long getModified() { - return instance.size(); - } - - @Override - public boolean setBlock(final int x, final int y, final int z, final BlockState id) { - return instance.setBlock(x, y, z, id); - } - - @Override - public boolean setBlock(int x, int y, int z, Pattern pattern) { - mutable.setComponents(x, y, z); - return pattern.apply(instance, mutable, mutable); - } - - @Override - public boolean setBlock(final int x, final int y, final int z, final BaseBlock id) { - return instance.setBlock(x, y, z, id); - } - - @Override - public BlockState getBlock(int x, int y, int z) { - return instance.getBlock(x, y, z); - } - - @Override - public boolean setBiome(int x, int z, BiomeType biomeType) { - return instance.setBiome(x, 0, z, biomeType); - } - - @Override - public String getWorld() { - return world.getId(); - } - - @Override - public void flush() { - instance.flush(); - } - - @Override - public boolean enqueue() { - boolean val = super.enqueue(); - instance.enableQueue(); - return val; - } - - @Override - public void refreshChunk(int x, int z) { - world.refreshChunk(x, z); - } - - @Override - public void fixChunkLighting(int x, int z) { - } - - @Override - public void regenChunk(int x, int z) { - instance.regenerateChunk(x, z, null, null); - } - - @Override - public boolean setTile(int x, int y, int z, CompoundTag tag) { - instance.setTile(x, y, z, (com.sk89q.jnbt.CompoundTag) FaweCache.IMP.asTag(tag)); - return true; - } - -} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java deleted file mode 100644 index 06921cb12..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.extent.clipboard.ReadOnlyClipboard; -import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriter; -import com.fastasyncworldedit.core.jnbt.CompressedCompoundTag; -import com.fastasyncworldedit.core.jnbt.CompressedSchematicTag; -import com.fastasyncworldedit.core.util.IOUtil; -import com.fastasyncworldedit.core.util.TaskManager; -import com.github.intellectualsites.plotsquared.plot.PlotSquared; -import com.github.intellectualsites.plotsquared.plot.object.Location; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.NBTOutputStream; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; -import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.World; -import net.jpountz.lz4.LZ4BlockInputStream; -import org.anarres.parallelgzip.ParallelGZIPOutputStream; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URL; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import static org.bukkit.Bukkit.getWorld; - -public class FaweSchematicHandler extends SchematicHandler { - - @Override - public boolean restoreTile(LocalBlockQueue queue, CompoundTag compoundTag, int x, int y, int z) { - if (queue instanceof FaweLocalBlockQueue) { - queue.setTile(x, y, z, compoundTag); - return true; - } - return false; - } - - @Override - public void getCompoundTag(final String world, final Set regions, final RunnableVal whenDone) { - TaskManager.IMP.async(() -> { - Location[] corners = MainUtil.getCorners(world, regions); - Location pos1 = corners[0]; - Location pos2 = corners[1]; - World adaptedWorld = BukkitAdapter.adapt(getWorld(world)); - final CuboidRegion region = new CuboidRegion( - BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), - BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ()) - ); - final EditSession editSession = WorldEdit.getInstance().newEditSessionBuilder().world(adaptedWorld) - .checkMemory(false) - .fastMode(true) - .limitUnlimited() - .changeSetNull() - .build(); - - ReadOnlyClipboard clipboard = ReadOnlyClipboard.of(editSession, region, false, true); - - Clipboard holder = new BlockArrayClipboard(region, clipboard); - - CompressedSchematicTag tag = new CompressedSchematicTag(holder); - whenDone.run(tag); - }); - } - - @Override - public boolean save(CompoundTag tag, String path) { - if (tag == null) { - PlotSquared.debug("&cCannot save empty tag"); - return false; - } - try { - File tmp = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), path); - tmp.getParentFile().mkdirs(); - if (tag instanceof CompressedCompoundTag) { - CompressedCompoundTag cTag = (CompressedCompoundTag) tag; - if (cTag instanceof CompressedSchematicTag) { - Clipboard clipboard = (Clipboard) cTag.getSource(); - try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new BufferedOutputStream( - new ParallelGZIPOutputStream(stream)))) { - new FastSchematicWriter(output).write(clipboard); - } - } else { - try (OutputStream stream = new FileOutputStream(tmp); BufferedOutputStream output = new BufferedOutputStream( - new ParallelGZIPOutputStream(stream))) { - LZ4BlockInputStream is = cTag.adapt(cTag.getSource()); - IOUtil.copy(is, stream); - } - } - } else { - try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new ParallelGZIPOutputStream( - stream))) { - Map map = tag.getValue(); - output.writeNamedTag("Schematic", map.getOrDefault("Schematic", tag)); - } - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - return true; - } - - @Override - public void upload(final CompoundTag tag, final UUID uuid, final String file, final RunnableVal whenDone) { - if (tag == null) { - PlotSquared.debug("&cCannot save empty tag"); - com.github.intellectualsites.plotsquared.plot.util.TaskManager.runTask(whenDone); - return; - } - CompoundTag weTag = (CompoundTag) FaweCache.IMP.asTag(tag); - if (weTag instanceof CompressedSchematicTag) { - Clipboard clipboard = ((CompressedSchematicTag) weTag).getSource(); - URL url = FaweAPI.upload(clipboard, BuiltInClipboardFormat.SPONGE_SCHEMATIC); - whenDone.run(url); - return; - } - MainUtil.upload(uuid, file, "schem", new RunnableVal() { - @Override - public void run(OutputStream output) { - try { - try (ParallelGZIPOutputStream gzip = new ParallelGZIPOutputStream(output)) { - try (NBTOutputStream nos = new NBTOutputStream(gzip)) { - Map map = weTag.getValue(); - nos.writeNamedTag("Schematic", map.getOrDefault("Schematic", weTag)); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }, whenDone); - } - -} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java deleted file mode 100644 index 0c5f02b59..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.util.TaskManager; -import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; -import com.github.intellectualsites.plotsquared.plot.commands.CommandCategory; -import com.github.intellectualsites.plotsquared.plot.commands.RequiredType; -import com.github.intellectualsites.plotsquared.plot.commands.SubCommand; -import com.github.intellectualsites.plotsquared.plot.config.Captions; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.WorldUtil; - -@CommandDeclaration( - command = "trimchunks", - permission = "plots.admin", - description = "Delete unmodified portions of your plotworld", - requiredType = RequiredType.PLAYER, - category = CommandCategory.ADMINISTRATION) -public class FaweTrim extends SubCommand { - - private boolean ran = false; - - @Override - public boolean onCommand(final PlotPlayer plotPlayer, final String[] strings) { - if (ran) { - plotPlayer.sendMessage("Already running!"); - return false; - } - if (strings.length != 2) { - plotPlayer.sendMessage( - "First make a backup of your world called then stand in the middle of an empty plot"); - plotPlayer.sendMessage("use /plot trimall "); - return false; - } - if (!WorldUtil.IMP.isWorld(strings[0])) { - Captions.NOT_VALID_PLOT_WORLD.send(plotPlayer, strings[0]); - return false; - } - ran = true; - TaskManager.IMP.async(new Runnable() { - @Override - public void run() { - try { - // TODO NOT IMPLEMENTED -// PlotTrim trim = new PlotTrim(plotPlayer, plotPlayer.getPlotAreaAbs(), strings[0], Boolean.parseBoolean(strings[1])); -// Location loc = plotPlayer.getLocation(); -// trim.setChunk(loc.getX() >> 4, loc.getZ() >> 4); -// trim.run(); -// plotPlayer.sendMessage("Done!"); - } catch (Throwable e) { - e.printStackTrace(); - } - ran = false; - } - }); - return true; - } - -} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java deleted file mode 100644 index 3d8e1c8d3..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.util.TaskManager; -import com.github.intellectualsites.plotsquared.commands.Command; -import com.github.intellectualsites.plotsquared.commands.CommandDeclaration; -import com.github.intellectualsites.plotsquared.plot.commands.CommandCategory; -import com.github.intellectualsites.plotsquared.plot.commands.MainCommand; -import com.github.intellectualsites.plotsquared.plot.commands.RequiredType; -import com.github.intellectualsites.plotsquared.plot.config.Captions; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal2; -import com.github.intellectualsites.plotsquared.plot.object.RunnableVal3; -import com.github.intellectualsites.plotsquared.plot.util.MainUtil; -import com.github.intellectualsites.plotsquared.plot.util.Permissions; -import com.github.intellectualsites.plotsquared.plot.util.StringMan; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.extension.platform.Capability; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.biome.BiomeTypes; -import com.sk89q.worldedit.world.biome.Biomes; -import com.sk89q.worldedit.world.registry.BiomeRegistry; -import org.bukkit.Bukkit; - -import java.util.Collection; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ThreadLocalRandom; - -@CommandDeclaration( - command = "generatebiome", - permission = "plots.generatebiome", - category = CommandCategory.APPEARANCE, - requiredType = RequiredType.NONE, - description = "Generate a biome in your plot", - aliases = {"bg", "gb"}, - usage = "/plots generatebiome " -) -public class PlotSetBiome extends Command { - - public PlotSetBiome() { - super(MainCommand.getInstance(), true); - } - - @Override - public CompletableFuture execute( - final PlotPlayer player, - String[] args, - RunnableVal3 confirm, - RunnableVal2 whenDone - ) throws CommandException { - final Plot plot = check(player.getCurrentPlot(), Captions.NOT_IN_PLOT); - checkTrue(plot.isOwner(player.getUUID()) || Permissions - .hasPermission(player, "plots.admin.command.generatebiome"), Captions.NO_PLOT_PERMS); - if (plot.getRunning() != 0) { - Captions.WAIT_FOR_TIMER.send(player); - return null; - } - checkTrue(args.length == 1, Captions.COMMAND_SYNTAX, getUsage()); - final Set regions = plot.getRegions(); - BiomeRegistry biomeRegistry = WorldEdit - .getInstance() - .getPlatformManager() - .queryCapability(Capability.GAME_HOOKS) - .getRegistries() - .getBiomeRegistry(); - Collection knownBiomes = BiomeTypes.values(); - final BiomeType biome = Biomes.findBiomeByName(knownBiomes, args[0], biomeRegistry); - if (biome == null) { - String biomes = StringMan - .join(BiomeType.REGISTRY.values(), Captions.BLOCK_LIST_SEPARATOR.getTranslated()); - Captions.NEED_BIOME.send(player); - MainUtil.sendMessage(player, Captions.SUBCOMMAND_SET_OPTIONS_HEADER + biomes); - return CompletableFuture.completedFuture(false); - } - confirm.run(this, () -> { - if (plot.getRunning() != 0) { - Captions.WAIT_FOR_TIMER.send(player); - return; - } - plot.addRunning(); - TaskManager.IMP.async(() -> { - EditSession session = WorldEdit.getInstance().newEditSessionBuilder().world(BukkitAdapter.adapt(Bukkit.getWorld( - plot.getArea().worldname))) - .checkMemory(false) - .allowedRegionsEverywhere() - .actor(BukkitAdapter.adapt(Bukkit.getPlayer(player.getUUID()))) - .limitUnlimited() - .build(); - long seed = ThreadLocalRandom.current().nextLong(); - for (CuboidRegion region : regions) { - session.regenerate(region, biome, seed); - } - session.flushQueue(); - plot.removeRunning(); - }); - }, null); - - return CompletableFuture.completedFuture(true); - } - -} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java deleted file mode 100644 index 5a2b5484f..000000000 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; - -import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.regions.FaweMask; -import com.fastasyncworldedit.core.regions.FaweMaskManager; -import com.fastasyncworldedit.core.regions.RegionWrapper; -import com.github.intellectualsites.plotsquared.plot.commands.MainCommand; -import com.github.intellectualsites.plotsquared.plot.config.Settings; -import com.github.intellectualsites.plotsquared.plot.database.DBFunc; -import com.github.intellectualsites.plotsquared.plot.flag.Flags; -import com.github.intellectualsites.plotsquared.plot.listener.WEManager; -import com.github.intellectualsites.plotsquared.plot.object.Plot; -import com.github.intellectualsites.plotsquared.plot.object.PlotArea; -import com.github.intellectualsites.plotsquared.plot.object.PlotPlayer; -import com.github.intellectualsites.plotsquared.plot.util.ChunkManager; -import com.github.intellectualsites.plotsquared.plot.util.SchematicHandler; -import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; -import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.regions.RegionIntersection; -import com.sk89q.worldedit.world.World; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; - -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -public class PlotSquaredFeature extends FaweMaskManager { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - public PlotSquaredFeature() { - super("PlotSquared"); - LOGGER.info("Optimizing PlotSquared"); - if (com.fastasyncworldedit.core.configuration.Settings.IMP.ENABLED_COMPONENTS.PLOTSQUARED_V4_HOOK) { - Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false; - try { - setupBlockQueue(); - setupSchematicHandler(); - setupChunkManager(); - } catch (Throwable ignored) { - LOGGER.info("Please update PlotSquared: https://www.spigotmc.org/resources/77506/"); - } - if (Settings.PLATFORM.toLowerCase(Locale.ROOT).startsWith("bukkit")) { - new FaweTrim(); - } - if (MainCommand.getInstance().getCommand("generatebiome") == null) { - new PlotSetBiome(); - } - } - // TODO: revisit this later on - /* - try { - if (Settings.Enabled_Components.WORLDS) { - new ReplaceAll(); - } - } catch (Throwable e) { - log.debug("You need to update PlotSquared to access the CFI and REPLACEALL commands"); - } - */ - } - - public static String getName(UUID uuid) { - return UUIDHandler.getName(uuid); - } - - private void setupBlockQueue() throws RuntimeException { - // If it's going to fail, throw an error now rather than later - //QueueProvider provider = QueueProvider.of(FaweLocalBlockQueue.class, null); - //GlobalBlockQueue.IMP.setProvider(provider); - //HybridPlotManager.REGENERATIVE_CLEAR = false; - //log.debug(" - QueueProvider: " + FaweLocalBlockQueue.class); - //log.debug(" - HybridPlotManager.REGENERATIVE_CLEAR: " + HybridPlotManager.REGENERATIVE_CLEAR); - } - - private void setupChunkManager() throws RuntimeException { - ChunkManager.manager = new FaweChunkManager(ChunkManager.manager); - LOGGER.info(" - ChunkManager: {}", ChunkManager.manager); - } - - private void setupSchematicHandler() throws RuntimeException { - SchematicHandler.manager = new FaweSchematicHandler(); - LOGGER.info(" - SchematicHandler: {}", SchematicHandler.manager); - } - - public boolean isAllowed(Player player, Plot plot, MaskType type) { - if (plot == null) { - return false; - } - UUID uid = player.getUniqueId(); - if (Flags.NO_WORLDEDIT.isTrue(plot)) { - player.print(Caption.of( - "fawe.cancel.reason.no.region.reason", - Caption.of("fawe.cancel.reason.no.region.plot.noworldeditflag") - )); - return false; - } - if (plot.isOwner(uid) || player.hasPermission("fawe.plotsquared.admin")) { - return true; - } - if (type != MaskType.MEMBER) { - player.print(Caption.of( - "fawe.cancel.reason.no.region.reason", - Caption.of("fawe.cancel.reason.no.region.plot.owner.only") - )); - return false; - } - if (plot.getTrusted().contains(uid) || plot.getTrusted().contains(DBFunc.EVERYONE)) { - return true; - } - if (plot.getMembers().contains(uid) || plot.getMembers().contains(DBFunc.EVERYONE)) { - if (!player.hasPermission("fawe.plotsquared.member")) { - player.print(Caption.of( - "fawe.cancel.reason.no.region.reason", - Caption.of("fawe.error.no-perm", "fawe.plotsquared.member") - )); - return false; - } - if (!plot.getOwners().isEmpty() && plot.getOwners().stream().anyMatch(this::playerOnline)) { - return true; - } else { - player.print(Caption.of( - "fawe.cancel.reason.no.region.reason", - Caption.of("fawe.cancel.reason.no.region.plot.owner.offline") - )); - return false; - } - } - player.print(Caption.of( - "fawe.cancel.reason.no.region.reason", - Caption.of("fawe.cancel.reason.no.region.not.added") - )); - return false; - } - - private boolean playerOnline(UUID uuid) { - if (uuid == null) { - return false; - } - org.bukkit.entity.Player player = Bukkit.getPlayer(uuid); - return player != null && player.isOnline(); - } - - @Override - public FaweMask getMask(Player player, MaskType type) { - final PlotPlayer pp = PlotPlayer.wrap(player.getUniqueId()); - if (pp == null) { - return null; - } - final Set regions; - Plot plot = pp.getCurrentPlot(); - if (isAllowed(player, plot, type)) { - regions = plot.getRegions(); - } else { - plot = null; - regions = WEManager.getMask(pp); - if (regions.size() == 1) { - CuboidRegion region = regions.iterator().next(); - if (region.getMinimumPoint().getX() == Integer.MIN_VALUE && region - .getMaximumPoint() - .getX() == Integer.MAX_VALUE) { - regions.clear(); - } - } - } - if (regions.isEmpty()) { - return null; - } - PlotArea area = pp.getApplicablePlotArea(); - int min = area != null ? area.MIN_BUILD_HEIGHT : 0; - int max = area != null ? Math.min(255, area.MAX_BUILD_HEIGHT) : 255; - final HashSet faweRegions = new HashSet<>(); - for (CuboidRegion current : regions) { - faweRegions.add(new RegionWrapper( - current.getMinimumX(), - current.getMaximumX(), - min, - max, - current.getMinimumZ(), - current.getMaximumZ() - )); - } - final CuboidRegion region = regions.iterator().next(); - final BlockVector3 pos1 = BlockVector3.at(region.getMinimumX(), min, region.getMinimumZ()); - final BlockVector3 pos2 = BlockVector3.at(region.getMaximumX(), max, region.getMaximumZ()); - final Plot finalPlot = plot; - if (Settings.Done.RESTRICT_BUILDING && Flags.DONE.isSet(finalPlot) || regions.isEmpty()) { - return null; - } - - Region maskedRegion; - if (regions.size() == 1) { - maskedRegion = new CuboidRegion(pos1, pos2); - } else { - World world = FaweAPI.getWorld(area.worldname); - List weRegions = regions.stream() - .map(r -> new CuboidRegion( - world, - BlockVector3.at(r.getMinimumX(), r.getMinimumY(), r.getMinimumZ()), - BlockVector3.at(r.getMaximumX(), r.getMaximumY(), r.getMaximumZ()) - )) - .collect(Collectors.toList()); - maskedRegion = new RegionIntersection(world, weRegions); - } - - return new FaweMask(maskedRegion) { - @Override - public boolean isValid(Player player, MaskType type) { - if (Settings.Done.RESTRICT_BUILDING && Flags.DONE.isSet(finalPlot)) { - return false; - } - return isAllowed(player, finalPlot, type); - } - }; - } - -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 9208881ef..3c7da3f12 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -520,7 +520,7 @@ public class BukkitWorld extends AbstractWorld { public BaseBlock getFullBlock(BlockVector3 position) { BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); if (adapter != null) { - return adapter.getBlock(BukkitAdapter.adapt(getWorld(), position)); + return adapter.getFullBlock(BukkitAdapter.adapt(getWorld(), position)); } else { return getBlock(position).toBaseBlock(); } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 75946fe01..8ea0a918d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -138,12 +138,12 @@ public class WorldEditPlugin extends JavaPlugin { platform = new BukkitServerInterface(this, getServer()); worldEdit.getPlatformManager().register(platform); - //FAWE start - Rename config to config-legacy.yml TODO: Chose a better name in the future - createDefaultConfiguration("config-legacy.yml"); // Create the default configuration file for WorldEdit, for us it's 'config-legacy.yml' + //FAWE start - Migrate from config-legacy to worldedit-config + migrateLegacyConfig(); //FAWE end //FAWE start - Modify WorldEdit config name - config = new BukkitConfiguration(new YAMLProcessor(new File(getDataFolder(), "config-legacy.yml"), true), this); + config = new BukkitConfiguration(new YAMLProcessor(new File(getDataFolder(), "worldedit-config.yml"), true), this); //FAWE end //FAWE start - Setup permission attachments @@ -422,6 +422,19 @@ public class WorldEditPlugin extends JavaPlugin { } } + private void migrateLegacyConfig() { + File legacy = new File(getDataFolder(), "config-legacy.yml"); + if (legacy.exists()) { + try { + legacy.renameTo(new File(getDataFolder(), "worldedit-config.yml")); + LOGGER.info("Migrated config-legacy.yml to worldedit-config.yml"); + } catch (Exception e) { + LOGGER.error("Unable to rename legacy config file", e); + } + } + createDefaultConfiguration("worldedit-config.yml"); + } + private void copyDefaultConfig(InputStream input, File actual, String name) { try (FileOutputStream output = new FileOutputStream(actual)) { byte[] buf = new byte[8192]; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 8f2e4008e..799e52bb9 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -106,7 +106,15 @@ public interface BukkitImplAdapter extends IBukkitAdapter { * @param location the location * @return the block */ - BaseBlock getBlock(Location location); + BlockState getBlock(Location location); + + /** + * Get the block at the given location. + * + * @param location the location + * @return the block + */ + BaseBlock getFullBlock(Location location); /** * Create a {@link WorldNativeAccess} for the given world reference. diff --git a/worldedit-bukkit/src/main/resources/defaults/config-legacy.yml b/worldedit-bukkit/src/main/resources/defaults/worldedit-config.yml similarity index 61% rename from worldedit-bukkit/src/main/resources/defaults/config-legacy.yml rename to worldedit-bukkit/src/main/resources/defaults/worldedit-config.yml index 51817009c..8140cade6 100644 --- a/worldedit-bukkit/src/main/resources/defaults/config-legacy.yml +++ b/worldedit-bukkit/src/main/resources/defaults/worldedit-config.yml @@ -10,39 +10,39 @@ # in categories, like "max-blocks-changed", are placed in the "limits" # category. # - If you want to check the format of this file before putting it -# into WorldEdit, paste it into http://yaml-online-parser.appspot.com/ +# into WorldEdit, paste it into https://yaml-online-parser.appspot.com/ # and see if it gives you "ERROR:". # - Lines starting with # are comments, so they are ignored. # - If you want to allow blocks, make sure to change "disallowed-blocks" to [] # -limits : - max-blocks-changed : +limits: + max-blocks-changed: # Ignored, use FAWE config limits - default : -1 - maximum : -1 - max-polygonal-points : - default : -1 - maximum : 20 - max-radius : -1 - max-super-pickaxe-size : 5 - max-brush-radius : 100 - butcher-radius : - default : -1 - maximum : -1 - disallowed-blocks : + default: -1 + maximum: -1 + max-polygonal-points: + default: -1 + maximum: 20 + max-radius: -1 + max-super-pickaxe-size: 5 + max-brush-radius: 100 + butcher-radius: + default: -1 + maximum: -1 + disallowed-blocks: - "minecraft:wheat" - "minecraft:fire" - "minecraft:redstone_wire" -use-inventory : - enable : false - allow-override : true - creative-mode-overrides : false +use-inventory: + enable: false + allow-override: true + creative-mode-overrides: false -logging : - log-commands : false - file : worldedit.log +logging: + log-commands: false + file: worldedit.log # The format of custom log message. This is java general format string (java.util.Formatter). Arguments are: # 1$ : date - a Date object representing event time of the log record. # 2$ : source - a string representing the caller, if available; otherwise, the logger's name. @@ -53,44 +53,44 @@ logging : # For details see: # https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html # https://docs.oracle.com/javase/8/docs/api/java/util/logging/SimpleFormatter.html#format-java.util.logging.LogRecord- - format : "[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s]: %5$s%6$s%n" + format: "[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s]: %5$s%6$s%n" -super-pickaxe : - drop-items : true - many-drop-items : false +super-pickaxe: + drop-items: true + many-drop-items: false -snapshots : - directory : +snapshots: + directory: -navigation-wand : - item : minecraft:compass - max-distance : 100 +navigation-wand: + item: minecraft:compass + max-distance: 100 -scripting : - timeout : 3000 - dir : craftscripts +scripting: + timeout: 3000 + dir: craftscripts -saving : - dir : schematics +saving: + dir: schematics -files : - allow-symbolic-links : false +files: + allow-symbolic-links: false -history : - size : 15 - expiration : 10 +history: + size: 15 + expiration: 10 -calculation : - timeout : 100 +calculation: + timeout: 100 -debugging : - trace-unflushed-sessions : false +debugging: + trace-unflushed-sessions: false -wand-item : minecraft:wooden_axe -shell-save-type : -no-double-slash : false -no-op-permissions : false -debug : false -show-help-on-first-use : true -server-side-cui : true -command-block-support : false +wand-item: minecraft:wooden_axe +shell-save-type: +no-double-slash: false +no-op-permissions: false +debug: false +show-help-on-first-use: true +server-side-cui: true +command-block-support: false diff --git a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java index 864f82a9f..e81e849f3 100644 --- a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java +++ b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java @@ -118,6 +118,11 @@ public class StubServer implements Server { return 0; } + @Override + public int getSimulationDistance() { + return 12; + } + @Override public @NotNull String getIp() { @@ -465,6 +470,11 @@ public class StubServer implements Server { } + @Override + public boolean getHideOnlinePlayers() { + return false; + } + @Override public boolean getOnlineMode() { return false; diff --git a/worldedit-core/build.gradle.kts b/worldedit-core/build.gradle.kts index 3d73c711b..7e4ae09a7 100644 --- a/worldedit-core/build.gradle.kts +++ b/worldedit-core/build.gradle.kts @@ -12,7 +12,7 @@ applyPlatformAndCoreConfiguration() dependencies { constraints { implementation("org.yaml:snakeyaml") { - version { strictly("1.28") } + version { strictly("1.30") } because("Bukkit provides SnakeYaml") } } @@ -37,7 +37,6 @@ dependencies { // Plugins compileOnly(libs.redprotect) { isTransitive = false } - compileOnly(libs.plotsquaredV4) { isTransitive = false } compileOnly(libs.plotsquaredV6Core) { isTransitive = false } // ensure this is on the classpath for the AP diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java index 19b574108..f6cc83158 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java @@ -63,8 +63,6 @@ public class Settings extends Config { @Create public WEB WEB; @Create - public PLOTSQUARED_INTEGRATION PLOTSQUARED_INTEGRATION; - @Create public EXTENT EXTENT; @Create public EXPERIMENTAL EXPERIMENTAL; @@ -219,7 +217,7 @@ public class Settings extends Config { }) public List STRIP_NBT = new ArrayList<>(); @Comment({ - "If the disallowed blocks listed in config-legacy.yml should be disallowed in all edits,", + "If the disallowed blocks listed in worldedit-config.yml should be disallowed in all edits,", "not just where blocks patterns are used.", " - Can prevent blocks being pasted from clipboards, etc.", " - If fast-placement is disabled, this may cause edits to be slower." @@ -486,17 +484,6 @@ public class Settings extends Config { } - public static class PLOTSQUARED_INTEGRATION { - - @Comment({ - "Only disables/enables the components with PlotSquared v4.", - "For v6, see PlotSquared settings.yml" - }) - public boolean CLEAR = true; - public boolean COPY_AND_SWAP = true; - - } - public static class WEB { @Comment({ diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java index 6cc3eef7f..3af6fcf78 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java @@ -1,7 +1,6 @@ package com.fastasyncworldedit.core.function.generator; import com.fastasyncworldedit.core.util.MathMan; -import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; @@ -237,11 +236,8 @@ public class CavesGen extends GenBase { BlockState material = chunk.getBlock(bx + local_x, local_y, bz + local_z); BlockState materialAbove = chunk.getBlock(bx + local_x, local_y + 1, bz + local_z); BlockType blockType = material.getBlockType(); - switch (blockType.getInternalId()) { - case BlockID.MYCELIUM: - case BlockID.GRASS: - grassFound = true; - + switch (blockType.getId()) { + case "minecraft:mycelium", "minecraft:grass_block" -> grassFound = true; } if (this.isSuitableBlock(material, materialAbove)) { if (local_y - 1 < 10) { @@ -281,13 +277,13 @@ public class CavesGen extends GenBase { } protected boolean isSuitableBlock(BlockStateHolder material, BlockStateHolder materialAbove) { - switch (material.getBlockType().getInternalId()) { - case BlockID.AIR: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: - case BlockID.WATER: - case BlockID.LAVA: - case BlockID.BEDROCK: + switch (material.getBlockType().getId()) { + case "minecraft:air": + case "minecraft:cave_air": + case "minecraft:void_air": + case "minecraft:water": + case "minecraft:lava": + case "minecraft:bedrock": return false; default: return true; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java index 0e9413f8a..37fdcbf55 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java @@ -10,7 +10,6 @@ import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.queue.IChunkSet; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.TaskManager; -import com.fastasyncworldedit.core.world.block.BlockID; import com.google.common.util.concurrent.Futures; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; @@ -187,7 +186,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { int xx = bx + x; int from = blocksGet[index]; if (from == 0) { - from = BlockID.AIR; + from = 1; } final int combinedFrom = from; final int combinedTo = blocksSet[index]; @@ -199,22 +198,23 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { } } - BiomeType[] biomes = set.getBiomes(); + BiomeType[][] biomes = set.getBiomes(); if (biomes != null) { - int index = 0; for (int layer = get.getMinSectionPosition(); layer <= get.getMaxSectionPosition(); layer++) { if (!set.hasBiomes(layer)) { continue; } + BiomeType[] biomeSection = biomes[layer - set.getMinSectionPosition()]; + int index = 0; int yy = layer << 4; - for (int y = 0; y < 4; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++, index++) { - BiomeType newBiome = biomes[index]; + for (int y = 0; y < 16; y+= 4) { + for (int z = 0; z < 16; z+= 4) { + for (int x = 0; x < 16; x+= 4, index++) { + BiomeType newBiome = biomeSection[index]; if (newBiome != null) { - BiomeType oldBiome = get.getBiomeType(x, y, z); + BiomeType oldBiome = get.getBiomeType(x, yy + y, z); if (oldBiome != newBiome) { - addBiomeChange(bx + (x << 2), yy + (y << 2), bz + (z << 2), oldBiome, newBiome); + addBiomeChange(bx + x, yy + y, bz + z, oldBiome, newBiome); } } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index 2b4eb84f1..c57be1117 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -3,7 +3,6 @@ package com.fastasyncworldedit.core.queue; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.internal.io.FastByteArrayOutputStream; import com.fastasyncworldedit.core.internal.io.FaweOutputStream; -import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; @@ -116,11 +115,11 @@ public interface IBlocks extends Trimable { for (int i = 0; i < ids.length; i++) { char ordinal = ids[i]; switch (ordinal) { - case BlockID.__RESERVED__: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: - ids[i] = BlockID.AIR; - case BlockID.AIR: + case 0: + case 2: + case 3: + ids[i] = 1; + case 1: continue; default: nonEmpty++; @@ -140,10 +139,10 @@ public interface IBlocks extends Trimable { for (int i = 0; i < palette.paletteToBlockLength; i++) { int ordinal = palette.paletteToBlock[i]; switch (ordinal) { - case BlockID.__RESERVED__: - case BlockID.CAVE_AIR: - case BlockID.VOID_AIR: - case BlockID.AIR: + case 0: + case 2: + case 3: + case 1: sectionWriter.write(0); break; default: diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java index 318e8ebeb..79aed9f23 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java @@ -64,7 +64,7 @@ public interface IChunkSet extends IBlocks, OutputExtent { * * @return Array of biomes set */ - BiomeType[] getBiomes(); + BiomeType[][] getBiomes(); default boolean hasBiomes() { return getBiomes() != null; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java index efa635626..0829ac710 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java @@ -161,7 +161,7 @@ public class BitSetBlocks implements IChunkSet { } @Override - public BiomeType[] getBiomes() { + public BiomeType[][] getBiomes() { return null; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index 9b59a4915..64e3aa7ed 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -33,7 +33,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { return POOL.poll(); } - public BiomeType[] biomes; + public BiomeType[][] biomes; public char[][] light; public char[][] skyLight; public BlockVector3ChunkMap tiles; @@ -54,17 +54,19 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { } @Override - public BiomeType[] getBiomes() { + public BiomeType[][] getBiomes() { return biomes; } @Override public BiomeType getBiomeType(int x, int y, int z) { + int layer; if (biomes == null || (y >> 4) < minSectionPosition || (y >> 4) > maxSectionPosition) { return null; + } else if (biomes[(layer = (y >> 4) - minSectionPosition)] == null) { + return null; } - y -= minSectionPosition << 4; - return biomes[(y >> 2) << 4 | (z >> 2) << 2 | x >> 2]; + return biomes[layer][(y & 15) >> 2 | (z >> 2) << 2 | x >> 2]; } @Override @@ -96,10 +98,14 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { public boolean setBiome(int x, int y, int z, BiomeType biome) { updateSectionIndexRange(y >> 4); y -= minSectionPosition << 4; + int layer = (y >> 4) - minSectionPosition; if (biomes == null) { - biomes = new BiomeType[64 * sectionCount]; + biomes = new BiomeType[sectionCount][]; + biomes[layer] = new BiomeType[64]; + } else if (biomes[layer] == null) { + biomes[layer] = new BiomeType[64]; } - biomes[(y >> 2) << 4 | (z >> 2) << 2 | x >> 2] = biome; + biomes[layer][(y & 12) << 2 | (z & 12) | (x & 12) >> 2] = biome; return true; } @@ -312,7 +318,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { if (layer < 0 || layer >= sections.length) { return false; } - return biomes != null; + return biomes != null && biomes[layer] != null; } @Override @@ -344,7 +350,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { sectionLocks = tmpSectionLocks; minSectionPosition = layer; if (biomes != null) { - BiomeType[] tmpBiomes = new BiomeType[sectionCount * 64]; + BiomeType[][] tmpBiomes = new BiomeType[sectionCount][64]; System.arraycopy(biomes, 0, tmpBiomes, 64 * diff, biomes.length); biomes = tmpBiomes; } @@ -376,7 +382,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { sectionLocks = tmpSectionLocks; maxSectionPosition = layer; if (biomes != null) { - BiomeType[] tmpBiomes = new BiomeType[sectionCount * 64]; + BiomeType[][] tmpBiomes = new BiomeType[sectionCount][64]; System.arraycopy(biomes, 0, tmpBiomes, 0, biomes.length); biomes = tmpBiomes; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java index 7a7706f87..27fdf76ad 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java @@ -96,7 +96,7 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public BiomeType[] getBiomes() { + public BiomeType[][] getBiomes() { // Uses set as this method is only used to retrieve biomes that have been set to the extent/chunk. return delegate.set(this).getBiomes(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java index 9b6d72b95..99757a513 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java @@ -122,7 +122,7 @@ public final class NullChunk implements IQueueChunk { } @Nullable - public BiomeType[] getBiomes() { + public BiomeType[][] getBiomes() { return null; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java index 8145c4514..5c7cdc34b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/registry/state/PropertyKey.java @@ -18,8 +18,13 @@ public class PropertyKey implements Comparable { // constants public static final PropertyKey AGE = getOrCreate("age"); public static final PropertyKey ATTACHED = getOrCreate("attached"); + public static final PropertyKey ATTACHMENT = getOrCreate("attachement"); public static final PropertyKey AXIS = getOrCreate("axis"); + public static final PropertyKey BERRIES = getOrCreate("berries"); public static final PropertyKey BITES = getOrCreate("bites"); + public static final PropertyKey BOTTOM = getOrCreate("bottom"); + public static final PropertyKey CANDLES = getOrCreate("candles"); + public static final PropertyKey CHARGES = getOrCreate("charges"); public static final PropertyKey CONDITIONAL = getOrCreate("conditional"); public static final PropertyKey DELAY = getOrCreate("delay"); public static final PropertyKey DISARMED = getOrCreate("disarmed"); @@ -33,17 +38,22 @@ public class PropertyKey implements Comparable { public static final PropertyKey EYE = getOrCreate("eye"); public static final PropertyKey FACE = getOrCreate("face"); public static final PropertyKey FACING = getOrCreate("facing"); + public static final PropertyKey FALLING = getOrCreate("falling"); public static final PropertyKey HALF = getOrCreate("half"); + public static final PropertyKey HANGING = getOrCreate("hanging"); + public static final PropertyKey HAS_BOOK = getOrCreate("has_book"); public static final PropertyKey HAS_BOTTLE_0 = getOrCreate("has_bottle_0"); public static final PropertyKey HAS_BOTTLE_1 = getOrCreate("has_bottle_1"); public static final PropertyKey HAS_BOTTLE_2 = getOrCreate("has_bottle_2"); public static final PropertyKey HAS_RECORD = getOrCreate("has_record"); public static final PropertyKey HATCH = getOrCreate("hatch"); public static final PropertyKey HINGE = getOrCreate("hinge"); - public static final PropertyKey IN_WALL = getOrCreate("in_wall"); + public static final PropertyKey HONEY_LEVEL = getOrCreate("honey_level"); public static final PropertyKey INSTRUMENT = getOrCreate("instrument"); public static final PropertyKey INVERTED = getOrCreate("inverted"); + public static final PropertyKey IN_WALL = getOrCreate("in_wall"); public static final PropertyKey LAYERS = getOrCreate("layers"); + public static final PropertyKey LEAVES = getOrCreate("leaves"); public static final PropertyKey LEVEL = getOrCreate("level"); public static final PropertyKey LIT = getOrCreate("lit"); public static final PropertyKey LOCKED = getOrCreate("locked"); @@ -53,29 +63,30 @@ public class PropertyKey implements Comparable { public static final PropertyKey NOTE = getOrCreate("note"); public static final PropertyKey OCCUPIED = getOrCreate("occupied"); public static final PropertyKey OPEN = getOrCreate("open"); + public static final PropertyKey ORIENTATION = getOrCreate("orientation"); public static final PropertyKey PART = getOrCreate("part"); public static final PropertyKey PERSISTENT = getOrCreate("persistent"); public static final PropertyKey PICKLES = getOrCreate("pickles"); public static final PropertyKey POWER = getOrCreate("power"); public static final PropertyKey POWERED = getOrCreate("powered"); public static final PropertyKey ROTATION = getOrCreate("rotation"); + public static final PropertyKey SCULK_SENSOR_PHASE = getOrCreate("sculk_sensor_phase"); public static final PropertyKey SHAPE = getOrCreate("shape"); public static final PropertyKey SHORT = getOrCreate("short"); + public static final PropertyKey SIGNAL_FIRE = getOrCreate("signal_fire"); public static final PropertyKey SNOWY = getOrCreate("snowy"); public static final PropertyKey SOUTH = getOrCreate("south"); public static final PropertyKey STAGE = getOrCreate("stage"); + public static final PropertyKey TILT = getOrCreate("tilt"); + public static final PropertyKey THICKNESS = getOrCreate("thickness"); public static final PropertyKey TRIGGERED = getOrCreate("triggered"); public static final PropertyKey TYPE = getOrCreate("type"); + public static final PropertyKey UNSTABLE = getOrCreate("unstable"); public static final PropertyKey UP = getOrCreate("up"); + public static final PropertyKey VERTICAL_DIRECTION = getOrCreate("vertical_direction"); + public static final PropertyKey VINE_END = getOrCreate("vine_end"); public static final PropertyKey WATERLOGGED = getOrCreate("waterlogged"); public static final PropertyKey WEST = getOrCreate("west"); - public static final PropertyKey UNSTABLE = getOrCreate("unstable"); - public static final PropertyKey LEAVES = getOrCreate("leaves"); - public static final PropertyKey ATTACHMENT = getOrCreate("attachement"); - public static final PropertyKey SIGNAL_FIRE = getOrCreate("signal_fire"); - public static final PropertyKey HANGING = getOrCreate("hanging"); - public static final PropertyKey HAS_BOOK = getOrCreate("has_book"); - public static final PropertyKey BOTTOM = getOrCreate("bottom"); private final String name; private final int id; @@ -90,10 +101,6 @@ public class PropertyKey implements Comparable { return keyList.size(); } - public final String getName() { - return this.name; - } - public static PropertyKey getByName(CharSequence name) { return keys.get(name); } @@ -116,6 +123,10 @@ public class PropertyKey implements Comparable { }); } + public final String getName() { + return this.name; + } + public int getId() { return id; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java deleted file mode 100644 index c077c7f53..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/block/BlockID.java +++ /dev/null @@ -1,695 +0,0 @@ -package com.fastasyncworldedit.core.world.block; - -/** - * An internal FAWE class used for switch statements on blocks. - * Using IDs to register items is pre 1.13 days. This class is - * deprecated for removal with replacement of namespaced IDs. - */ -@Deprecated(forRemoval = true) -public class BlockID { - - public static final int __RESERVED__ = 0; - public static final int AIR = 1; - public static final int CAVE_AIR = 2; - public static final int VOID_AIR = 3; - public static final int ACACIA_BUTTON = 4; - public static final int ACACIA_DOOR = 5; - public static final int ACACIA_FENCE = 6; - public static final int ACACIA_FENCE_GATE = 7; - public static final int ACACIA_LEAVES = 8; - public static final int ACACIA_LOG = 9; - public static final int ACACIA_PLANKS = 10; - public static final int ACACIA_PRESSURE_PLATE = 11; - public static final int ACACIA_SAPLING = 12; - public static final int ACACIA_SIGN = 501; - public static final int ACACIA_SLAB = 13; - public static final int ACACIA_STAIRS = 14; - public static final int ACACIA_TRAPDOOR = 15; - public static final int ACACIA_WALL_SIGN = 565; - public static final int ACACIA_WOOD = 16; - public static final int ACTIVATOR_RAIL = 17; - public static final int ALLIUM = 18; - public static final int ANDESITE = 19; - public static final int ANDESITE_SLAB = 599; - public static final int ANDESITE_STAIRS = 600; - public static final int ANDESITE_WALL = 601; - public static final int ANVIL = 20; - public static final int ATTACHED_MELON_STEM = 21; - public static final int ATTACHED_PUMPKIN_STEM = 22; - public static final int AZURE_BLUET = 23; - public static final int BAMBOO = 602; - public static final int BAMBOO_SAPLING = 603; - public static final int BARREL = 604; - public static final int BARRIER = 24; - public static final int BEACON = 25; - public static final int BEDROCK = 26; - public static final int BEE_NEST = 677; - public static final int BEEHIVE = 678; // highest - public static final int BEETROOTS = 27; - public static final int BELL = 605; - public static final int BIRCH_BUTTON = 28; - public static final int BIRCH_DOOR = 29; - public static final int BIRCH_FENCE = 30; - public static final int BIRCH_FENCE_GATE = 31; - public static final int BIRCH_LEAVES = 32; - public static final int BIRCH_LOG = 33; - public static final int BIRCH_PLANKS = 34; - public static final int BIRCH_PRESSURE_PLATE = 35; - public static final int BIRCH_SAPLING = 36; - public static final int BIRCH_SIGN = 606; - public static final int BIRCH_SLAB = 37; - public static final int BIRCH_STAIRS = 38; - public static final int BIRCH_TRAPDOOR = 39; - public static final int BIRCH_WALL_SIGN = 607; - public static final int BIRCH_WOOD = 40; - public static final int BLACK_BANNER = 41; - public static final int BLACK_BED = 42; - public static final int BLACK_CARPET = 43; - public static final int BLACK_CONCRETE = 44; - public static final int BLACK_CONCRETE_POWDER = 45; - public static final int BLACK_GLAZED_TERRACOTTA = 46; - public static final int BLACK_SHULKER_BOX = 47; - public static final int BLACK_STAINED_GLASS = 48; - public static final int BLACK_STAINED_GLASS_PANE = 49; - public static final int BLACK_TERRACOTTA = 50; - public static final int BLACK_WALL_BANNER = 51; - public static final int BLACK_WOOL = 52; - public static final int BLAST_FURNACE = 608; - public static final int BLUE_BANNER = 53; - public static final int BLUE_BED = 54; - public static final int BLUE_CARPET = 55; - public static final int BLUE_CONCRETE = 56; - public static final int BLUE_CONCRETE_POWDER = 57; - public static final int BLUE_GLAZED_TERRACOTTA = 58; - public static final int BLUE_ICE = 59; - public static final int BLUE_ORCHID = 60; - public static final int BLUE_SHULKER_BOX = 61; - public static final int BLUE_STAINED_GLASS = 62; - public static final int BLUE_STAINED_GLASS_PANE = 63; - public static final int BLUE_TERRACOTTA = 64; - public static final int BLUE_WALL_BANNER = 65; - public static final int BLUE_WOOL = 66; - public static final int BONE_BLOCK = 67; - public static final int BOOKSHELF = 68; - public static final int BRAIN_CORAL = 69; - public static final int BRAIN_CORAL_BLOCK = 70; - public static final int BRAIN_CORAL_FAN = 71; - public static final int BRAIN_CORAL_WALL_FAN = 72; - public static final int BREWING_STAND = 73; - public static final int BRICK_SLAB = 74; - public static final int BRICK_STAIRS = 75; - public static final int BRICK_WALL = 609; - public static final int BRICKS = 76; - public static final int BROWN_BANNER = 77; - public static final int BROWN_BED = 78; - public static final int BROWN_CARPET = 79; - public static final int BROWN_CONCRETE = 80; - public static final int BROWN_CONCRETE_POWDER = 81; - public static final int BROWN_GLAZED_TERRACOTTA = 82; - public static final int BROWN_MUSHROOM = 83; - public static final int BROWN_MUSHROOM_BLOCK = 84; - public static final int BROWN_SHULKER_BOX = 85; - public static final int BROWN_STAINED_GLASS = 86; - public static final int BROWN_STAINED_GLASS_PANE = 87; - public static final int BROWN_TERRACOTTA = 88; - public static final int BROWN_WALL_BANNER = 89; - public static final int BROWN_WOOL = 90; - public static final int BUBBLE_COLUMN = 91; - public static final int BUBBLE_CORAL = 92; - public static final int BUBBLE_CORAL_BLOCK = 93; - public static final int BUBBLE_CORAL_FAN = 94; - public static final int BUBBLE_CORAL_WALL_FAN = 95; - public static final int CACTUS = 96; - public static final int CAKE = 97; - public static final int CAMPFIRE = 610; - public static final int CARROTS = 98; - public static final int CARTOGRAPHY_TABLE = 611; - public static final int CARVED_PUMPKIN = 99; - public static final int CAULDRON = 100; - public static final int CHAIN_COMMAND_BLOCK = 101; - public static final int CHEST = 102; - public static final int CHIPPED_ANVIL = 103; - public static final int CHISELED_QUARTZ_BLOCK = 104; - public static final int CHISELED_RED_SANDSTONE = 105; - public static final int CHISELED_SANDSTONE = 106; - public static final int CHISELED_STONE_BRICKS = 107; - public static final int CHORUS_FLOWER = 108; - public static final int CHORUS_PLANT = 109; - public static final int CLAY = 110; - public static final int COAL_BLOCK = 111; - public static final int COAL_ORE = 112; - public static final int COARSE_DIRT = 113; - public static final int COBBLESTONE = 114; - public static final int COBBLESTONE_SLAB = 115; - public static final int COBBLESTONE_STAIRS = 116; - public static final int COBBLESTONE_WALL = 117; - public static final int COBWEB = 118; - public static final int COCOA = 119; - public static final int COMMAND_BLOCK = 120; - public static final int COMPARATOR = 121; - public static final int COMPOSTER = 612; - public static final int CONDUIT = 122; - public static final int CORNFLOWER = 613; - public static final int CRACKED_STONE_BRICKS = 123; - public static final int CRAFTING_TABLE = 124; - public static final int CREEPER_HEAD = 125; - public static final int CREEPER_WALL_HEAD = 126; - public static final int CUT_RED_SANDSTONE = 127; - public static final int CUT_RED_SANDSTONE_SLAB = 614; - public static final int CUT_SANDSTONE = 128; - public static final int CUT_SANDSTONE_SLAB = 615; - public static final int CYAN_BANNER = 129; - public static final int CYAN_BED = 130; - public static final int CYAN_CARPET = 131; - public static final int CYAN_CONCRETE = 132; - public static final int CYAN_CONCRETE_POWDER = 133; - public static final int CYAN_GLAZED_TERRACOTTA = 134; - public static final int CYAN_SHULKER_BOX = 135; - public static final int CYAN_STAINED_GLASS = 136; - public static final int CYAN_STAINED_GLASS_PANE = 137; - public static final int CYAN_TERRACOTTA = 138; - public static final int CYAN_WALL_BANNER = 139; - public static final int CYAN_WOOL = 140; - public static final int DAMAGED_ANVIL = 141; - public static final int DANDELION = 142; - public static final int DARK_OAK_BUTTON = 143; - public static final int DARK_OAK_DOOR = 144; - public static final int DARK_OAK_FENCE = 145; - public static final int DARK_OAK_FENCE_GATE = 146; - public static final int DARK_OAK_LEAVES = 147; - public static final int DARK_OAK_LOG = 148; - public static final int DARK_OAK_PLANKS = 149; - public static final int DARK_OAK_PRESSURE_PLATE = 150; - public static final int DARK_OAK_SAPLING = 151; - public static final int DARK_OAK_SIGN = 616; - public static final int DARK_OAK_SLAB = 152; - public static final int DARK_OAK_STAIRS = 153; - public static final int DARK_OAK_TRAPDOOR = 154; - public static final int DARK_OAK_WALL_SIGN = 617; - public static final int DARK_OAK_WOOD = 155; - public static final int DARK_PRISMARINE = 156; - public static final int DARK_PRISMARINE_SLAB = 157; - public static final int DARK_PRISMARINE_STAIRS = 158; - public static final int DAYLIGHT_DETECTOR = 159; - public static final int DEAD_BRAIN_CORAL = 160; - public static final int DEAD_BRAIN_CORAL_BLOCK = 161; - public static final int DEAD_BRAIN_CORAL_FAN = 162; - public static final int DEAD_BRAIN_CORAL_WALL_FAN = 163; - public static final int DEAD_BUBBLE_CORAL = 164; - public static final int DEAD_BUBBLE_CORAL_BLOCK = 165; - public static final int DEAD_BUBBLE_CORAL_FAN = 166; - public static final int DEAD_BUBBLE_CORAL_WALL_FAN = 167; - public static final int DEAD_BUSH = 168; - public static final int DEAD_FIRE_CORAL = 169; - public static final int DEAD_FIRE_CORAL_BLOCK = 170; - public static final int DEAD_FIRE_CORAL_FAN = 171; - public static final int DEAD_FIRE_CORAL_WALL_FAN = 172; - public static final int DEAD_HORN_CORAL = 173; - public static final int DEAD_HORN_CORAL_BLOCK = 174; - public static final int DEAD_HORN_CORAL_FAN = 175; - public static final int DEAD_HORN_CORAL_WALL_FAN = 176; - public static final int DEAD_TUBE_CORAL = 177; - public static final int DEAD_TUBE_CORAL_BLOCK = 178; - public static final int DEAD_TUBE_CORAL_FAN = 179; - public static final int DEAD_TUBE_CORAL_WALL_FAN = 180; - public static final int DETECTOR_RAIL = 181; - public static final int DIAMOND_BLOCK = 182; - public static final int DIAMOND_ORE = 183; - public static final int DIORITE = 184; - public static final int DIORITE_SLAB = 618; - public static final int DIORITE_STAIRS = 619; - public static final int DIORITE_WALL = 620; - public static final int DIRT = 185; - public static final int DISPENSER = 186; - public static final int DRAGON_EGG = 187; - public static final int DRAGON_HEAD = 188; - public static final int DRAGON_WALL_HEAD = 189; - public static final int DRIED_KELP_BLOCK = 190; - public static final int DROPPER = 191; - public static final int EMERALD_BLOCK = 192; - public static final int EMERALD_ORE = 193; - public static final int ENCHANTING_TABLE = 194; - public static final int END_GATEWAY = 195; - public static final int END_PORTAL = 196; - public static final int END_PORTAL_FRAME = 197; - public static final int END_ROD = 198; - public static final int END_STONE = 199; - public static final int END_STONE_BRICK_SLAB = 621; - public static final int END_STONE_BRICK_STAIRS = 622; - public static final int END_STONE_BRICK_WALL = 623; - public static final int END_STONE_BRICKS = 200; - public static final int ENDER_CHEST = 201; - public static final int FARMLAND = 202; - public static final int FERN = 203; - public static final int FIRE = 204; - public static final int FIRE_CORAL = 205; - public static final int FIRE_CORAL_BLOCK = 206; - public static final int FIRE_CORAL_FAN = 207; - public static final int FIRE_CORAL_WALL_FAN = 208; - public static final int FLETCHING_TABLE = 624; - public static final int FLOWER_POT = 209; - public static final int FROSTED_ICE = 210; - public static final int FURNACE = 211; - public static final int GLASS = 212; - public static final int GLASS_PANE = 213; - public static final int GLOWSTONE = 214; - public static final int GOLD_BLOCK = 215; - public static final int GOLD_ORE = 216; - public static final int GRANITE = 217; - public static final int GRANITE_SLAB = 625; - public static final int GRANITE_STAIRS = 626; - public static final int GRANITE_WALL = 627; - public static final int GRASS = 218; - public static final int GRASS_BLOCK = 219; - public static final int GRASS_PATH = 220; - public static final int GRAVEL = 221; - public static final int GRAY_BANNER = 222; - public static final int GRAY_BED = 223; - public static final int GRAY_CARPET = 224; - public static final int GRAY_CONCRETE = 225; - public static final int GRAY_CONCRETE_POWDER = 226; - public static final int GRAY_GLAZED_TERRACOTTA = 227; - public static final int GRAY_SHULKER_BOX = 228; - public static final int GRAY_STAINED_GLASS = 229; - public static final int GRAY_STAINED_GLASS_PANE = 230; - public static final int GRAY_TERRACOTTA = 231; - public static final int GRAY_WALL_BANNER = 232; - public static final int GRAY_WOOL = 233; - public static final int GREEN_BANNER = 234; - public static final int GREEN_BED = 235; - public static final int GREEN_CARPET = 236; - public static final int GREEN_CONCRETE = 237; - public static final int GREEN_CONCRETE_POWDER = 238; - public static final int GREEN_GLAZED_TERRACOTTA = 239; - public static final int GREEN_SHULKER_BOX = 240; - public static final int GREEN_STAINED_GLASS = 241; - public static final int GREEN_STAINED_GLASS_PANE = 242; - public static final int GREEN_TERRACOTTA = 243; - public static final int GREEN_WALL_BANNER = 244; - public static final int GREEN_WOOL = 245; - public static final int GRINDSTONE = 628; - public static final int HAY_BLOCK = 246; - public static final int HEAVY_WEIGHTED_PRESSURE_PLATE = 247; - public static final int HOPPER = 248; - public static final int HORN_CORAL = 249; - public static final int HORN_CORAL_BLOCK = 250; - public static final int HORN_CORAL_FAN = 251; - public static final int HORN_CORAL_WALL_FAN = 252; - public static final int ICE = 253; - public static final int INFESTED_CHISELED_STONE_BRICKS = 254; - public static final int INFESTED_COBBLESTONE = 255; - public static final int INFESTED_CRACKED_STONE_BRICKS = 256; - public static final int INFESTED_MOSSY_STONE_BRICKS = 257; - public static final int INFESTED_STONE = 258; - public static final int INFESTED_STONE_BRICKS = 259; - public static final int IRON_BARS = 260; - public static final int IRON_BLOCK = 261; - public static final int IRON_DOOR = 262; - public static final int IRON_ORE = 263; - public static final int IRON_TRAPDOOR = 264; - public static final int JACK_O_LANTERN = 265; - public static final int JIGSAW = 629; - public static final int JUKEBOX = 266; - public static final int JUNGLE_BUTTON = 267; - public static final int JUNGLE_DOOR = 268; - public static final int JUNGLE_FENCE = 269; - public static final int JUNGLE_FENCE_GATE = 270; - public static final int JUNGLE_LEAVES = 271; - public static final int JUNGLE_LOG = 272; - public static final int JUNGLE_PLANKS = 273; - public static final int JUNGLE_PRESSURE_PLATE = 274; - public static final int JUNGLE_SAPLING = 275; - public static final int JUNGLE_SIGN = 630; - public static final int JUNGLE_SLAB = 276; - public static final int JUNGLE_STAIRS = 277; - public static final int JUNGLE_TRAPDOOR = 278; - public static final int JUNGLE_WALL_SIGN = 631; - public static final int JUNGLE_WOOD = 279; - public static final int KELP = 280; - public static final int KELP_PLANT = 281; - public static final int LADDER = 282; - public static final int LANTERN = 632; - public static final int LAPIS_BLOCK = 283; - public static final int LAPIS_ORE = 284; - public static final int LARGE_FERN = 285; - public static final int LAVA = 286; - public static final int LECTERN = 633; - public static final int LEVER = 287; - public static final int LIGHT_BLUE_BANNER = 288; - public static final int LIGHT_BLUE_BED = 289; - public static final int LIGHT_BLUE_CARPET = 290; - public static final int LIGHT_BLUE_CONCRETE = 291; - public static final int LIGHT_BLUE_CONCRETE_POWDER = 292; - public static final int LIGHT_BLUE_GLAZED_TERRACOTTA = 293; - public static final int LIGHT_BLUE_SHULKER_BOX = 294; - public static final int LIGHT_BLUE_STAINED_GLASS = 295; - public static final int LIGHT_BLUE_STAINED_GLASS_PANE = 296; - public static final int LIGHT_BLUE_TERRACOTTA = 297; - public static final int LIGHT_BLUE_WALL_BANNER = 298; - public static final int LIGHT_BLUE_WOOL = 299; - public static final int LIGHT_GRAY_BANNER = 300; - public static final int LIGHT_GRAY_BED = 301; - public static final int LIGHT_GRAY_CARPET = 302; - public static final int LIGHT_GRAY_CONCRETE = 303; - public static final int LIGHT_GRAY_CONCRETE_POWDER = 304; - public static final int LIGHT_GRAY_GLAZED_TERRACOTTA = 305; - public static final int LIGHT_GRAY_SHULKER_BOX = 306; - public static final int LIGHT_GRAY_STAINED_GLASS = 307; - public static final int LIGHT_GRAY_STAINED_GLASS_PANE = 308; - public static final int LIGHT_GRAY_TERRACOTTA = 309; - public static final int LIGHT_GRAY_WALL_BANNER = 310; - public static final int LIGHT_GRAY_WOOL = 311; - public static final int LIGHT_WEIGHTED_PRESSURE_PLATE = 312; - public static final int LILAC = 313; - public static final int LILY_OF_THE_VALLEY = 634; - public static final int LILY_PAD = 314; - public static final int LIME_BANNER = 315; - public static final int LIME_BED = 316; - public static final int LIME_CARPET = 317; - public static final int LIME_CONCRETE = 318; - public static final int LIME_CONCRETE_POWDER = 319; - public static final int LIME_GLAZED_TERRACOTTA = 320; - public static final int LIME_SHULKER_BOX = 321; - public static final int LIME_STAINED_GLASS = 322; - public static final int LIME_STAINED_GLASS_PANE = 323; - public static final int LIME_TERRACOTTA = 324; - public static final int LIME_WALL_BANNER = 325; - public static final int LIME_WOOL = 326; - public static final int LOOM = 635; - public static final int MAGENTA_BANNER = 327; - public static final int MAGENTA_BED = 328; - public static final int MAGENTA_CARPET = 329; - public static final int MAGENTA_CONCRETE = 330; - public static final int MAGENTA_CONCRETE_POWDER = 331; - public static final int MAGENTA_GLAZED_TERRACOTTA = 332; - public static final int MAGENTA_SHULKER_BOX = 333; - public static final int MAGENTA_STAINED_GLASS = 334; - public static final int MAGENTA_STAINED_GLASS_PANE = 335; - public static final int MAGENTA_TERRACOTTA = 336; - public static final int MAGENTA_WALL_BANNER = 337; - public static final int MAGENTA_WOOL = 338; - public static final int MAGMA_BLOCK = 339; - public static final int MELON = 340; - public static final int MELON_STEM = 341; - public static final int MOSSY_COBBLESTONE = 342; - public static final int MOSSY_COBBLESTONE_SLAB = 636; - public static final int MOSSY_COBBLESTONE_STAIRS = 637; - public static final int MOSSY_COBBLESTONE_WALL = 343; - public static final int MOSSY_STONE_BRICK_SLAB = 638; - public static final int MOSSY_STONE_BRICK_STAIRS = 639; - public static final int MOSSY_STONE_BRICK_WALL = 640; - public static final int MOSSY_STONE_BRICKS = 344; - public static final int MOVING_PISTON = 345; - public static final int MUSHROOM_STEM = 346; - public static final int MYCELIUM = 347; - public static final int NETHER_BRICK_FENCE = 348; - public static final int NETHER_BRICK_SLAB = 349; - public static final int NETHER_BRICK_STAIRS = 350; - public static final int NETHER_BRICK_WALL = 641; - public static final int NETHER_BRICKS = 351; - public static final int NETHER_PORTAL = 352; - public static final int NETHER_QUARTZ_ORE = 353; - public static final int NETHER_WART = 354; - public static final int NETHER_WART_BLOCK = 355; - public static final int NETHERRACK = 356; - public static final int NOTE_BLOCK = 357; - public static final int OAK_BUTTON = 358; - public static final int OAK_DOOR = 359; - public static final int OAK_FENCE = 360; - public static final int OAK_FENCE_GATE = 361; - public static final int OAK_LEAVES = 362; - public static final int OAK_LOG = 363; - public static final int OAK_PLANKS = 364; - public static final int OAK_PRESSURE_PLATE = 365; - public static final int OAK_SAPLING = 366; - public static final int OAK_SIGN = 642; - public static final int OAK_SLAB = 367; - public static final int OAK_STAIRS = 368; - public static final int OAK_TRAPDOOR = 369; - public static final int OAK_WALL_SIGN = 643; - public static final int OAK_WOOD = 370; - public static final int OBSERVER = 371; - public static final int OBSIDIAN = 372; - public static final int ORANGE_BANNER = 373; - public static final int ORANGE_BED = 374; - public static final int ORANGE_CARPET = 375; - public static final int ORANGE_CONCRETE = 376; - public static final int ORANGE_CONCRETE_POWDER = 377; - public static final int ORANGE_GLAZED_TERRACOTTA = 378; - public static final int ORANGE_SHULKER_BOX = 379; - public static final int ORANGE_STAINED_GLASS = 380; - public static final int ORANGE_STAINED_GLASS_PANE = 381; - public static final int ORANGE_TERRACOTTA = 382; - public static final int ORANGE_TULIP = 383; - public static final int ORANGE_WALL_BANNER = 384; - public static final int ORANGE_WOOL = 385; - public static final int OXEYE_DAISY = 386; - public static final int PACKED_ICE = 387; - public static final int PEONY = 388; - public static final int PETRIFIED_OAK_SLAB = 389; - public static final int PINK_BANNER = 390; - public static final int PINK_BED = 391; - public static final int PINK_CARPET = 392; - public static final int PINK_CONCRETE = 393; - public static final int PINK_CONCRETE_POWDER = 394; - public static final int PINK_GLAZED_TERRACOTTA = 395; - public static final int PINK_SHULKER_BOX = 396; - public static final int PINK_STAINED_GLASS = 397; - public static final int PINK_STAINED_GLASS_PANE = 398; - public static final int PINK_TERRACOTTA = 399; - public static final int PINK_TULIP = 400; - public static final int PINK_WALL_BANNER = 401; - public static final int PINK_WOOL = 402; - public static final int PISTON = 403; - public static final int PISTON_HEAD = 404; - public static final int PLAYER_HEAD = 405; - public static final int PLAYER_WALL_HEAD = 406; - public static final int PODZOL = 407; - public static final int POLISHED_ANDESITE = 408; - public static final int POLISHED_ANDESITE_SLAB = 644; - public static final int POLISHED_ANDESITE_STAIRS = 645; - public static final int POLISHED_DIORITE = 409; - public static final int POLISHED_DIORITE_SLAB = 646; - public static final int POLISHED_DIORITE_STAIRS = 647; - public static final int POLISHED_GRANITE = 410; - public static final int POLISHED_GRANITE_SLAB = 648; - public static final int POLISHED_GRANITE_STAIRS = 649; - public static final int POPPY = 411; - public static final int POTATOES = 412; - public static final int POTTED_ACACIA_SAPLING = 413; - public static final int POTTED_ALLIUM = 414; - public static final int POTTED_AZURE_BLUET = 415; - public static final int POTTED_BAMBOO = 650; - public static final int POTTED_BIRCH_SAPLING = 416; - public static final int POTTED_BLUE_ORCHID = 417; - public static final int POTTED_BROWN_MUSHROOM = 418; - public static final int POTTED_CACTUS = 419; - public static final int POTTED_CORNFLOWER = 651; - public static final int POTTED_DANDELION = 420; - public static final int POTTED_DARK_OAK_SAPLING = 421; - public static final int POTTED_DEAD_BUSH = 422; - public static final int POTTED_FERN = 423; - public static final int POTTED_JUNGLE_SAPLING = 424; - public static final int POTTED_LILY_OF_THE_VALLEY = 652; - public static final int POTTED_OAK_SAPLING = 425; - public static final int POTTED_ORANGE_TULIP = 426; - public static final int POTTED_OXEYE_DAISY = 427; - public static final int POTTED_PINK_TULIP = 428; - public static final int POTTED_POPPY = 429; - public static final int POTTED_RED_MUSHROOM = 430; - public static final int POTTED_RED_TULIP = 431; - public static final int POTTED_SPRUCE_SAPLING = 432; - public static final int POTTED_WHITE_TULIP = 433; - public static final int POTTED_WITHER_ROSE = 653; - public static final int POWERED_RAIL = 434; - public static final int PRISMARINE = 435; - public static final int PRISMARINE_BRICK_SLAB = 436; - public static final int PRISMARINE_BRICK_STAIRS = 437; - public static final int PRISMARINE_BRICKS = 438; - public static final int PRISMARINE_SLAB = 439; - public static final int PRISMARINE_STAIRS = 440; - public static final int PRISMARINE_WALL = 654; - public static final int PUMPKIN = 441; - public static final int PUMPKIN_STEM = 442; - public static final int PURPLE_BANNER = 443; - public static final int PURPLE_BED = 444; - public static final int PURPLE_CARPET = 445; - public static final int PURPLE_CONCRETE = 446; - public static final int PURPLE_CONCRETE_POWDER = 447; - public static final int PURPLE_GLAZED_TERRACOTTA = 448; - public static final int PURPLE_SHULKER_BOX = 449; - public static final int PURPLE_STAINED_GLASS = 450; - public static final int PURPLE_STAINED_GLASS_PANE = 451; - public static final int PURPLE_TERRACOTTA = 452; - public static final int PURPLE_WALL_BANNER = 453; - public static final int PURPLE_WOOL = 454; - public static final int PURPUR_BLOCK = 455; - public static final int PURPUR_PILLAR = 456; - public static final int PURPUR_SLAB = 457; - public static final int PURPUR_STAIRS = 458; - public static final int QUARTZ_BLOCK = 459; - public static final int QUARTZ_PILLAR = 460; - public static final int QUARTZ_SLAB = 461; - public static final int QUARTZ_STAIRS = 462; - public static final int RAIL = 463; - public static final int RED_BANNER = 464; - public static final int RED_BED = 465; - public static final int RED_CARPET = 466; - public static final int RED_CONCRETE = 467; - public static final int RED_CONCRETE_POWDER = 468; - public static final int RED_GLAZED_TERRACOTTA = 469; - public static final int RED_MUSHROOM = 470; - public static final int RED_MUSHROOM_BLOCK = 471; - public static final int RED_NETHER_BRICK_SLAB = 655; - public static final int RED_NETHER_BRICK_STAIRS = 656; - public static final int RED_NETHER_BRICK_WALL = 657; - public static final int RED_NETHER_BRICKS = 472; - public static final int RED_SAND = 473; - public static final int RED_SANDSTONE = 474; - public static final int RED_SANDSTONE_SLAB = 475; - public static final int RED_SANDSTONE_STAIRS = 476; - public static final int RED_SANDSTONE_WALL = 658; - public static final int RED_SHULKER_BOX = 477; - public static final int RED_STAINED_GLASS = 478; - public static final int RED_STAINED_GLASS_PANE = 479; - public static final int RED_TERRACOTTA = 480; - public static final int RED_TULIP = 481; - public static final int RED_WALL_BANNER = 482; - public static final int RED_WOOL = 483; - public static final int REDSTONE_BLOCK = 484; - public static final int REDSTONE_LAMP = 485; - public static final int REDSTONE_ORE = 486; - public static final int REDSTONE_TORCH = 487; - public static final int REDSTONE_WALL_TORCH = 488; - public static final int REDSTONE_WIRE = 489; - public static final int REPEATER = 490; - public static final int REPEATING_COMMAND_BLOCK = 491; - public static final int ROSE_BUSH = 492; - public static final int SAND = 493; - public static final int SANDSTONE = 494; - public static final int SANDSTONE_SLAB = 495; - public static final int SANDSTONE_STAIRS = 496; - public static final int SANDSTONE_WALL = 659; - public static final int SCAFFOLDING = 660; - public static final int SEA_LANTERN = 497; - public static final int SEA_PICKLE = 498; - public static final int SEAGRASS = 499; - public static final int SHULKER_BOX = 500; - public static final int SKELETON_SKULL = 502; - public static final int SKELETON_WALL_SKULL = 503; - public static final int SLIME_BLOCK = 504; - public static final int SMITHING_TABLE = 661; - public static final int SMOKER = 662; - public static final int SMOOTH_QUARTZ = 505; - public static final int SMOOTH_QUARTZ_SLAB = 663; - public static final int SMOOTH_QUARTZ_STAIRS = 664; - public static final int SMOOTH_RED_SANDSTONE = 506; - public static final int SMOOTH_RED_SANDSTONE_SLAB = 665; - public static final int SMOOTH_RED_SANDSTONE_STAIRS = 666; - public static final int SMOOTH_SANDSTONE = 507; - public static final int SMOOTH_SANDSTONE_SLAB = 667; - public static final int SMOOTH_SANDSTONE_STAIRS = 668; - public static final int SMOOTH_STONE = 508; - public static final int SMOOTH_STONE_SLAB = 669; - public static final int SNOW = 509; - public static final int SNOW_BLOCK = 510; - public static final int SOUL_SAND = 511; - public static final int SPAWNER = 512; - public static final int SPONGE = 513; - public static final int SPRUCE_BUTTON = 514; - public static final int SPRUCE_DOOR = 515; - public static final int SPRUCE_FENCE = 516; - public static final int SPRUCE_FENCE_GATE = 517; - public static final int SPRUCE_LEAVES = 518; - public static final int SPRUCE_LOG = 519; - public static final int SPRUCE_PLANKS = 520; - public static final int SPRUCE_PRESSURE_PLATE = 521; - public static final int SPRUCE_SAPLING = 522; - public static final int SPRUCE_SIGN = 670; - public static final int SPRUCE_SLAB = 523; - public static final int SPRUCE_STAIRS = 524; - public static final int SPRUCE_TRAPDOOR = 525; - public static final int SPRUCE_WALL_SIGN = 671; - public static final int SPRUCE_WOOD = 526; - public static final int STICKY_PISTON = 527; - public static final int STONE = 528; - public static final int STONE_BRICK_SLAB = 529; - public static final int STONE_BRICK_STAIRS = 530; - public static final int STONE_BRICK_WALL = 672; - public static final int STONE_BRICKS = 531; - public static final int STONE_BUTTON = 532; - public static final int STONE_PRESSURE_PLATE = 533; - public static final int STONE_SLAB = 534; - public static final int STONE_STAIRS = 673; - public static final int STONECUTTER = 674; - public static final int STRIPPED_ACACIA_LOG = 535; - public static final int STRIPPED_ACACIA_WOOD = 536; - public static final int STRIPPED_BIRCH_LOG = 537; - public static final int STRIPPED_BIRCH_WOOD = 538; - public static final int STRIPPED_DARK_OAK_LOG = 539; - public static final int STRIPPED_DARK_OAK_WOOD = 540; - public static final int STRIPPED_JUNGLE_LOG = 541; - public static final int STRIPPED_JUNGLE_WOOD = 542; - public static final int STRIPPED_OAK_LOG = 543; - public static final int STRIPPED_OAK_WOOD = 544; - public static final int STRIPPED_SPRUCE_LOG = 545; - public static final int STRIPPED_SPRUCE_WOOD = 546; - public static final int STRUCTURE_BLOCK = 547; - public static final int STRUCTURE_VOID = 548; - public static final int SUGAR_CANE = 549; - public static final int SUNFLOWER = 550; - public static final int SWEET_BERRY_BUSH = 675; - public static final int TALL_GRASS = 551; - public static final int TALL_SEAGRASS = 552; - public static final int TERRACOTTA = 553; - public static final int TNT = 554; - public static final int TORCH = 555; - public static final int TRAPPED_CHEST = 556; - public static final int TRIPWIRE = 557; - public static final int TRIPWIRE_HOOK = 558; - public static final int TUBE_CORAL = 559; - public static final int TUBE_CORAL_BLOCK = 560; - public static final int TUBE_CORAL_FAN = 561; - public static final int TUBE_CORAL_WALL_FAN = 562; - public static final int TURTLE_EGG = 563; - public static final int VINE = 564; - public static final int WALL_TORCH = 566; - public static final int WATER = 567; - public static final int WET_SPONGE = 568; - public static final int WHEAT = 569; - public static final int WHITE_BANNER = 570; - public static final int WHITE_BED = 571; - public static final int WHITE_CARPET = 572; - public static final int WHITE_CONCRETE = 573; - public static final int WHITE_CONCRETE_POWDER = 574; - public static final int WHITE_GLAZED_TERRACOTTA = 575; - public static final int WHITE_SHULKER_BOX = 576; - public static final int WHITE_STAINED_GLASS = 577; - public static final int WHITE_STAINED_GLASS_PANE = 578; - public static final int WHITE_TERRACOTTA = 579; - public static final int WHITE_TULIP = 580; - public static final int WHITE_WALL_BANNER = 581; - public static final int WHITE_WOOL = 582; - public static final int WITHER_ROSE = 676; - public static final int WITHER_SKELETON_SKULL = 583; - public static final int WITHER_SKELETON_WALL_SKULL = 584; - public static final int YELLOW_BANNER = 585; - public static final int YELLOW_BED = 586; - public static final int YELLOW_CARPET = 587; - public static final int YELLOW_CONCRETE = 588; - public static final int YELLOW_CONCRETE_POWDER = 589; - public static final int YELLOW_GLAZED_TERRACOTTA = 590; - public static final int YELLOW_SHULKER_BOX = 591; - public static final int YELLOW_STAINED_GLASS = 592; - public static final int YELLOW_STAINED_GLASS_PANE = 593; - public static final int YELLOW_TERRACOTTA = 594; - public static final int YELLOW_WALL_BANNER = 595; - public static final int YELLOW_WOOL = 596; - public static final int ZOMBIE_HEAD = 597; - public static final int ZOMBIE_WALL_HEAD = 598; - - // Deprecated - public static final int SIGN = OAK_SIGN; - public static final int WALL_SIGN = OAK_WALL_SIGN; - -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 5ac56564b..beb085a0d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -434,9 +434,8 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return output; } - // pkg private for TracedEditSession only, may later become public API - boolean commitRequired() { - //FAWE start + private boolean commitRequired() { + //FAWE start - false for us, returning true if the reorder extent != null for upstream return false; } //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java index e2dba673b..6d178b363 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalConfiguration.java @@ -54,7 +54,7 @@ public abstract class LocalConfiguration { private static final Logger LOGGER = LogManagerCompat.getLogger(); public boolean profile = false; - public boolean traceUnflushedSessions = false; + public boolean traceUnflushedSessions = true; public Set disallowedBlocks = new HashSet<>(); protected BlockMask disallowedBlocksMask; public int defaultChangeLimit = -1; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index f0a079e67..2fd81d469 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -1192,13 +1192,13 @@ public class LocalSession implements TextureHolder { /** * Get the brush tool assigned to the item. If there is no tool assigned - * or the tool is not assigned, the slot will be replaced with the + * or the tool is not a brush tool, the slot will be replaced with the * brush tool. * * @param item the item type * @return the tool, or {@code null} * @throws InvalidToolBindException if the item can't be bound to that item - * @deprecated FAWE binds to the item, not the type - this allows brushes to persist + * @deprecated FAWE binds to the item, not the type - this allows brushes to persist, also deprecated in upstream */ @Deprecated public BrushTool getBrushTool(ItemType item) throws InvalidToolBindException { @@ -1232,6 +1232,17 @@ public class LocalSession implements TextureHolder { } //FAWE end + /** + * Get the brush tool assigned to this item. + * + * @param item the item type + * @return the brush tool assigned to the item type + */ + @Nullable + public BrushTool getBrush(ItemType item) { + return getTool(item) instanceof BrushTool tool ? tool : null; + } + //FAWE start - see note of getBrushTool /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java index 586403847..4b4fb860b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/TracedEditSession.java @@ -21,16 +21,22 @@ package com.sk89q.worldedit; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.inventory.BlockBag; +import com.sk89q.worldedit.internal.util.ErrorReporting; import com.sk89q.worldedit.util.eventbus.EventBus; import com.sk89q.worldedit.world.World; import javax.annotation.Nullable; +import java.lang.ref.Cleaner; /** * Internal use only. Unused for now, but present in case upstream make it API. */ class TracedEditSession extends EditSession { + private static final Cleaner cleaner = Cleaner.create(); + private final TraceRecord record; + private final Cleaner.Cleanable cleanable; + //FAWE start - does not work with FAWE's ways of doing things... @Deprecated //FAWE end @@ -45,22 +51,37 @@ class TracedEditSession extends EditSession { .blockBag(blockBag) .actor(actor) .tracing(tracing)); + this.record = new TraceRecord(actor); + this.cleanable = cleaner.register(this, record); } - TracedEditSession(EditSessionBuilder builder) { - super(builder); + public void close() { + try { + super.close(); + } finally { + this.record.committed = true; + cleanable.clean(); + } } - private final Throwable stacktrace = new Throwable("Creation trace."); + private static final class TraceRecord implements Runnable { + private final Throwable stacktrace = new Throwable("An EditSession was not closed."); + private final Actor actor; - @Override - protected void finalize() throws Throwable { - super.finalize(); + private volatile boolean committed = false; - if (commitRequired()) { - WorldEdit.logger.warn("####### LEFTOVER BUFFER BLOCKS DETECTED #######"); - WorldEdit.logger.warn("This means that some code did not flush their EditSession."); - WorldEdit.logger.warn("Here is a stacktrace from the creation of this EditSession:", stacktrace); + private TraceRecord(Actor actor) { + this.actor = actor; + } + + @Override + public void run() { + if (!committed) { + WorldEdit.logger.warn("####### EDIT SESSION NOT CLOSED #######"); + WorldEdit.logger.warn("This means that some code did not close their EditSession."); + WorldEdit.logger.warn("Here is a stacktrace from the creation of this EditSession:", stacktrace); + ErrorReporting.trigger(actor, stacktrace); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java index fb38799a1..b115afbca 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java @@ -59,7 +59,6 @@ import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.util.image.ImageUtil; -import com.fastasyncworldedit.core.world.block.BlockID; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; @@ -1187,9 +1186,9 @@ public class BrushCommands { //FAWE start - Suggest different brush material if sand or gravel is used if (pattern instanceof BlockStateHolder) { BlockType type = ((BlockStateHolder) pattern).getBlockType(); - switch (type.getInternalId()) { - case BlockID.SAND: - case BlockID.GRAVEL: + switch (type.getId()) { + case "minecraft:sand": + case "minecraft:gravel": player.print( Caption.of("fawe.worldedit.brush.brush.try.other")); falling = true; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index cad6775ac..c145fa61f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -113,7 +113,7 @@ public class WorldEditCommands { //FAWE start @Command( name = "debugpaste", - desc = "Writes a report of latest.log, config.yml, config-legacy.yml, strings.json to https://athion.net/ISPaster/paste" + desc = "Writes a report of latest.log, config.yml, worldedit-config.yml, strings.json to https://athion.net/ISPaster/paste" ) @CommandPermissions(value = {"worldedit.report", "worldedit.debugpaste"}, queued = false) public void report(Actor actor) throws WorldEditException { @@ -121,8 +121,8 @@ public class WorldEditCommands { try { final File logFile = new File("logs/latest.log"); final File config = new File(Fawe.imp().getDirectory(), "config.yml"); - final File legacyConfig = new File(Fawe.imp().getDirectory(), "config-legacy.yml"); - dest = IncendoPaster.debugPaste(logFile, Fawe.imp().getDebugInfo(), config, legacyConfig); + final File worldeditConfig = new File(Fawe.imp().getDirectory(), "worldedit-config.yml"); + dest = IncendoPaster.debugPaste(logFile, Fawe.imp().getDebugInfo(), config, worldeditConfig); } catch (IOException e) { actor.printInfo(TextComponent.of(e.getMessage())); return; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java index d2a6fde14..23e570107 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.command.tool; import com.fastasyncworldedit.core.configuration.Caption; -import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; @@ -56,9 +55,8 @@ public class QueryTool implements BlockTool { ) { World world = (World) clicked.getExtent(); - EditSession editSession = session.createEditSession(player); BlockVector3 blockPoint = clicked.toVector().toBlockPoint(); - BaseBlock block = editSession.getFullBlock(blockPoint); + BaseBlock block = world.getFullBlock(blockPoint); TextComponent.Builder builder = TextComponent.builder(); builder.append(TextComponent.of("@" + clicked.toVector().toBlockPoint() + ": ", TextColor.BLUE)); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index d07b4d805..626703203 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -120,6 +120,7 @@ import com.sk89q.worldedit.internal.command.CommandLoggingHandler; import com.sk89q.worldedit.internal.command.CommandRegistrationHandler; import com.sk89q.worldedit.internal.command.exception.ExceptionConverter; import com.sk89q.worldedit.internal.command.exception.WorldEditExceptionConverter; +import com.sk89q.worldedit.internal.util.ErrorReporting; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.internal.util.Substring; import com.sk89q.worldedit.regions.Region; @@ -884,10 +885,9 @@ public final class PlatformCommandManager { } private void handleUnknownException(Actor actor, Throwable t) { - actor.print(Caption.of("worldedit.command.error.report")); - actor.print(TextComponent.of(t.getClass().getName() + ": " + t.getMessage())); //FAWE start - Exchange name LOGGER.error("An unexpected error while handling a FastAsyncWorldEdit command", t); + ErrorReporting.trigger(actor, t); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java index c7dd577c1..7e5a4abf1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMask.java @@ -210,9 +210,9 @@ public class BlockMask extends ABlockMask { @Override public boolean replacesAir() { - return ordinals[BlockTypes.AIR.getDefaultState().getOrdinal()] - || ordinals[BlockTypes.CAVE_AIR.getDefaultState().getOrdinal()] - || ordinals[BlockTypes.VOID_AIR.getDefaultState().getOrdinal()]; + return ordinals[1] + || ordinals[2] + || ordinals[3]; } @Override @@ -334,9 +334,9 @@ public class BlockMask extends ABlockMask { cloned[i] = !cloned[i]; } if (replacesAir()) { - cloned[BlockTypes.AIR.getDefaultState().getOrdinal()] = false; - cloned[BlockTypes.CAVE_AIR.getDefaultState().getOrdinal()] = false; - cloned[BlockTypes.VOID_AIR.getDefaultState().getOrdinal()] = false; + cloned[1] = false; + cloned[2] = false; + cloned[3] = false; cloned[0] = false; } return new BlockMask(getExtent(), cloned); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java index a55b90f36..be9dabfc4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java @@ -44,17 +44,23 @@ public final class Constants { /** * The DataVersion for Minecraft 1.13 + * @deprecated If Fawe drops interaction with 1.13, this method is subject to removal. */ + @Deprecated(forRemoval = true, since = "2.0.0") public static final int DATA_VERSION_MC_1_13 = 1519; /** * The DataVersion for Minecraft 1.13.2 + * @deprecated If Fawe drops interaction with 1.13, this method is subject to removal. */ + @Deprecated(forRemoval = true, since = "2.0.0") public static final int DATA_VERSION_MC_1_13_2 = 1631; /** * The DataVersion for Minecraft 1.14 + * @deprecated If Fawe drops interaction with 1.14, this method is subject to removal. */ + @Deprecated(forRemoval = true, since = "2.0.0") public static final int DATA_VERSION_MC_1_14 = 1952; /** @@ -72,11 +78,9 @@ public final class Constants { */ public static final int DATA_VERSION_MC_1_17 = 2724; - //FAWE start - add data version for 1.18 /** * The DataVersion for Minecraft 1.18 */ public static final int DATA_VERSION_MC_1_18 = 2860; - //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ErrorReporting.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ErrorReporting.java new file mode 100644 index 000000000..fa5b95868 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/ErrorReporting.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.internal.util; + +import com.fastasyncworldedit.core.configuration.Caption; +import com.google.common.base.Throwables; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; + +/** + * Simple class for handling error reporting to users. + */ +public class ErrorReporting { + private ErrorReporting() { + } + + public static void trigger(Actor actor, Throwable error) { + actor.printError(Caption.of("worldedit.command.error.report")); + actor.print( + TextComponent.builder(error.getClass().getName() + ": " + error.getMessage()) + .hoverEvent(HoverEvent.showText(TextComponent.of(Throwables.getStackTraceAsString(error)))) + .build() + ); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java index 14fb05834..9df060bf6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypes.java @@ -121,12 +121,12 @@ public final class BlockTypes { @Nullable public static final BlockType BEDROCK = init(); @Nullable - public static final BlockType BEE_NEST = init(); - @Nullable public static final BlockType BEEHIVE = init(); @Nullable public static final BlockType BEETROOTS = init(); @Nullable + public static final BlockType BEE_NEST = init(); + @Nullable public static final BlockType BELL = init(); @Nullable public static final BlockType BIG_DRIPLEAF = init(); @@ -163,6 +163,14 @@ public final class BlockTypes { @Nullable public static final BlockType BIRCH_WOOD = init(); @Nullable + public static final BlockType BLACKSTONE = init(); + @Nullable + public static final BlockType BLACKSTONE_SLAB = init(); + @Nullable + public static final BlockType BLACKSTONE_STAIRS = init(); + @Nullable + public static final BlockType BLACKSTONE_WALL = init(); + @Nullable public static final BlockType BLACK_BANNER = init(); @Nullable public static final BlockType BLACK_BED = init(); @@ -191,14 +199,6 @@ public final class BlockTypes { @Nullable public static final BlockType BLACK_WOOL = init(); @Nullable - public static final BlockType BLACKSTONE = init(); - @Nullable - public static final BlockType BLACKSTONE_SLAB = init(); - @Nullable - public static final BlockType BLACKSTONE_STAIRS = init(); - @Nullable - public static final BlockType BLACKSTONE_WALL = init(); - @Nullable public static final BlockType BLAST_FURNACE = init(); @Nullable public static final BlockType BLUE_BANNER = init(); @@ -247,14 +247,14 @@ public final class BlockTypes { @Nullable public static final BlockType BREWING_STAND = init(); @Nullable + public static final BlockType BRICKS = init(); + @Nullable public static final BlockType BRICK_SLAB = init(); @Nullable public static final BlockType BRICK_STAIRS = init(); @Nullable public static final BlockType BRICK_WALL = init(); @Nullable - public static final BlockType BRICKS = init(); - @Nullable public static final BlockType BROWN_BANNER = init(); @Nullable public static final BlockType BROWN_BED = init(); @@ -389,8 +389,6 @@ public final class BlockTypes { @Nullable public static final BlockType COPPER_BLOCK = init(); @Nullable - public static final BlockType COPPER_ORE = init(); - @Nullable public static final BlockType CORNFLOWER = init(); @Nullable public static final BlockType CRACKED_DEEPSLATE_BRICKS = init(); @@ -571,14 +569,14 @@ public final class BlockTypes { @Nullable public static final BlockType DEEPSLATE = init(); @Nullable + public static final BlockType DEEPSLATE_BRICKS = init(); + @Nullable public static final BlockType DEEPSLATE_BRICK_SLAB = init(); @Nullable public static final BlockType DEEPSLATE_BRICK_STAIRS = init(); @Nullable public static final BlockType DEEPSLATE_BRICK_WALL = init(); @Nullable - public static final BlockType DEEPSLATE_BRICKS = init(); - @Nullable public static final BlockType DEEPSLATE_COAL_ORE = init(); @Nullable public static final BlockType DEEPSLATE_COPPER_ORE = init(); @@ -595,14 +593,14 @@ public final class BlockTypes { @Nullable public static final BlockType DEEPSLATE_REDSTONE_ORE = init(); @Nullable + public static final BlockType DEEPSLATE_TILES = init(); + @Nullable public static final BlockType DEEPSLATE_TILE_SLAB = init(); @Nullable public static final BlockType DEEPSLATE_TILE_STAIRS = init(); @Nullable public static final BlockType DEEPSLATE_TILE_WALL = init(); @Nullable - public static final BlockType DEEPSLATE_TILES = init(); - @Nullable public static final BlockType DETECTOR_RAIL = init(); @Nullable public static final BlockType DIAMOND_BLOCK = init(); @@ -641,6 +639,8 @@ public final class BlockTypes { @Nullable public static final BlockType ENCHANTING_TABLE = init(); @Nullable + public static final BlockType ENDER_CHEST = init(); + @Nullable public static final BlockType END_GATEWAY = init(); @Nullable public static final BlockType END_PORTAL = init(); @@ -651,18 +651,16 @@ public final class BlockTypes { @Nullable public static final BlockType END_STONE = init(); @Nullable + public static final BlockType END_STONE_BRICKS = init(); + @Nullable public static final BlockType END_STONE_BRICK_SLAB = init(); @Nullable public static final BlockType END_STONE_BRICK_STAIRS = init(); @Nullable public static final BlockType END_STONE_BRICK_WALL = init(); @Nullable - public static final BlockType END_STONE_BRICKS = init(); - @Nullable public static final BlockType EXPOSED_COPPER = init(); @Nullable - public static final BlockType ENDER_CHEST = init(); - @Nullable public static final BlockType EXPOSED_CUT_COPPER = init(); @Nullable public static final BlockType EXPOSED_CUT_COPPER_SLAB = init(); @@ -685,12 +683,12 @@ public final class BlockTypes { @Nullable public static final BlockType FLETCHING_TABLE = init(); @Nullable - public static final BlockType FLOWER_POT = init(); - @Nullable public static final BlockType FLOWERING_AZALEA = init(); @Nullable public static final BlockType FLOWERING_AZALEA_LEAVES = init(); @Nullable + public static final BlockType FLOWER_POT = init(); + @Nullable public static final BlockType FROSTED_ICE = init(); @Nullable public static final BlockType FURNACE = init(); @@ -701,10 +699,10 @@ public final class BlockTypes { @Nullable public static final BlockType GLASS_PANE = init(); @Nullable - public static final BlockType GLOW_LICHEN = init(); - @Nullable public static final BlockType GLOWSTONE = init(); @Nullable + public static final BlockType GLOW_LICHEN = init(); + @Nullable public static final BlockType GOLD_BLOCK = init(); @Nullable public static final BlockType GOLD_ORE = init(); @@ -720,9 +718,6 @@ public final class BlockTypes { public static final BlockType GRASS = init(); @Nullable public static final BlockType GRASS_BLOCK = init(); - @Deprecated - @Nullable - public static final BlockType GRASS_PATH = init(); @Nullable public static final BlockType GRAVEL = init(); @Nullable @@ -790,10 +785,10 @@ public final class BlockTypes { @Nullable public static final BlockType HEAVY_WEIGHTED_PRESSURE_PLATE = init(); @Nullable - public static final BlockType HONEY_BLOCK = init(); - @Nullable public static final BlockType HONEYCOMB_BLOCK = init(); @Nullable + public static final BlockType HONEY_BLOCK = init(); + @Nullable public static final BlockType HOPPER = init(); @Nullable public static final BlockType HORN_CORAL = init(); @@ -892,6 +887,8 @@ public final class BlockTypes { @Nullable public static final BlockType LIGHT = init(); @Nullable + public static final BlockType LIGHTNING_ROD = init(); + @Nullable public static final BlockType LIGHT_BLUE_BANNER = init(); @Nullable public static final BlockType LIGHT_BLUE_BED = init(); @@ -950,8 +947,6 @@ public final class BlockTypes { @Nullable public static final BlockType LIGHT_WEIGHTED_PRESSURE_PLATE = init(); @Nullable - public static final BlockType LIGHTNING_ROD = init(); - @Nullable public static final BlockType LILAC = init(); @Nullable public static final BlockType LILY_OF_THE_VALLEY = init(); @@ -1026,10 +1021,6 @@ public final class BlockTypes { @Nullable public static final BlockType MELON_STEM = init(); @Nullable - public static final BlockType MOSS_BLOCK = init(); - @Nullable - public static final BlockType MOSS_CARPET = init(); - @Nullable public static final BlockType MOSSY_COBBLESTONE = init(); @Nullable public static final BlockType MOSSY_COBBLESTONE_SLAB = init(); @@ -1038,13 +1029,17 @@ public final class BlockTypes { @Nullable public static final BlockType MOSSY_COBBLESTONE_WALL = init(); @Nullable + public static final BlockType MOSSY_STONE_BRICKS = init(); + @Nullable public static final BlockType MOSSY_STONE_BRICK_SLAB = init(); @Nullable public static final BlockType MOSSY_STONE_BRICK_STAIRS = init(); @Nullable public static final BlockType MOSSY_STONE_BRICK_WALL = init(); @Nullable - public static final BlockType MOSSY_STONE_BRICKS = init(); + public static final BlockType MOSS_BLOCK = init(); + @Nullable + public static final BlockType MOSS_CARPET = init(); @Nullable public static final BlockType MOVING_PISTON = init(); @Nullable @@ -1052,6 +1047,12 @@ public final class BlockTypes { @Nullable public static final BlockType MYCELIUM = init(); @Nullable + public static final BlockType NETHERITE_BLOCK = init(); + @Nullable + public static final BlockType NETHERRACK = init(); + @Nullable + public static final BlockType NETHER_BRICKS = init(); + @Nullable public static final BlockType NETHER_BRICK_FENCE = init(); @Nullable public static final BlockType NETHER_BRICK_SLAB = init(); @@ -1060,8 +1061,6 @@ public final class BlockTypes { @Nullable public static final BlockType NETHER_BRICK_WALL = init(); @Nullable - public static final BlockType NETHER_BRICKS = init(); - @Nullable public static final BlockType NETHER_GOLD_ORE = init(); @Nullable public static final BlockType NETHER_PORTAL = init(); @@ -1074,10 +1073,6 @@ public final class BlockTypes { @Nullable public static final BlockType NETHER_WART_BLOCK = init(); @Nullable - public static final BlockType NETHERITE_BLOCK = init(); - @Nullable - public static final BlockType NETHERRACK = init(); - @Nullable public static final BlockType NOTE_BLOCK = init(); @Nullable public static final BlockType OAK_BUTTON = init(); @@ -1212,14 +1207,14 @@ public final class BlockTypes { @Nullable public static final BlockType POLISHED_BLACKSTONE = init(); @Nullable + public static final BlockType POLISHED_BLACKSTONE_BRICKS = init(); + @Nullable public static final BlockType POLISHED_BLACKSTONE_BRICK_SLAB = init(); @Nullable public static final BlockType POLISHED_BLACKSTONE_BRICK_STAIRS = init(); @Nullable public static final BlockType POLISHED_BLACKSTONE_BRICK_WALL = init(); @Nullable - public static final BlockType POLISHED_BLACKSTONE_BRICKS = init(); - @Nullable public static final BlockType POLISHED_BLACKSTONE_BUTTON = init(); @Nullable public static final BlockType POLISHED_BLACKSTONE_PRESSURE_PLATE = init(); @@ -1257,9 +1252,12 @@ public final class BlockTypes { public static final BlockType POTTED_ACACIA_SAPLING = init(); @Nullable public static final BlockType POTTED_ALLIUM = init(); + @Deprecated //No longer has "bush" @Nullable public static final BlockType POTTED_AZALEA_BUSH = init(); @Nullable + public static final BlockType POTTED_AZALEA = init(); + @Nullable public static final BlockType POTTED_AZURE_BLUET = init(); @Nullable public static final BlockType POTTED_BAMBOO = init(); @@ -1285,9 +1283,12 @@ public final class BlockTypes { public static final BlockType POTTED_DEAD_BUSH = init(); @Nullable public static final BlockType POTTED_FERN = init(); + @Deprecated //No longer has "bush" @Nullable public static final BlockType POTTED_FLOWERING_AZALEA_BUSH = init(); @Nullable + public static final BlockType POTTED_FLOWERING_AZALEA = init(); + @Nullable public static final BlockType POTTED_JUNGLE_SAPLING = init(); @Nullable public static final BlockType POTTED_LILY_OF_THE_VALLEY = init(); @@ -1324,12 +1325,12 @@ public final class BlockTypes { @Nullable public static final BlockType PRISMARINE = init(); @Nullable + public static final BlockType PRISMARINE_BRICKS = init(); + @Nullable public static final BlockType PRISMARINE_BRICK_SLAB = init(); @Nullable public static final BlockType PRISMARINE_BRICK_STAIRS = init(); @Nullable - public static final BlockType PRISMARINE_BRICKS = init(); - @Nullable public static final BlockType PRISMARINE_SLAB = init(); @Nullable public static final BlockType PRISMARINE_STAIRS = init(); @@ -1394,6 +1395,18 @@ public final class BlockTypes { @Nullable public static final BlockType RAW_IRON_BLOCK = init(); @Nullable + public static final BlockType REDSTONE_BLOCK = init(); + @Nullable + public static final BlockType REDSTONE_LAMP = init(); + @Nullable + public static final BlockType REDSTONE_ORE = init(); + @Nullable + public static final BlockType REDSTONE_TORCH = init(); + @Nullable + public static final BlockType REDSTONE_WALL_TORCH = init(); + @Nullable + public static final BlockType REDSTONE_WIRE = init(); + @Nullable public static final BlockType RED_BANNER = init(); @Nullable public static final BlockType RED_BED = init(); @@ -1414,14 +1427,14 @@ public final class BlockTypes { @Nullable public static final BlockType RED_MUSHROOM_BLOCK = init(); @Nullable + public static final BlockType RED_NETHER_BRICKS = init(); + @Nullable public static final BlockType RED_NETHER_BRICK_SLAB = init(); @Nullable public static final BlockType RED_NETHER_BRICK_STAIRS = init(); @Nullable public static final BlockType RED_NETHER_BRICK_WALL = init(); @Nullable - public static final BlockType RED_NETHER_BRICKS = init(); - @Nullable public static final BlockType RED_SAND = init(); @Nullable public static final BlockType RED_SANDSTONE = init(); @@ -1446,18 +1459,6 @@ public final class BlockTypes { @Nullable public static final BlockType RED_WOOL = init(); @Nullable - public static final BlockType REDSTONE_BLOCK = init(); - @Nullable - public static final BlockType REDSTONE_LAMP = init(); - @Nullable - public static final BlockType REDSTONE_ORE = init(); - @Nullable - public static final BlockType REDSTONE_TORCH = init(); - @Nullable - public static final BlockType REDSTONE_WALL_TORCH = init(); - @Nullable - public static final BlockType REDSTONE_WIRE = init(); - @Nullable public static final BlockType REPEATER = init(); @Nullable public static final BlockType REPEATING_COMMAND_BLOCK = init(); @@ -1482,12 +1483,12 @@ public final class BlockTypes { @Nullable public static final BlockType SCULK_SENSOR = init(); @Nullable + public static final BlockType SEAGRASS = init(); + @Nullable public static final BlockType SEA_LANTERN = init(); @Nullable public static final BlockType SEA_PICKLE = init(); @Nullable - public static final BlockType SEAGRASS = init(); - @Nullable public static final BlockType SHROOMLIGHT = init(); @Nullable public static final BlockType SHULKER_BOX = init(); @@ -1591,14 +1592,16 @@ public final class BlockTypes { @Nullable public static final BlockType STONE = init(); @Nullable + public static final BlockType STONECUTTER = init(); + @Nullable + public static final BlockType STONE_BRICKS = init(); + @Nullable public static final BlockType STONE_BRICK_SLAB = init(); @Nullable public static final BlockType STONE_BRICK_STAIRS = init(); @Nullable public static final BlockType STONE_BRICK_WALL = init(); @Nullable - public static final BlockType STONE_BRICKS = init(); - @Nullable public static final BlockType STONE_BUTTON = init(); @Nullable public static final BlockType STONE_PRESSURE_PLATE = init(); @@ -1607,8 +1610,6 @@ public final class BlockTypes { @Nullable public static final BlockType STONE_STAIRS = init(); @Nullable - public static final BlockType STONECUTTER = init(); - @Nullable public static final BlockType STRIPPED_ACACIA_LOG = init(); @Nullable public static final BlockType STRIPPED_ACACIA_WOOD = init(); @@ -1772,10 +1773,10 @@ public final class BlockTypes { @Nullable public static final BlockType WEATHERED_CUT_COPPER_SLAB = init(); @Nullable - public static final BlockType WEEPING_VINES = init(); - @Nullable public static final BlockType WEATHERED_CUT_COPPER_STAIRS = init(); @Nullable + public static final BlockType WEEPING_VINES = init(); + @Nullable public static final BlockType WEEPING_VINES_PLANT = init(); @Nullable public static final BlockType WET_SPONGE = init(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java index d476c092c..4485945fc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java @@ -2,7 +2,6 @@ package com.sk89q.worldedit.world.block; import com.fastasyncworldedit.core.registry.state.PropertyKey; import com.fastasyncworldedit.core.util.MathMan; -import com.fastasyncworldedit.core.world.block.BlockID; import com.google.common.primitives.Booleans; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; @@ -14,7 +13,6 @@ import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.BlockRegistry; import com.sk89q.worldedit.world.registry.Registries; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -218,14 +216,15 @@ public class BlockTypesCache { : item, item -> item)); int size = blockMap.size() + 1; - Field[] idFields = BlockID.class.getDeclaredFields(); - for (Field field : idFields) { - size = Math.max(field.getInt(null) + 1, size); - } BIT_OFFSET = MathMan.log2nlz(size); BIT_MASK = ((1 << BIT_OFFSET) - 1); values = new BlockType[size]; + /*Field[] idFields = BlockID.class.getDeclaredFields(); + for (Field field : idFields) { + size = Math.max(field.getInt(null) + 1, size); + } + // Register the statically declared ones first for (Field field : idFields) { if (field.getType() == int.class) { @@ -245,9 +244,30 @@ public class BlockTypesCache { // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty values[internalId] = type; } + }*/ + + // Register "Reserved". Ensure air/reserved and 0/1/2/3 + { + int internalId = 0; + for (String id : new String[]{"minecraft:__reserved__", "minecraft:air", "minecraft:cave_air", + "minecraft:void_air"}) { + String defaultState = blockMap.remove(id); + if (defaultState == null) { + defaultState = id; + } + if (values[internalId] != null) { + throw new IllegalStateException( + "Invalid duplicate id for __reserved__! Something has gone very wrong. Are " + + "any plugins shading FAWE?!"); + } + BlockType type = register(defaultState, internalId, stateList, tickList); + // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty + values[internalId] = type; + internalId++; + } } - { // Register new blocks + { // Register real blocks int internalId = 1; for (Map.Entry entry : blockMap.entrySet()) { String defaultState = entry.getValue(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java index 1e507e58c..92f7f6caf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk16.java @@ -26,7 +26,7 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.storage.InvalidFormatException; /** - * The chunk format for Minecraft 1.16 and newer + * The chunk format for Minecraft 1.16 and 1.17 */ public class AnvilChunk16 extends AnvilChunk15 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk18.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk18.java new file mode 100644 index 000000000..6d8348d5e --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk18.java @@ -0,0 +1,218 @@ +/* + * 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.world.chunk; + +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.jnbt.IntTag; +import com.sk89q.jnbt.ListTag; +import com.sk89q.jnbt.LongArrayTag; +import com.sk89q.jnbt.NBTUtils; +import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.registry.state.Property; +import com.sk89q.worldedit.world.DataException; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; +import com.sk89q.worldedit.world.storage.InvalidFormatException; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The chunk format for Minecraft 1.18 and newer + */ +public class AnvilChunk18 implements Chunk { + + private final CompoundTag rootTag; + private final Int2ObjectOpenHashMap blocks; + private final int rootX; + private final int rootZ; + + private Map> tileEntities; + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + */ + public AnvilChunk18(CompoundTag tag) throws DataException { + rootTag = tag; + + rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); + rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + + List sections = NBTUtils.getChildTag(rootTag.getValue(), "sections", ListTag.class).getValue(); + blocks = new Int2ObjectOpenHashMap<>(sections.size()); + + for (Tag rawSectionTag : sections) { + if (!(rawSectionTag instanceof CompoundTag sectionTag)) { + continue; + } + + Object yValue = sectionTag.getValue().get("Y").getValue(); // sometimes a byte, sometimes an int + if (!(yValue instanceof Number)) { + throw new InvalidFormatException("Y is not numeric: " + yValue); + } + int y = ((Number) yValue).intValue(); + + Tag rawBlockStatesTag = sectionTag.getValue().get("block_states"); // null for sections outside of the world limits + if (rawBlockStatesTag instanceof CompoundTag blockStatesTag) { + + // parse palette + List paletteEntries = blockStatesTag.getList("palette", CompoundTag.class); + int paletteSize = paletteEntries.size(); + if (paletteSize == 0) { + continue; + } + BlockState[] palette = new BlockState[paletteSize]; + for (int paletteEntryId = 0; paletteEntryId < paletteSize; paletteEntryId++) { + CompoundTag paletteEntry = paletteEntries.get(paletteEntryId); + BlockType type = BlockTypes.get(paletteEntry.getString("Name")); + if (type == null) { + throw new InvalidFormatException("Invalid block type: " + paletteEntry.getString("Name")); + } + BlockState blockState = type.getDefaultState(); + if (paletteEntry.containsKey("Properties")) { + CompoundTag properties = NBTUtils.getChildTag(paletteEntry.getValue(), "Properties", CompoundTag.class); + for (Property property : blockState.getStates().keySet()) { + if (properties.containsKey(property.getName())) { + String value = properties.getString(property.getName()); + try { + blockState = getBlockStateWith(blockState, property, value); + } catch (IllegalArgumentException e) { + throw new InvalidFormatException("Invalid block state for " + blockState.getBlockType().getId() + ", " + property.getName() + ": " + value); + } + } + } + } + palette[paletteEntryId] = blockState; + } + if (paletteSize == 1) { + // the same block everywhere + blocks.put(y, palette); + continue; + } + + // parse block states + long[] blockStatesSerialized = NBTUtils.getChildTag(blockStatesTag.getValue(), "data", LongArrayTag.class).getValue(); + + BlockState[] chunkSectionBlocks = new BlockState[16 * 16 * 16]; + blocks.put(y, chunkSectionBlocks); + + readBlockStates(palette, blockStatesSerialized, chunkSectionBlocks); + } + } + } + + protected void readBlockStates(BlockState[] palette, long[] blockStatesSerialized, BlockState[] chunkSectionBlocks) throws InvalidFormatException { + PackedIntArrayReader reader = new PackedIntArrayReader(blockStatesSerialized); + for (int blockPos = 0; blockPos < chunkSectionBlocks.length; blockPos++) { + int index = reader.get(blockPos); + if (index >= palette.length) { + throw new InvalidFormatException("Invalid block state table entry: " + index); + } + chunkSectionBlocks[blockPos] = palette[index]; + } + } + + private BlockState getBlockStateWith(BlockState source, Property property, String value) { + return source.with(property, property.getValueFor(value)); + } + + /** + * Used to load the tile entities. + */ + private void populateTileEntities() throws DataException { + tileEntities = new HashMap<>(); + if (!rootTag.getValue().containsKey("block_entities")) { + return; + } + List tags = NBTUtils.getChildTag(rootTag.getValue(), + "block_entities", ListTag.class).getValue(); + + for (Tag tag : tags) { + if (!(tag instanceof CompoundTag t)) { + throw new InvalidFormatException("CompoundTag expected in block_entities"); + } + + Map values = new HashMap<>(t.getValue()); + int x = ((IntTag) values.get("x")).getValue(); + int y = ((IntTag) values.get("y")).getValue(); + int z = ((IntTag) values.get("z")).getValue(); + + BlockVector3 vec = BlockVector3.at(x, y, z); + tileEntities.put(vec, values); + } + } + + /** + * Get the map of tags keyed to strings for a block's tile entity data. May + * return null if there is no tile entity data. Not public yet because + * what this function returns isn't ideal for usage. + * + * @param position the position + * @return the compound tag for that position, which may be null + * @throws DataException thrown if there is a data error + */ + @Nullable + private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + if (tileEntities == null) { + populateTileEntities(); + } + + Map values = tileEntities.get(position); + if (values == null) { + return null; + } + + return new CompoundTag(values); + } + + @Override + public BaseBlock getBlock(BlockVector3 position) throws DataException { + int x = position.getX() - rootX * 16; + int y = position.getY(); + int z = position.getZ() - rootZ * 16; + + int section = y >> 4; + int yIndex = y & 0x0F; + + BlockState[] sectionBlocks = blocks.get(section); + if (sectionBlocks == null) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } + BlockState state = sectionBlocks[sectionBlocks.length == 1 ? 0 : ((yIndex << 8) | (z << 4) | x)]; + + CompoundTag tileEntity = getBlockTileEntity(position); + + if (tileEntity != null) { + return state.toBaseBlock(tileEntity); + } + + return state.toBaseBlock(); + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java index 00970efd3..e6db601c3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ChunkStoreHelper.java @@ -34,6 +34,7 @@ import com.sk89q.worldedit.world.chunk.AnvilChunk13; import com.sk89q.worldedit.world.chunk.AnvilChunk15; import com.sk89q.worldedit.world.chunk.AnvilChunk16; import com.sk89q.worldedit.world.chunk.AnvilChunk17; +import com.sk89q.worldedit.world.chunk.AnvilChunk18; import com.sk89q.worldedit.world.chunk.Chunk; import com.sk89q.worldedit.world.chunk.OldChunk; @@ -72,8 +73,28 @@ public class ChunkStoreHelper { * @throws DataException if the rootTag is not valid chunk data */ public static Chunk getChunk(CompoundTag rootTag) throws DataException { + int dataVersion = rootTag.getInt("DataVersion"); + if (dataVersion == 0) { + dataVersion = -1; + } + + final Platform platform = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING); + final int currentDataVersion = platform.getDataVersion(); + if ((dataVersion > 0 || hasLevelSections(rootTag)) && dataVersion < currentDataVersion) { // only fix up MCA format, DFU doesn't support MCR chunks + final DataFixer dataFixer = platform.getDataFixer(); + if (dataFixer != null) { + rootTag = (CompoundTag) AdventureNBTConverter.fromAdventure(dataFixer.fixUp(DataFixer.FixTypes.CHUNK, + rootTag.asBinaryTag(), dataVersion)); + dataVersion = currentDataVersion; + } + } + + if (dataVersion >= Constants.DATA_VERSION_MC_1_18) { + return new AnvilChunk18(rootTag); + } //FAWE start - biome and entity restore return getChunk(rootTag, () -> null); + //FAWE end } /** @@ -113,21 +134,6 @@ public class ChunkStoreHelper { if (dataVersion == 0) { dataVersion = -1; } - final Platform platform = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING); - final int currentDataVersion = platform.getDataVersion(); - if (tag - .getValue() - .containsKey("Sections") && dataVersion < currentDataVersion) { // only fix up MCA format, DFU doesn't support MCR chunks - final DataFixer dataFixer = platform.getDataFixer(); - if (dataFixer != null) { - //FAWE start - BinaryTag - tag = (CompoundTag) AdventureNBTConverter.fromAdventure(dataFixer - .fixUp(DataFixer.FixTypes.CHUNK, rootTag.asBinaryTag(), dataVersion) - .get("Level")); - //FAWE end - dataVersion = currentDataVersion; - } - } //FAWE start - biome and entity restore if (dataVersion >= Constants.DATA_VERSION_MC_1_17) { return new AnvilChunk17(tag, entitiesTag); @@ -153,6 +159,15 @@ public class ChunkStoreHelper { return new OldChunk(tag); } + private static boolean hasLevelSections(CompoundTag rootTag) { + Map children = rootTag.getValue(); + Tag levelTag = children.get("Level"); + if (levelTag instanceof CompoundTag) { + return ((CompoundTag) levelTag).getValue().containsKey("Sections"); + } + return false; + } + private ChunkStoreHelper() { } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/TrueZipMcRegionChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/TrueZipMcRegionChunkStore.java index f60df4510..76f9a5ba3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/TrueZipMcRegionChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/TrueZipMcRegionChunkStore.java @@ -105,7 +105,7 @@ public class TrueZipMcRegionChunkStore extends McRegionChunkStore { endIndex = entryName.lastIndexOf('\\'); } folder = entryName.substring(0, endIndex); - if (folder.endsWith("poi")) { + if (folder.endsWith("poi") || folder.endsWith("entities")) { continue; } name = folder + "/" + name; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java index a19aed26d..067515e13 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/ZippedMcRegionChunkStore.java @@ -101,9 +101,7 @@ public class ZippedMcRegionChunkStore extends McRegionChunkStore { endIndex = entryName.lastIndexOf('\\'); } folder = entryName.substring(0, endIndex); - //FAWE start - biome and entity restore if (folder.endsWith("poi") || folder.endsWith("entities")) { - //FAWE end continue; } name = folder + "/" + name; diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index 54c0a9c44..dcd13d76e 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -238,8 +238,8 @@ "worldedit.error.unknown-block": "Block name '{0}' was not recognized.", "worldedit.error.disallowed-block": "Block '{0}' not allowed (see WorldEdit configuration).", "worldedit.error.max-changes": "Max blocks changed in an operation reached ({0}).", - "worldedit.error.max-brush-radius": "Maximum brush radius (in config-legacy.yml): {0}", - "worldedit.error.max-radius": "Maximum radius (in config-legacy.yml): {0}", + "worldedit.error.max-brush-radius": "Maximum brush radius (in worldedit-config.yml): {0}", + "worldedit.error.max-radius": "Maximum radius (in worldedit-config.yml): {0}", "worldedit.error.unknown-direction": "Unknown direction: {0}", "worldedit.error.empty-clipboard": "Your clipboard is empty. Use //copy first.", "worldedit.error.invalid-filename": "Filename '{0}' invalid: {1}", From e9d97fc7b1d0f62ccde1955bab15a5be38d4c30b Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Mon, 20 Dec 2021 21:18:26 +0000 Subject: [PATCH 18/81] Update version (checking) for semver --- .../fastasyncworldedit/core/FaweVersion.java | 64 +++++++++++++------ .../core/util/UpdateNotification.java | 15 +++-- .../src/main/resources/lang/strings.json | 2 +- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java index 811aaad41..5fb78e6bb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java @@ -1,5 +1,9 @@ package com.fastasyncworldedit.core; +import com.fastasyncworldedit.core.util.StringMan; + +import java.util.Locale; + /** * An internal FAWE class not meant for public use. **/ @@ -11,28 +15,34 @@ public class FaweVersion { public final int day; public final int hash; public final int build; + public final int[] semver; + public final boolean snapshot; - public FaweVersion(int year, int month, int day, int hash, int build) { + public FaweVersion(int year, int month, int day, int[] semver, boolean snapshot, int hash, int build) { this.year = year; this.month = month; this.day = day; this.hash = hash; this.build = build; + this.semver = semver; + this.snapshot = snapshot; } public FaweVersion(String version, String commit, String date) { String[] split = version.substring(version.indexOf('=') + 1).split("-"); - int build = 0; - try { - build = Integer.parseInt(split[1]); - } catch (NumberFormatException ignored) { + String[] split1 = split[0].split("\\."); + int[] ver = new int[3]; + for (int i = 0; i < 3; i++) { + ver[i] = Integer.parseInt(split1[i]); } - this.build = build; + this.semver = ver; + this.snapshot = split.length > 1 && split[1].toLowerCase(Locale.ROOT).contains("snapshot"); + this.build = version.contains("+") ? Integer.parseInt(version.substring(version.indexOf('+') + 1)) : 0; this.hash = Integer.parseInt(commit.substring(commit.indexOf('=') + 1), 16); - String[] split1 = date.substring(date.indexOf('=') + 1).split("\\."); - this.year = Integer.parseInt(split1[0]); - this.month = Integer.parseInt(split1[1]); - this.day = Integer.parseInt(split1[2]); + String[] split2 = date.substring(date.indexOf('=') + 1).split("\\."); + this.year = Integer.parseInt(split2[0]); + this.month = Integer.parseInt(split2[1]); + this.day = Integer.parseInt(split2[2]); } public static FaweVersion tryParse(String version, String commit, String date) { @@ -40,28 +50,42 @@ public class FaweVersion { return new FaweVersion(version, commit, date); } catch (Exception exception) { exception.printStackTrace(); - return new FaweVersion(0, 0, 0, 0, 0); + return new FaweVersion(0, 0, 0, null, true, 0, 0); } } @Override public String toString() { - if (hash == 0 && build == 0) { - return getSimpleVersionName() + "-NoVer-SNAPSHOT"; + if (semver == null) { + return "FastAsyncWorldEdit-NoVer-SNAPSHOT"; } else { - return getSimpleVersionName() + "-" + build; + String snapshot = this.snapshot ? "-SNAPSHOT" : ""; + String build = this.build > 0 ? "+" + this.build : ""; + return "FastAsyncWorldEdit-" + StringMan.join(semver, ".") + snapshot + build; } } /** - * @return The qualified version name + * Returns if another FaweVersion is newer than this one */ - public String getSimpleVersionName() { - return "FastAsyncWorldEdit-1.17"; - } - public boolean isNewer(FaweVersion other) { - return other.build < this.build; + if (other.semver == null) { + return other.build > this.build; + } + if (this.semver == null) { + return true; + } + if (other.semver[0] != this.semver[0]) { + return other.semver[0] > this.semver[0]; + } else if (other.semver[1] != this.semver[1]) { + return other.semver[1] > this.semver[1]; + } else if (other.semver[2] != this.semver[2]) { + return other.semver[2] > this.semver[2]; + } + if (other.snapshot == this.snapshot) { + return other.build > this.build; + } + return !other.snapshot; } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java index 97efe95b4..d680137e9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java @@ -30,8 +30,7 @@ public class UpdateNotification { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - //TODO 1.18 revisit and update to semver parsing after updating FaweVersion.java - Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit-1.17/api/xml/").openStream()); + Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit/api/xml/").openStream()); faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent(); FaweVersion faweVersion = Fawe.get().getVersion(); if (faweVersion.build == 0) { @@ -45,11 +44,10 @@ public class UpdateNotification { LOGGER.warn( """ An update for FastAsyncWorldEdit is available. You are {} build(s) out of date. - You are running version {}, the latest version is {}-{}. + You are running build {}, the latest version is build {}. Update at https://www.spigotmc.org/resources/13932/""", versionDifference, - faweVersion.toString(), - faweVersion.getSimpleVersionName(), + faweVersion.build, UpdateNotification.faweVersion ); } @@ -70,8 +68,11 @@ public class UpdateNotification { if (actor.hasPermission("fawe.admin") && UpdateNotification.hasUpdate) { FaweVersion faweVersion = Fawe.get().getVersion(); int versionDifference = Integer.parseInt(UpdateNotification.faweVersion) - faweVersion.build; - actor.print(Caption.of("fawe.info.update-available", versionDifference, faweVersion.toString(), - faweVersion.getSimpleVersionName() + "-" + UpdateNotification.faweVersion, + actor.print(Caption.of( + "fawe.info.update-available", + versionDifference, + faweVersion.build, + UpdateNotification.faweVersion, TextComponent .of("https://www.spigotmc.org/resources/13932/") .clickEvent(ClickEvent.openUrl("https://www.spigotmc.org/resources/13932/")) diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index dcd13d76e..6f4c5a737 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -13,7 +13,7 @@ "fawe.info.worldedit.restricted": "Your FAWE edits are now restricted.", "fawe.info.worldedit.oom.admin": "Possible options:\n - //fast\n - Do smaller edits\n - Allocate more memory\n - Disable `max-memory-percent`", "fawe.info.temporarily-not-working": "Temporarily not working", - "fawe.info.update-available": "An update for FastAsyncWorldEdit is available. You are {0} build(s) out of date.\nYou are running version {1}, the latest version is {2}.\nUpdate at {3}", + "fawe.info.update-available": "An update for FastAsyncWorldEdit is available. You are {0} build(s) out of date.\nYou are running build {1}, the latest version is build {2}.\nUpdate at {3}", "fawe.web.generating.link": "Uploading {0}, please wait...", "fawe.web.generating.link.failed": "Failed to generate download link!", "fawe.web.download.link": "{0}", From 6350fe5411d8c5e4490e187e9613468de108a130 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Mon, 20 Dec 2021 22:20:41 +0100 Subject: [PATCH 19/81] build: Fix release drafter base branch --- .github/workflows/build.yml | 4 ++-- .github/workflows/release-drafter.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d793bb26e..89e6e2fd1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: - name : Validate Gradle Wrapper uses : gradle/wrapper-validation-action@v1.0.4 - name: Setup Java - uses: actions/setup-java@v2.3.1 + uses: actions/setup-java@v2.4.0 with: distribution: temurin cache: gradle @@ -41,7 +41,7 @@ jobs: ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} - name: Archive Artifacts - uses: actions/upload-artifact@v2.2.4 + uses: actions/upload-artifact@v2.3.1 with: name: FastAsyncWorldEdit-Bukkit-SNAPSHOT path: worldedit-bukkit/build/libs/FastAsyncWorldEdit-Bukkit-*.jar diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 976495eda..6beea8078 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -3,7 +3,7 @@ name: draft release on: push: branches: - - "2.0.0" + - main jobs: update_release_draft: From d6110013b8207f88cfafb08c8f67daf5e42c2f69 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 21 Dec 2021 00:42:46 +0100 Subject: [PATCH 21/81] tests: Add resource pack methods --- .../fastasyncworldedit/util/StubServer.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java index e81e849f3..237b55903 100644 --- a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java +++ b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/StubServer.java @@ -155,6 +155,26 @@ public class StubServer implements Server { return false; } + @Override + public @NotNull String getResourcePack() { + return null; + } + + @Override + public @NotNull String getResourcePackHash() { + return null; + } + + @Override + public @NotNull String getResourcePackPrompt() { + return null; + } + + @Override + public boolean isResourcePackRequired() { + return false; + } + @Override public boolean hasWhitelist() { return false; From 78aff4c81fd4c8dea88ef7f1219ef807cf7c92f4 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 21 Dec 2021 11:11:08 +0100 Subject: [PATCH 22/81] build: Update paperweight and add 1.17 again --- buildSrc/build.gradle.kts | 2 +- .../adapters/adapter-1_17_1/build.gradle.kts | 40 +----------------- .../resources/worldedit-adapter-1.17.1.jar | Bin 229162 -> 0 bytes .../adapters/adapter-1_18/build.gradle.kts | 2 +- 4 files changed, 4 insertions(+), 40 deletions(-) delete mode 100644 worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index f0f8bf4b2..71895e12c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation(gradleApi()) implementation("org.ajoberstar.grgit:grgit-gradle:4.1.1") implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.1") - implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.2") + implementation("io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.3.3") } kotlin { diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts index d9c2fcc45..0aa31cc0b 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_17_1/build.gradle.kts @@ -1,16 +1,6 @@ -// TODO await https://github.com/PaperMC/paperweight/issues/116 -//applyPaperweightAdapterConfiguration() -// -//dependencies { -// paperDevBundle("1.17.1-R0.1-20211120.192557-194") -//} - -// Until the above issue is resolved, we are bundling old versions using their last assembled JAR. -// Technically this means we cannot really update them, but that is is the price we pay for supporting older versions. - +applyPaperweightAdapterConfiguration() plugins { - base java } @@ -20,25 +10,6 @@ repositories { name = "PaperMC" url = uri("https://papermc.io/repo/repository/maven-public/") } - maven { - name = "Athion" - url = uri("https://ci.athion.net/plugin/repository/tools/") - content { - includeModule("io.papermc", "paper-server") - } - } - maven { - name = "OSS Sonatype Snapshots" - url = uri("https://oss.sonatype.org/content/repositories/snapshots/") - } - maven { - name = "Mojang" - url = uri("https://libraries.minecraft.net/") - } -} - -artifacts { - add("default", file("./src/main/resources/worldedit-adapter-1.17.1.jar")) } java { @@ -51,13 +22,6 @@ configurations.all { dependencies { - compileOnly("io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT") - compileOnly(project(":worldedit-bukkit")) - compileOnly(project(":worldedit-core")) - compileOnly("io.papermc:paper-server:1_17_r1_2") + paperDevBundle("1.17.1-R0.1-20211219.175449-201") compileOnly(libs.paperlib) - compileOnly("com.mojang:datafixerupper:4.0.26") - compileOnly("com.mojang:authlib:2.3.31") - compileOnly("com.mojang:brigadier:1.0.18") - compileOnly("io.netty:netty-all:4.1.25.Final") } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/resources/worldedit-adapter-1.17.1.jar deleted file mode 100644 index a1d408d0ddee874b61fdaa866f72acc37dd8b7cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229162 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 z 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

  • =CnLX@w5EQ8?&l<-Ylg+L(Fb)qRr+mlKm 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Ì!7dv6_9PU^9}oI6j~bOoL;?(2=qO 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 diff --git a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts index 241ab7d14..e3658659c 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts +++ b/worldedit-bukkit/adapters/adapter-1_18/build.gradle.kts @@ -12,6 +12,6 @@ repositories { } dependencies { - paperDevBundle("1.18.1-R0.1-20211218.091106-15") + paperDevBundle("1.18.1-R0.1-20211221.093324-19") compileOnly(libs.paperlib) } From 7453f12e662792b682e004352d7e51f45110017d Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 21 Dec 2021 16:27:46 +0100 Subject: [PATCH 23/81] chore: Lazily change build delimiter --- build.gradle.kts | 2 +- .../main/java/com/fastasyncworldedit/core/FaweVersion.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d0bc3b838..c52c082a2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,7 +34,7 @@ ext { date = git.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd")) revision = "-${git.head().abbreviatedId}" buildNumber = if (project.hasProperty("buildnumber")) { - snapshot + "+" + project.properties["buildnumber"] as String + snapshot + "-" + project.properties["buildnumber"] as String } else { project.properties["snapshot"] as String } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java index 5fb78e6bb..2298d491b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java @@ -7,7 +7,6 @@ import java.util.Locale; /** * An internal FAWE class not meant for public use. **/ -//TODO 18 update to semver public class FaweVersion { public final int year; @@ -37,7 +36,7 @@ public class FaweVersion { } this.semver = ver; this.snapshot = split.length > 1 && split[1].toLowerCase(Locale.ROOT).contains("snapshot"); - this.build = version.contains("+") ? Integer.parseInt(version.substring(version.indexOf('+') + 1)) : 0; + this.build = version.contains("-") ? Integer.parseInt(version.substring(version.indexOf('-') + 10)) : 0; this.hash = Integer.parseInt(commit.substring(commit.indexOf('=') + 1), 16); String[] split2 = date.substring(date.indexOf('=') + 1).split("\\."); this.year = Integer.parseInt(split2[0]); @@ -60,7 +59,7 @@ public class FaweVersion { return "FastAsyncWorldEdit-NoVer-SNAPSHOT"; } else { String snapshot = this.snapshot ? "-SNAPSHOT" : ""; - String build = this.build > 0 ? "+" + this.build : ""; + String build = this.build > 0 ? "-" + this.build : ""; return "FastAsyncWorldEdit-" + StringMan.join(semver, ".") + snapshot + build; } } From aff3d8ba49e99dab6ac5573c83575fc217646ab7 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 21 Dec 2021 17:48:56 +0100 Subject: [PATCH 24/81] build: Deploy API snapshots for 2.0.0 --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 89e6e2fd1..b56c1367d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,15 +27,15 @@ jobs: echo "STATUS=release" >> $GITHUB_ENV fi - name: Publish Release - if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}} - run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository + if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18'}} + run: ./gradlew publishToSonatype closeSonatypeStagingRepository env: ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }} ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} - name: Publish Snapshot - if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }} + if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/major/2.0.0/1.18' }} run: ./gradlew publishToSonatype env: ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} From 9ec829eddfefa8ddb7d1746d9ea3caf4bc857016 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 21 Dec 2021 17:59:55 +0000 Subject: [PATCH 25/81] Update adapters jar --- .../src/main/resources/worldedit-adapters.jar | Bin 618774 -> 619982 bytes 1 file changed, 0 insertions(+), 0 deletions(-) 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 index 6d4726c42a466ebe1cbd0761f8d1ce984003fec7..8171f289f60795c202006f429fd40d9c926fd5cf 100644 GIT binary patch delta 543272 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,Zn* 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

    Unr=e7z!}M=h9R=N!-k_hc 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

    B=BqmGyuUEF>!Emgo#N!Wl8%bU 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̸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

    3HS6xj8*2I}8h%N=x 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

    $+|{A@$%FYvDou(P4` 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 delta 542252 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

    Hx=yg|GZNvi`%{QQ_rx%&(G=Mw(8EKB?i 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 O@-@gLx?inU+orf+8sG`IfeAWG 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≪CahHi=54>6dAYsnp2VkklqPa6KqV3sk3waUU) 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�V-P5mb~F7*!Nz#vnl$OqvCI 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 Uf%?A{j!-e5nCT}x#Ec664{6iGbpQYW From 28f3bc61eaf57c0c7071c772a1fcba47a865e35e Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 21 Dec 2021 18:00:09 +0000 Subject: [PATCH 26/81] More verbosely get block data and ensure biome layer isn't null --- .../impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java | 7 ++++++- .../adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java | 3 +++ .../adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java | 7 ++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java index 8433a9fc1..801da6ad0 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java @@ -243,7 +243,12 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements 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); - return adapt(blockData); + BlockState state = adapt(blockData); + if (state == null) { + org.bukkit.block.Block bukkitBlock = location.getBlock(); + state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + } + return state; } @Override diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java index 61dcd63f8..ed5a71b0e 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java @@ -553,6 +553,9 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc copy.storeBiomes(currentBiomes); } for (int layer = 0; layer < 16; layer++) { + if (biomes[layer] == null) { + continue; + } for (int y = 0, i = 0; y < 4; y++) { for (int z = 0; z < 4; z++) { for (int x = 0; x < 4; x++, i++) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index d7e1c8914..76c9f6225 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -242,7 +242,12 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements 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); - return adapt(blockData); + BlockState state = adapt(blockData); + if (state == null) { + org.bukkit.block.Block bukkitBlock = location.getBlock(); + state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); + } + return state; } @Override From 94b392dd395c4cfdf79b8c28c768da7c9dce2f6b Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 21 Dec 2021 19:00:59 +0100 Subject: [PATCH 27/81] refactor: Address a few `TODO 1.18`'s (cherry picked from commit 0b77932b6e46c825d78b8c7ccae2a68ad890564e) --- .../src/main/java/com/fastasyncworldedit/core/Fawe.java | 3 +-- .../java/com/fastasyncworldedit/core/util/TextureUtil.java | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 46f934d4a..4cea8e2cb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -305,8 +305,7 @@ public class Fawe { br.close(); this.version = FaweVersion.tryParse(versionString, commitString, dateString); Settings.IMP.DATE = new Date(100 + version.year, version.month, version.day).toString(); - //TODO 1.18 revisit - Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit-1.17/" + version.build; + Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit/" + version.build; Settings.IMP.COMMIT = "https://github.com/IntellectualSites/FastAsyncWorldEdit/commit/" + Integer.toHexString(version.hash); } catch (Throwable ignored) { } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index 747ed625b..59078cba5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -33,7 +33,6 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.security.AccessControlException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -370,8 +369,7 @@ public class TextureUtil implements TextureHolder { "folder with a `.minecraft/versions` jar in it."); LOGGER.error("If the file exists, please make sure the server has read access to the directory."); } - //TODO 1.18 AccessControlException is deprecated and scheduled for removal as of Java 17. Exchange on sight to be prepared for future releases - } catch (AccessControlException e) { + } catch (SecurityException e) { LOGGER.error( "Could not download asset jar. It's likely your file permission are setup improperly and do not allow fetching data from the Mojang servers."); LOGGER.error( From a4cec49e8933ca29bbd2056020e73a69eaf79b79 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 22 Dec 2021 00:53:27 +0100 Subject: [PATCH 28/81] fix: Fix `/fawe debugpaste` --- worldedit-bukkit/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index 89dc6a653..fa1e999a7 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -180,7 +180,7 @@ tasks.named("shadowJar") { include(dependency("dev.notmyfault.serverlib:ServerLib:2.3.1")) } relocate("com.intellectualsites.paster", "com.fastasyncworldedit.paster") { - include(dependency("com.intellectualsites.paster:Paster:1.1.1")) + include(dependency("com.intellectualsites.paster:Paster:1.1.3")) } relocate("org.lz4", "com.fastasyncworldedit.core.lz4") { include(dependency("org.lz4:lz4-java:1.8.0")) From 6b6c94556a3f2528a2cd252b972515dbc7f39b9b Mon Sep 17 00:00:00 2001 From: Jordan Date: Wed, 22 Dec 2021 00:53:45 +0000 Subject: [PATCH 29/81] refactor! Remove deprecations marked for removal that are not present in upstream (#1483) --- .../bukkit/regions/GriefDefenderFeature.java | 2 +- .../regions/GriefPreventionFeature.java | 2 +- .../bukkit/regions/ResidenceFeature.java | 2 +- .../bukkit/regions/TownyFeature.java | 2 +- .../plotsquared/PlotSquaredFeature.java | 2 +- .../bukkit/adapter/BukkitImplLoader.java | 3 + .../com/fastasyncworldedit/core/FaweAPI.java | 12 - .../core/regions/FaweMaskManager.java | 30 +- .../core/util/EditSessionBuilder.java | 498 ------------------ .../java/com/sk89q/worldedit/EditSession.java | 62 --- .../sk89q/worldedit/EditSessionBuilder.java | 8 - .../sk89q/worldedit/internal/Constants.java | 7 - .../worldedit/regions/RegionIntersection.java | 11 - 13 files changed, 9 insertions(+), 632 deletions(-) delete mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java index 3a09a9aa8..1f9fc7233 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java @@ -32,7 +32,7 @@ public class GriefDefenderFeature extends BukkitMaskManager implements Listener } @Override - public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type) { + public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type, boolean isWhitelist) { final Player player = BukkitAdapter.adapt(wePlayer); final Location loc = player.getLocation(); final Vector3i vector = Vector3i.from(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java index a54f3a0af..0798cf973 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java @@ -30,7 +30,7 @@ public class GriefPreventionFeature extends BukkitMaskManager implements Listene } @Override - public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type) { + public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type, boolean isWhitelist) { final Player player = BukkitAdapter.adapt(wePlayer); final Claim claim = GriefPrevention.instance.dataStore.getClaimAt(player.getLocation(), true, null); if (claim != null) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java index c6b75f8c6..05243974d 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java @@ -39,7 +39,7 @@ public class ResidenceFeature extends BukkitMaskManager implements Listener { } @Override - public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, final MaskType type) { + public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, final MaskType type, boolean isWhitelist) { final Player player = BukkitAdapter.adapt(wePlayer); final Location location = player.getLocation(); ClaimedResidence residence = Residence.getInstance().getResidenceManager().getByLoc(location); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java index 231ee9ea3..c46c4c0a3 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java @@ -66,7 +66,7 @@ public class TownyFeature extends BukkitMaskManager implements Listener { } @Override - public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type) { + public FaweMask getMask(final com.sk89q.worldedit.entity.Player wePlayer, MaskType type, boolean isWhitelist) { final Player player = BukkitAdapter.adapt(wePlayer); final Location location = player.getLocation(); try { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java index 33ddb4fa8..d900c6c24 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java @@ -127,7 +127,7 @@ public class PlotSquaredFeature extends FaweMaskManager { } @Override - public FaweMask getMask(Player player, MaskType type) { + public FaweMask getMask(Player player, MaskType type, boolean isWhitelist) { final PlotPlayer pp = PlotPlayer.from(BukkitAdapter.adapt(player)); if (pp == null) { return null; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java index 3224aec12..29679eef1 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java @@ -172,6 +172,9 @@ public class BukkitImplLoader { if (className.equals(customCandidate)) { LOGGER.warn("Failed to load the Bukkit adapter class '" + className + "'", e); } + if (className.contains("Adapter") && className.contains("18")) { + e.printStackTrace(); + } } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java index 3c94233ee..c34052554 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java @@ -11,7 +11,6 @@ import com.fastasyncworldedit.core.queue.IQueueExtent; import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.fastasyncworldedit.core.regions.RegionWrapper; -import com.fastasyncworldedit.core.util.EditSessionBuilder; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MemUtil; import com.fastasyncworldedit.core.util.TaskManager; @@ -60,17 +59,6 @@ public class FaweAPI { private static final Logger LOGGER = LogManagerCompat.getLogger(); - /** - * Offers a lot of options for building an EditSession. - * - * @return A new EditSessionBuilder - * @deprecated See {@link WorldEdit#newEditSessionBuilder()} - */ - @Deprecated(forRemoval = true) - public static EditSessionBuilder getEditSessionBuilder(World world) { - return new EditSessionBuilder(world); - } - /** * The TaskManager has some useful methods for doing things asynchronously. * diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java index 62f54e49b..dd413080b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java @@ -23,38 +23,10 @@ public abstract class FaweMaskManager { return this.key; } - /** - * Get a {@link FaweMask} for the given player and {@link MaskType} - * - * @deprecated Use {@link #getMask(Player, MaskType, boolean)} - */ - @Deprecated(forRemoval = true) - public FaweMask getMask(final Player player, MaskType type) { - return getMask(player, type, true); - } - /** * Get a {@link FaweMask} for the given player and {@link MaskType}. If isWhitelist is false, will return a "blacklist" mask. */ - public FaweMask getMask(final Player player, MaskType type, boolean isWhitelist) { - return getMask(player, type); - } - - /** - * @deprecated Not used internally - */ - @Deprecated(forRemoval = true) - public boolean isValid(FaweMask mask) { - return true; - } - - /** - * @deprecated Not used internally - */ - @Deprecated(forRemoval = true) - public RegionFilter getFilter(String world) { - return null; - } + public abstract FaweMask getMask(final Player player, MaskType type, boolean isWhitelist); public boolean isExclusive() { return Settings.IMP.REGION_RESTRICTIONS_OPTIONS.EXCLUSIVE_MANAGERS.contains(this.key); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java deleted file mode 100644 index e99c3a162..000000000 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java +++ /dev/null @@ -1,498 +0,0 @@ -package com.fastasyncworldedit.core.util; - -import com.fastasyncworldedit.core.Fawe; -import com.fastasyncworldedit.core.FaweCache; -import com.fastasyncworldedit.core.configuration.Caption; -import com.fastasyncworldedit.core.configuration.Settings; -import com.fastasyncworldedit.core.extent.FaweRegionExtent; -import com.fastasyncworldedit.core.extent.HistoryExtent; -import com.fastasyncworldedit.core.extent.LimitExtent; -import com.fastasyncworldedit.core.extent.MultiRegionExtent; -import com.fastasyncworldedit.core.extent.NullExtent; -import com.fastasyncworldedit.core.extent.SingleRegionExtent; -import com.fastasyncworldedit.core.extent.SlowExtent; -import com.fastasyncworldedit.core.extent.StripNBTExtent; -import com.fastasyncworldedit.core.extent.processor.heightmap.HeightmapProcessor; -import com.fastasyncworldedit.core.extent.processor.lighting.NullRelighter; -import com.fastasyncworldedit.core.extent.processor.lighting.RelightMode; -import com.fastasyncworldedit.core.extent.processor.lighting.RelightProcessor; -import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; -import com.fastasyncworldedit.core.history.DiskStorageHistory; -import com.fastasyncworldedit.core.history.MemoryOptimizedHistory; -import com.fastasyncworldedit.core.history.RollbackOptimizedHistory; -import com.fastasyncworldedit.core.history.changeset.AbstractChangeSet; -import com.fastasyncworldedit.core.history.changeset.BlockBagChangeSet; -import com.fastasyncworldedit.core.history.changeset.NullChangeSet; -import com.fastasyncworldedit.core.limit.FaweLimit; -import com.fastasyncworldedit.core.queue.IQueueChunk; -import com.fastasyncworldedit.core.queue.IQueueExtent; -import com.fastasyncworldedit.core.queue.implementation.ParallelQueueExtent; -import com.fastasyncworldedit.core.regions.RegionWrapper; -import com.fastasyncworldedit.core.wrappers.WorldWrapper; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.entity.Player; -import com.sk89q.worldedit.event.extent.EditSessionEvent; -import com.sk89q.worldedit.extension.platform.Capability; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.inventory.BlockBag; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.Identifiable; -import com.sk89q.worldedit.util.eventbus.EventBus; -import com.sk89q.worldedit.util.formatting.text.TextComponent; -import com.sk89q.worldedit.world.World; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; - -import javax.annotation.Nonnull; -import java.util.Locale; -import java.util.UUID; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * @deprecated Being replaced by {@link com.sk89q.worldedit.EditSessionBuilder}. See https://worldedit.enginehub.org/en/latest/api/concepts/edit-sessions/ - */ -@Deprecated(forRemoval = true) -public class EditSessionBuilder { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - @Nonnull - private World world; - private Player player; - private FaweLimit limit; - private AbstractChangeSet changeSet; - private Region[] allowedRegions; - private Boolean fastmode; - private Boolean checkMemory; - private Boolean combineStages; - @Nonnull - private EventBus eventBus = WorldEdit.getInstance().getEventBus(); - private BlockBag blockBag; - private EditSessionEvent event; - private String command; - private RelightMode relightMode; - private Relighter relighter; - private Boolean wnaMode; - private AbstractChangeSet changeTask; - private Extent bypassHistory; - private Extent bypassAll; - private Extent extent; - private boolean compiled; - private boolean wrapped; - - /** - * An EditSession builder
    - * - Unset values will revert to their default
    - *
    - * player: The player doing the edit (defaults to to null)
    - * limit: Block/Entity/Action limit (defaults to unlimited)
    - * changeSet: Stores changes (defaults to config.yml value)
    - * allowedRegions: Allowed editable regions (defaults to player's allowed regions, or everywhere)
    - * fastmode: bypasses history (defaults to player fastmode or config.yml console history)
    - * checkMemory: If low memory checks are enabled (defaults to player's fastmode or true)
    - * combineStages: If history is combined with dispatching - * - * @param world A world must be provided for all EditSession(s) - */ - public EditSessionBuilder(World world) { - checkNotNull(world); - this.world = world; - } - - public EditSessionBuilder player(@Nullable Player player) { - this.player = player; - return setDirty(); - } - - public EditSessionBuilder limit(@Nullable FaweLimit limit) { - this.limit = limit; - return setDirty(); - } - - public EditSessionBuilder limitUnlimited() { - return limit(FaweLimit.MAX.copy()); - } - - public EditSessionBuilder limitUnprocessed(@Nonnull Player player) { - checkNotNull(player); - limitUnlimited(); - FaweLimit tmp = player.getLimit(); - limit.INVENTORY_MODE = tmp.INVENTORY_MODE; - return setDirty(); - } - - public EditSessionBuilder changeSet(@Nullable AbstractChangeSet changeSet) { - this.changeSet = changeSet; - return setDirty(); - } - - public EditSessionBuilder changeSetNull() { - return changeSet(new NullChangeSet(world)); - } - - public EditSessionBuilder world(@Nonnull World world) { - checkNotNull(world); - this.world = world; - return setDirty(); - } - - public EditSessionBuilder command(String command) { - this.command = command; - return this; - } - - public EditSessionBuilder changeSet(boolean disk, @Nullable UUID uuid, int compression) { - if (disk) { - if (Settings.IMP.HISTORY.USE_DATABASE) { - this.changeSet = new RollbackOptimizedHistory(world, uuid); - } else { - this.changeSet = new DiskStorageHistory(world, uuid); - } - } else { - this.changeSet = new MemoryOptimizedHistory(world); - } - return setDirty(); - } - - public EditSessionBuilder allowedRegions(@Nullable Region[] allowedRegions) { - this.allowedRegions = allowedRegions; - return setDirty(); - } - - @Deprecated - public EditSessionBuilder allowedRegions(@Nullable RegionWrapper[] allowedRegions) { - this.allowedRegions = allowedRegions; - return setDirty(); - } - - public EditSessionBuilder allowedRegions(@Nullable RegionWrapper allowedRegion) { - this.allowedRegions = allowedRegion == null ? null : allowedRegion.toArray(); - return setDirty(); - } - - public EditSessionBuilder allowedRegionsEverywhere() { - return allowedRegions(new Region[]{RegionWrapper.GLOBAL()}); - } - - @Deprecated - public EditSessionBuilder autoQueue(@Nullable Boolean autoQueue) { - return this; - } - - public EditSessionBuilder fastmode(@Nullable Boolean fastmode) { - this.fastmode = fastmode; - return setDirty(); - } - - public EditSessionBuilder relightMode(@Nullable RelightMode relightMode) { - this.relightMode = relightMode; - return setDirty(); - } - - public EditSessionBuilder checkMemory(@Nullable Boolean checkMemory) { - this.checkMemory = checkMemory; - return setDirty(); - } - - public EditSessionBuilder combineStages(@Nullable Boolean combineStages) { - this.combineStages = combineStages; - return setDirty(); - } - - public EditSessionBuilder blockBag(@Nullable BlockBag blockBag) { - this.blockBag = blockBag; - return setDirty(); - } - - public EditSessionBuilder eventBus(@Nonnull EventBus eventBus) { - this.eventBus = eventBus; - return setDirty(); - } - - public EditSessionBuilder event(@Nullable EditSessionEvent event) { - this.event = event; - return setDirty(); - } - - public EditSessionBuilder forceWNA() { - this.wnaMode = true; - return setDirty(); - } - - private EditSessionBuilder setDirty() { - compiled = false; - return this; - } - - private Extent wrapExtent( - final Extent extent, - final EventBus eventBus, - EditSessionEvent event, - final EditSession.Stage stage - ) { - event = event.clone(stage); - event.setExtent(extent); - eventBus.post(event); - if (event.isCancelled()) { - return new NullExtent(extent, FaweCache.MANUAL); - } - final Extent toReturn = event.getExtent(); - if (toReturn instanceof com.sk89q.worldedit.extent.NullExtent) { - return new NullExtent(toReturn, FaweCache.MANUAL); - } - if (toReturn != extent) { - String className = toReturn.getClass().getName().toLowerCase(Locale.ROOT); - for (String allowed : Settings.IMP.EXTENT.ALLOWED_PLUGINS) { - if (className.contains(allowed.toLowerCase(Locale.ROOT))) { - this.wrapped = true; - return toReturn; - } - } - if (Settings.IMP.EXTENT.DEBUG) { - if (event.getActor() != null) { - event.getActor().printDebug(TextComponent.of("Potentially unsafe extent blocked: " + toReturn - .getClass() - .getName())); - event.getActor().print(TextComponent.of( - "- For area restrictions and block logging, it is recommended that third party plugins use the FAWE" + - " API")); - event.getActor().print(TextComponent.of("- Add the following line to the `allowed-plugins` list in the " + - "FAWE config.yml to let FAWE recognize the extent:")); - event.getActor().print(toReturn.getClass().getName()); - } else { - LOGGER.warn("Potentially unsafe extent blocked: " + toReturn.getClass().getName()); - LOGGER.warn( - " - For area restrictions and block logging, it is recommended that third party plugins use the FAWE API"); - LOGGER.warn( - " - Add the following classpath to the `allowed-plugins` list in the FAWE config.yml to let FAWE " + - "recognize the extent:"); - LOGGER.warn(toReturn.getClass().getName()); - } - } - } - return extent; - } - - public EditSessionBuilder compile() { - if (compiled) { - return this; - } - - compiled = true; - wrapped = false; - if (event == null) { - event = new EditSessionEvent(world, player, -1, null); - } - if (player == null && event.getActor() != null) { - player = (Player) event.getActor(); - } - if (limit == null) { - if (player == null) { - limit = FaweLimit.MAX; - } else { - limit = player.getLimit(); - } - } - if (fastmode == null) { - if (player == null) { - fastmode = !Settings.IMP.HISTORY.ENABLE_FOR_CONSOLE; - } else { - fastmode = player.getSession().hasFastMode(); - } - } - if (checkMemory == null) { - checkMemory = player != null && !this.fastmode; - } - if (checkMemory) { - if (MemUtil.isMemoryLimitedSlow()) { - if (Permission.hasPermission(player, "worldedit.fast")) { - player.print(Caption.of("fawe.info.worldedit.oom.admin")); - } - throw FaweCache.LOW_MEMORY; - } - } -// this.originalLimit = limit; - this.blockBag = limit.INVENTORY_MODE != 0 ? blockBag : null; - this.limit = limit.copy(); - - if (extent == null) { - IQueueExtent queue = null; - World unwrapped = WorldWrapper.unwrap(world); - boolean placeChunks = (this.fastmode || this.limit.FAST_PLACEMENT) && (wnaMode == null || !wnaMode); - - if (placeChunks) { - wnaMode = false; - if (unwrapped instanceof IQueueExtent) { - extent = queue = (IQueueExtent) unwrapped; - } else if (Settings.IMP.QUEUE.PARALLEL_THREADS > 1 && !Fawe.isMainThread()) { - ParallelQueueExtent parallel = new ParallelQueueExtent(Fawe.get().getQueueHandler(), world, fastmode); - queue = parallel.getExtent(); - extent = parallel; - } else { - extent = queue = Fawe.get().getQueueHandler().getQueue(world); - } - } else { - wnaMode = true; - extent = world; - } - if (combineStages == null) { - combineStages = - // If it's enabled in the settings - Settings.IMP.HISTORY.COMBINE_STAGES - // If fast placement is disabled, it's slower to perform a copy on each chunk - && this.limit.FAST_PLACEMENT - // If the edit uses items from the inventory we can't use a delayed task - && this.blockBag == null; - } - extent = this.bypassAll = wrapExtent(extent, eventBus, event, EditSession.Stage.BEFORE_CHANGE); - this.bypassHistory = this.extent = wrapExtent(bypassAll, eventBus, event, EditSession.Stage.BEFORE_REORDER); - if (!this.fastmode || changeSet != null) { - if (changeSet == null) { - if (Settings.IMP.HISTORY.USE_DISK) { - UUID uuid = player == null ? Identifiable.CONSOLE : player.getUniqueId(); - if (Settings.IMP.HISTORY.USE_DATABASE) { - changeSet = new RollbackOptimizedHistory(world, uuid); - } else { - changeSet = new DiskStorageHistory(world, uuid); - } -// } else if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0) { -// changeSet = new CPUOptimizedChangeSet(world); - } else { - if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0) { - //TODO add CPUOptimizedChangeSet - } - changeSet = new MemoryOptimizedHistory(world); - } - } - if (this.limit.SPEED_REDUCTION > 0) { - this.extent = this.bypassHistory = new SlowExtent(this.bypassHistory, this.limit.SPEED_REDUCTION); - } - if (command != null && changeSet instanceof RollbackOptimizedHistory) { - ((RollbackOptimizedHistory) changeSet).setCommand(this.command); - } - if (!(changeSet instanceof NullChangeSet)) { - if (this.blockBag != null) { - //TODO implement block bag as IBatchProcessor - changeSet = new BlockBagChangeSet(changeSet, blockBag, limit.INVENTORY_MODE == 1); - } - if (combineStages) { - changeTask = changeSet; - this.extent = extent.enableHistory(changeSet); - } else { - this.extent = new HistoryExtent(extent, changeSet); -// if (this.blockBag != null) { -// this.extent = new BlockBagExtent(this.extent, blockBag, limit.INVENTORY_MODE == 1); -// } - } - } - } - if (allowedRegions == null) { - if (player != null && !player.hasPermission("fawe.bypass") && !player.hasPermission("fawe.bypass.regions")) { - allowedRegions = player.getAllowedRegions(); - } - } - FaweRegionExtent regionExtent = null; - if (allowedRegions != null) { - if (allowedRegions.length == 0) { - regionExtent = new NullExtent(this.extent, FaweCache.NO_REGION); - } else { - if (allowedRegions.length == 1) { - regionExtent = new SingleRegionExtent(this.extent, this.limit, allowedRegions[0]); - } else { - regionExtent = new MultiRegionExtent(this.extent, this.limit, allowedRegions, null); - } - } - } else { - allowedRegions = new Region[]{RegionWrapper.GLOBAL()}; - } - // There's no need to do lighting (and it'll also just be a pain to implement) if we're not placing chunks - if (placeChunks) { - if (((relightMode != null && relightMode != RelightMode.NONE) || (relightMode == null && Settings.IMP.LIGHTING.MODE > 0))) { - relighter = WorldEdit.getInstance().getPlatformManager() - .queryCapability(Capability.WORLD_EDITING) - .getRelighterFactory().createRelighter(relightMode, world, queue); - extent.addProcessor(new RelightProcessor(relighter)); - } - extent.addProcessor(new HeightmapProcessor(world.getMinY(), world.getMaxY())); - } else { - relighter = NullRelighter.INSTANCE; - } - if (limit != null && !limit.isUnlimited() && regionExtent != null) { - this.extent = new LimitExtent(regionExtent, limit); - } else if (limit != null && !limit.isUnlimited()) { - this.extent = new LimitExtent(this.extent, limit); - } else if (regionExtent != null) { - this.extent = regionExtent; - } - if (this.limit != null && this.limit.STRIP_NBT != null && !this.limit.STRIP_NBT.isEmpty()) { - if (placeChunks) { - extent.addProcessor(new StripNBTExtent(this.extent, this.limit.STRIP_NBT)); - } else { - this.extent = new StripNBTExtent(this.extent, this.limit.STRIP_NBT); - } - } - this.extent = wrapExtent(this.extent, eventBus, event, EditSession.Stage.BEFORE_HISTORY); - } - return this; - } - - public EditSession build() { - return new EditSession(this); - } - - @Nonnull - public World getWorld() { - return world; - } - - public Extent getExtent() { - return extent != null ? extent : world; - } - - public boolean isWrapped() { - return wrapped; - } - - public Extent getBypassHistory() { - return bypassHistory; - } - - public Extent getBypassAll() { - return bypassAll; - } - - @Nonnull - public FaweLimit getLimit() { - return limit; - } - - public Player getPlayer() { - return player; - } - - public AbstractChangeSet getChangeTask() { - return changeTask; - } - - public BlockBag getBlockBag() { - return blockBag; - } - - public Relighter getRelighter() { - return relighter; - } - - public boolean isWNAMode() { - return wnaMode; - } - - @Nullable - public Region[] getAllowedRegions() { - return allowedRegions; - } - - -} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index beb085a0d..f1e21c067 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -258,47 +258,6 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { @Nullable private final Region[] allowedRegions; - @Deprecated(forRemoval = true) - public EditSession( - @Nonnull EventBus bus, World world, @Nullable Player actor, - @Nullable FaweLimit limit, @Nullable AbstractChangeSet changeSet, - @Nullable RegionWrapper[] allowedRegions, @Nullable Boolean autoQueue, - @Nullable Boolean fastmode, @Nullable Boolean checkMemory, @Nullable Boolean combineStages, - @Nullable BlockBag blockBag, @Nullable EditSessionEvent event - ) { - this(new EditSessionBuilder(bus).world(world).actor(actor) - .limit(limit) - .changeSet(changeSet) - .allowedRegions(allowedRegions) - .fastMode(fastmode) - .checkMemory(checkMemory) - .combineStages(combineStages) - .blockBag(blockBag) - .event(event)); - } - //FAWE end - - /** - * Construct the object with a maximum number of blocks and a block bag. - * - * @param eventBus the event bus - * @param world the world - * @param maxBlocks the maximum number of blocks that can be changed, or -1 to use no limit - * @param blockBag an optional {@link BlockBag} to use, otherwise null - * @param event the event to call with the extent - */ - //FAWE start - EditSessionEvent - @Deprecated(forRemoval = true) - public EditSession( - @Nonnull EventBus eventBus, - World world, - int maxBlocks, - @Nullable BlockBag blockBag, - EditSessionEvent event - ) { - this(eventBus, world, null, null, null, null, true, null, null, null, blockBag, event); - } - EditSession(EditSessionBuilder builder) { super(builder.compile().getExtent()); this.world = builder.getWorld(); @@ -324,27 +283,6 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { this.allowedRegions = builder.getAllowedRegions() != null ? builder.getAllowedRegions().clone() : null; } - @Deprecated(forRemoval = true) - public EditSession(com.fastasyncworldedit.core.util.EditSessionBuilder builder) { - super(builder.compile().getExtent()); - this.world = builder.getWorld(); - this.bypassHistory = builder.getBypassHistory(); - this.bypassAll = builder.getBypassAll(); - this.originalLimit = builder.getLimit(); - this.limit = builder.getLimit().copy(); - this.actor = builder.getPlayer(); - this.changeSet = builder.getChangeTask(); - this.minY = world.getMinY(); - this.maxY = world.getMaxY(); - this.blockBag = builder.getBlockBag(); - this.history = changeSet != null; - this.relighter = builder.getRelighter(); - this.wnaMode = builder.isWNAMode(); - this.tracingExtents = null; - - this.allowedRegions = builder.getAllowedRegions() != null ? builder.getAllowedRegions().clone() : null; - } - /** * The limit for this specific edit (blocks etc). * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java index 65d92d0f8..13d159913 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java @@ -377,14 +377,6 @@ public final class EditSessionBuilder { return allowedRegions(new Region[]{RegionWrapper.GLOBAL()}); } - /** - * Does nothing as of 1.13 new queueing system - */ - @Deprecated(forRemoval = true) - public EditSessionBuilder autoQueue(@Nullable Boolean autoQueue) { - return this; - } - /** * Set fast mode. Use null to set to actor's fast mode setting. Also set to true by default if history for console disabled */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java index be9dabfc4..2068b9947 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/Constants.java @@ -56,13 +56,6 @@ public final class Constants { @Deprecated(forRemoval = true, since = "2.0.0") public static final int DATA_VERSION_MC_1_13_2 = 1631; - /** - * The DataVersion for Minecraft 1.14 - * @deprecated If Fawe drops interaction with 1.14, this method is subject to removal. - */ - @Deprecated(forRemoval = true, since = "2.0.0") - public static final int DATA_VERSION_MC_1_14 = 1952; - /** * The DataVersion for Minecraft 1.15 */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java index f4b51a8d4..a58524825 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/RegionIntersection.java @@ -61,17 +61,6 @@ public class RegionIntersection extends AbstractRegion { this(null, regions); } - /** - * Create a new instance with the included list of regions. - * - * @param regions a list of regions, which is copied - * @deprecated Use {@link #RegionIntersection(List)} to match upstream - */ - @Deprecated(forRemoval = true) - public RegionIntersection(Collection regions) { - this(null, regions); - } - /** * Create a new instance with the included list of regions. * From d98f626ba6c81af9448ba934a6206046a9e08976 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 22 Dec 2021 11:37:01 +0000 Subject: [PATCH 30/81] Reverse a "debug" change to BukkitImplLoader --- .../com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java index 29679eef1..3224aec12 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java @@ -172,9 +172,6 @@ public class BukkitImplLoader { if (className.equals(customCandidate)) { LOGGER.warn("Failed to load the Bukkit adapter class '" + className + "'", e); } - if (className.contains("Adapter") && className.contains("18")) { - e.printStackTrace(); - } } } From 77802758a9d1889d1f4dea5f8b858ef8e5375474 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 22 Dec 2021 11:44:37 +0000 Subject: [PATCH 31/81] Fix parsing of build in FaweVersion --- .../src/main/java/com/fastasyncworldedit/core/FaweVersion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java index 2298d491b..6ce56a244 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java @@ -36,7 +36,8 @@ public class FaweVersion { } this.semver = ver; this.snapshot = split.length > 1 && split[1].toLowerCase(Locale.ROOT).contains("snapshot"); - this.build = version.contains("-") ? Integer.parseInt(version.substring(version.indexOf('-') + 10)) : 0; + int buildIndex = this.snapshot ? 2 : 1; + this.build = split.length == buildIndex + 1 ? Integer.parseInt(split[buildIndex]) : 0; this.hash = Integer.parseInt(commit.substring(commit.indexOf('=') + 1), 16); String[] split2 = date.substring(date.indexOf('=') + 1).split("\\."); this.year = Integer.parseInt(split2[0]); From 1715f35341139436a666093a9d7f7e30c69dfbf0 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 22 Dec 2021 13:10:04 +0100 Subject: [PATCH 32/81] refactor: Do prepared statements properly - Update TextureUtil client jar to 1.18.1 - Limit the update checker to our domain --- .../core/database/RollbackDatabase.java | 76 ++++++------------- .../core/util/TextureUtil.java | 8 +- .../core/util/UpdateNotification.java | 2 + 3 files changed, 29 insertions(+), 57 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java index 209f93e3f..9dd001687 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java @@ -11,7 +11,6 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.World; import org.apache.logging.log4j.Logger; -import org.intellij.lang.annotations.Language; import javax.annotation.Nonnull; import java.io.File; @@ -37,35 +36,8 @@ public class RollbackDatabase extends AsyncNotifyQueue { private final String prefix; private final File dbLocation; private final World world; - private Connection connection; - - @Language("SQLite") - private String createTable = "CREATE TABLE IF NOT EXISTS `{0}edits` (`player` BLOB(16) NOT NULL,`id` INT NOT NULL, `time` INT NOT NULL,`x1` INT NOT NULL,`x2` INT NOT NULL,`z1` INT NOT NULL,`z2` INT NOT NULL,`y1` INT NOT NULL, `y2` INT NOT NULL, `size` INT NOT NULL, `command` VARCHAR, PRIMARY KEY (player, id))"; - @Language("SQLite") - private String updateTable1 = "ALTER TABLE `{0}edits` ADD COLUMN `command` VARCHAR"; - @Language("SQLite") - private String updateTable2 = "alter table `{0}edits` add size int default 0 not null"; - @Language("SQLite") - private String insertEdit = "INSERT OR REPLACE INTO `{0}edits` (`player`,`id`,`time`,`x1`,`x2`,`z1`,`z2`,`y1`,`y2`,`command`,`size`) VALUES(?,?,?,?,?,?,?,?,?,?,?)"; - @Language("SQLite") - private String purge = "DELETE FROM `{0}edits` WHERE `time`? AND `x2`>=? AND `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? AND `player`=? ORDER BY `time` DESC, `id` DESC"; - @Language("SQLite") - private String getEditsUserAsc = "SELECT * FROM `{0}edits` WHERE `time`>? AND `x2`>=? AND `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? AND `player`=? ORDER BY `time` ASC, `id` ASC"; - @Language("SQLite") - private String getEdits = "SELECT * FROM `{0}edits` WHERE `time`>? AND `x2`>=? AND `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? ORDER BY `time` DESC, `id` DESC"; - @Language("SQLite") - private String getEditsAsc = "SELECT * FROM `{0}edits` WHERE `time`>? AND `x2`>=? AND `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? ORDER BY `time` , `id` "; - @Language("SQLite") - private String getEditUser = "SELECT * FROM `{0}edits` WHERE `player`=? AND `id`=?"; - - @Language("SQLite") - private String deleteEditsUser = "DELETE FROM `{0}edits` WHERE `player`=? AND `time`>? AND `x2`>=? AND `x1`<=? AND `y2`>=? AND `y1`<=? AND `z2`>=? AND `z1`<=?"; - @Language("SQLite") - private String deleteEditUser = "DELETE FROM `{0}edits` WHERE `player`=? AND `id`=?"; - private final ConcurrentLinkedQueue historyChanges = new ConcurrentLinkedQueue<>(); + private Connection connection; RollbackDatabase(World world) throws SQLException, ClassNotFoundException { super((t, e) -> e.printStackTrace()); @@ -77,20 +49,6 @@ public class RollbackDatabase extends AsyncNotifyQueue { ); connection = openConnection(); - // update vars - createTable = createTable.replace("{0}", prefix); - updateTable1 = updateTable1.replace("{0}", prefix); - updateTable2 = updateTable2.replace("{0}", prefix); - insertEdit = insertEdit.replace("{0}", prefix); - purge = purge.replace("{0}", prefix); - getEditsUser = getEditsUser.replace("{0}", prefix); - getEditsUserAsc = getEditsUserAsc.replace("{0}", prefix); - getEdits = getEdits.replace("{0}", prefix); - getEditsAsc = getEditsAsc.replace("{0}", prefix); - getEditUser = getEditUser.replace("{0}", prefix); - deleteEditsUser = deleteEditsUser.replace("{0}", prefix); - deleteEditUser = deleteEditUser.replace("{0}", prefix); - try { init().get(); purge((int) TimeUnit.DAYS.toSeconds(Settings.IMP.HISTORY.DELETE_AFTER_DAYS)); @@ -105,14 +63,17 @@ public class RollbackDatabase extends AsyncNotifyQueue { public Future init() { return call(() -> { - try (PreparedStatement stmt = connection.prepareStatement(createTable)) { + try (PreparedStatement stmt = connection.prepareStatement("CREATE TABLE IF NOT EXISTS`" + this.prefix + + "edits` (`player` BLOB(16) NOT NULL,`id` INT NOT NULL, `time` INT NOT NULL,`x1`" + + "INT NOT NULL,`x2` INT NOT NULL,`z1` INT NOT NULL,`z2` INT NOT NULL,`y1`" + + "INT NOT NULL, `y2` INT NOT NULL, `size` INT NOT NULL, `command` VARCHAR, PRIMARY KEY (player, id))")) { stmt.executeUpdate(); } - try (PreparedStatement stmt = connection.prepareStatement(updateTable1)) { + try (PreparedStatement stmt = connection.prepareStatement("ALTER TABLE`" + this.prefix + "edits` ADD COLUMN `command` VARCHAR")) { stmt.executeUpdate(); } catch (SQLException ignored) { } // Already updated - try (PreparedStatement stmt = connection.prepareStatement(updateTable2)) { + try (PreparedStatement stmt = connection.prepareStatement("ALTER TABLE`" + this.prefix + "edits` ADD SIZE INT DEFAULT 0 NOT NULL")) { stmt.executeUpdate(); } catch (SQLException ignored) { } // Already updated @@ -122,7 +83,7 @@ public class RollbackDatabase extends AsyncNotifyQueue { public Future delete(UUID uuid, int id) { return call(() -> { - try (PreparedStatement stmt = connection.prepareStatement(deleteEditUser)) { + try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM`" + this.prefix + "edits` WHERE `player`=? AND `id`=?")) { stmt.setBytes(1, toBytes(uuid)); stmt.setInt(2, id); return stmt.executeUpdate(); @@ -132,7 +93,8 @@ public class RollbackDatabase extends AsyncNotifyQueue { public Future getEdit(@Nonnull UUID uuid, int id) { return call(() -> { - try (PreparedStatement stmt = connection.prepareStatement(getEditUser)) { + try (PreparedStatement stmt = connection.prepareStatement("SELECT * FROM`" + this.prefix + + "edits` WHERE `player`=? AND `id`=?")) { stmt.setBytes(1, toBytes(uuid)); stmt.setInt(2, id); ResultSet result = stmt.executeQuery(); @@ -172,7 +134,7 @@ public class RollbackDatabase extends AsyncNotifyQueue { long now = System.currentTimeMillis() / 1000; final int then = (int) (now - diff); return call(() -> { - try (PreparedStatement stmt = connection.prepareStatement(purge)) { + try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM`" + this.prefix + "edits` WHERE `time` future = call(() -> { try { int count = 0; - String stmtStr = ascending ? uuid == null ? getEditsAsc : getEditsUserAsc : - uuid == null ? getEdits : getEditsUser; + String stmtStr = ascending ? uuid == null ? "SELECT * FROM`" + this.prefix + "edits` WHERE `time`>? AND `x2`>=? AND" + + " `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? ORDER BY `time` , `id`" : + "SELECT * FROM`" + this.prefix + "edits` WHERE `time`>? AND" + + " `x2`>=? AND `x1`<=? AND `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? AND `player`=? ORDER BY `time` ASC, `id` ASC" : + uuid == null ? "SELECT * FROM`" + this.prefix + "edits` WHERE `time`>? AND `x2`>=? AND `x1`<=? AND `z2`>=? " + + "AND `z1`<=? AND `y2`>=? AND `y1`<=? ORDER BY `time` DESC, `id` DESC" : + "SELECT * FROM`" + this.prefix + "edits` WHERE `time`>? AND `x2`>=? AND `x1`<=? AND" + + " `z2`>=? AND `z1`<=? AND `y2`>=? AND `y1`<=? AND `player`=? ORDER BY `time` DESC, `id` DESC"; try (PreparedStatement stmt = connection.prepareStatement(stmtStr)) { stmt.setInt(1, (int) (minTime / 1000)); stmt.setInt(2, pos1.getBlockX()); @@ -221,7 +189,8 @@ public class RollbackDatabase extends AsyncNotifyQueue { } while (result.next()); } if (delete && uuid != null) { - try (PreparedStatement stmt = connection.prepareStatement(deleteEditsUser)) { + try (PreparedStatement stmt = connection.prepareStatement("DELETE FROM`" + this.prefix + + "edits` WHERE `player`=? AND `time`>? AND `x2`>=? AND `x1`<=? AND `y2`>=? AND `y1`<=? AND `z2`>=? AND `z1`<=?")) { stmt.setInt(1, (int) (minTime / 1000)); stmt.setInt(2, pos1.getBlockX()); stmt.setInt(3, pos2.getBlockX()); @@ -267,7 +236,8 @@ public class RollbackDatabase extends AsyncNotifyQueue { RollbackOptimizedHistory[] copy = IntStream.range(0, size) .mapToObj(i -> historyChanges.poll()).toArray(RollbackOptimizedHistory[]::new); - try (PreparedStatement stmt = connection.prepareStatement(insertEdit)) { + try (PreparedStatement stmt = connection.prepareStatement("INSERT OR REPLACE INTO`" + this.prefix + "edits`" + + " (`player`,`id`,`time`,`x1`,`x2`,`z1`,`z2`,`y1`,`y2`,`command`,`size`) VALUES(?,?,?,?,?,?,?,?,?,?,?)")) { // `player`,`id`,`time`,`x1`,`x2`,`z1`,`z2`,`y1`,`y2`,`command`,`size`) VALUES(?,?,?,?,?,?,?,?,?,?,?)" for (RollbackOptimizedHistory change : copy) { UUID uuid = change.getUUID(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index 59078cba5..d1e9a17a9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -353,10 +353,10 @@ public class TextureUtil implements TextureHolder { LOGGER.info("Downloading asset jar from Mojang, please wait..."); new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/").mkdirs(); try (BufferedInputStream in = new BufferedInputStream( - new URL("https://launcher.mojang.com/v1/objects/d49eb6caed53d23927648c97451503442f9e26fd/client.jar") + new URL("https://launcher.mojang.com/v1/objects/7e46fb47609401970e2818989fa584fd467cd036/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.jar")) { + Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.1.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { @@ -810,10 +810,10 @@ public class TextureUtil implements TextureHolder { new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/") .mkdirs(); try (BufferedInputStream in = new BufferedInputStream( - new URL("https://launcher.mojang.com/v1/objects/d49eb6caed53d23927648c97451503442f9e26fd/client.jar") + new URL("https://launcher.mojang.com/v1/objects/7e46fb47609401970e2818989fa584fd467cd036/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.jar")) { + Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.1.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java index d680137e9..30c14c92f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java @@ -11,6 +11,7 @@ import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import org.apache.logging.log4j.Logger; import org.w3c.dom.Document; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.net.URL; @@ -29,6 +30,7 @@ public class UpdateNotification { if (Settings.IMP.ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit/api/xml/").openStream()); faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent(); From 34f971c72916729fcccc2f2f12f9de68fe93408e Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 22 Dec 2021 12:19:20 +0000 Subject: [PATCH 33/81] Add classes with the correct minor version to the start of the adapter candidates list --- .../bukkit/adapter/BukkitImplLoader.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java index 3224aec12..11cee4f14 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplLoader.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.bukkit.adapter; +import com.fastasyncworldedit.bukkit.util.MinecraftVersion; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.util.io.Closer; import org.apache.logging.log4j.Logger; @@ -39,6 +40,8 @@ public class BukkitImplLoader { private static final Logger LOGGER = LogManagerCompat.getLogger(); private final List adapterCandidates = new ArrayList<>(); + private final String minorMCVersion = String.valueOf(new MinecraftVersion().getMinor()); + private int zeroth = 0; private String customCandidate; private static final String SEARCH_PACKAGE = "com.sk89q.worldedit.bukkit.adapter.impl.fawe"; @@ -73,6 +76,7 @@ public class BukkitImplLoader { String className = System.getProperty("worldedit.bukkit.adapter"); if (className != null) { customCandidate = className; + zeroth = 1; adapterCandidates.add(className); LOGGER.info("-Dworldedit.bukkit.adapter used to add " + className + " to the list of available Bukkit adapters"); } @@ -101,7 +105,11 @@ public class BukkitImplLoader { int beginIndex = 0; int endIndex = className.length() - CLASS_SUFFIX.length(); className = className.substring(beginIndex, endIndex); - adapterCandidates.add(className); + if (className.contains(minorMCVersion)) { + adapterCandidates.add(zeroth, className); + } else { + adapterCandidates.add(className); + } } } finally { closer.close(); @@ -142,7 +150,11 @@ public class BukkitImplLoader { int beginIndex = 0; int endIndex = resource.length() - CLASS_SUFFIX.length(); String className = resource.substring(beginIndex, endIndex); - adapterCandidates.add(className); + if (className.contains(minorMCVersion)) { + adapterCandidates.add(zeroth, className); + } else { + adapterCandidates.add(className); + } } } From 7da921e075cf2f066ac690ede4b2689abf32b2e4 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 22 Dec 2021 20:58:23 +0100 Subject: [PATCH 34/81] refactor: Deprecate `IMP` initializors in favor of builders --- .../v1_17_R1_2/PaperweightFaweAdapter.java | 4 +- .../PaperweightFaweWorldNativeAccess.java | 4 +- .../fawe/v1_17_R1_2/PaperweightGetBlocks.java | 10 +- .../PaperweightPlatformAdapter.java | 14 +- .../PaperweightStarlightRelighter.java | 8 +- .../v1_17_R1_2/regen/PaperweightRegen.java | 10 +- .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 4 +- .../PaperweightFaweWorldNativeAccess.java | 4 +- .../fawe/v1_18_R1/PaperweightGetBlocks.java | 10 +- .../v1_18_R1/PaperweightPlatformAdapter.java | 12 +- .../PaperweightStarlightRelighter.java | 8 +- .../fawe/v1_18_R1/regen/PaperweightRegen.java | 10 +- .../fastasyncworldedit/bukkit/FaweBukkit.java | 14 +- .../bukkit/adapter/IBukkitAdapter.java | 2 +- .../bukkit/adapter/NMSAdapter.java | 6 +- .../bukkit/adapter/NMSRelighterFactory.java | 2 +- .../bukkit/adapter/Regenerator.java | 2 +- .../bukkit/listener/ChunkListener.java | 28 +- .../bukkit/listener/ChunkListener9.java | 6 +- .../bukkit/listener/RenderListener.java | 14 +- .../bukkit/regions/ResidenceFeature.java | 2 +- .../FaweDelegateRegionManager.java | 34 +- .../FaweDelegateSchematicHandler.java | 4 +- .../plotsquared/FaweQueueCoordinator.java | 6 +- .../bukkit/regions/plotsquared/FaweTrim.java | 2 +- .../regions/plotsquared/PlotSetBiome.java | 2 +- .../regions/plotsquared/ReplaceAll.java | 6 +- .../bukkit/util/BukkitItemStack.java | 6 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 6 +- .../sk89q/worldedit/bukkit/BukkitWorld.java | 2 +- .../worldedit/bukkit/WorldEditPlugin.java | 2 +- .../bukkit/adapter/BukkitImplAdapter.java | 2 +- .../com/fastasyncworldedit/core/Fawe.java | 67 ++-- .../com/fastasyncworldedit/core/FaweAPI.java | 29 +- .../fastasyncworldedit/core/FaweCache.java | 18 +- .../core/command/AnvilCommands.java | 2 +- .../core/command/CFICommands.java | 16 +- .../core/command/ListFilters.java | 2 +- .../core/command/PlotLoader.java | 4 +- .../command/tool/brush/BrushSettings.java | 2 +- .../core/command/tool/brush/InspectBrush.java | 4 +- .../core/configuration/Settings.java | 342 +++++++++--------- .../core/database/RollbackDatabase.java | 10 +- .../core/entity/LazyBaseEntity.java | 2 +- .../platform/binding/ConsumeBindings.java | 2 +- .../core/extent/FaweRegionExtent.java | 14 +- .../core/extent/MemoryCheckingExtent.java | 2 +- .../core/extent/ProcessedWEExtent.java | 14 +- .../clipboard/DiskOptimizedClipboard.java | 8 +- .../clipboard/MemoryOptimizedClipboard.java | 2 +- .../extent/clipboard/ReadOnlyClipboard.java | 4 +- .../clipboard/io/FastSchematicReader.java | 4 +- .../clipboard/io/FastSchematicWriter.java | 2 +- .../io/schematic/MinecraftStructure.java | 10 +- .../clipboard/io/schematic/PNGWriter.java | 2 +- .../io/schematic/visualizer/SchemVis.java | 4 +- .../extent/filter/block/CharFilterBlock.java | 2 +- .../processor/ExtentBatchProcessorHolder.java | 2 +- .../extent/processor/MultiBatchProcessor.java | 4 +- .../heightmap/HeightmapProcessor.java | 4 +- .../processor/lighting/NMSRelighter.java | 12 +- .../processor/lighting/RelightProcessor.java | 4 +- .../function/pattern/BufferedPattern.java | 2 +- .../core/history/DiskStorageHistory.java | 10 +- .../core/history/MemoryOptimizedHistory.java | 12 +- .../history/changeset/AbstractChangeSet.java | 6 +- .../changeset/FaweStreamChangeSet.java | 4 +- .../core/math/MutableBlockVector3.java | 2 +- .../core/math/MutableVector3.java | 4 +- .../core/queue/IBlocks.java | 4 +- .../core/queue/implementation/Flood.java | 2 +- .../implementation/ParallelQueueExtent.java | 4 +- .../queue/implementation/QueueHandler.java | 8 +- .../SingleThreadQueueExtent.java | 22 +- .../implementation/blocks/BitSetBlocks.java | 2 +- .../implementation/blocks/CharBlocks.java | 2 +- .../implementation/blocks/CharSetBlocks.java | 4 +- .../implementation/blocks/NullChunkGet.java | 2 +- .../implementation/chunk/ChunkHolder.java | 4 +- .../implementation/packet/ChunkPacket.java | 8 +- .../preloader/AsyncPreloader.java | 10 +- .../core/regions/FaweMaskManager.java | 4 +- .../core/util/MainUtil.java | 72 ++-- .../fastasyncworldedit/core/util/MemUtil.java | 2 +- .../core/util/TaskManager.java | 41 ++- .../core/util/TextureUtil.java | 14 +- .../core/util/UpdateNotification.java | 8 +- .../core/util/WEManager.java | 22 +- .../core/util/collection/MemBlockSet.java | 2 +- .../core/util/image/ImageUtil.java | 8 +- .../util/progress/DefaultProgressTracker.java | 8 +- .../core/util/task/AsyncNotifyQueue.java | 2 +- .../util/task/SingleThreadIntervalQueue.java | 8 +- .../core/world/SimpleWorld.java | 2 +- .../core/wrappers/AsyncPlayer.java | 22 +- .../core/wrappers/WorldWrapper.java | 10 +- .../java/com/sk89q/worldedit/EditSession.java | 8 +- .../sk89q/worldedit/EditSessionBuilder.java | 30 +- .../com/sk89q/worldedit/LocalSession.java | 38 +- .../worldedit/command/BrushCommands.java | 14 +- .../worldedit/command/ClipboardCommands.java | 2 +- .../worldedit/command/GeneralCommands.java | 4 +- .../worldedit/command/GenerationCommands.java | 2 +- .../worldedit/command/HistorySubCommands.java | 10 +- .../worldedit/command/SchematicCommands.java | 42 +-- .../worldedit/command/UtilityCommands.java | 14 +- .../worldedit/command/WorldEditCommands.java | 10 +- .../worldedit/command/tool/SelectionWand.java | 4 +- .../worldedit/command/util/EntityRemover.java | 2 +- .../util/annotation/ConfirmHandler.java | 2 +- .../command/util/annotation/Preload.java | 2 +- .../util/annotation/PreloadHandler.java | 2 +- .../com/sk89q/worldedit/entity/Player.java | 10 +- .../platform/AbstractNonPlayerActor.java | 2 +- .../platform/AbstractPlayerActor.java | 6 +- .../worldedit/extension/platform/Actor.java | 4 +- .../platform/PlatformCommandManager.java | 4 +- .../extent/AbstractDelegateExtent.java | 4 +- .../com/sk89q/worldedit/extent/Extent.java | 2 +- .../sk89q/worldedit/extent/MaskingExtent.java | 2 +- .../worldedit/extent/clipboard/Clipboard.java | 4 +- .../extent/clipboard/io/ClipboardFormats.java | 8 +- .../clipboard/io/SpongeSchematicWriter.java | 2 +- .../transform/BlockTransformExtent.java | 2 +- .../extent/world/SurvivalModeExtent.java | 2 +- .../function/visitor/BreadthFirstSearch.java | 4 +- .../function/visitor/RegionVisitor.java | 4 +- .../sk89q/worldedit/regions/CuboidRegion.java | 2 +- .../com/sk89q/worldedit/regions/Region.java | 2 +- 129 files changed, 750 insertions(+), 677 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java index 801da6ad0..ad2ec33ef 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java @@ -510,10 +510,10 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements chunkPacket.setNativePacket(nmsPacket); } try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); + FaweCache.INSTANCE.CHUNK_FLAG.get().set(true); entityPlayer.connection.send(nmsPacket); } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); + FaweCache.INSTANCE.CHUNK_FLAG.get().set(false); } } }); diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java index ba56db4a7..68824d9e6 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java @@ -250,7 +250,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess TaskManager.IMP.sync(runnableVal)); + TaskManager.taskManager().async(() -> TaskManager.taskManager().sync(runnableVal)); } @Override @@ -269,7 +269,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess chunkTiles = new HashMap<>(nmsChunk.getBlockEntities()); @@ -726,7 +726,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc nmsChunk.mustNotSave = false; nmsChunk.markUnsaved(); // send to player - if (Settings.IMP.LIGHTING.MODE == 0 || !Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) { + if (Settings.settings().LIGHTING.MODE == 0 || !Settings.settings().LIGHTING.DELAY_PACKET_SENDING) { this.send(finalMask, finalLightUpdate); } if (finalizer != null) { @@ -735,7 +735,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc }; } if (syncTasks != null) { - QueueHandler queueHandler = Fawe.get().getQueueHandler(); + QueueHandler queueHandler = Fawe.instance().getQueueHandler(); Runnable[] finalSyncTasks = syncTasks; // Chain the sync tasks and the callback @@ -851,7 +851,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc data = new char[4096]; Arrays.fill(data, (char) 1); } - if (data == null || data == FaweCache.IMP.EMPTY_CHAR_4096) { + if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) { data = new char[4096]; Arrays.fill(data, (char) 1); } @@ -884,7 +884,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc return data; } - char[] paletteToOrdinal = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); + char[] paletteToOrdinal = FaweCache.INSTANCE.PALETTE_TO_BLOCK_CHAR.get(); try { if (num_palette != 1) { for (int i = 0; i < num_palette; i++) { diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java index 38d54e0ef..1f7706b57 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java @@ -215,7 +215,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { e.printStackTrace(); } } - return TaskManager.IMP.sync(() -> serverLevel.getChunk(chunkX, chunkZ)); + return TaskManager.taskManager().sync(() -> serverLevel.getChunk(chunkX, chunkZ)); } public static ChunkHolder getPlayerChunk(ServerLevel nmsWorld, final int chunkX, final int chunkZ) { @@ -247,7 +247,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { return; } LevelChunk levelChunk = optional.get(); - TaskManager.IMP.task(() -> { + TaskManager.taskManager().task(() -> { ClientboundLevelChunkPacket chunkPacket = new ClientboundLevelChunkPacket(levelChunk); nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(chunkPacket)); if (lighting) { @@ -283,10 +283,10 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { if (set == null) { return newChunkSection(layer); } - final int[] blockToPalette = FaweCache.IMP.BLOCK_TO_PALETTE.get(); - final int[] paletteToBlock = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - final long[] blockStates = FaweCache.IMP.BLOCK_STATES.get(); - final int[] blocksCopy = FaweCache.IMP.SECTION_BLOCKS.get(); + final int[] blockToPalette = FaweCache.INSTANCE.BLOCK_TO_PALETTE.get(); + final int[] paletteToBlock = FaweCache.INSTANCE.PALETTE_TO_BLOCK.get(); + final long[] blockStates = FaweCache.INSTANCE.BLOCK_STATES.get(); + final int[] blocksCopy = FaweCache.INSTANCE.SECTION_BLOCKS.get(); try { int[] num_palette_buffer = new int[1]; Map ticking_blocks = new HashMap<>(); @@ -303,7 +303,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { int num_palette = num_palette_buffer[0]; // BlockStates int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { + if (Settings.settings().PROTOCOL_SUPPORT_FIX || num_palette != 1) { bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry } else { bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightStarlightRelighter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightStarlightRelighter.java index bd8363ece..d51b3a6fc 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightStarlightRelighter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightStarlightRelighter.java @@ -129,7 +129,7 @@ public class PaperweightStarlightRelighter implements Relighter { while (iterator.hasNext()) { coords.add(new ChunkPos(iterator.nextLong())); } - TaskManager.IMP.task(() -> { + TaskManager.taskManager().task(() -> { // trigger chunk load and apply ticket on main thread List> futures = new ArrayList<>(); for (ChunkPos pos : coords) { @@ -153,9 +153,9 @@ public class PaperweightStarlightRelighter implements Relighter { LOGGER.warn("Processed {} chunks instead of {}", i, coords.size()); } // post process chunks on main thread - TaskManager.IMP.task(() -> postProcessChunks(coords)); + TaskManager.taskManager().task(() -> postProcessChunks(coords)); // call callback on our own threads - TaskManager.IMP.async(andThen); + TaskManager.taskManager().async(andThen); } ) ); @@ -184,7 +184,7 @@ public class PaperweightStarlightRelighter implements Relighter { * Also, if chunk packets are sent delayed, we need to do that here */ private void postProcessChunks(Set coords) { - boolean delay = Settings.IMP.LIGHTING.DELAY_PACKET_SENDING; + boolean delay = Settings.settings().LIGHTING.DELAY_PACKET_SENDING; for (ChunkPos pos : coords) { int x = pos.x; int z = pos.z; diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java index 2e16b9f28..6807c7a05 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java @@ -232,7 +232,7 @@ public class PaperweightRegen extends Regenerator) () -> new ServerLevel( + freshWorld = Fawe.instance().getQueueHandler().sync((Supplier) () -> new ServerLevel( server, server.executor, session, @@ -336,7 +336,7 @@ public class PaperweightRegen extends Regenerator { + Fawe.instance().getQueueHandler().sync(() -> { try { freshChunkProvider.close(false); } catch (IOException e) { @@ -348,7 +348,7 @@ public class PaperweightRegen extends Regenerator blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); + TaskManager.taskManager().task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); } @Override @@ -403,7 +403,7 @@ public class PaperweightRegen extends Regenerator { + Fawe.instance().getQueueHandler().sync(() -> { try { Map map = (Map) serverWorldsField.get(Bukkit.getServer()); map.remove("worldeditregentempworld"); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index 76c9f6225..c04b4254a 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -504,10 +504,10 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements chunkPacket.setNativePacket(nmsPacket); } try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); + FaweCache.INSTANCE.CHUNK_FLAG.get().set(true); entityPlayer.connection.send(nmsPacket); } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); + FaweCache.INSTANCE.CHUNK_FLAG.get().set(false); } } }); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java index e6bb23523..d95e260b6 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java @@ -250,7 +250,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess TaskManager.IMP.sync(runnableVal)); + TaskManager.taskManager().async(() -> TaskManager.taskManager().sync(runnableVal)); } @Override @@ -269,7 +269,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess chunkTiles = new HashMap<>(nmsChunk.getBlockEntities()); @@ -755,7 +755,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc nmsChunk.mustNotSave = false; nmsChunk.setUnsaved(true); // send to player - if (Settings.IMP.LIGHTING.MODE == 0 || !Settings.IMP.LIGHTING.DELAY_PACKET_SENDING) { + if (Settings.settings().LIGHTING.MODE == 0 || !Settings.settings().LIGHTING.DELAY_PACKET_SENDING) { this.send(finalMask, finalLightUpdate); } if (finalizer != null) { @@ -764,7 +764,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc }; } if (syncTasks != null) { - QueueHandler queueHandler = Fawe.get().getQueueHandler(); + QueueHandler queueHandler = Fawe.instance().getQueueHandler(); Runnable[] finalSyncTasks = syncTasks; // Chain the sync tasks and the callback @@ -881,7 +881,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc data = new char[4096]; Arrays.fill(data, (char) 1); } - if (data == null || data == FaweCache.IMP.EMPTY_CHAR_4096) { + if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) { data = new char[4096]; Arrays.fill(data, (char) 1); } @@ -921,7 +921,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc return data; } - char[] paletteToOrdinal = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); + char[] paletteToOrdinal = FaweCache.INSTANCE.PALETTE_TO_BLOCK_CHAR.get(); try { if (num_palette != 1) { for (int i = 0; i < num_palette; i++) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java index a7bdb4825..47b67b009 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java @@ -236,7 +236,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { e.printStackTrace(); } } - return TaskManager.IMP.sync(() -> serverLevel.getChunk(chunkX, chunkZ)); + return TaskManager.taskManager().sync(() -> serverLevel.getChunk(chunkX, chunkZ)); } public static ChunkHolder getPlayerChunk(ServerLevel nmsWorld, final int chunkX, final int chunkZ) { @@ -268,7 +268,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { return; } LevelChunk levelChunk = optional.get(); - TaskManager.IMP.task(() -> { + TaskManager.taskManager().task(() -> { ClientboundLevelChunkWithLightPacket packet = new ClientboundLevelChunkWithLightPacket(levelChunk, nmsWorld.getChunkSource().getLightEngine(), null, null , true, false); // last false is to not bother with x-ray @@ -299,10 +299,10 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { if (set == null) { return newChunkSection(layer, biomeRegistry, biomes); } - final int[] blockToPalette = FaweCache.IMP.BLOCK_TO_PALETTE.get(); - final int[] paletteToBlock = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - final long[] blockStates = FaweCache.IMP.BLOCK_STATES.get(); - final int[] blocksCopy = FaweCache.IMP.SECTION_BLOCKS.get(); + final int[] blockToPalette = FaweCache.INSTANCE.BLOCK_TO_PALETTE.get(); + final int[] paletteToBlock = FaweCache.INSTANCE.PALETTE_TO_BLOCK.get(); + final long[] blockStates = FaweCache.INSTANCE.BLOCK_STATES.get(); + final int[] blocksCopy = FaweCache.INSTANCE.SECTION_BLOCKS.get(); try { int[] num_palette_buffer = new int[1]; Map ticking_blocks = new HashMap<>(); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java index 8b7042d63..767674188 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java @@ -130,7 +130,7 @@ public class PaperweightStarlightRelighter implements Relighter { while (iterator.hasNext()) { coords.add(new ChunkPos(iterator.nextLong())); } - TaskManager.IMP.task(() -> { + TaskManager.taskManager().task(() -> { // trigger chunk load and apply ticket on main thread List> futures = new ArrayList<>(); for (ChunkPos pos : coords) { @@ -154,9 +154,9 @@ public class PaperweightStarlightRelighter implements Relighter { LOGGER.warn("Processed {} chunks instead of {}", i, coords.size()); } // post process chunks on main thread - TaskManager.IMP.task(() -> postProcessChunks(coords)); + TaskManager.taskManager().task(() -> postProcessChunks(coords)); // call callback on our own threads - TaskManager.IMP.async(andThen); + TaskManager.taskManager().async(andThen); } ) ); @@ -185,7 +185,7 @@ public class PaperweightStarlightRelighter implements Relighter { * Also, if chunk packets are sent delayed, we need to do that here */ private void postProcessChunks(Set coords) { - boolean delay = Settings.IMP.LIGHTING.DELAY_PACKET_SENDING; + boolean delay = Settings.settings().LIGHTING.DELAY_PACKET_SENDING; for (ChunkPos pos : coords) { int x = pos.x; int z = pos.z; diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java index f916ebb91..85fb06d67 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -238,7 +238,7 @@ // PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); // // //init world -// freshWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new ServerLevel( +// freshWorld = Fawe.instance().getQueueHandler().sync((Supplier) () -> new ServerLevel( // server, // server.executor, // session, @@ -345,7 +345,7 @@ // // //shutdown chunk provider // try { -// Fawe.get().getQueueHandler().sync(() -> { +// Fawe.instance().getQueueHandler().sync(() -> { // try { // freshChunkProvider.close(false); // } catch (IOException e) { @@ -357,7 +357,7 @@ // // //remove world from server // try { -// Fawe.get().getQueueHandler().sync(this::removeWorldFromWorldsMap); +// Fawe.instance().getQueueHandler().sync(this::removeWorldFromWorldsMap); // } catch (Exception ignored) { // } // @@ -397,7 +397,7 @@ // @Override // protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { // // BlockPopulator#populate has to be called synchronously for TileEntity access -// TaskManager.IMP.task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); +// TaskManager.taskManager().task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); // } // // @Override @@ -412,7 +412,7 @@ // // //util // private void removeWorldFromWorldsMap() { -// Fawe.get().getQueueHandler().sync(() -> { +// Fawe.instance().getQueueHandler().sync(() -> { // try { // Map map = (Map) serverWorldsField.get(Bukkit.getServer()); // map.remove("worldeditregentempworld"); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 3d02b0de7..8aff475d1 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -68,7 +68,7 @@ public class FaweBukkit implements IFawe, Listener { public FaweBukkit(Plugin plugin) { this.plugin = plugin; try { - Settings.IMP.TICK_LIMITER.ENABLED = !Bukkit.hasWhitelist(); + Settings.settings().TICK_LIMITER.ENABLED = !Bukkit.hasWhitelist(); Fawe.set(this); Fawe.setupInjector(); try { @@ -76,7 +76,7 @@ public class FaweBukkit implements IFawe, Listener { } catch (Throwable e) { LOGGER.error("Brush Listener Failed", e); } - if (PaperLib.isPaper() && Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) { + if (PaperLib.isPaper() && Settings.settings().EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING > 1) { new RenderListener(plugin); } } catch (final Throwable e) { @@ -89,12 +89,12 @@ public class FaweBukkit implements IFawe, Listener { platformAdapter = new NMSAdapter(); //PlotSquared support is limited to Spigot/Paper as of 02/20/2020 - TaskManager.IMP.later(this::setupPlotSquared, 0); + TaskManager.taskManager().later(this::setupPlotSquared, 0); // Registered delayed Event Listeners - TaskManager.IMP.task(() -> { + TaskManager.taskManager().task(() -> { // Fix for ProtocolSupport - Settings.IMP.PROTOCOL_SUPPORT_FIX = + Settings.settings().PROTOCOL_SUPPORT_FIX = Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport"); // This class @@ -141,7 +141,7 @@ public class FaweBukkit implements IFawe, Listener { try { this.itemUtil = tmp = new ItemUtil(); } catch (Throwable e) { - Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES = false; + Settings.settings().EXPERIMENTAL.PERSISTENT_BRUSHES = false; LOGGER.error("Persistent Brushes Failed", e); } } @@ -311,7 +311,7 @@ public class FaweBukkit implements IFawe, Listener { return; } if (PlotSquared.get().getVersion().version[0] == 6) { - WEManager.IMP.addManager(new com.fastasyncworldedit.bukkit.regions.plotsquared.PlotSquaredFeature()); + WEManager.weManager().addManager(new com.fastasyncworldedit.bukkit.regions.plotsquared.PlotSquaredFeature()); LOGGER.info("Plugin 'PlotSquared' v6 found. Using it now."); } else { LOGGER.error("Incompatible version of PlotSquared found. Please use PlotSquared v6."); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java index aaac5c69f..29162b607 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java @@ -389,7 +389,7 @@ public interface IBukkitAdapter { * @return list of {@link org.bukkit.entity.Entity} */ default List getEntities(org.bukkit.World world) { - return TaskManager.IMP.sync(world::getEntities); + return TaskManager.taskManager().sync(world::getEntities); } } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 9f6b97d6a..f7bfd7d33 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -44,7 +44,7 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } char lastOrdinal = 0; boolean lastticking = false; - boolean tick_placed = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_PLACED; + boolean tick_placed = Settings.settings().EXPERIMENTAL.ALLOW_TICK_PLACED; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { @@ -121,8 +121,8 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } char lastOrdinal = 0; boolean lastticking = false; - boolean tick_placed = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_PLACED; - boolean tick_existing = Settings.IMP.EXPERIMENTAL.ALLOW_TICK_EXISTING; + boolean tick_placed = Settings.settings().EXPERIMENTAL.ALLOW_TICK_PLACED; + boolean tick_existing = Settings.settings().EXPERIMENTAL.ALLOW_TICK_EXISTING; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java index 89f16bafd..4fd78df85 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java @@ -18,7 +18,7 @@ public class NMSRelighterFactory implements RelighterFactory { Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { return new NMSRelighter( queue, - relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE) + relightMode != null ? relightMode : RelightMode.valueOf(Settings.settings().LIGHTING.MODE) ); } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index 97e15b9a6..58fd32512 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -151,7 +151,7 @@ public abstract class Regeneratorimp().getPlugin(); + Plugin plugin = Fawe.platform().getPlugin(); plm.registerEvents(this, plugin); - TaskManager.IMP.repeat(() -> { + TaskManager.taskManager().repeat(() -> { Location tmpLoc = lastCancelPos; if (tmpLoc != null) { LOGGER.info("[FAWE Tick Limiter] Detected and cancelled physics lag source at {}", tmpLoc); @@ -80,7 +80,7 @@ public abstract class ChunkListener implements Listener { counter.put(key, badLimit); } badChunks.clear(); - }, Settings.IMP.TICK_LIMITER.INTERVAL); + }, Settings.settings().TICK_LIMITER.INTERVAL); } } @@ -241,13 +241,13 @@ public abstract class ChunkListener implements Listener { if ((++physSkip & 1023) != 0) { return; } - FaweTimer timer = Fawe.get().getTimer(); + FaweTimer timer = Fawe.instance().getTimer(); if (timer.getTick() != physTick) { physTick = timer.getTick(); physStart = System.currentTimeMillis(); return; } else if (System.currentTimeMillis() - physStart - < Settings.IMP.TICK_LIMITER.PHYSICS_MS) { + < Settings.settings().TICK_LIMITER.PHYSICS_MS) { return; } } @@ -324,15 +324,15 @@ public abstract class ChunkListener implements Listener { int cx = x >> 4; int cz = z >> 4; int[] count = getCount(cx, cz); - if (count[1] >= Settings.IMP.TICK_LIMITER.FALLING) { + if (count[1] >= Settings.settings().TICK_LIMITER.FALLING) { event.setCancelled(true); return; } if (event.getEntityType() == EntityType.FALLING_BLOCK) { - if (++count[1] >= Settings.IMP.TICK_LIMITER.FALLING) { + if (++count[1] >= Settings.settings().TICK_LIMITER.FALLING) { // Only cancel falling blocks when it's lagging - if (Fawe.get().getTimer().getTPS() < 18) { + if (Fawe.instance().getTimer().getTPS() < 18) { cancelNearby(cx, cz); if (rateLimit <= 0) { rateLimit = 20; @@ -351,7 +351,7 @@ public abstract class ChunkListener implements Listener { */ @EventHandler(priority = EventPriority.LOWEST) public void onChunkLoad(ChunkLoadEvent event) { - if (!Settings.IMP.TICK_LIMITER.FIREWORKS_LOAD_CHUNKS) { + if (!Settings.settings().TICK_LIMITER.FIREWORKS_LOAD_CHUNKS) { Chunk chunk = event.getChunk(); Entity[] entities = chunk.getEntities(); World world = chunk.getWorld(); @@ -398,11 +398,11 @@ public abstract class ChunkListener implements Listener { int cx = loc.getBlockX() >> 4; int cz = loc.getBlockZ() >> 4; int[] count = getCount(cx, cz); - if (count[2] >= Settings.IMP.TICK_LIMITER.ITEMS) { + if (count[2] >= Settings.settings().TICK_LIMITER.ITEMS) { event.setCancelled(true); return; } - if (++count[2] >= Settings.IMP.TICK_LIMITER.ITEMS) { + if (++count[2] >= Settings.settings().TICK_LIMITER.ITEMS) { cleanup(loc.getChunk()); cancelNearby(cx, cz); if (rateLimit <= 0) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java index 0726af748..0d93b95d3 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java @@ -37,13 +37,13 @@ public class ChunkListener9 extends ChunkListener { event.setCancelled(true); return; } - if (System.currentTimeMillis() - physStart > Settings.IMP.TICK_LIMITER.PHYSICS_MS) { + if (System.currentTimeMillis() - physStart > Settings.settings().TICK_LIMITER.PHYSICS_MS) { physCancelPair = pair; event.setCancelled(true); return; } } - FaweTimer timer = Fawe.get().getTimer(); + FaweTimer timer = Fawe.instance().getTimer(); if (timer.getTick() != physTick) { physTick = timer.getTick(); physStart = System.currentTimeMillis(); @@ -52,7 +52,7 @@ public class ChunkListener9 extends ChunkListener { return; } if ((++physSkip & 1023) == 0) { - if (System.currentTimeMillis() - physStart > Settings.IMP.TICK_LIMITER.PHYSICS_MS) { + if (System.currentTimeMillis() - physStart > Settings.settings().TICK_LIMITER.PHYSICS_MS) { Block block = event.getBlock(); int cx = block.getX() >> 4; int cz = block.getZ() >> 4; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java index c76d85739..22a09deb8 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java @@ -28,7 +28,7 @@ public class RenderListener implements Listener { public RenderListener(Plugin plugin) { Bukkit.getPluginManager().registerEvents(this, plugin); - TaskManager.IMP.repeat(new Runnable() { + TaskManager.taskManager().repeat(new Runnable() { private long last = 0; @Override @@ -38,7 +38,7 @@ public class RenderListener implements Listener { } long now = System.currentTimeMillis(); - int tps32 = (int) (Math.round(Fawe.get().getTimer().getTPS()) * 32); + int tps32 = (int) (Math.round(Fawe.instance().getTimer().getTPS()) * 32); long diff = now - last; last = now; if (diff > 75) { @@ -56,7 +56,7 @@ public class RenderListener implements Listener { if (entrySet == null || !entrySet.hasNext()) { entrySet = views.entrySet().iterator(); } - int nowTick = (int) (Fawe.get().getTimer().getTick()); + int nowTick = (int) (Fawe.instance().getTimer().getTick()); while (entrySet.hasNext()) { Map.Entry entry = entrySet.next(); Player player = Bukkit.getPlayer(entry.getKey()); @@ -81,17 +81,17 @@ public class RenderListener implements Listener { private void setViewDistance(Player player, int value) { UUID uuid = player.getUniqueId(); - if (value == Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING) { + if (value == Settings.settings().EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING) { views.remove(uuid); } else { int[] val = views.get(uuid); if (val == null) { - val = new int[]{value, (int) Fawe.get().getTimer().getTick()}; + val = new int[]{value, (int) Fawe.instance().getTimer().getTick()}; UUID uid = player.getUniqueId(); views.put(uid, val); } else { if (value <= val[0]) { - val[1] = (int) Fawe.get().getTimer().getTick(); + val[1] = (int) Fawe.instance().getTimer().getTick(); } if (val[0] == value) { return; @@ -105,7 +105,7 @@ public class RenderListener implements Listener { private int getViewDistance(Player player) { int[] value = views.get(player.getUniqueId()); - return value == null ? Settings.IMP.EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING : value[0]; + return value == null ? Settings.settings().EXPERIMENTAL.DYNAMIC_CHUNK_RENDERING : value[0]; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java index 05243974d..d72769176 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java @@ -33,7 +33,7 @@ public class ResidenceFeature extends BukkitMaskManager implements Listener { return residence != null && (residence.getOwner().equals(player.getName()) || residence.getOwner().equals(player.getUniqueId().toString()) || - type == MaskType.MEMBER && TaskManager.IMP.sync(() -> residence + type == MaskType.MEMBER && TaskManager.taskManager().sync(() -> residence .getPermissions() .playerHas(player, "build", false))); } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java index 7d10ac33a..61f1943b1 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java @@ -53,7 +53,7 @@ public class FaweDelegateRegionManager { int maxY, Runnable whenDone ) { - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { World world = BukkitAdapter.adapt(getWorld(area.getWorldName())); EditSession session = WorldEdit.getInstance().newEditSessionBuilder().world(world).checkMemory(false). @@ -67,14 +67,14 @@ public class FaweDelegateRegionManager { session.flushQueue(); for (CuboidRegion region : regions) { FaweAPI.fixLighting(world, region, null, - RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE) + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.settings().LIGHTING.MODE) ); } } catch (MaxChangedBlocksException e) { e.printStackTrace(); } finally { if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } } } @@ -92,7 +92,7 @@ public class FaweDelegateRegionManager { @Nullable Runnable whenDone, @Nonnull PlotManager manager ) { - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { final HybridPlotWorld hybridPlotWorld = ((HybridPlotManager) manager).getHybridPlotWorld(); World world = BukkitAdapter.adapt(getWorld(hybridPlotWorld.getWorldName())); @@ -176,10 +176,10 @@ public class FaweDelegateRegionManager { world, new CuboidRegion(plot.getBottomAbs().getBlockVector3(), plot.getTopAbs().getBlockVector3()), null, - RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE) + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.settings().LIGHTING.MODE) ); if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } } }); @@ -192,7 +192,7 @@ public class FaweDelegateRegionManager { Location swapPos, final Runnable whenDone ) { - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { //todo because of the following code this should proably be in the Bukkit module World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); @@ -231,7 +231,7 @@ public class FaweDelegateRegionManager { e.printStackTrace(); } FaweAPI.fixLighting(pos1World, new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), null, - RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE) + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.settings().LIGHTING.MODE) ); FaweAPI.fixLighting(pos1World, new CuboidRegion( swapPos.getBlockVector3(), @@ -241,10 +241,10 @@ public class FaweDelegateRegionManager { swapPos.getZ() + pos2.getZ() - pos1.getZ() ) ), null, - RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE) + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.settings().LIGHTING.MODE) ); if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } } }); @@ -253,7 +253,7 @@ public class FaweDelegateRegionManager { public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, String world, Runnable whenDone) { region.expand(BlockVector3.at(extendBiome, 0, extendBiome)); region.expand(BlockVector3.at(-extendBiome, 0, -extendBiome)); - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { EditSession editSession = WorldEdit .getInstance() @@ -273,7 +273,7 @@ public class FaweDelegateRegionManager { e.printStackTrace(); } if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } } }); @@ -285,7 +285,7 @@ public class FaweDelegateRegionManager { final @NonNull Location pos3, final @NonNull Runnable whenDone ) { - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); World pos3World = BukkitAdapter.adapt(getWorld(pos3.getWorldName())); @@ -319,21 +319,21 @@ public class FaweDelegateRegionManager { pos3.getBlockVector3(), pos3.getBlockVector3().add(pos2.getBlockVector3().subtract(pos1.getBlockVector3())) ), - null, RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE) + null, RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.settings().LIGHTING.MODE) ); } catch (MaxChangedBlocksException e) { e.printStackTrace(); } } if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } }); return true; } public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) { - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { synchronized (FaweDelegateRegionManager.class) { World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); try (EditSession editSession = WorldEdit.getInstance().newEditSessionBuilder().world(pos1World) @@ -350,7 +350,7 @@ public class FaweDelegateRegionManager { editSession.flushQueue(); } if (whenDone != null) { - TaskManager.IMP.task(whenDone); + TaskManager.taskManager().task(whenDone); } } }); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java index e61cacce2..7ed54786e 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java @@ -132,7 +132,7 @@ public class FaweDelegateSchematicHandler { } }; if (Fawe.isMainThread()) { - com.fastasyncworldedit.core.util.TaskManager.IMP.async(r); + com.fastasyncworldedit.core.util.TaskManager.taskManager().async(r); } else { r.run(); } @@ -186,7 +186,7 @@ public class FaweDelegateSchematicHandler { } return; } - final CompoundTag weTag = (CompoundTag) FaweCache.IMP.asTag(tag); + final CompoundTag weTag = (CompoundTag) FaweCache.INSTANCE.asTag(tag); SchematicHandler.upload(uuid, file, "schem", new RunnableVal<>() { @Override public void run(OutputStream output) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java index 692a594aa..9c8888a8e 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java @@ -35,8 +35,8 @@ public class FaweQueueCoordinator extends QueueCoordinator { public FaweQueueCoordinator(World world) { super(world); this.world = world; - instance = Fawe.get().getQueueHandler().getQueue(world); - Fawe.get().getQueueHandler().unCache(); + instance = Fawe.instance().getQueueHandler().getQueue(world); + Fawe.instance().getQueueHandler().unCache(); } @Override @@ -194,7 +194,7 @@ public class FaweQueueCoordinator extends QueueCoordinator { @Override public boolean setTile(int x, int y, int z, CompoundTag tag) { - instance.setTile(x, y, z, (com.sk89q.jnbt.CompoundTag) FaweCache.IMP.asTag(tag)); + instance.setTile(x, y, z, (com.sk89q.jnbt.CompoundTag) FaweCache.INSTANCE.asTag(tag)); return true; } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java index f2621d90b..8bfab4939 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java @@ -37,7 +37,7 @@ public class FaweTrim extends SubCommand { return false; } ran = true; - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { try { // TODO NOT IMPLEMENTED //PlotTrim trim = new PlotTrim(plotPlayer, plotPlayer.getPlotAreaAbs(), strings[0], Boolean.parseBoolean(strings[1])); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java index 3977cf808..87db6655a 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java @@ -89,7 +89,7 @@ public class PlotSetBiome extends Command { return; } plot.addRunning(); - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { EditSession session = WorldEdit .getInstance() diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java index d894596df..ed77b3668 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java @@ -46,9 +46,9 @@ public class ReplaceAll extends Command { plot.addRunning(); FawePlayer fp = FawePlayer.wrap(player.getName()); Captions.TASK_START.send(player); - TaskManager.IMP.async(() -> fp.runAction(() -> { + TaskManager.taskManager().async(() -> fp.runAction(() -> { String worldName = plot.getWorldName(); - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Object value) { SetupUtils.manager.unload(worldName, true); @@ -58,7 +58,7 @@ public class ReplaceAll extends Command { String cmd = "/replaceallpattern " + worldName + " " + StringMan.join(args, " "); CommandEvent event = new CommandEvent(actor, cmd); PlatformCommandManager.getInstance().handleCommandOnCurrentThread(event); - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Object value) { plot.teleportPlayer(player); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitItemStack.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitItemStack.java index 9ec00af76..1eed3ad33 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitItemStack.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitItemStack.java @@ -34,7 +34,7 @@ public class BukkitItemStack extends BaseItemStack { @Nullable @Override public Object getNativeItem() { - ItemUtil util = Fawe.imp().getItemUtil(); + ItemUtil util = Fawe.platform().getItemUtil(); if (util != null && nativeItem == null) { return nativeItem = util.getNMSItem(stack); } @@ -58,7 +58,7 @@ public class BukkitItemStack extends BaseItemStack { public CompoundTag getNbtData() { if (!loadedNBT) { loadedNBT = true; - ItemUtil util = Fawe.imp().getItemUtil(); + ItemUtil util = Fawe.platform().getItemUtil(); if (util != null) { super.setNbtData(util.getNBT(stack)); } @@ -68,7 +68,7 @@ public class BukkitItemStack extends BaseItemStack { @Override public void setNbtData(@Nullable CompoundTag nbtData) { - ItemUtil util = Fawe.imp().getItemUtil(); + ItemUtil util = Fawe.platform().getItemUtil(); if (util != null) { stack = util.setNBT(stack, nbtData); nativeItem = null; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index ebf394d43..acfd5cacd 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -107,7 +107,7 @@ public class BukkitPlayer extends AbstractPlayerActor { this.player = player; //FAWE start this.permAttachment = plugin.getPermissionAttachmentManager().getOrAddAttachment(player); - if (player != null && Settings.IMP.CLIPBOARD.USE_DISK) { + if (player != null && Settings.settings().CLIPBOARD.USE_DISK) { BukkitPlayer cached = WorldEditPlugin.getInstance().getCachedPlayer(player); if (cached == null) { loadClipboardFromDisk(); @@ -169,7 +169,7 @@ public class BukkitPlayer extends AbstractPlayerActor { player.getInventory().setItemInMainHand(newItem); HashMap overflow = inv.addItem(item); if (!overflow.isEmpty()) { - TaskManager.IMP.sync(new RunnableVal<>() { + TaskManager.taskManager().sync(new RunnableVal<>() { @Override public void run(Object value) { for (Map.Entry entry : overflow.entrySet()) { @@ -243,7 +243,7 @@ public class BukkitPlayer extends AbstractPlayerActor { } org.bukkit.World finalWorld = world; //FAWE end - return TaskManager.IMP.sync(() -> player.teleport(new Location( + return TaskManager.taskManager().sync(() -> player.teleport(new Location( finalWorld, pos.getX(), pos.getY(), diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 3c7da3f12..91ffb6674 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -317,7 +317,7 @@ public class BukkitWorld extends AbstractWorld { @Override public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, BlockVector3 pt) { //FAWE start - allow tree commands to be undone and obey region restrictions - return TaskManager.IMP.sync(() -> WorldEditPlugin.getInstance().getBukkitImplAdapter().generateTree(type, editSession, pt, + return TaskManager.taskManager().sync(() -> WorldEditPlugin.getInstance().getBukkitImplAdapter().generateTree(type, editSession, pt, getWorld() )); //FAWE end diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 8ea0a918d..3fe92e41d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -380,7 +380,7 @@ public class WorldEditPlugin extends JavaPlugin { */ @Override public void onDisable() { - Fawe.get().onDisable(); + Fawe.instance().onDisable(); WorldEdit worldEdit = WorldEdit.getInstance(); worldEdit.getSessionManager().unload(); if (platform != null) { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 799e52bb9..38fdbff91 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -314,7 +314,7 @@ public interface BukkitImplAdapter extends IBukkitAdapter { @Nullable default World createWorld(WorldCreator creator) { - return ((FaweBukkit) Fawe.imp()).createWorldUnloaded(creator::createWorld); + return ((FaweBukkit) Fawe.platform()).createWorldUnloaded(creator::createWorld); } /** diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 4cea8e2cb..3640b7a88 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -101,17 +101,17 @@ public class Fawe { this.setupConfigs(); TaskManager.IMP = this.implementation.getTaskManager(); - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { MainUtil.deleteOlder( MainUtil.getFile(this.implementation - .getDirectory(), Settings.IMP.PATHS.HISTORY), - TimeUnit.DAYS.toMillis(Settings.IMP.HISTORY.DELETE_AFTER_DAYS), + .getDirectory(), Settings.settings().PATHS.HISTORY), + TimeUnit.DAYS.toMillis(Settings.settings().HISTORY.DELETE_AFTER_DAYS), false ); MainUtil.deleteOlder( MainUtil.getFile(this.implementation - .getDirectory(), Settings.IMP.PATHS.CLIPBOARD), - TimeUnit.DAYS.toMillis(Settings.IMP.CLIPBOARD.DELETE_AFTER_DAYS), + .getDirectory(), Settings.settings().PATHS.CLIPBOARD), + TimeUnit.DAYS.toMillis(Settings.settings().CLIPBOARD.DELETE_AFTER_DAYS), false ); }); @@ -123,28 +123,49 @@ public class Fawe { this.timer = new FaweTimer(); // Delayed worldedit setup - TaskManager.IMP.later(() -> { + TaskManager.taskManager().later(() -> { try { - WEManager.IMP.addManagers(Fawe.this.implementation.getMaskManagers()); + WEManager.weManager().addManagers(Fawe.this.implementation.getMaskManagers()); } catch (Throwable ignored) { } }, 0); - TaskManager.IMP.repeat(timer, 1); + TaskManager.taskManager().repeat(timer, 1); } /** * Get the implementation specific class. + * @deprecated use {@link #platform()} */ @SuppressWarnings("unchecked") + @Deprecated(forRemoval = true, since = "2.0.0") public static T imp() { return instance != null ? (T) instance.implementation : null; } + /** + * Get the implementation specific class. + * @since 2.0.0 + */ + @SuppressWarnings("unchecked") + public static T platform() { + return instance != null ? (T) instance.implementation : null; + } + + + /** + * Get the implementation independent class. + * @ use {@link #instance()} + */ + @Deprecated(forRemoval = true, since = "2.0.0") + public static Fawe get() { + return instance; + } + /** * Get the implementation independent class. */ - public static Fawe get() { + public static Fawe instance() { return instance; } @@ -225,8 +246,8 @@ public class Fawe { } public void onDisable() { - if (imp().getPreloader(false) != null) { - imp().getPreloader(false).cancel(); + if (platform().getPreloader(false) != null) { + platform().getPreloader(false).cancel(); } } @@ -296,7 +317,7 @@ public class Fawe { MainUtil.copyFile(MainUtil.getJarFile(), "lang/strings.json", null); // Setting up config.yml File file = new File(this.implementation.getDirectory(), "config.yml"); - Settings.IMP.PLATFORM = implementation.getPlatform().replace("\"", ""); + Settings.settings().PLATFORM = implementation.getPlatform().replace("\"", ""); try (InputStream stream = getClass().getResourceAsStream("/fawe.properties"); BufferedReader br = new BufferedReader(new InputStreamReader(stream))) { String versionString = br.readLine(); @@ -304,17 +325,17 @@ public class Fawe { String dateString = br.readLine(); br.close(); this.version = FaweVersion.tryParse(versionString, commitString, dateString); - Settings.IMP.DATE = new Date(100 + version.year, version.month, version.day).toString(); - Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit/" + version.build; - Settings.IMP.COMMIT = "https://github.com/IntellectualSites/FastAsyncWorldEdit/commit/" + Integer.toHexString(version.hash); + Settings.settings().DATE = new Date(100 + version.year, version.month, version.day).toString(); + Settings.settings().BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit/" + version.build; + Settings.settings().COMMIT = "https://github.com/IntellectualSites/FastAsyncWorldEdit/commit/" + Integer.toHexString(version.hash); } catch (Throwable ignored) { } try { - Settings.IMP.reload(file); + Settings.settings().reload(file); } catch (Throwable e) { LOGGER.error("Failed to load config.", e); } - Settings.IMP.QUEUE.TARGET_SIZE = Math.max(Settings.IMP.QUEUE.TARGET_SIZE, Settings.IMP.QUEUE.PARALLEL_THREADS); + Settings.settings().QUEUE.TARGET_SIZE = Math.max(Settings.settings().QUEUE.TARGET_SIZE, Settings.settings().QUEUE.PARALLEL_THREADS); try { byte[] in = new byte[0]; byte[] compressed = LZ4Factory.fastestJavaInstance().fastCompressor().compress(in); @@ -332,14 +353,14 @@ public class Fawe { assert (Zstd.decompress(ob, compressed) == 0); LOGGER.info("ZSTD Compression Binding loaded successfully"); } catch (Throwable e) { - if (Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL > 6 || Settings.IMP.HISTORY.COMPRESSION_LEVEL > 6) { - Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL = Math.min(6, Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL); - Settings.IMP.HISTORY.COMPRESSION_LEVEL = Math.min(6, Settings.IMP.HISTORY.COMPRESSION_LEVEL); + if (Settings.settings().CLIPBOARD.COMPRESSION_LEVEL > 6 || Settings.settings().HISTORY.COMPRESSION_LEVEL > 6) { + Settings.settings().CLIPBOARD.COMPRESSION_LEVEL = Math.min(6, Settings.settings().CLIPBOARD.COMPRESSION_LEVEL); + Settings.settings().HISTORY.COMPRESSION_LEVEL = Math.min(6, Settings.settings().HISTORY.COMPRESSION_LEVEL); LOGGER.error("ZSTD Compression Binding Not Found.\n" + "FAWE will still work but compression won't work as well.", e); } } - Settings.IMP.save(file); + Settings.settings().save(file); } public WorldEdit getWorldEdit() { @@ -347,7 +368,7 @@ public class Fawe { } private void setupMemoryListener() { - if (Settings.IMP.MAX_MEMORY_PERCENT < 1 || Settings.IMP.MAX_MEMORY_PERCENT > 99) { + if (Settings.settings().MAX_MEMORY_PERCENT < 1 || Settings.settings().MAX_MEMORY_PERCENT > 99) { return; } try { @@ -371,7 +392,7 @@ public class Fawe { if (max < 0) { continue; } - final long alert = (max * Settings.IMP.MAX_MEMORY_PERCENT) / 100; + final long alert = (max * Settings.settings().MAX_MEMORY_PERCENT) / 100; mp.setUsageThreshold(alert); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java index c34052554..fcaf33288 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java @@ -65,7 +65,7 @@ public class FaweAPI { * @return TaskManager */ public static TaskManager getTaskManager() { - return TaskManager.IMP; + return TaskManager.taskManager(); } /** @@ -81,7 +81,7 @@ public class FaweAPI { * @return the queue extent */ public static IQueueExtent createQueue(World world, boolean autoQueue) { - IQueueExtent queue = Fawe.get().getQueueHandler().getQueue(world); + IQueueExtent queue = Fawe.instance().getQueueHandler().getQueue(world); if (!autoQueue) { queue.disableQueue(); } @@ -127,7 +127,7 @@ public class FaweAPI { * @return Set of FaweMaskManager */ public static Set getMaskManagers() { - return new HashSet<>(WEManager.IMP.getManagers()); + return new HashSet<>(WEManager.weManager().getManagers()); } /** @@ -143,7 +143,7 @@ public class FaweAPI { * Get a player's allowed WorldEdit region(s). */ public static Region[] getRegions(Player player) { - return WEManager.IMP.getMask(player); + return WEManager.weManager().getMask(player); } /** @@ -155,7 +155,7 @@ public class FaweAPI { * @return array of allowed regions if whitelist, else of disallowed regions. */ public static Region[] getRegions(Player player, FaweMaskManager.MaskType type, boolean isWhiteList) { - return WEManager.IMP.getMask(player, type, isWhiteList); + return WEManager.weManager().getMask(player, type, isWhiteList); } /** @@ -170,13 +170,13 @@ public class FaweAPI { */ public static void cancelEdit(AbstractDelegateExtent extent, Component reason) { try { - WEManager.IMP.cancelEdit(extent, new FaweException(reason)); + WEManager.weManager().cancelEdit(extent, new FaweException(reason)); } catch (WorldEditException ignored) { } } public static void addMaskManager(FaweMaskManager maskMan) { - WEManager.IMP.addManager(maskMan); + WEManager.weManager().addManager(maskMan); } /** @@ -186,7 +186,7 @@ public class FaweAPI { if (!file.exists() || file.isDirectory()) { throw new IllegalArgumentException("Not a file!"); } - if (Settings.IMP.HISTORY.USE_DISK) { + if (Settings.settings().HISTORY.USE_DISK) { throw new IllegalArgumentException("History on disk not enabled!"); } if (!file.getName().toLowerCase(Locale.ROOT).endsWith(".bd")) { @@ -224,11 +224,10 @@ public class FaweAPI { */ public static List getBDFiles(Location origin, UUID user, int radius, long timediff, boolean shallow) { Extent extent = origin.getExtent(); - if (!(extent instanceof World)) { + if (!(extent instanceof World world)) { throw new IllegalArgumentException("Origin is not a valid world"); } - World world = (World) extent; - File history = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY + File.separator + world.getName()); + File history = MainUtil.getFile(Fawe.platform().getDirectory(), Settings.settings().PATHS.HISTORY + File.separator + world.getName()); if (!history.exists()) { return new ArrayList<>(); } @@ -352,12 +351,12 @@ public class FaweAPI { World unwrapped = WorldWrapper.unwrap(world); if (unwrapped instanceof IQueueExtent) { queue = (IQueueExtent) unwrapped; - } else if (Settings.IMP.QUEUE.PARALLEL_THREADS > 1) { + } else if (Settings.settings().QUEUE.PARALLEL_THREADS > 1) { ParallelQueueExtent parallel = - new ParallelQueueExtent(Fawe.get().getQueueHandler(), world, true); + new ParallelQueueExtent(Fawe.instance().getQueueHandler(), world, true); queue = parallel.getExtent(); } else { - queue = Fawe.get().getQueueHandler().getQueue(world); + queue = Fawe.instance().getQueueHandler().getQueue(world); } } @@ -372,7 +371,7 @@ public class FaweAPI { } } if (mode != RelightMode.NONE) { - if (Settings.IMP.LIGHTING.REMOVE_FIRST) { + if (Settings.settings().LIGHTING.REMOVE_FIRST) { relighter.removeAndRelight(true); } else { relighter.fixSkyLighting(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java index 317d2df83..e0f840a3f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java @@ -59,7 +59,15 @@ import java.util.function.Supplier; import static com.google.common.base.Preconditions.checkNotNull; public enum FaweCache implements Trimable { - IMP; // singleton + /** + * @deprecated Use {@link #INSTANCE} to get an instance. + */ + @Deprecated(forRemoval = true, since = "2.0.0") + IMP, + /** + * @since 2.0.0 + */ + INSTANCE;// singleton private static final Logger LOGGER = LogManagerCompat.getLogger(); @@ -301,7 +309,7 @@ public enum FaweCache implements Trimable { // BlockStates int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { + if (Settings.settings().PROTOCOL_SUPPORT_FIX || num_palette != 1) { bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry } else { bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries @@ -387,7 +395,7 @@ public enum FaweCache implements Trimable { // BlockStates int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { + if (Settings.settings().PROTOCOL_SUPPORT_FIX || num_palette != 1) { bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry } else { bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries @@ -568,7 +576,7 @@ public enum FaweCache implements Trimable { Thread stuff */ public ThreadPoolExecutor newBlockingExecutor() { - int nThreads = Settings.IMP.QUEUE.PARALLEL_THREADS; + int nThreads = Settings.settings().QUEUE.PARALLEL_THREADS; ArrayBlockingQueue queue = new ArrayBlockingQueue<>(nThreads, true); return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, queue, @@ -609,7 +617,7 @@ public enum FaweCache implements Trimable { lastException = hash; LOGGER.catching(throwable); count = 0; - } else if (count < Settings.IMP.QUEUE.PARALLEL_THREADS) { + } else if (count < Settings.settings().QUEUE.PARALLEL_THREADS) { LOGGER.warn(throwable.getMessage()); count++; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java index 71438bfd0..5c5ad228c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java @@ -531,7 +531,7 @@ public class AnvilCommands { // }); // if (useData) { // for (long[] c : map) { - // BaseBlock block = FaweCache.IMP.CACHE_BLOCK[(int) c[0]]; + // BaseBlock block = FaweCache.INSTANCE.CACHE_BLOCK[(int) c[0]]; // String name = BlockType.fromID(block.getId()).getName(); // String str = String.format("%-7s (%.3f%%) %s #%d:%d", // String.valueOf(c[1]), diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java index 932fc1495..d7c4afb82 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java @@ -147,7 +147,7 @@ // CFISettings settings = getSettings(player).remove(); // generator.setPacketViewer(player); // settings.setGenerator(generator).bind(); -// generator.setImageViewer(Fawe.imp().getImageViewer(player)); +// generator.setImageViewer(Fawe.platform().getImageViewer(player)); // generator.update(); // mainMenu(player); // } @@ -226,7 +226,7 @@ // World world = FaweAPI.getWorld(folder.getName()); // if (world != null) { // if (player.getWorld() != world) { -// TaskManager.IMP.sync(new RunnableVal() { +// TaskManager.taskManager().sync(new RunnableVal() { // @Override // public void run(Object value) { // Location spawn = new Location(world, world.getSpawnPosition().toVector3()); @@ -425,7 +425,7 @@ // switch (argOpt.toLowerCase(Locale.ROOT)) { // case "true": // case "*": { -// generator.setTextureUtil(Fawe.get().getTextureUtil()); +// generator.setTextureUtil(Fawe.instance().getTextureUtil()); // return; // } // case "#clipboard": { @@ -453,7 +453,7 @@ // parserContext.setExtent(extent); // Request.request().setExtent(extent); // Mask mask = worldEdit.getMaskFactory().parseFromInput(argOpt, parserContext); -// TextureUtil tu = Fawe.get().getTextureUtil(); +// TextureUtil tu = Fawe.instance().getTextureUtil(); // for (int typeId : tu.getValidBlockIds()) { // BlockType type = BlockTypes.get(typeId); // extent.init(0, 0, 0, type.getDefaultState().toBaseBlock()); @@ -464,7 +464,7 @@ // break; // } // } -// generator.setTextureUtil(new FilteredTextureUtil(Fawe.get().getTextureUtil(), blocks)); +// generator.setTextureUtil(new FilteredTextureUtil(Fawe.instance().getTextureUtil(), blocks)); // coloring(player); // } // @@ -493,9 +493,9 @@ // public void complexity(Player player, int min, int max) throws FileNotFoundException { // HeightMapMCAGenerator gen = assertSettings(player).getGenerator(); // if (min == 0 && max == 100) { -// gen.setTextureUtil(Fawe.get().getTextureUtil()); +// gen.setTextureUtil(Fawe.instance().getTextureUtil()); // } else { -// gen.setTextureUtil(new CleanTextureUtil(Fawe.get().getTextureUtil(), min, max)); +// gen.setTextureUtil(new CleanTextureUtil(Fawe.instance().getTextureUtil(), min, max)); // } // coloring(player); // } @@ -1201,7 +1201,7 @@ // whiteOnly = true; // maskArg = null; // imageMaskArg = null; -// generator.setTextureUtil(Fawe.get().getTextureUtil()); +// generator.setTextureUtil(Fawe.instance().getTextureUtil()); // } // // public void resetComponent() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java index ebb75b247..aa9556937 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/ListFilters.java @@ -95,7 +95,7 @@ public class ListFilters { } String firstArg = finalArg.substring(0, finalArg.length() - File.separator.length()); if (firstArg.length() > 3 && firstArg.length() <= 16) { - UUID fromName = Fawe.imp().getUUID(finalArg); + UUID fromName = Fawe.platform().getUUID(finalArg); if (fromName != null) { newRoot = new File(root, finalArg); if (newRoot.exists()) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java index fe4242243..fba983d93 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java @@ -45,7 +45,7 @@ // PlotPlayer player = PlotPlayer.get(actor.getName()); // // actor.print("Claiming world"); -// Plot plot = TaskManager.IMP.sync(new RunnableVal() { +// Plot plot = TaskManager.taskManager().sync(new RunnableVal() { // @Override // public void run(Plot o) { // int currentPlots = Settings.Limit.GLOBAL ? player.getPlotCount() @@ -73,7 +73,7 @@ // File folder = CFICommands.getFolder(plot.getWorldName()); // Boolean result = createTask.apply(folder); // if (result == Boolean.TRUE) { -// TaskManager.IMP.sync(() -> plot.teleportPlayer(player)); +// TaskManager.taskManager().sync(() -> plot.teleportPlayer(player)); // } // return; // } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java index 2a18f856a..0a4d611bb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BrushSettings.java @@ -90,7 +90,7 @@ public class BrushSettings { // } // if (settings.containsKey(SettingType.TRANSFORM.name())) { // String transformArgs = (String) settings.get(SettingType.TRANSFORM.name()); - // ResettableExtent extent = Fawe.get().getTransformParser().parseFromInput(transformArgs, parserContext); + // ResettableExtent extent = Fawe.instance().getTransformParser().parseFromInput(transformArgs, parserContext); // bs.setTransform(extent); // bs.constructor.put(SettingType.TRANSFORM, transformArgs); // } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java index d9f11976a..82d99c416 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java @@ -68,7 +68,7 @@ public class InspectBrush extends BrushTool { player.print(Caption.of("fawe.error.no-perm", "worldedit.tool.inspect")); return false; } - if (!Settings.IMP.HISTORY.USE_DATABASE) { + if (!Settings.settings().HISTORY.USE_DATABASE) { player.print(Caption.of( "fawe.error.setting.disable", "history.use-database (Import with /history import )" @@ -95,7 +95,7 @@ public class InspectBrush extends BrushTool { int from = change.from; int to = change.to; UUID uuid = edit.getUUID(); - String name = Fawe.imp().getName(uuid); + String name = Fawe.platform().getName(uuid); int index = edit.getIndex(); long age = System.currentTimeMillis() - edit.getBDFile().lastModified(); String ageFormatted = MainUtil.secToTime(age / 1000); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java index f6cc83158..8f899afd5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java @@ -19,12 +19,16 @@ import java.util.stream.Stream; public class Settings extends Config { + /** + * @deprecated Use {@link #settings()} instead to get an instance. + */ @Ignore + @Deprecated(forRemoval = true, since = "2.0.0") public static final Settings IMP = new Settings(); - + @Ignore + static Settings INSTANCE = new Settings(); @Ignore public boolean PROTOCOL_SUPPORT_FIX = false; - @Comment("These first 6 aren't configurable") // This is a comment @Final // Indicates that this value isn't configurable public String ISSUES = "https://github.com/IntellectualSites/FastAsyncWorldEdit/issues"; @@ -38,7 +42,6 @@ public class Settings extends Config { public String COMMIT; // These values are set from FAWE before loading @Final public String PLATFORM; // These values are set from FAWE before loading - @Comment({ "Set true to enable WorldEdit restrictions per region (e.g. PlotSquared or WorldGuard).", "To be allowed to WorldEdit in a region, users need the appropriate", @@ -51,7 +54,6 @@ public class Settings extends Config { " - Disable with 100 or -1." }) public int MAX_MEMORY_PERCENT = 95; - @Create public ENABLED_COMPONENTS ENABLED_COMPONENTS; @Create @@ -77,16 +79,178 @@ public class Settings extends Config { @Create public ConfigBlock LIMITS; + private Settings() { + INSTANCE = this; + } + + /** + * Gets an instance of Settings. + * + * @return an instance of Settings + * @since 2.0.0 + */ + public static Settings settings() { + return INSTANCE; + } + + public void reload(File file) { + load(file); + save(file); + } + + public FaweLimit getLimit(Actor actor) { + FaweLimit limit; + if (actor.hasPermission("fawe.limit.*") || actor.hasPermission("fawe.bypass")) { + limit = FaweLimit.MAX.copy(); + } else { + limit = new FaweLimit(); + } + ArrayList keys = new ArrayList<>(LIMITS.getSections()); + if (keys.remove("default")) { + keys.add("default"); + } + + boolean limitFound = false; + for (String key : keys) { + if (actor.hasPermission("fawe.limit." + key) || !limitFound && key.equals("default")) { + limitFound = true; + LIMITS newLimit = LIMITS.get(key); + limit.MAX_ACTIONS = Math.max( + limit.MAX_ACTIONS, + newLimit.MAX_ACTIONS != -1 ? newLimit.MAX_ACTIONS : Integer.MAX_VALUE + ); + limit.MAX_CHANGES = Math.max( + limit.MAX_CHANGES, + newLimit.MAX_CHANGES != -1 ? newLimit.MAX_CHANGES : Long.MAX_VALUE + ); + limit.MAX_BLOCKSTATES = Math.max( + limit.MAX_BLOCKSTATES, + newLimit.MAX_BLOCKSTATES != -1 ? newLimit.MAX_BLOCKSTATES : Integer.MAX_VALUE + ); + limit.MAX_CHECKS = Math.max( + limit.MAX_CHECKS, + newLimit.MAX_CHECKS != -1 ? newLimit.MAX_CHECKS : Long.MAX_VALUE + ); + limit.MAX_ENTITIES = Math.max( + limit.MAX_ENTITIES, + newLimit.MAX_ENTITIES != -1 ? newLimit.MAX_ENTITIES : Integer.MAX_VALUE + ); + limit.MAX_FAILS = Math.max(limit.MAX_FAILS, newLimit.MAX_FAILS != -1 ? newLimit.MAX_FAILS : Integer.MAX_VALUE); + limit.MAX_ITERATIONS = Math.max( + limit.MAX_ITERATIONS, + newLimit.MAX_ITERATIONS != -1 ? newLimit.MAX_ITERATIONS : Integer.MAX_VALUE + ); + limit.MAX_HISTORY = Math.max( + limit.MAX_HISTORY, + newLimit.MAX_HISTORY_MB != -1 ? newLimit.MAX_HISTORY_MB : Integer.MAX_VALUE + ); + limit.MAX_EXPRESSION_MS = Math.max( + limit.MAX_EXPRESSION_MS, + newLimit.MAX_EXPRESSION_MS != -1 ? newLimit.MAX_EXPRESSION_MS : Integer.MAX_VALUE + ); + limit.INVENTORY_MODE = Math.min(limit.INVENTORY_MODE, newLimit.INVENTORY_MODE); + limit.SPEED_REDUCTION = Math.min(limit.SPEED_REDUCTION, newLimit.SPEED_REDUCTION); + limit.FAST_PLACEMENT |= newLimit.FAST_PLACEMENT; + limit.CONFIRM_LARGE &= newLimit.CONFIRM_LARGE; + limit.RESTRICT_HISTORY_TO_REGIONS &= newLimit.RESTRICT_HISTORY_TO_REGIONS; + if (limit.STRIP_NBT == null) { + limit.STRIP_NBT = newLimit.STRIP_NBT.isEmpty() ? Collections.emptySet() : new HashSet<>(newLimit.STRIP_NBT); + } else if (limit.STRIP_NBT.isEmpty() || newLimit.STRIP_NBT.isEmpty()) { + limit.STRIP_NBT = Collections.emptySet(); + } else { + limit.STRIP_NBT = new HashSet<>(limit.STRIP_NBT); + limit.STRIP_NBT.retainAll(newLimit.STRIP_NBT); + if (limit.STRIP_NBT.isEmpty()) { + limit.STRIP_NBT = Collections.emptySet(); + } + } + limit.UNIVERSAL_DISALLOWED_BLOCKS &= newLimit.UNIVERSAL_DISALLOWED_BLOCKS; + + if (limit.DISALLOWED_BLOCKS == null) { + limit.DISALLOWED_BLOCKS = newLimit.DISALLOWED_BLOCKS.isEmpty() ? Collections.emptySet() : new HashSet<>( + newLimit.DISALLOWED_BLOCKS); + } else if (limit.DISALLOWED_BLOCKS.isEmpty() || newLimit.DISALLOWED_BLOCKS.isEmpty()) { + limit.DISALLOWED_BLOCKS = Collections.emptySet(); + } else { + limit.DISALLOWED_BLOCKS = new HashSet<>(limit.DISALLOWED_BLOCKS); + limit.DISALLOWED_BLOCKS.retainAll(newLimit.DISALLOWED_BLOCKS + .stream() + .map(s -> s.contains(":") ? s.toLowerCase(Locale.ROOT) : ("minecraft:" + s).toLowerCase(Locale.ROOT)) + .collect(Collectors.toSet())); + if (limit.DISALLOWED_BLOCKS.isEmpty()) { + limit.DISALLOWED_BLOCKS = Collections.emptySet(); + } + } + + if (limit.REMAP_PROPERTIES == null) { + limit.REMAP_PROPERTIES = newLimit.REMAP_PROPERTIES.isEmpty() ? Collections.emptySet() : + newLimit.REMAP_PROPERTIES.stream().flatMap(s -> { + String propertyStr = s.substring(0, s.indexOf('[')); + List> properties = + BlockTypesCache.getAllProperties().get(propertyStr.toLowerCase(Locale.ROOT)); + if (properties == null || properties.isEmpty()) { + return Stream.empty(); + } + String[] mappings = s.substring(s.indexOf('[') + 1, s.indexOf(']')).split(","); + Set> remaps = new HashSet<>(); + for (Property property : properties) { + for (String mapping : mappings) { + try { + String[] fromTo = mapping.split(":"); + remaps.add(property.getRemap( + property.getValueFor(fromTo[0]), + property.getValueFor(fromTo[1]) + )); + } catch (IllegalArgumentException ignored) { + // This property is unlikely to be the one being targeted. + break; + } + } + } + return remaps.stream(); + }).collect(Collectors.toSet()); + } else if (limit.REMAP_PROPERTIES.isEmpty() || newLimit.REMAP_PROPERTIES.isEmpty()) { + limit.REMAP_PROPERTIES = Collections.emptySet(); + } else { + limit.REMAP_PROPERTIES = new HashSet<>(limit.REMAP_PROPERTIES); + limit.REMAP_PROPERTIES.retainAll(newLimit.REMAP_PROPERTIES.stream().flatMap(s -> { + String propertyStr = s.substring(0, s.indexOf('[')); + List> properties = + BlockTypesCache.getAllProperties().get(propertyStr.toLowerCase(Locale.ROOT)); + if (properties == null || properties.isEmpty()) { + return Stream.empty(); + } + String[] mappings = s.substring(s.indexOf('[') + 1, s.indexOf(']')).split(","); + Set> remaps = new HashSet<>(); + for (Property property : properties) { + for (String mapping : mappings) { + try { + String[] fromTo = mapping.split(":"); + remaps.add(property.getRemap( + property.getValueFor(fromTo[0]), + property.getValueFor(fromTo[1]) + )); + } catch (IllegalArgumentException ignored) { + // This property is unlikely to be the one being targeted. + break; + } + } + } + return remaps.stream(); + }).collect(Collectors.toSet())); + if (limit.REMAP_PROPERTIES.isEmpty()) { + limit.REMAP_PROPERTIES = Collections.emptySet(); + } + } + } + } + return limit; + } + @Comment("Enable or disable core components") public static final class ENABLED_COMPONENTS { public boolean COMMANDS = true; - @Comment({ - "Disable the FAWE-PlotSquared hook to take over most intense P2 queueing", - "Specific aspects can be turned on and off further below", - "Only disables/enables the hook with v4. For v6, see PlotSquared settings.yml" - }) - public boolean PLOTSQUARED_V4_HOOK = true; @Comment({"Show additional information in console. It helps us at IntellectualSites to find out more about an issue.", "Leave it off if you don't need it, it can spam your console."}) public boolean DEBUG = false; @@ -341,12 +505,12 @@ public class Settings extends Config { @Comment("This relates to how FAWE places chunks") public static class QUEUE { + @Create + public static PROGRESS PROGRESS; @Comment({ "This should equal the number of processors you have", }) public int PARALLEL_THREADS = Math.max(1, Runtime.getRuntime().availableProcessors()); - @Create - public static PROGRESS PROGRESS; @Comment({ "When doing edits that effect more than this many chunks:", " - FAWE will start placing before all calculations are finished", @@ -575,158 +739,4 @@ public class Settings extends Config { } - public void reload(File file) { - load(file); - save(file); - } - - public FaweLimit getLimit(Actor actor) { - FaweLimit limit; - if (actor.hasPermission("fawe.limit.*") || actor.hasPermission("fawe.bypass")) { - limit = FaweLimit.MAX.copy(); - } else { - limit = new FaweLimit(); - } - ArrayList keys = new ArrayList<>(LIMITS.getSections()); - if (keys.remove("default")) { - keys.add("default"); - } - - boolean limitFound = false; - for (String key : keys) { - if (actor.hasPermission("fawe.limit." + key) || !limitFound && key.equals("default")) { - limitFound = true; - LIMITS newLimit = LIMITS.get(key); - limit.MAX_ACTIONS = Math.max( - limit.MAX_ACTIONS, - newLimit.MAX_ACTIONS != -1 ? newLimit.MAX_ACTIONS : Integer.MAX_VALUE - ); - limit.MAX_CHANGES = Math.max( - limit.MAX_CHANGES, - newLimit.MAX_CHANGES != -1 ? newLimit.MAX_CHANGES : Long.MAX_VALUE - ); - limit.MAX_BLOCKSTATES = Math.max( - limit.MAX_BLOCKSTATES, - newLimit.MAX_BLOCKSTATES != -1 ? newLimit.MAX_BLOCKSTATES : Integer.MAX_VALUE - ); - limit.MAX_CHECKS = Math.max( - limit.MAX_CHECKS, - newLimit.MAX_CHECKS != -1 ? newLimit.MAX_CHECKS : Long.MAX_VALUE - ); - limit.MAX_ENTITIES = Math.max( - limit.MAX_ENTITIES, - newLimit.MAX_ENTITIES != -1 ? newLimit.MAX_ENTITIES : Integer.MAX_VALUE - ); - limit.MAX_FAILS = Math.max(limit.MAX_FAILS, newLimit.MAX_FAILS != -1 ? newLimit.MAX_FAILS : Integer.MAX_VALUE); - limit.MAX_ITERATIONS = Math.max( - limit.MAX_ITERATIONS, - newLimit.MAX_ITERATIONS != -1 ? newLimit.MAX_ITERATIONS : Integer.MAX_VALUE - ); - limit.MAX_HISTORY = Math.max( - limit.MAX_HISTORY, - newLimit.MAX_HISTORY_MB != -1 ? newLimit.MAX_HISTORY_MB : Integer.MAX_VALUE - ); - limit.MAX_EXPRESSION_MS = Math.max( - limit.MAX_EXPRESSION_MS, - newLimit.MAX_EXPRESSION_MS != -1 ? newLimit.MAX_EXPRESSION_MS : Integer.MAX_VALUE - ); - limit.INVENTORY_MODE = Math.min(limit.INVENTORY_MODE, newLimit.INVENTORY_MODE); - limit.SPEED_REDUCTION = Math.min(limit.SPEED_REDUCTION, newLimit.SPEED_REDUCTION); - limit.FAST_PLACEMENT |= newLimit.FAST_PLACEMENT; - limit.CONFIRM_LARGE &= newLimit.CONFIRM_LARGE; - limit.RESTRICT_HISTORY_TO_REGIONS &= newLimit.RESTRICT_HISTORY_TO_REGIONS; - if (limit.STRIP_NBT == null) { - limit.STRIP_NBT = newLimit.STRIP_NBT.isEmpty() ? Collections.emptySet() : new HashSet<>(newLimit.STRIP_NBT); - } else if (limit.STRIP_NBT.isEmpty() || newLimit.STRIP_NBT.isEmpty()) { - limit.STRIP_NBT = Collections.emptySet(); - } else { - limit.STRIP_NBT = new HashSet<>(limit.STRIP_NBT); - limit.STRIP_NBT.retainAll(newLimit.STRIP_NBT); - if (limit.STRIP_NBT.isEmpty()) { - limit.STRIP_NBT = Collections.emptySet(); - } - } - limit.UNIVERSAL_DISALLOWED_BLOCKS &= newLimit.UNIVERSAL_DISALLOWED_BLOCKS; - - if (limit.DISALLOWED_BLOCKS == null) { - limit.DISALLOWED_BLOCKS = newLimit.DISALLOWED_BLOCKS.isEmpty() ? Collections.emptySet() : new HashSet<>( - newLimit.DISALLOWED_BLOCKS); - } else if (limit.DISALLOWED_BLOCKS.isEmpty() || newLimit.DISALLOWED_BLOCKS.isEmpty()) { - limit.DISALLOWED_BLOCKS = Collections.emptySet(); - } else { - limit.DISALLOWED_BLOCKS = new HashSet<>(limit.DISALLOWED_BLOCKS); - limit.DISALLOWED_BLOCKS.retainAll(newLimit.DISALLOWED_BLOCKS - .stream() - .map(s -> s.contains(":") ? s.toLowerCase(Locale.ROOT) : ("minecraft:" + s).toLowerCase(Locale.ROOT)) - .collect(Collectors.toSet())); - if (limit.DISALLOWED_BLOCKS.isEmpty()) { - limit.DISALLOWED_BLOCKS = Collections.emptySet(); - } - } - - if (limit.REMAP_PROPERTIES == null) { - limit.REMAP_PROPERTIES = newLimit.REMAP_PROPERTIES.isEmpty() ? Collections.emptySet() : - newLimit.REMAP_PROPERTIES.stream().flatMap(s -> { - String propertyStr = s.substring(0, s.indexOf('[')); - List> properties = - BlockTypesCache.getAllProperties().get(propertyStr.toLowerCase(Locale.ROOT)); - if (properties == null || properties.isEmpty()) { - return Stream.empty(); - } - String[] mappings = s.substring(s.indexOf('[') + 1, s.indexOf(']')).split(","); - Set> remaps = new HashSet<>(); - for (Property property : properties) { - for (String mapping : mappings) { - try { - String[] fromTo = mapping.split(":"); - remaps.add(property.getRemap( - property.getValueFor(fromTo[0]), - property.getValueFor(fromTo[1]) - )); - } catch (IllegalArgumentException ignored) { - // This property is unlikely to be the one being targeted. - break; - } - } - } - return remaps.stream(); - }).collect(Collectors.toSet()); - } else if (limit.REMAP_PROPERTIES.isEmpty() || newLimit.REMAP_PROPERTIES.isEmpty()) { - limit.REMAP_PROPERTIES = Collections.emptySet(); - } else { - limit.REMAP_PROPERTIES = new HashSet<>(limit.REMAP_PROPERTIES); - limit.REMAP_PROPERTIES.retainAll(newLimit.REMAP_PROPERTIES.stream().flatMap(s -> { - String propertyStr = s.substring(0, s.indexOf('[')); - List> properties = - BlockTypesCache.getAllProperties().get(propertyStr.toLowerCase(Locale.ROOT)); - if (properties == null || properties.isEmpty()) { - return Stream.empty(); - } - String[] mappings = s.substring(s.indexOf('[') + 1, s.indexOf(']')).split(","); - Set> remaps = new HashSet<>(); - for (Property property : properties) { - for (String mapping : mappings) { - try { - String[] fromTo = mapping.split(":"); - remaps.add(property.getRemap( - property.getValueFor(fromTo[0]), - property.getValueFor(fromTo[1]) - )); - } catch (IllegalArgumentException ignored) { - // This property is unlikely to be the one being targeted. - break; - } - } - } - return remaps.stream(); - }).collect(Collectors.toSet())); - if (limit.REMAP_PROPERTIES.isEmpty()) { - limit.REMAP_PROPERTIES = Collections.emptySet(); - } - } - } - } - return limit; - } - } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java index 9dd001687..0e4843f2f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java @@ -44,14 +44,14 @@ public class RollbackDatabase extends AsyncNotifyQueue { this.prefix = ""; this.world = world; this.dbLocation = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + world.getName() + File.separator + "summary.db" + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + world.getName() + File.separator + "summary.db" ); connection = openConnection(); try { init().get(); - purge((int) TimeUnit.DAYS.toSeconds(Settings.IMP.HISTORY.DELETE_AFTER_DAYS)); + purge((int) TimeUnit.DAYS.toSeconds(Settings.settings().HISTORY.DELETE_AFTER_DAYS)); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -284,8 +284,8 @@ public class RollbackDatabase extends AsyncNotifyQueue { if (checkConnection()) { return connection; } - if (!Fawe.imp().getDirectory().exists()) { - Fawe.imp().getDirectory().mkdirs(); + if (!Fawe.platform().getDirectory().exists()) { + Fawe.platform().getDirectory().mkdirs(); } if (!dbLocation.exists()) { try { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java index 3f0ca3f0c..28ed77fed 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/entity/LazyBaseEntity.java @@ -27,7 +27,7 @@ public class LazyBaseEntity extends BaseEntity { if (Fawe.isMainThread()) { setNbtData(tmp.get()); } else { - setNbtData(TaskManager.IMP.sync(tmp)); + setNbtData(TaskManager.taskManager().sync(tmp)); } } return super.getNbtData(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java index 478cbc46a..3c7ad1f4d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ConsumeBindings.java @@ -166,7 +166,7 @@ public class ConsumeBindings extends Bindings { if (argument.length() > 16) { uuid = UUID.fromString(argument); } else { - uuid = Fawe.imp().getUUID(argument); + uuid = Fawe.platform().getUUID(argument); } if (uuid == null) { throw new InputParseException(Caption.of("fawe.error.player.not.found", TextComponent.of(argument))); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java index b38a1b101..ac869b630 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/FaweRegionExtent.java @@ -75,7 +75,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc throws WorldEditException { if (!contains(x, y, z)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return false; } @@ -86,7 +86,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public boolean setBiome(int x, int y, int z, BiomeType biome) { if (!contains(x, y, z)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return false; } @@ -97,7 +97,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public BiomeType getBiome(BlockVector3 position) { if (!contains(position)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return null; } @@ -108,7 +108,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public BiomeType getBiomeType(int x, int y, int z) { if (!contains(x, z)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return null; } @@ -119,7 +119,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public BaseBlock getFullBlock(BlockVector3 position) { if (!contains(position)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return BlockTypes.AIR.getDefaultState().toBaseBlock(); } @@ -130,7 +130,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public BlockState getBlock(BlockVector3 position) { if (!contains(position)) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return BlockTypes.AIR.getDefaultState(); } @@ -142,7 +142,7 @@ public abstract class FaweRegionExtent extends ResettableExtent implements IBatc public Entity createEntity(Location location, BaseEntity entity) { if (!contains(location.getBlockX(), location.getBlockY(), location.getBlockZ())) { if (!limit.MAX_FAILS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.OUTSIDE_REGION); + WEManager.weManager().cancelEditSafe(this, FaweCache.OUTSIDE_REGION); } return null; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java index a4398dc69..e2d215c56 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/MemoryCheckingExtent.java @@ -29,7 +29,7 @@ public class MemoryCheckingExtent extends PassthroughExtent { this.actor.print(Caption.of("fawe.info.worldedit.oom.admin")); } } - WEManager.IMP.cancelEdit(this, FaweCache.LOW_MEMORY); + WEManager.weManager().cancelEdit(this, FaweCache.LOW_MEMORY); } return super.getExtent(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java index ab8c1d47b..9635497b2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ProcessedWEExtent.java @@ -37,7 +37,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { return null; } if (!limit.MAX_ENTITIES()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.MAX_ENTITIES); + WEManager.weManager().cancelEditSafe(this, FaweCache.MAX_ENTITIES); return null; } return super.createEntity(location, entity); @@ -46,7 +46,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { @Override public BlockState getBlock(int x, int y, int z) { if (!limit.MAX_CHECKS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.MAX_CHECKS); + WEManager.weManager().cancelEditSafe(this, FaweCache.MAX_CHECKS); return BlockTypes.AIR.getDefaultState(); } else { return extent.getBlock(x, y, z); @@ -56,7 +56,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { @Override public BaseBlock getFullBlock(BlockVector3 pos) { if (!limit.MAX_CHECKS()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.MAX_CHECKS); + WEManager.weManager().cancelEditSafe(this, FaweCache.MAX_CHECKS); return BlockTypes.AIR.getDefaultState().toBaseBlock(); } else { return extent.getFullBlock(pos); @@ -80,18 +80,18 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { boolean hasNbt = block instanceof BaseBlock && block.hasNbtData(); if (hasNbt) { if (!limit.MAX_BLOCKSTATES()) { - WEManager.IMP.cancelEdit(this, FaweCache.MAX_TILES); + WEManager.weManager().cancelEdit(this, FaweCache.MAX_TILES); return false; } else { if (!limit.MAX_CHANGES()) { - WEManager.IMP.cancelEdit(this, FaweCache.MAX_CHANGES); + WEManager.weManager().cancelEdit(this, FaweCache.MAX_CHANGES); return false; } return extent.setBlock(x, y, z, block); } } if (!limit.MAX_CHANGES()) { - WEManager.IMP.cancelEdit(this, FaweCache.MAX_CHANGES); + WEManager.weManager().cancelEdit(this, FaweCache.MAX_CHANGES); return false; } else { return extent.setBlock(x, y, z, block); @@ -101,7 +101,7 @@ public class ProcessedWEExtent extends AbstractDelegateExtent { @Override public boolean setBiome(BlockVector3 position, BiomeType biome) { if (!limit.MAX_CHANGES()) { - WEManager.IMP.cancelEditSafe(this, FaweCache.MAX_CHANGES); + WEManager.weManager().cancelEditSafe(this, FaweCache.MAX_CHANGES); return false; } return super.setBiome(position, biome); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java index 30f854b3d..6ace08060 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java @@ -72,8 +72,8 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable this( region.getDimensions(), MainUtil.getFile( - Fawe.get() != null ? Fawe.imp().getDirectory() : new File("."), - Settings.IMP.PATHS.CLIPBOARD + File.separator + uuid + ".bd" + Fawe.instance() != null ? Fawe.platform().getDirectory() : new File("."), + Settings.settings().PATHS.CLIPBOARD + File.separator + uuid + ".bd" ) ); setOffset(region.getMinimumPoint()); @@ -84,8 +84,8 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable this( dimensions, MainUtil.getFile( - Fawe.imp() != null ? Fawe.imp().getDirectory() : new File("."), - Settings.IMP.PATHS.CLIPBOARD + File.separator + UUID.randomUUID() + ".bd" + Fawe.platform() != null ? Fawe.platform().getDirectory() : new File("."), + Settings.settings().PATHS.CLIPBOARD + File.separator + UUID.randomUUID() + ".bd" ) ); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java index 8854027eb..6823acc97 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/MemoryOptimizedClipboard.java @@ -54,7 +54,7 @@ public class MemoryOptimizedClipboard extends LinearClipboard { private final int compressionLevel; public MemoryOptimizedClipboard(Region region) { - this(region, Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL); + this(region, Settings.settings().CLIPBOARD.COMPRESSION_LEVEL); } public MemoryOptimizedClipboard(Region region, int compressionLevel) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java index 24b3a4daf..e46c58c0e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/ReadOnlyClipboard.java @@ -39,12 +39,12 @@ public abstract class ReadOnlyClipboard extends SimpleClipboard { } public static ReadOnlyClipboard of(Extent extent, final Region region) { - Fawe.get().getQueueHandler().unCache(); + Fawe.instance().getQueueHandler().unCache(); return of(() -> extent, region); } public static ReadOnlyClipboard of(Extent extent, final Region region, boolean copyEntities, boolean copyBiomes) { - Fawe.get().getQueueHandler().unCache(); + Fawe.instance().getQueueHandler().unCache(); return of(() -> extent, region, copyEntities, copyBiomes); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java index 6d3a61359..5c60b91c5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java @@ -327,7 +327,7 @@ public class FastSchematicReader extends NBTSchematicReader { // tiles if (tiles != null && !tiles.isEmpty()) { for (Map tileRaw : tiles) { - CompoundTag tile = FaweCache.IMP.asTag(tileRaw); + CompoundTag tile = FaweCache.INSTANCE.asTag(tileRaw); int[] pos = tile.getIntArray("Pos"); int x; @@ -372,7 +372,7 @@ public class FastSchematicReader extends NBTSchematicReader { // entities if (entities != null && !entities.isEmpty()) { for (Map entRaw : entities) { - Map value = new HashMap<>(FaweCache.IMP.asTag(entRaw).getValue()); + Map value = new HashMap<>(FaweCache.INSTANCE.asTag(entRaw).getValue()); StringTag id = (StringTag) value.get("Id"); if (id == null) { id = (StringTag) value.get("id"); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java index f5861e4d1..696dd3ef5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicWriter.java @@ -123,7 +123,7 @@ public class FastSchematicWriter implements ClipboardWriter { out1.writeNamedTag("WEOffsetX", offset.getBlockX()); out1.writeNamedTag("WEOffsetY", offset.getBlockY()); out1.writeNamedTag("WEOffsetZ", offset.getBlockZ()); - out1.writeNamedTag("FAWEVersion", Fawe.get().getVersion().build); + out1.writeNamedTag("FAWEVersion", Fawe.instance().getVersion().build); }); ByteArrayOutputStream blocksCompressed = new ByteArrayOutputStream(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java index 600ccf50b..79d5f8186 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/MinecraftStructure.java @@ -165,7 +165,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter { if (width > WARN_SIZE || height > WARN_SIZE || length > WARN_SIZE) { LOGGER.info("A structure longer than 32 is unsupported by minecraft (but probably still works)"); } - Map structure = FaweCache.IMP.asMap("version", 1, "author", owner); + Map structure = FaweCache.INSTANCE.asMap("version", 1, "author", owner); // ignored: version / owner Int2ObjectArrayMap indexes = new Int2ObjectArrayMap<>(); // Size @@ -217,10 +217,10 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter { point.getY() - min.getY(), point.getZ() - min.getZ() ); if (!block.hasNbtData()) { - blocks.add(FaweCache.IMP.asMap("state", index, "pos", pos)); + blocks.add(FaweCache.INSTANCE.asMap("state", index, "pos", pos)); } else { blocks.add( - FaweCache.IMP.asMap("state", index, "pos", pos, "nbt", block.getNbtData())); + FaweCache.INSTANCE.asMap("state", index, "pos", pos, "nbt", block.getNbtData())); } } } @@ -240,14 +240,14 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter { // Replace rotation data nbtMap.put("Rotation", writeRotation(entity.getLocation())); nbtMap.put("id", new StringTag(state.getType().getId())); - Map entityMap = FaweCache.IMP.asMap("pos", pos, "blockPos", blockPos, "nbt", nbt); + Map entityMap = FaweCache.INSTANCE.asMap("pos", pos, "blockPos", blockPos, "nbt", nbt); entities.add(entityMap); } } if (!entities.isEmpty()) { structure.put("entities", entities); } - out.writeNamedTag("", FaweCache.IMP.asTag(structure)); + out.writeNamedTag("", FaweCache.INSTANCE.asTag(structure)); close(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java index b4812e2e8..92be10e66 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/PNGWriter.java @@ -26,7 +26,7 @@ public class PNGWriter implements ClipboardWriter { public PNGWriter(OutputStream out) throws IOException { this.out = ImageIO.createImageOutputStream(out); - this.tu = Fawe.get().getCachedTextureUtil(false, 0, 100); + this.tu = Fawe.instance().getCachedTextureUtil(false, 0, 100); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java index b1a393c51..7debe40dd 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/schematic/visualizer/SchemVis.java @@ -203,7 +203,7 @@ // */ // private void clean() { // if (chunks.size() > 225) { -// TaskManager.IMP.sync(() -> { +// TaskManager.taskManager().sync(() -> { // if (chunks.size() > 225) { // synchronized (SchemVis.this) { // Location pos = player.toWorldEditPlayer().getLocation(); @@ -233,7 +233,7 @@ // * @param chunkZ // */ // private void send(IQueueExtent packetQueue, int chunkX, int chunkZ) { -// TaskManager.IMP.getPublicForkJoinPool().submit(() -> { +// TaskManager.taskManager().getPublicForkJoinPool().submit(() -> { // try { // int OX = chunkOffset.getBlockX(); // int OZ = chunkOffset.getBlockZ(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java index 9cefe420f..1a2e4705e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/CharFilterBlock.java @@ -71,7 +71,7 @@ public class CharFilterBlock extends ChunkFilterBlock { maxLayer = this.get.getMaxSectionPosition(); this.layer = layer; if (!iget.hasSection(layer)) { - getArr = FaweCache.IMP.EMPTY_CHAR_4096; + getArr = FaweCache.INSTANCE.EMPTY_CHAR_4096; } else { getArr = iget.load(layer); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java index b83ea2c4b..20dced74e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/ExtentBatchProcessorHolder.java @@ -21,7 +21,7 @@ public abstract class ExtentBatchProcessorHolder extends BatchProcessorHolder im @Override public Extent enableHistory(AbstractChangeSet changeSet) { - if (Settings.IMP.HISTORY.SEND_BEFORE_HISTORY) { + if (Settings.settings().HISTORY.SEND_BEFORE_HISTORY) { return this.addPostProcessor(changeSet); } else { return this.addProcessor(changeSet); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java index 55ed8aab7..ca463f911 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/MultiBatchProcessor.java @@ -34,7 +34,7 @@ public class MultiBatchProcessor implements IBatchProcessor { private static final Logger LOGGER = LogManagerCompat.getLogger(); private final LoadingCache, Map> classToThreadIdToFilter = - FaweCache.IMP.createCache((Supplier>) ConcurrentHashMap::new); + FaweCache.INSTANCE.createCache((Supplier>) ConcurrentHashMap::new); // Array for lazy avoidance of concurrent modification exceptions and needless overcomplication of code (synchronisation is // not very important) private boolean[] faweExceptionReasonsUsed = new boolean[FaweException.Type.values().length]; @@ -157,7 +157,7 @@ public class MultiBatchProcessor implements IBatchProcessor { lastException = hash; exceptionCount = 0; LOGGER.catching(e); - } else if (exceptionCount < Settings.IMP.QUEUE.PARALLEL_THREADS) { + } else if (exceptionCount < Settings.settings().QUEUE.PARALLEL_THREADS) { exceptionCount++; LOGGER.warn(message); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightmapProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightmapProcessor.java index c42d51677..efdf79846 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightmapProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightmapProcessor.java @@ -62,7 +62,7 @@ public class HeightmapProcessor implements IBatchProcessor { continue; } char[] setSection = hasSectionSet ? set.loadIfPresent(layer) : null; - if (setSection == null || Arrays.equals(setSection, FaweCache.IMP.EMPTY_CHAR_4096) || + if (setSection == null || Arrays.equals(setSection, FaweCache.INSTANCE.EMPTY_CHAR_4096) || Arrays.equals(setSection, AIR_LAYER)) { hasSectionSet = false; } @@ -86,7 +86,7 @@ public class HeightmapProcessor implements IBatchProcessor { } else if (getSection == null) { getSection = get.load(layer); // skip empty layer - if (Arrays.equals(getSection, FaweCache.IMP.EMPTY_CHAR_4096) + if (Arrays.equals(getSection, FaweCache.INSTANCE.EMPTY_CHAR_4096) || Arrays.equals(getSection, AIR_LAYER)) { hasSectionGet = false; if (!hasSectionSet) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java index 7be725bc8..ef8b73f21 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java @@ -77,7 +77,7 @@ public class NMSRelighter implements Relighter { this.concurrentLightQueue = new ConcurrentHashMap<>(12); this.maxY = queue.getMaxY(); this.minY = queue.getMinY(); - this.relightMode = relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE); + this.relightMode = relightMode != null ? relightMode : RelightMode.valueOf(Settings.settings().LIGHTING.MODE); this.lightingLock = new ReentrantLock(); } @@ -911,11 +911,11 @@ public class NMSRelighter implements Relighter { chunk.setBitMask(bitMask); iter.remove(); } - if (Settings.IMP.LIGHTING.ASYNC) { + if (Settings.settings().LIGHTING.ASYNC) { queue.flush(); finished.set(true); } else { - TaskManager.IMP.sync(new RunnableVal<>() { + TaskManager.taskManager().sync(new RunnableVal<>() { @Override public void run(Object value) { queue.flush(); @@ -943,16 +943,16 @@ public class NMSRelighter implements Relighter { ChunkHolder chunk = (ChunkHolder) queue.getOrCreateChunk(x, z); chunk.setBitMask(bitMask); chunk.flushLightToGet(); - Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true); + Fawe.platform().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true); iter.remove(); } finished.set(true); } }; - if (Settings.IMP.LIGHTING.ASYNC) { + if (Settings.settings().LIGHTING.ASYNC) { runnable.run(); } else { - TaskManager.IMP.sync(runnable); + TaskManager.taskManager().sync(runnable); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java index c9b71beb1..8ac56c0f1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java @@ -25,9 +25,9 @@ public class RelightProcessor implements IBatchProcessor { @Override public IChunkSet processSet(IChunk chunk, IChunkGet get, IChunkSet set) { - if (Settings.IMP.LIGHTING.MODE == 2) { + if (Settings.settings().LIGHTING.MODE == 2) { relighter.addChunk(chunk.getX(), chunk.getZ(), null, chunk.getBitMask()); - } else if (Settings.IMP.LIGHTING.MODE == 1) { + } else if (Settings.settings().LIGHTING.MODE == 1) { byte[] fix = new byte[get.getSectionCount()]; boolean relight = false; for (int i = get.getMaxSectionPosition(); i >= get.getMinSectionPosition(); i--) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java index 84cc42d45..399d96663 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/BufferedPattern.java @@ -32,7 +32,7 @@ public class BufferedPattern extends AbstractPattern implements ResettablePatter } actionTime = tmp; this.pattern = parent; - this.timer = Fawe.get().getTimer(); + this.timer = Fawe.instance().getTimer(); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java index 1e307c560..5adeb0c91 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java @@ -75,8 +75,8 @@ public class DiskStorageHistory extends FaweStreamChangeSet { private void init(UUID uuid, String worldName) { final File folder = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + worldName + File.separator + uuid + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + worldName + File.separator + uuid ); final int max = NEXT_INDEX.computeIfAbsent(worldName, _worldName -> new ConcurrentHashMap<>()) @@ -111,8 +111,8 @@ public class DiskStorageHistory extends FaweStreamChangeSet { this.uuid = uuid; this.index = i; File folder = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + getWorld().getName() + File.separator + uuid + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + getWorld().getName() + File.separator + uuid ); initFiles(folder); } @@ -120,7 +120,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet { @Override public void delete() { deleteFiles(); - if (Settings.IMP.HISTORY.USE_DATABASE) { + if (Settings.settings().HISTORY.USE_DATABASE) { RollbackDatabase db = DBHandler.IMP.getDatabase(getWorld()); db.delete(uuid, index); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java index 32ac92b48..9e575c2a7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/MemoryOptimizedHistory.java @@ -149,7 +149,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { } synchronized (this) { setOrigin(x, z); - idsStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + idsStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); idsStreamZip = getCompressedOS(idsStream); writeHeader(idsStreamZip, x, y, z); return idsStreamZip; @@ -170,7 +170,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { return biomeStreamZip; } synchronized (this) { - biomeStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + biomeStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); biomeStreamZip = getCompressedOS(biomeStream); return biomeStreamZip; } @@ -191,7 +191,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { if (entCStreamZip != null) { return entCStreamZip; } - entCStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + entCStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); return entCStreamZip = new NBTOutputStream(getCompressedOS(entCStream)); } @@ -200,7 +200,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { if (entRStreamZip != null) { return entRStreamZip; } - entRStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + entRStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); return entRStreamZip = new NBTOutputStream(getCompressedOS(entRStream)); } @@ -209,7 +209,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { if (tileCStreamZip != null) { return tileCStreamZip; } - tileCStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + tileCStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); return tileCStreamZip = new NBTOutputStream(getCompressedOS(tileCStream)); } @@ -218,7 +218,7 @@ public class MemoryOptimizedHistory extends FaweStreamChangeSet { if (tileRStreamZip != null) { return tileRStreamZip; } - tileRStream = new FastByteArrayOutputStream(Settings.IMP.HISTORY.BUFFER_SIZE); + tileRStream = new FastByteArrayOutputStream(Settings.settings().HISTORY.BUFFER_SIZE); return tileRStreamZip = new NBTOutputStream(getCompressedOS(tileRStream)); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java index 37fdcbf55..83114a473 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java @@ -64,7 +64,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { return; } waitingAsync.incrementAndGet(); - TaskManager.IMP.async(() -> { + TaskManager.taskManager().async(() -> { waitingAsync.decrementAndGet(); synchronized (waitingAsync) { waitingAsync.notifyAll(); @@ -168,7 +168,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { char[] blocksGet; char[] tmp = get.load(layer); if (tmp == null) { - blocksGet = FaweCache.IMP.EMPTY_CHAR_4096; + blocksGet = FaweCache.INSTANCE.EMPTY_CHAR_4096; } else { System.arraycopy(tmp, 0, (blocksGet = new char[4096]), 0, 4096); } @@ -379,7 +379,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { wrappedTask.run(); return Futures.immediateCancelledFuture(); } else { - return Fawe.get().getQueueHandler().submit(wrappedTask); + return Fawe.instance().getQueueHandler().submit(wrappedTask); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java index c780297cc..77869a7ce 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java @@ -43,7 +43,7 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { protected FaweStreamPositionDelegate posDel; public FaweStreamChangeSet(World world) { - this(world, Settings.IMP.HISTORY.COMPRESSION_LEVEL, Settings.IMP.HISTORY.STORE_REDO, Settings.IMP.HISTORY.SMALL_EDITS); + this(world, Settings.settings().HISTORY.COMPRESSION_LEVEL, Settings.settings().HISTORY.STORE_REDO, Settings.settings().HISTORY.SMALL_EDITS); } public FaweStreamChangeSet(World world, int compression, boolean storeRedo, boolean smallLoc) { @@ -764,7 +764,7 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { } try (FaweInputStream fis = getBlockIS()) { if (!shallow) { - int amount = (Settings.IMP.HISTORY.BUFFER_SIZE - HEADER_SIZE) / 9; + int amount = (Settings.settings().HISTORY.BUFFER_SIZE - HEADER_SIZE) / 9; MutableFullBlockChange change = new MutableFullBlockChange(null, 0, false); for (int i = 0; i < amount; i++) { int x = posDel.readX(fis) + ox; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java index 2dad4500d..baa20163f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableBlockVector3.java @@ -14,7 +14,7 @@ public class MutableBlockVector3 extends BlockVector3 { } public static MutableBlockVector3 get(int x, int y, int z) { - return FaweCache.IMP.MUTABLE_BLOCKVECTOR3.get().setComponents(x, y, z); + return FaweCache.INSTANCE.MUTABLE_BLOCKVECTOR3.get().setComponents(x, y, z); } public MutableBlockVector3() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java index a23b910ce..22d85d38a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/MutableVector3.java @@ -27,11 +27,11 @@ public class MutableVector3 extends Vector3 { } public static MutableVector3 get(int x, int y, int z) { - return FaweCache.IMP.MUTABLE_VECTOR3.get().setComponents(x, y, z); + return FaweCache.INSTANCE.MUTABLE_VECTOR3.get().setComponents(x, y, z); } public static MutableVector3 get(double x, double y, double z) { - return FaweCache.IMP.MUTABLE_VECTOR3.get().setComponents(x, y, z); + return FaweCache.INSTANCE.MUTABLE_VECTOR3.get().setComponents(x, y, z); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index c57be1117..c37e2ee70 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -129,9 +129,9 @@ public interface IBlocks extends Trimable { sectionWriter.writeShort(nonEmpty); // non empty FaweCache.Palette palette; if (stretched) { - palette = FaweCache.IMP.toPalette(0, ids); + palette = FaweCache.INSTANCE.toPalette(0, ids); } else { - palette = FaweCache.IMP.toPaletteUnstretched(0, ids); + palette = FaweCache.INSTANCE.toPaletteUnstretched(0, ids); } sectionWriter.writeByte(palette.bitsPerEntry); // bits per block diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java index 142e79d67..6d431c1b6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java @@ -45,7 +45,7 @@ public class Flood { } public synchronized void run(World world) { - QueueHandler queueHandler = Fawe.get().getQueueHandler(); + QueueHandler queueHandler = Fawe.instance().getQueueHandler(); IQueueExtent fq = queueHandler.getQueue(world); while (!chunkQueues.isEmpty()) { long firstKey = chunkQueues.firstLongKey(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java index 58671f0ba..89c3b549f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/ParallelQueueExtent.java @@ -99,7 +99,7 @@ public class ParallelQueueExtent extends PassthroughExtent { final Iterator chunksIter = chunks.iterator(); // Get a pool, to operate on the chunks in parallel - final int size = Math.min(chunks.size(), Settings.IMP.QUEUE.PARALLEL_THREADS); + final int size = Math.min(chunks.size(), Settings.settings().QUEUE.PARALLEL_THREADS); if (size <= 1 && chunksIter.hasNext()) { BlockVector2 pos = chunksIter.next(); getExtent().apply(null, filter, region, pos.getX(), pos.getZ(), full); @@ -147,7 +147,7 @@ public class ParallelQueueExtent extends PassthroughExtent { lastException = hash; exceptionCount = 0; LOGGER.catching(e); - } else if (exceptionCount < Settings.IMP.QUEUE.PARALLEL_THREADS) { + } else if (exceptionCount < Settings.settings().QUEUE.PARALLEL_THREADS) { exceptionCount++; LOGGER.warn(message); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java index 83e9da4f9..cd731d10b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/QueueHandler.java @@ -41,7 +41,7 @@ public abstract class QueueHandler implements Trimable, Runnable { private final ForkJoinPool forkJoinPoolPrimary = new ForkJoinPool(); private final ForkJoinPool forkJoinPoolSecondary = new ForkJoinPool(); - private final ThreadPoolExecutor blockingExecutor = FaweCache.IMP.newBlockingExecutor(); + private final ThreadPoolExecutor blockingExecutor = FaweCache.INSTANCE.newBlockingExecutor(); private final ConcurrentLinkedQueue syncTasks = new ConcurrentLinkedQueue<>(); private final ConcurrentLinkedQueue syncWhenFree = new ConcurrentLinkedQueue<>(); @@ -56,7 +56,7 @@ public abstract class QueueHandler implements Trimable, Runnable { private double targetTPS = 18; public QueueHandler() { - TaskManager.IMP.repeat(this, 1); + TaskManager.taskManager().repeat(this, 1); } @Override @@ -87,14 +87,14 @@ public abstract class QueueHandler implements Trimable, Runnable { private long getAllocate() { long now = System.currentTimeMillis(); - targetTPS = 18 - Math.max(Settings.IMP.QUEUE.EXTRA_TIME_MS * 0.05, 0); + targetTPS = 18 - Math.max(Settings.settings().QUEUE.EXTRA_TIME_MS * 0.05, 0); long diff = 50 + this.last - (this.last = now); long absDiff = Math.abs(diff); if (diff == 0) { allocate = Math.min(50, allocate + 1); } else if (diff < 0) { allocate = Math.max(5, allocate + diff); - } else if (!Fawe.get().getTimer().isAbove(targetTPS)) { + } else if (!Fawe.instance().getTimer().isAbove(targetTPS)) { allocate = Math.max(5, allocate - 1); } return allocate - absDiff; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java index 8f1c1c489..97513aa69 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java @@ -250,7 +250,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen } } - return (V) Fawe.get().getQueueHandler().submit(chunk); + return (V) Fawe.instance().getQueueHandler().submit(chunk); } @Override @@ -266,7 +266,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen if (aggressive) { pollSubmissions(0, aggressive); } else { - pollSubmissions(Settings.IMP.QUEUE.PARALLEL_THREADS, aggressive); + pollSubmissions(Settings.settings().QUEUE.PARALLEL_THREADS, aggressive); } } synchronized (this) { @@ -312,8 +312,8 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen // If queueing is enabled AND either of the following // - memory is low & queue size > num threads + 8 // - queue size > target size and primary queue has less than num threads submissions - if (enabledQueue && ((lowMem && size > Settings.IMP.QUEUE.PARALLEL_THREADS + 8) || (size > Settings.IMP.QUEUE.TARGET_SIZE && Fawe - .get() + if (enabledQueue && ((lowMem && size > Settings.settings().QUEUE.PARALLEL_THREADS + 8) || (size > Settings.settings().QUEUE.TARGET_SIZE && Fawe + .instance() .getQueueHandler() .isUnderutilized()))) { chunk = chunks.removeFirst(); @@ -321,9 +321,9 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen if (future != null && !future.isDone()) { final int targetSize; if (lowMem) { - targetSize = Settings.IMP.QUEUE.PARALLEL_THREADS + 8; + targetSize = Settings.settings().QUEUE.PARALLEL_THREADS + 8; } else { - targetSize = Settings.IMP.QUEUE.TARGET_SIZE; + targetSize = Settings.settings().QUEUE.TARGET_SIZE; } pollSubmissions(targetSize, lowMem); submissions.add(future); @@ -361,10 +361,10 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen * @param region region of chunks */ public void preload(Region region) { - if (Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT > 1) { + if (Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT > 1) { int loadCount = 0; for (BlockVector2 from : region.getChunks()) { - if (loadCount >= Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT) { + if (loadCount >= Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT) { break; } loadCount++; @@ -409,7 +409,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen lastException = hash; exceptionCount = 0; LOGGER.catching(e); - } else if (exceptionCount < Settings.IMP.QUEUE.PARALLEL_THREADS) { + } else if (exceptionCount < Settings.settings().QUEUE.PARALLEL_THREADS) { exceptionCount++; LOGGER.warn(message); } @@ -449,7 +449,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen lastException = hash; exceptionCount = 0; LOGGER.catching(e); - } else if (exceptionCount < Settings.IMP.QUEUE.PARALLEL_THREADS) { + } else if (exceptionCount < Settings.settings().QUEUE.PARALLEL_THREADS) { exceptionCount++; LOGGER.warn(message); } @@ -464,7 +464,7 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen for (IQueueChunk chunk : chunks.values()) { final Future future = submitUnchecked(chunk); if (future != null && !future.isDone()) { - pollSubmissions(Settings.IMP.QUEUE.PARALLEL_THREADS, true); + pollSubmissions(Settings.settings().QUEUE.PARALLEL_THREADS, true); submissions.add(future); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java index 0829ac710..89c9d0519 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java @@ -124,7 +124,7 @@ public class BitSetBlocks implements IChunkSet { @Override public char[] load(int layer) { layer -= minSectionPosition; - char[] arr = FaweCache.IMP.SECTION_BITS_TO_CHAR.get(); + char[] arr = FaweCache.INSTANCE.SECTION_BITS_TO_CHAR.get(); MemBlockSet.IRow nullRowY = row.getRow(layer); if (nullRowY instanceof MemBlockSet.RowY) { char value = blockState.getOrdinalChar(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java index 882cbe682..8b434cc8a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java @@ -201,7 +201,7 @@ public abstract class CharBlocks implements IBlocks { set(layer, index, value); } catch (ArrayIndexOutOfBoundsException exception) { LOGGER.error("Tried setting block at coordinates (" + x + "," + y + "," + z + ")"); - assert Fawe.imp() != null; + assert Fawe.platform() != null; LOGGER.error("Layer variable was = {}", layer, exception); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index 64e3aa7ed..df8bde411 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -23,10 +23,10 @@ import java.util.stream.IntStream; public class CharSetBlocks extends CharBlocks implements IChunkSet { - private static final Pool POOL = FaweCache.IMP.registerPool( + private static final Pool POOL = FaweCache.INSTANCE.registerPool( CharSetBlocks.class, CharSetBlocks::new, - Settings.IMP.QUEUE.POOL + Settings.settings().QUEUE.POOL ); public static CharSetBlocks newInstance() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java index eea966ebc..8f7b8007c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java @@ -124,7 +124,7 @@ public final class NullChunkGet implements IChunkGet { @Nonnull public char[] load(int layer) { - return FaweCache.IMP.EMPTY_CHAR_4096; + return FaweCache.INSTANCE.EMPTY_CHAR_4096; } @Nullable diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java index 27fdf76ad..5634dd1f5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java @@ -32,10 +32,10 @@ import java.util.concurrent.Future; @SuppressWarnings("rawtypes") public class ChunkHolder> implements IQueueChunk { - private static final Pool POOL = FaweCache.IMP.registerPool( + private static final Pool POOL = FaweCache.INSTANCE.registerPool( ChunkHolder.class, ChunkHolder::new, - Settings.IMP.QUEUE.POOL + Settings.settings().QUEUE.POOL ); public static ChunkHolder newInstance() { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java index 9df1a8f9f..7f8195bbc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/packet/ChunkPacket.java @@ -64,8 +64,8 @@ public class ChunkPacket implements Function, Supplier { synchronized (this) { if (sectionBytes == null) { IBlocks tmpChunk = getChunk(); - byte[] buf = FaweCache.IMP.BYTE_BUFFER_8192.get(); - sectionBytes = tmpChunk.toByteArray(buf, tmpChunk.getBitMask(), this.full, Fawe.imp().isChunksStretched()); + byte[] buf = FaweCache.INSTANCE.BYTE_BUFFER_8192.get(); + sectionBytes = tmpChunk.toByteArray(buf, tmpChunk.getBitMask(), this.full, Fawe.platform().isChunksStretched()); } tmp = sectionBytes; } @@ -85,14 +85,14 @@ public class ChunkPacket implements Function, Supplier { @Override @Deprecated public byte[] get() { - return apply(FaweCache.IMP.BYTE_BUFFER_8192.get()); + return apply(FaweCache.INSTANCE.BYTE_BUFFER_8192.get()); } public CompoundTag getHeightMap() { HashMap map = new HashMap<>(); map.put("MOTION_BLOCKING", new long[36]); // TODO - return FaweCache.IMP.asTag(map); + return FaweCache.INSTANCE.asTag(map); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java index 43d18f3a7..29e82790d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/preloader/AsyncPreloader.java @@ -31,7 +31,7 @@ public class AsyncPreloader implements Preloader, Runnable { public AsyncPreloader() { this.update = new ConcurrentHashMap<>(); - TaskManager.IMP.laterAsync(this, 1); + TaskManager.taskManager().laterAsync(this, 1); } @Override @@ -77,7 +77,7 @@ public class AsyncPreloader implements Preloader, Runnable { existing.setKey(world); existing.setValue(ImmutableSet.copyOf(Iterables.limit( region.getChunks(), - Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT + Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT ))); } synchronized (update) { @@ -89,12 +89,12 @@ public class AsyncPreloader implements Preloader, Runnable { @Override public void run() { - FaweTimer timer = Fawe.get().getTimer(); + FaweTimer timer = Fawe.instance().getTimer(); if (cancelled.get()) { return; } if (update.isEmpty()) { - TaskManager.IMP.laterAsync(this, 1); + TaskManager.taskManager().laterAsync(this, 1); return; } Iterator>>> plrIter = update.entrySet().iterator(); @@ -118,7 +118,7 @@ public class AsyncPreloader implements Preloader, Runnable { if (cancelled.get()) { return; } - TaskManager.IMP.laterAsync(this, 20); + TaskManager.taskManager().laterAsync(this, 20); } private void queueLoad(World world, BlockVector2 chunk) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java index dd413080b..60c6e6be9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java @@ -29,7 +29,7 @@ public abstract class FaweMaskManager { public abstract FaweMask getMask(final Player player, MaskType type, boolean isWhitelist); public boolean isExclusive() { - return Settings.IMP.REGION_RESTRICTIONS_OPTIONS.EXCLUSIVE_MANAGERS.contains(this.key); + return Settings.settings().REGION_RESTRICTIONS_OPTIONS.EXCLUSIVE_MANAGERS.contains(this.key); } public enum MaskType { @@ -39,7 +39,7 @@ public abstract class FaweMaskManager { public static MaskType getDefaultMaskType() { try { return MaskType - .valueOf(Settings.IMP.REGION_RESTRICTIONS_OPTIONS.MODE.toUpperCase(Locale.ROOT)); + .valueOf(Settings.settings().REGION_RESTRICTIONS_OPTIONS.MODE.toUpperCase(Locale.ROOT)); } catch (Exception ignored) { return MEMBER; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java index d6fa8f5d1..ae64b274e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java @@ -115,7 +115,7 @@ public class MainUtil { public static long getTotalSize(Path path) { final AtomicLong size = new AtomicLong(0); - traverse(path, new RunnableVal2() { + traverse(path, new RunnableVal2<>() { @Override public void run(Path path, BasicFileAttributes attrs) { size.addAndGet(attrs.size()); @@ -126,7 +126,7 @@ public class MainUtil { public static void traverse(Path path, final BiConsumer onEach) { try { - Files.walkFileTree(path, new SimpleFileVisitor() { + Files.walkFileTree(path, new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { @@ -231,20 +231,19 @@ public class MainUtil { } public static long getSize(ChangeSet changeSet) { - if (changeSet instanceof FaweStreamChangeSet) { - FaweStreamChangeSet fscs = (FaweStreamChangeSet) changeSet; + if (changeSet instanceof FaweStreamChangeSet fscs) { return fscs.getSizeOnDisk() + fscs.getSizeInMemory(); // } else if (changeSet instanceof CPUOptimizedChangeSet) { // return changeSet.size() + 32; } else if (changeSet != null) { - return changeSet.size() * 128; + return changeSet.size() * 128L; } else { return 0; } } public static FaweOutputStream getCompressedOS(OutputStream os, int amount) throws IOException { - return getCompressedOS(os, amount, Settings.IMP.HISTORY.BUFFER_SIZE); + return getCompressedOS(os, amount, Settings.settings().HISTORY.BUFFER_SIZE); } private static final LZ4Factory FACTORY = LZ4Factory.fastestInstance(); @@ -350,7 +349,7 @@ public class MainUtil { } public static FaweInputStream getCompressedIS(InputStream is) throws IOException { - return getCompressedIS(is, Settings.IMP.HISTORY.BUFFER_SIZE); + return getCompressedIS(is, Settings.settings().HISTORY.BUFFER_SIZE); } public static FaweInputStream getCompressedIS(InputStream is, int buffer) throws IOException { @@ -381,7 +380,7 @@ public class MainUtil { } public static URL upload(UUID uuid, String file, String extension, @Nonnull final RunnableVal writeTask) { - return upload(Settings.IMP.WEB.URL, uuid != null, uuid != null ? uuid.toString() : null, file, extension, writeTask); + return upload(Settings.settings().WEB.URL, uuid != null, uuid != null ? uuid.toString() : null, file, extension, writeTask); } public static URL upload( @@ -413,16 +412,15 @@ public class MainUtil { StandardCharsets.UTF_8 ), true)) { String crlf = "\r\n"; - writer.append("--" + boundary).append(crlf); + writer.append("--").append(boundary).append(crlf); writer.append("Content-Disposition: form-data; name=\"param\"").append(crlf); - writer.append("Content-Type: text/plain; charset=" + StandardCharsets.UTF_8.displayName()).append(crlf); + writer.append("Content-Type: text/plain; charset=").append(StandardCharsets.UTF_8.displayName()).append(crlf); String param = "value"; writer.append(crlf).append(param).append(crlf).flush(); - writer.append("--" + boundary).append(crlf); - writer - .append("Content-Disposition: form-data; name=\"schematicFile\"; filename=\"" + filename + '"') + writer.append("--").append(boundary).append(crlf); + writer.append("Content-Disposition: form-data; name=\"schematicFile\"; filename=\"").append(filename).append(String.valueOf('"')) .append(crlf); - writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(filename)).append(crlf); + writer.append("Content-Type: ").append(URLConnection.guessContentTypeFromName(filename)).append(crlf); writer.append("Content-Transfer-Encoding: binary").append(crlf); writer.append(crlf).flush(); OutputStream nonClosable = new AbstractDelegateOutputStream(new BufferedOutputStream(output)) { @@ -434,7 +432,7 @@ public class MainUtil { writeTask.run(); nonClosable.flush(); writer.append(crlf).flush(); - writer.append("--" + boundary + "--").append(crlf).flush(); + writer.append("--").append(boundary).append("--").append(crlf).flush(); } int responseCode = ((HttpURLConnection) con).getResponseCode(); String content; @@ -524,7 +522,7 @@ public class MainUtil { try { return getJarFile(Fawe.class); } catch (MalformedURLException | URISyntaxException | SecurityException e) { - return new File(Fawe.imp().getDirectory().getParentFile(), "FastAsyncWorldEdit.jar"); + return new File(Fawe.platform().getDirectory().getParentFile(), "FastAsyncWorldEdit.jar"); } } @@ -598,7 +596,7 @@ public class MainUtil { public static File copyFile(File jar, String resource, File output, String fileName) { try { if (output == null) { - output = Fawe.imp().getDirectory(); + output = Fawe.platform().getDirectory(); } if (!output.exists()) { output.mkdirs(); @@ -663,21 +661,19 @@ public class MainUtil { continue; } switch (c) { - case '-': - val = -val; - break; - case '.': + case '-' -> val = -val; + case '.' -> { res[index--] = val; if (index == -1) { return res; } val = 0; numIndex = 1; - break; - default: + } + default -> { val = val + (c - 48) * numIndex; numIndex *= 10; - break; + } } } res[index] = val; @@ -802,30 +798,30 @@ public class MainUtil { int years = (int) (time / 33868800); int time1 = years * 33868800; time -= time1; - toreturn.append(years + "y "); + toreturn.append(years).append("y "); } if (time >= 604800) { int weeks = (int) (time / 604800); - time -= weeks * 604800; - toreturn.append(weeks + "w "); + time -= weeks * 604800L; + toreturn.append(weeks).append("w "); } if (time >= 86400) { int days = (int) (time / 86400); - time -= days * 86400; - toreturn.append(days + "d "); + time -= days * 86400L; + toreturn.append(days).append("d "); } if (time >= 3600) { int hours = (int) (time / 3600); - time -= hours * 3600; - toreturn.append(hours + "h "); + time -= hours * 3600L; + toreturn.append(hours).append("h "); } if (time >= 60) { int minutes = (int) (time / 60); - time -= minutes * 60; - toreturn.append(minutes + "m "); + time -= minutes * 60L; + toreturn.append(minutes).append("m "); } if (toreturn.equals("") || time > 0) { - toreturn.append((time) + "s "); + toreturn.append(time).append("s "); } return toreturn.toString().trim(); } @@ -849,23 +845,23 @@ public class MainUtil { case "wks": case "w": - time += 604800 * nums; + time += 604800L * nums; case "days": case "day": case "d": - time += 86400 * nums; + time += 86400L * nums; case "hour": case "hr": case "hrs": case "hours": case "h": - time += 3600 * nums; + time += 3600L * nums; case "minutes": case "minute": case "mins": case "min": case "m": - time += 60 * nums; + time += 60L * nums; case "seconds": case "second": case "secs": diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java index 7aa4036ee..7760663ea 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java @@ -44,7 +44,7 @@ public class MemUtil { } final long heapFreeSize = Runtime.getRuntime().freeMemory(); final int size = (int) ((heapFreeSize * 100) / heapMaxSize); - if (size > (100 - Settings.IMP.MAX_MEMORY_PERCENT)) { + if (size > (100 - Settings.settings().MAX_MEMORY_PERCENT)) { memoryPlentifulTask(); return Integer.MAX_VALUE; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java index 9124d06e0..ad69c87d6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java @@ -21,10 +21,31 @@ public abstract class TaskManager { private static final Logger LOGGER = LogManagerCompat.getLogger(); + /** + * @deprecated Use {@link #taskManager()} to get an instance. + */ + @Deprecated(forRemoval = true, since = "2.0.0") public static TaskManager IMP; - + static TaskManager INSTANCE; private final ForkJoinPool pool = new ForkJoinPool(); + protected TaskManager() { + INSTANCE = this; + } + + /** + * Gets an instance of the TaskManager. + * + * @return an instance of the TaskManager + * @since 2.0.0 + */ + public static TaskManager taskManager() { + if (INSTANCE == null) { + INSTANCE = Fawe.platform().getTaskManager(); + } + return INSTANCE; + } + /** * Run a repeating task on the main thread. * @@ -68,8 +89,8 @@ public abstract class TaskManager { /** * Run a bunch of tasks in parallel using the shared thread pool. */ - public void parallel(Collection runnables) { - for (Runnable run : runnables) { + public void parallel(Collection runables) { + for (Runnable run : runables) { pool.submit(run); } pool.awaitQuiescence(Long.MAX_VALUE, TimeUnit.MILLISECONDS); @@ -87,7 +108,7 @@ public abstract class TaskManager { return; } if (numThreads == null) { - numThreads = Settings.IMP.QUEUE.PARALLEL_THREADS; + numThreads = Settings.settings().QUEUE.PARALLEL_THREADS; } if (numThreads <= 1) { for (Runnable run : runnables) { @@ -135,7 +156,7 @@ public abstract class TaskManager { * Disable async catching for a specific task. */ public void runUnsafe(Runnable run) { - QueueHandler queue = Fawe.get().getQueueHandler(); + QueueHandler queue = Fawe.instance().getQueueHandler(); queue.startSet(true); try { run.run(); @@ -256,7 +277,7 @@ public abstract class TaskManager { synchronized (running) { while (running.get()) { running.wait(timeout); - if (running.get() && System.currentTimeMillis() - start > Settings.IMP.QUEUE.DISCARD_AFTER_MS) { + if (running.get() && System.currentTimeMillis() - start > Settings.settings().QUEUE.DISCARD_AFTER_MS) { new RuntimeException("FAWE is taking a long time to execute a task (might just be a symptom): ").printStackTrace(); LOGGER.info("For full debug information use: /fawe threads"); } @@ -278,7 +299,7 @@ public abstract class TaskManager { if (Fawe.isMainThread()) { run.run(); } else { - Fawe.get().getQueueHandler().sync(run); + Fawe.instance().getQueueHandler().sync(run); } } @@ -293,7 +314,7 @@ public abstract class TaskManager { return function.value; } try { - return Fawe.get().getQueueHandler().sync((Supplier) function).get(); + return Fawe.instance().getQueueHandler().sync((Supplier) function).get(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -309,7 +330,7 @@ public abstract class TaskManager { return supplier.get(); } try { - return Fawe.get().getQueueHandler().sync(supplier).get(); + return Fawe.instance().getQueueHandler().sync(supplier).get(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -334,7 +355,7 @@ public abstract class TaskManager { return function.get(); } try { - return Fawe.get().getQueueHandler().sync(function).get(); + return Fawe.instance().getQueueHandler().sync(function).get(); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index d1e9a17a9..2a7da6939 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -340,7 +340,7 @@ public class TextureUtil implements TextureHolder { * Do not use. Use {@link Fawe#getTextureUtil()} */ public TextureUtil() throws FileNotFoundException { - this(MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.TEXTURES)); + this(MainUtil.getFile(Fawe.platform().getDirectory(), Settings.settings().PATHS.TEXTURES)); } /** @@ -351,12 +351,12 @@ public class TextureUtil implements TextureHolder { if (!folder.exists()) { try { LOGGER.info("Downloading asset jar from Mojang, please wait..."); - new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/").mkdirs(); + new File(Fawe.platform().getDirectory() + "/" + Settings.settings().PATHS.TEXTURES + "/").mkdirs(); try (BufferedInputStream in = new BufferedInputStream( new URL("https://launcher.mojang.com/v1/objects/7e46fb47609401970e2818989fa584fd467cd036/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.1.jar")) { + Fawe.platform().getDirectory() + "/" + Settings.settings().PATHS.TEXTURES + "/1.18.1.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { @@ -395,7 +395,7 @@ public class TextureUtil implements TextureHolder { } public static TextureUtil fromBlocks(Set blocks) throws FileNotFoundException { - return new FilteredTextureUtil(Fawe.get().getTextureUtil(), blocks); + return new FilteredTextureUtil(Fawe.instance().getTextureUtil(), blocks); } public static TextureUtil fromMask(Mask mask) throws FileNotFoundException { @@ -404,7 +404,7 @@ public class TextureUtil implements TextureHolder { SingleFilterBlock extent = new SingleFilterBlock(); new MaskTraverser(mask).reset(extent); - TextureUtil tu = Fawe.get().getTextureUtil(); + TextureUtil tu = Fawe.instance().getTextureUtil(); for (int typeId : tu.getValidBlockIds()) { BlockType block = BlockTypes.get(typeId); extent.init(0, 0, 0, block.getDefaultState().toBaseBlock()); @@ -807,13 +807,13 @@ public class TextureUtil implements TextureHolder { // Get all the jar files File[] files = folder.listFiles((dir, name) -> name.endsWith(".jar")); if (files.length == 0) { - new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/") + new File(Fawe.platform().getDirectory() + "/" + Settings.settings().PATHS.TEXTURES + "/") .mkdirs(); try (BufferedInputStream in = new BufferedInputStream( new URL("https://launcher.mojang.com/v1/objects/7e46fb47609401970e2818989fa584fd467cd036/client.jar") .openStream()); FileOutputStream fileOutputStream = new FileOutputStream( - Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/1.18.1.jar")) { + Fawe.platform().getDirectory() + "/" + Settings.settings().PATHS.TEXTURES + "/1.18.1.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java index 30c14c92f..6425cfd14 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UpdateNotification.java @@ -27,14 +27,14 @@ public class UpdateNotification { * Check whether a new build with a higher build number than the current build is available. */ public static void doUpdateCheck() { - if (Settings.IMP.ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { + if (Settings.settings().ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit/api/xml/").openStream()); faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent(); - FaweVersion faweVersion = Fawe.get().getVersion(); + FaweVersion faweVersion = Fawe.instance().getVersion(); if (faweVersion.build == 0) { LOGGER.warn("You are using a snapshot or a custom version of FAWE. This is not an official build distributed " + "via https://www.spigotmc.org/resources/13932/"); @@ -66,9 +66,9 @@ public class UpdateNotification { * @param actor The player to notify. */ public static void doUpdateNotification(Actor actor) { - if (Settings.IMP.ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { + if (Settings.settings().ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { if (actor.hasPermission("fawe.admin") && UpdateNotification.hasUpdate) { - FaweVersion faweVersion = Fawe.get().getVersion(); + FaweVersion faweVersion = Fawe.instance().getVersion(); int versionDifference = Integer.parseInt(UpdateNotification.faweVersion) - faweVersion.build; actor.print(Caption.of( "fawe.info.update-available", diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java index cbb5695ec..3b2a4782e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java @@ -26,10 +26,28 @@ import java.util.Set; public class WEManager { - public static final WEManager IMP = new WEManager(); private static final Logger LOGGER = LogManagerCompat.getLogger(); + private static WEManager INSTANCE; + /** + * @deprecated Use {@link #weManager()} instead. + */ + @Deprecated(forRemoval = true, since = "2.0.0") + private final WEManager IMP = new WEManager(); private final ArrayDeque managers = new ArrayDeque<>(); + private WEManager() { + INSTANCE = this; + } + + /** + * Get an instance of the WEManager. + * + * @return an instance of the WEManager + */ + public static WEManager weManager() { + return INSTANCE; + } + public ArrayDeque getManagers() { return managers; } @@ -81,7 +99,7 @@ public class WEManager { * @return array of allowed regions if whitelist, else of disallowed regions. */ public Region[] getMask(Player player, FaweMaskManager.MaskType type, final boolean isWhitelist) { - if (!Settings.IMP.REGION_RESTRICTIONS || player.hasPermission("fawe.bypass") || player.hasPermission("fawe.bypass.regions")) { + if (!Settings.settings().REGION_RESTRICTIONS || player.hasPermission("fawe.bypass") || player.hasPermission("fawe.bypass.regions")) { return new Region[]{RegionWrapper.GLOBAL()}; } Location loc = player.getLocation(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java index 6da6b471e..50512235c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java @@ -22,7 +22,7 @@ import java.util.Set; public final class MemBlockSet extends BlockSet { public static final int BITS_PER_WORD = 6; - public static final int WORDS = FaweCache.IMP.BLOCKS_PER_LAYER >> BITS_PER_WORD; + public static final int WORDS = FaweCache.INSTANCE.BLOCKS_PER_LAYER >> BITS_PER_WORD; public static final IRow NULL_ROW_X = new NullRowX(); public static final IRow NULL_ROW_Z = new NullRowZ(); public static final IRow NULL_ROW_Y = new NullRowY(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java index ee8ee6251..a8998e1f0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java @@ -212,8 +212,8 @@ public class ImageUtil { if (arg.startsWith("file:/")) { arg = arg.replaceFirst("file:/+", ""); File file = MainUtil.getFile(MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HEIGHTMAP + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HEIGHTMAP ), arg); return MainUtil.readImage(file); } @@ -234,8 +234,8 @@ public class ImageUtil { if (arg.startsWith("file:/")) { arg = arg.replaceFirst("file:/+", ""); File file = MainUtil.getFile(MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HEIGHTMAP + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HEIGHTMAP ), arg); if (!file.exists()) { throw new InputParseException(Caption.of( diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java index ef92296c0..c14ca93eb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/progress/DefaultProgressTracker.java @@ -17,8 +17,8 @@ public class DefaultProgressTracker implements BiConsumer { this.task = new Runnable() { @Override public void run() { - long allowedTick = Fawe.get().getTimer().getTick() - 1; + long allowedTick = Fawe.instance().getTimer().getTick() - 1; Iterator> iter = objMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); @@ -32,7 +32,7 @@ public abstract class SingleThreadIntervalQueue { } synchronized (objMap) { if (!objMap.isEmpty()) { - TaskManager.IMP.laterAsync(this, interval); + TaskManager.taskManager().laterAsync(this, interval); } else { queued.set(false); } @@ -51,10 +51,10 @@ public abstract class SingleThreadIntervalQueue { public void queue(T obj) { synchronized (objMap) { - objMap.put(obj, Fawe.get().getTimer().getTick()); + objMap.put(obj, Fawe.instance().getTimer().getTick()); if (!queued.get()) { queued.set(true); - TaskManager.IMP.laterAsync(task, 3); + TaskManager.taskManager().laterAsync(task, 3); } } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java index 70c7abd9c..dcc65ae21 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java @@ -97,7 +97,7 @@ public interface SimpleWorld extends World { @Override default boolean queueBlockBreakEffect(Platform server, BlockVector3 position, BlockType blockType, double priority) { - Fawe.get().getQueueHandler().sync((Supplier) () -> playEffect( + Fawe.instance().getQueueHandler().sync((Supplier) () -> playEffect( position, 2001, blockType.getLegacyCombinedId() >> 4 diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java index b7d9acace..700070611 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java @@ -38,7 +38,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public void findFreePosition(Location searchPos) { - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Boolean value) { getBasePlayer().findFreePosition(searchPos); @@ -48,7 +48,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public void setOnGround(Location searchPos) { - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Boolean value) { getBasePlayer().setOnGround(searchPos); @@ -58,7 +58,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public void findFreePosition() { - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Boolean value) { getBasePlayer().findFreePosition(); @@ -68,12 +68,12 @@ public class AsyncPlayer extends PlayerProxy { @Override public boolean ascendLevel() { - return TaskManager.IMP.sync(() -> getBasePlayer().ascendLevel()); + return TaskManager.taskManager().sync(() -> getBasePlayer().ascendLevel()); } @Override public boolean descendLevel() { - return TaskManager.IMP.sync(() -> getBasePlayer().descendLevel()); + return TaskManager.taskManager().sync(() -> getBasePlayer().descendLevel()); } @Override @@ -155,7 +155,7 @@ public class AsyncPlayer extends PlayerProxy { unwrap(getBasePlayer())).build(); edit.setBlock(BlockVector3.at(x, y - 1, z), BlockTypes.GLASS); edit.flushQueue(); - LocalSession session = Fawe.get().getWorldEdit().getSessionManager().get(this); + LocalSession session = Fawe.instance().getWorldEdit().getSessionManager().get(this); if (session != null) { session.remember(edit, true, getBasePlayer().getLimit().MAX_HISTORY); } @@ -173,12 +173,12 @@ public class AsyncPlayer extends PlayerProxy { @Override public void setPosition(Vector3 pos, float pitch, float yaw) { - Fawe.get().getQueueHandler().sync(() -> super.setPosition(pos, pitch, yaw)); + Fawe.instance().getQueueHandler().sync(() -> super.setPosition(pos, pitch, yaw)); } @Override public Location getBlockTrace(int range, boolean useLastBlock) { - return TaskManager.IMP.sync(() -> { + return TaskManager.taskManager().sync(() -> { TargetBlock tb = new TargetBlock(AsyncPlayer.this, range, 0.2D); return useLastBlock ? tb.getAnyTargetBlock() : tb.getTargetBlock(); }); @@ -186,7 +186,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public Location getBlockTraceFace(int range, boolean useLastBlock) { - return TaskManager.IMP.sync(() -> { + return TaskManager.taskManager().sync(() -> { TargetBlock tb = new TargetBlock(AsyncPlayer.this, range, 0.2D); return useLastBlock ? tb.getAnyTargetBlockFace() : tb.getTargetBlockFace(); }); @@ -194,7 +194,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public Location getSolidBlockTrace(int range) { - return TaskManager.IMP.sync(() -> { + return TaskManager.taskManager().sync(() -> { TargetBlock tb = new TargetBlock(AsyncPlayer.this, range, 0.2D); return tb.getSolidTargetBlock(); }); @@ -207,7 +207,7 @@ public class AsyncPlayer extends PlayerProxy { @Override public boolean passThroughForwardWall(int range) { - return TaskManager.IMP.sync(() -> { + return TaskManager.taskManager().sync(() -> { int searchDist = 0; TargetBlock hitBlox = new TargetBlock(AsyncPlayer.this, range, 0.2); Extent world = getLocation().getExtent(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java index 8374cba7c..0537aef0a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java @@ -238,7 +238,7 @@ public class WorldWrapper extends AbstractWorld { @Override public void simulateBlockMine(BlockVector3 pt) { - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Object value) { parent.simulateBlockMine(pt); @@ -249,7 +249,7 @@ public class WorldWrapper extends AbstractWorld { //FAWE start @Override public Collection getBlockDrops(final BlockVector3 position) { - return TaskManager.IMP.sync(() -> parent.getBlockDrops(position)); + return TaskManager.taskManager().sync(() -> parent.getBlockDrops(position)); } //FAWE end @@ -266,7 +266,7 @@ public class WorldWrapper extends AbstractWorld { @Override public boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException { - return TaskManager.IMP.sync(() -> { + return TaskManager.taskManager().sync(() -> { try { return parent.generateTree(type, editSession, position); } catch (MaxChangedBlocksException e) { @@ -307,12 +307,12 @@ public class WorldWrapper extends AbstractWorld { @Override public List getEntities(Region region) { - return TaskManager.IMP.sync(() -> parent.getEntities(region)); + return TaskManager.taskManager().sync(() -> parent.getEntities(region)); } @Override public List getEntities() { - return TaskManager.IMP.sync(parent::getEntities); + return TaskManager.taskManager().sync(parent::getEntities); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index f1e21c067..77757fe77 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -1289,7 +1289,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { // Don't relight twice! if (!relighter.isFinished() && relighter.getLock().tryLock()) { try { - if (Settings.IMP.LIGHTING.REMOVE_FIRST) { + if (Settings.settings().LIGHTING.REMOVE_FIRST) { relighter.removeAndRelight(true); } else { relighter.fixLightingSafe(true); @@ -1305,14 +1305,14 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } // Cancel any preloader associated with the actor if present if (getActor() instanceof Player) { - Preloader preloader = Fawe.imp().getPreloader(false); + Preloader preloader = Fawe.platform().getPreloader(false); if (preloader != null) { preloader.cancel(getActor()); } } // Enqueue it if (getChangeSet() != null) { - if (Settings.IMP.HISTORY.COMBINE_STAGES) { + if (Settings.settings().HISTORY.COMBINE_STAGES) { ((AbstractChangeSet) getChangeSet()).closeAsync(); } else { try { @@ -3649,7 +3649,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } if (containsAny) { changes++; - TaskManager.IMP.sync(new RunnableVal() { + TaskManager.taskManager().sync(new RunnableVal() { @Override public void run(Object value) { regenerateChunk(cx, cz, biome, seed); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java index 13d159913..e8af94c69 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java @@ -303,7 +303,7 @@ public final class EditSessionBuilder { */ public EditSessionBuilder changeSet(boolean disk, @Nullable UUID uuid) { if (disk) { - if (Settings.IMP.HISTORY.USE_DATABASE) { + if (Settings.settings().HISTORY.USE_DATABASE) { this.changeSet = new RollbackOptimizedHistory(world, uuid); } else { this.changeSet = new DiskStorageHistory(world, uuid); @@ -437,7 +437,7 @@ public final class EditSessionBuilder { } if (fastMode == null) { if (actor == null) { - fastMode = !Settings.IMP.HISTORY.ENABLE_FOR_CONSOLE; + fastMode = !Settings.settings().HISTORY.ENABLE_FOR_CONSOLE; } else { fastMode = actor.getSession().hasFastMode(); } @@ -466,12 +466,12 @@ public final class EditSessionBuilder { wnaMode = false; if (unwrapped instanceof IQueueExtent) { extent = queue = (IQueueExtent) unwrapped; - } else if (Settings.IMP.QUEUE.PARALLEL_THREADS > 1 && !Fawe.isMainThread()) { - ParallelQueueExtent parallel = new ParallelQueueExtent(Fawe.get().getQueueHandler(), world, fastMode); + } else if (Settings.settings().QUEUE.PARALLEL_THREADS > 1 && !Fawe.isMainThread()) { + ParallelQueueExtent parallel = new ParallelQueueExtent(Fawe.instance().getQueueHandler(), world, fastMode); queue = parallel.getExtent(); extent = parallel; } else { - extent = queue = Fawe.get().getQueueHandler().getQueue(world); + extent = queue = Fawe.instance().getQueueHandler().getQueue(world); } } else { wnaMode = true; @@ -480,7 +480,7 @@ public final class EditSessionBuilder { if (combineStages == null) { combineStages = // If it's enabled in the settings - Settings.IMP.HISTORY.COMBINE_STAGES + Settings.settings().HISTORY.COMBINE_STAGES // If fast placement is disabled, it's slower to perform a copy on each chunk && this.limit.FAST_PLACEMENT // If the edit uses items from the inventory we can't use a delayed task @@ -490,17 +490,17 @@ public final class EditSessionBuilder { this.bypassHistory = this.extent = wrapExtent(bypassAll, eventBus, event, EditSession.Stage.BEFORE_REORDER); if (!this.fastMode || changeSet != null) { if (changeSet == null) { - if (Settings.IMP.HISTORY.USE_DISK) { + if (Settings.settings().HISTORY.USE_DISK) { UUID uuid = actor == null ? Identifiable.CONSOLE : actor.getUniqueId(); - if (Settings.IMP.HISTORY.USE_DATABASE) { + if (Settings.settings().HISTORY.USE_DATABASE) { changeSet = new RollbackOptimizedHistory(world, uuid); } else { changeSet = new DiskStorageHistory(world, uuid); } -// } else if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0) { +// } else if (combineStages && Settings.settings().HISTORY.COMPRESSION_LEVEL == 0) { // changeSet = new CPUOptimizedChangeSet(world); } else { - if (combineStages && Settings.IMP.HISTORY.COMPRESSION_LEVEL == 0) { + if (combineStages && Settings.settings().HISTORY.COMPRESSION_LEVEL == 0) { //TODO add CPUOptimizedChangeSet } changeSet = new MemoryOptimizedHistory(world); @@ -528,7 +528,7 @@ public final class EditSessionBuilder { } } } - if (allowedRegions == null && Settings.IMP.REGION_RESTRICTIONS) { + if (allowedRegions == null && Settings.settings().REGION_RESTRICTIONS) { if (actor != null && !actor.hasPermission("fawe.bypass") && !actor.hasPermission("fawe.bypass.regions")) { if (actor instanceof Player) { Player player = (Player) actor; @@ -536,7 +536,7 @@ public final class EditSessionBuilder { } } } - if (disallowedRegions == null && Settings.IMP.REGION_RESTRICTIONS && Settings.IMP.REGION_RESTRICTIONS_OPTIONS.ALLOW_BLACKLISTS) { + if (disallowedRegions == null && Settings.settings().REGION_RESTRICTIONS && Settings.settings().REGION_RESTRICTIONS_OPTIONS.ALLOW_BLACKLISTS) { if (actor != null && !actor.hasPermission("fawe.bypass") && !actor.hasPermission("fawe.bypass.regions")) { if (actor instanceof Player) { Player player = (Player) actor; @@ -562,7 +562,7 @@ public final class EditSessionBuilder { } // There's no need to do lighting (and it'll also just be a pain to implement) if we're not placing chunks if (placeChunks) { - if (((relightMode != null && relightMode != RelightMode.NONE) || (relightMode == null && Settings.IMP.LIGHTING.MODE > 0))) { + if (((relightMode != null && relightMode != RelightMode.NONE) || (relightMode == null && Settings.settings().LIGHTING.MODE > 0))) { relighter = WorldEdit.getInstance().getPlatformManager() .queryCapability(Capability.WORLD_EDITING) .getRelighterFactory().createRelighter(relightMode, world, queue); @@ -704,13 +704,13 @@ public final class EditSessionBuilder { } if (toReturn != extent) { String className = toReturn.getClass().getName().toLowerCase(Locale.ROOT); - for (String allowed : Settings.IMP.EXTENT.ALLOWED_PLUGINS) { + for (String allowed : Settings.settings().EXTENT.ALLOWED_PLUGINS) { if (className.contains(allowed.toLowerCase(Locale.ROOT))) { this.wrapped = true; return toReturn; } } - if (Settings.IMP.EXTENT.DEBUG) { + if (Settings.settings().EXTENT.DEBUG) { if (event.getActor() != null) { event.getActor().printDebug(TextComponent.of("Potentially unsafe extent blocked: " + toReturn .getClass() diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 2fd81d469..236ea7403 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -225,7 +225,7 @@ public class LocalSession implements TextureHolder { if (world == null || uuid == null) { return false; } - if (Settings.IMP.HISTORY.USE_DISK) { + if (Settings.settings().HISTORY.USE_DISK) { MAX_HISTORY_SIZE = Integer.MAX_VALUE; } world = WorldWrapper.unwrap(world); @@ -248,8 +248,8 @@ public class LocalSession implements TextureHolder { private boolean loadHistoryChangeSets(UUID uuid, World world) { SparseBitSet set = new SparseBitSet(); final File folder = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid ); if (folder.isDirectory()) { folder.listFiles(pathname -> { @@ -282,12 +282,12 @@ public class LocalSession implements TextureHolder { } private void loadHistoryNegativeIndex(UUID uuid, World world) { - if (!Settings.IMP.HISTORY.USE_DISK) { + if (!Settings.settings().HISTORY.USE_DISK) { return; } File file = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid + File.separator + "index" + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid + File.separator + "index" ); if (file.exists()) { try (FaweInputStream is = new FaweInputStream(new FileInputStream(file))) { @@ -301,12 +301,12 @@ public class LocalSession implements TextureHolder { } private void saveHistoryNegativeIndex(UUID uuid, World world) { - if (world == null || !Settings.IMP.HISTORY.USE_DISK) { + if (world == null || !Settings.settings().HISTORY.USE_DISK) { return; } File file = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid + File.separator + "index" + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + world.getName() + File.separator + uuid + File.separator + "index" ); if (getHistoryNegativeIndex() != 0) { try { @@ -450,8 +450,8 @@ public class LocalSession implements TextureHolder { } if (o instanceof Integer) { File folder = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HISTORY + File.separator + currentWorld.getName() + File.separator + uuid + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HISTORY + File.separator + currentWorld.getName() + File.separator + uuid ); File specific = new File(folder, o.toString()); if (specific.isDirectory()) { @@ -467,7 +467,7 @@ public class LocalSession implements TextureHolder { public void remember(Identifiable player, World world, ChangeSet changeSet, FaweLimit limit) { historyWriteLock.lock(); try { - if (Settings.IMP.HISTORY.USE_DISK) { + if (Settings.settings().HISTORY.USE_DISK) { LocalSession.MAX_HISTORY_SIZE = Integer.MAX_VALUE; } if (changeSet.size() == 0) { @@ -500,7 +500,7 @@ public class LocalSession implements TextureHolder { } if (limit != null) { int limitMb = limit.MAX_HISTORY; - while (((!Settings.IMP.HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history + while (((!Settings.settings().HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history .size() > 1) { ChangeSet item = (ChangeSet) history.remove(0); item.delete(); @@ -516,7 +516,7 @@ public class LocalSession implements TextureHolder { public void remember(EditSession editSession, boolean append, int limitMb) { historyWriteLock.lock(); try { - if (Settings.IMP.HISTORY.USE_DISK) { + if (Settings.settings().HISTORY.USE_DISK) { LocalSession.MAX_HISTORY_SIZE = Integer.MAX_VALUE; } // It should have already been flushed, but just in case! @@ -564,7 +564,7 @@ public class LocalSession implements TextureHolder { } else { history.add(0, changeSet); } - while (((!Settings.IMP.HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history + while (((!Settings.settings().HISTORY.USE_DISK && history.size() > MAX_HISTORY_SIZE) || (historySize >> 20) > limitMb) && history .size() > 1) { ChangeSet item = (ChangeSet) history.remove(0); item.delete(); @@ -1146,7 +1146,7 @@ public class LocalSession implements TextureHolder { @Nullable public Tool getTool(Player player) { loadDefaults(player, false); - if (!Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES && tools.isEmpty()) { + if (!Settings.settings().EXPERIMENTAL.PERSISTENT_BRUSHES && tools.isEmpty()) { return null; } BaseItem item = player.getItemInHand(HandSide.MAIN_HAND); @@ -1157,7 +1157,7 @@ public class LocalSession implements TextureHolder { public Tool getTool(BaseItem item, Player player) { loadDefaults(player, false); - if (Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES && item.getNativeItem() != null) { + if (Settings.settings().EXPERIMENTAL.PERSISTENT_BRUSHES && item.getNativeItem() != null) { BrushTool tool = BrushCache.getTool(player, this, item); if (tool != null) { return tool; @@ -1303,7 +1303,7 @@ public class LocalSession implements TextureHolder { } Tool previous; - if (player != null && (tool instanceof BrushTool || tool == null) && Settings.IMP.EXPERIMENTAL.PERSISTENT_BRUSHES && item.getNativeItem() != null) { + if (player != null && (tool instanceof BrushTool || tool == null) && Settings.settings().EXPERIMENTAL.PERSISTENT_BRUSHES && item.getNativeItem() != null) { previous = BrushCache.getCachedTool(item); BrushCache.setTool(item, (BrushTool) tool); if (tool != null) { @@ -1782,7 +1782,7 @@ public class LocalSession implements TextureHolder { TextureUtil tmp = texture; if (tmp == null) { synchronized (this) { - tmp = Fawe.get().getCachedTextureUtil(true, 0, 100); + tmp = Fawe.instance().getCachedTextureUtil(true, 0, 100); this.texture = tmp; } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java index b115afbca..77cb921cc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java @@ -860,8 +860,8 @@ public class BrushCommands { } String filenamePng = filename.endsWith(".png") ? filename : filename + ".png"; File file = new File( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.HEIGHTMAP + File.separator + filenamePng + Fawe.platform().getDirectory(), + Settings.settings().PATHS.HEIGHTMAP + File.separator + filenamePng ); if (file.exists()) { return new FileInputStream(file); @@ -936,7 +936,7 @@ public class BrushCommands { if (tool != null) { root |= name.startsWith("../"); name = FileSystems.getDefault().getPath(name).getFileName().toString(); - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + File folder = MainUtil.getFile(Fawe.platform().getDirectory(), "brushes"); name = name.endsWith(".jsgz") ? name : name + ".jsgz"; File file; if (root && player.hasPermission("worldedit.brush.save.other")) { @@ -971,7 +971,7 @@ public class BrushCommands { public void loadBrush(Player player, LocalSession session, @Arg(desc = "String name") String name) throws WorldEditException, IOException { name = FileSystems.getDefault().getPath(name).getFileName().toString(); - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + File folder = MainUtil.getFile(Fawe.platform().getDirectory(), "brushes"); name = name.endsWith(".jsgz") ? name : name + ".jsgz"; File file = new File(folder, player.getUniqueId() + File.separator + name); if (!file.exists()) { @@ -1006,7 +1006,7 @@ public class BrushCommands { int page ) throws WorldEditException { String baseCmd = "/brush loadbrush"; - File dir = MainUtil.getFile(Fawe.imp().getDirectory(), "brushes"); + File dir = MainUtil.getFile(Fawe.platform().getDirectory(), "brushes"); // TODO NOT IMPLEMENTED // UtilityCommands.list(dir, actor, args, page, null, true, baseCmd); } @@ -1310,7 +1310,7 @@ public class BrushCommands { worldEdit.checkMaxBrushRadius(radius); //FAWE start - FaweLimit limit = Settings.IMP.getLimit(player); + FaweLimit limit = Settings.settings().getLimit(player); iterations = Math.min(limit.MAX_ITERATIONS, iterations); //FAWE end @@ -1345,7 +1345,7 @@ public class BrushCommands { worldEdit.checkMaxBrushRadius(radius); //FAWE start - FaweLimit limit = Settings.IMP.getLimit(player); + FaweLimit limit = Settings.settings().getLimit(player); iterations = Math.min(limit.MAX_ITERATIONS, iterations); //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index 61c220f68..f3a24ed9c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -405,7 +405,7 @@ public class ClipboardCommands { url = null; } } else { - if (Settings.IMP.WEB.URL.isEmpty()) { + if (Settings.settings().WEB.URL.isEmpty()) { actor.print(Caption.of("fawe.error.setting.disable", "web.url")); return; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java index c7bcc7e65..3d54e40a7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GeneralCommands.java @@ -475,7 +475,7 @@ public class GeneralCommands { String arg = arguments.get(0); String argLower = arg.toLowerCase(Locale.ROOT); - TextureUtil util = Fawe.get().getTextureUtil(); + TextureUtil util = Fawe.instance().getTextureUtil(); int randomIndex = 1; boolean checkRandomization = true; if (arguments.size() >= 2 && MathMan.isInteger(arguments.get(0)) && MathMan.isInteger(arguments.get(1))) { @@ -500,7 +500,7 @@ public class GeneralCommands { Clipboard clipboard = session.getClipboard().getClipboard(); util = TextureUtil.fromClipboard(clipboard); } else if (argLower.equals("*") || argLower.equals("true")) { - util = Fawe.get().getTextureUtil(); + util = Fawe.instance().getTextureUtil(); } else { ParserContext parserContext = new ParserContext(); parserContext.setActor(actor); 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 d63f26e52..b34e7860f 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 @@ -582,7 +582,7 @@ public class GenerationCommands { @Arg(desc = "TODO", def = "100") int threshold, @Arg(desc = "BlockVector2", def = "") BlockVector2 dimensions ) throws WorldEditException, IOException { - TextureUtil tu = Fawe.get().getCachedTextureUtil(randomize, 0, threshold); + TextureUtil tu = Fawe.instance().getCachedTextureUtil(randomize, 0, threshold); URL url = new URL(imageURL); if (!url.getHost().equalsIgnoreCase("i.imgur.com")) { throw new IOException("Only i.imgur.com links are allowed!"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java index 1d97c13d2..3688041d4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java @@ -114,7 +114,7 @@ public class HistorySubCommands { @Switch(name = 'f', desc = "Restore instead of rollback") boolean restore ) throws WorldEditException { - if (!Settings.IMP.HISTORY.USE_DATABASE) { + if (!Settings.settings().HISTORY.USE_DATABASE) { player.print(Caption.of("fawe.error.setting.disable", "history.use-database (Import with /history import )")); return; } @@ -168,7 +168,7 @@ public class HistorySubCommands { @CommandPermissions("fawe.rollback.import") @Confirm public synchronized void importdb(Actor actor) throws WorldEditException { - File folder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HISTORY); + File folder = MainUtil.getFile(Fawe.platform().getDirectory(), Settings.settings().PATHS.HISTORY); if (folder.exists()) { for (File worldFolder : Objects.requireNonNull(folder.listFiles())) { if (worldFolder != null && worldFolder.isDirectory()) { @@ -238,7 +238,7 @@ public class HistorySubCommands { } Location origin = player.getLocation(); - String name = Fawe.imp().getName(edit.getUUID()); + String name = Fawe.platform().getName(edit.getUUID()); String cmd = edit.getCommand(); BlockVector3 pos1 = edit.getMinimumPoint(); BlockVector3 pos2 = edit.getMaximumPoint(); @@ -319,7 +319,7 @@ public class HistorySubCommands { UUID uuid = rollback.getUUID(); int index = rollback.getIndex(); - String name = Fawe.imp().getName(rollback.getUUID()); + String name = Fawe.platform().getName(rollback.getUUID()); String cmd = rollback.getCommand(); BlockVector3 pos1 = rollback.getMinimumPoint(); @@ -382,7 +382,7 @@ public class HistorySubCommands { @ArgFlag(name = 'p', desc = "Page to view.", def = "") Integer page ) throws WorldEditException { - if (!Settings.IMP.HISTORY.USE_DATABASE) { + if (!Settings.settings().HISTORY.USE_DATABASE) { player.print(Caption.of("fawe.error.setting.disable", "history.use-database (Import with //history import )")); return; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index 6e7f5f4fd..4065c56ad 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -203,7 +203,7 @@ public class SchematicCommands { } else { final LocalConfiguration config = this.worldEdit.getConfiguration(); File working = this.worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - File root = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; + File root = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; uri = new File(root, fileName).toURI(); } @@ -238,13 +238,13 @@ public class SchematicCommands { IOException { LocalConfiguration config = worldEdit.getConfiguration(); File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; + File dir = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; File destDir = new File(dir, directory); if (!MainUtil.isInSubDirectory(working, destDir)) { actor.print(Caption.of("worldedit.schematic.directory-does-not-exist", TextComponent.of(String.valueOf(destDir)))); return; } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, destDir) && !actor.hasPermission( + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, destDir) && !actor.hasPermission( "worldedit.schematic.move.other")) { actor.print(Caption.of("fawe.error.no-perm", "worldedit.schematic.move.other")); return; @@ -265,7 +265,7 @@ public class SchematicCommands { actor.print(Caption.of("fawe.worldedit.schematic.schematic.move.exists", destFile)); continue; } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && (!MainUtil.isInSubDirectory( + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && (!MainUtil.isInSubDirectory( dir, destFile ) || !MainUtil.isInSubDirectory(dir, source)) && !actor.hasPermission("worldedit.schematic.delete.other")) { @@ -333,7 +333,7 @@ public class SchematicCommands { return; } UUID uuid = UUID.fromString(filename.substring(4)); - URL webUrl = new URL(Settings.IMP.WEB.URL); + URL webUrl = new URL(Settings.settings().WEB.URL); format = ClipboardFormats.findByAlias(formatName); URL url = new URL(webUrl, "uploads/" + uuid + "." + format.getPrimaryFileExtension()); ReadableByteChannel byteChannel = Channels.newChannel(url.openStream()); @@ -341,7 +341,7 @@ public class SchematicCommands { uri = url.toURI(); } else { File saveDir = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(saveDir, actor.getUniqueId().toString()) : saveDir; + File dir = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS ? new File(saveDir, actor.getUniqueId().toString()) : saveDir; File file; if (filename.startsWith("#")) { format = ClipboardFormats.findByAlias(formatName); @@ -357,7 +357,7 @@ public class SchematicCommands { return; } } else { - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && !actor.hasPermission("worldedit.schematic.load.other") && Pattern + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && !actor.hasPermission("worldedit.schematic.load.other") && Pattern .compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") .matcher(filename) .find()) { @@ -446,7 +446,7 @@ public class SchematicCommands { File dir = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); //FAWE start - if (!global && Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS) { + if (!global && Settings.settings().PATHS.PER_PLAYER_SCHEMATICS) { dir = new File(dir, actor.getUniqueId().toString()); } @@ -580,7 +580,7 @@ public class SchematicCommands { final boolean hasShow = false; //If player forgot -p argument - boolean playerFolder = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS; + boolean playerFolder = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS; UUID uuid = playerFolder ? actor.getUniqueId() : null; List files = UtilityCommands.getFiles(dir, actor, args, formatName, playerFolder, oldFirst, newFirst); List> entries = UtilityCommands.filesToEntry(dir, files, uuid); @@ -670,14 +670,14 @@ public class SchematicCommands { String headerBytesElem = String.format("%.1fkb", totalBytes / 1000.0); - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT > -1) { + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT > -1) { headerBytesElem += String.format( " / %dkb", - Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT + Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT ); } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS) { + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS) { String fullHeader = "| My Schematics: " + headerBytesElem + " |"; PaginationBox paginationBox = PaginationBox.fromComponents(fullHeader, pageCommand, components); actor.print(paginationBox.create(page)); @@ -704,7 +704,7 @@ public class SchematicCommands { LocalConfiguration config = worldEdit.getConfiguration(); File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); //FAWE start - File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; + File dir = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS ? new File(working, actor.getUniqueId().toString()) : working; List files = new ArrayList<>(); if (filename.equalsIgnoreCase("*")) { @@ -723,7 +723,7 @@ public class SchematicCommands { actor.print(Caption.of("worldedit.schematic.delete.does-not-exist", TextComponent.of(filename))); continue; } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, f) && !actor.hasPermission( + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && !MainUtil.isInSubDirectory(dir, f) && !actor.hasPermission( "worldedit.schematic.delete.other")) { actor.print(Caption.of("fawe.error.no-perm", "worldedit.schematic.delete.other")); continue; @@ -806,8 +806,8 @@ public class SchematicCommands { Clipboard target; //FAWE start - boolean checkFilesize = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS - && Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT > -1; + boolean checkFilesize = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS + && Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT > -1; double directorysizeKb = 0; String curFilepath = file.getAbsolutePath(); @@ -838,7 +838,7 @@ public class SchematicCommands { } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT > -1) { + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT > -1) { if (numFiles == -1) { numFiles = 0; @@ -851,7 +851,7 @@ public class SchematicCommands { } } } - int limit = Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT; + int limit = Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT; if (numFiles >= limit) { TextComponent noSlotsErr = TextComponent.of( //TODO - to be moved into captions/translatablecomponents @@ -902,7 +902,7 @@ public class SchematicCommands { if (checkFilesize) { double curKb = filesizeKb + directorysizeKb; - int allocatedKb = Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT; + int allocatedKb = Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_SIZE_LIMIT; if (overwrite) { curKb -= oldKbOverwritten; @@ -937,11 +937,11 @@ public class SchematicCommands { actor.print(kbRemainingNotif); } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT > -1) { + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT > -1) { TextComponent slotsRemainingNotif = TextComponent.of( //TODO - to be moved into captions/translatablecomponents - "You have " + (Settings.IMP.EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT - numFiles) + "You have " + (Settings.settings().EXPERIMENTAL.PER_PLAYER_FILE_NUM_LIMIT - numFiles) + " schematic file slots left.", TextColor.GRAY ); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 4dbbc29dc..9a7de94a4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -135,9 +135,9 @@ public class UtilityCommands { @Arg(name = "max", desc = "int", def = "200") int max ) throws IOException { actor.print(TextComponent.of("Please wait while we generate the minified heightmaps.")); - File srcFolder = MainUtil.getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.HEIGHTMAP); + File srcFolder = MainUtil.getFile(Fawe.platform().getDirectory(), Settings.settings().PATHS.HEIGHTMAP); - File webSrc = new File(Fawe.imp().getDirectory(), "web" + File.separator + "heightmap"); + File webSrc = new File(Fawe.platform().getDirectory(), "web" + File.separator + "heightmap"); File minImages = new File(webSrc, "images" + File.separator + "min"); File maxImages = new File(webSrc, "images" + File.separator + "max"); final int sub = srcFolder.getAbsolutePath().length(); @@ -698,7 +698,7 @@ public class UtilityCommands { //FAWE start - run this sync int finalRadius = radius; - int killed = TaskManager.IMP.sync(() -> killMatchingEntities(finalRadius, actor, flags::createFunction)); + int killed = TaskManager.taskManager().sync(() -> killMatchingEntities(finalRadius, actor, flags::createFunction)); //FAWE end actor.print(Caption.of( @@ -730,7 +730,7 @@ public class UtilityCommands { } //FAWE start - run this sync - int removed = TaskManager.IMP.sync(() -> killMatchingEntities(radius, actor, remover::createFunction)); + int removed = TaskManager.taskManager().sync(() -> killMatchingEntities(radius, actor, remover::createFunction)); //FAWE end actor.print(Caption.of("worldedit.remove.removed", TextComponent.of(removed))); return removed; @@ -953,7 +953,7 @@ public class UtilityCommands { String dirFilter = File.separator; boolean listMine = false; - boolean listGlobal = !Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS; + boolean listGlobal = !Settings.settings().PATHS.PER_PLAYER_SCHEMATICS; if (len > 0) { for (String arg : args) { switch (arg.toLowerCase(Locale.ROOT)) { @@ -982,7 +982,7 @@ public class UtilityCommands { if (!exists) { arg = arg.substring(0, arg.length() - File.separator.length()); if (arg.length() > 3 && arg.length() <= 16) { - UUID fromName = Fawe.imp().getUUID(arg); + UUID fromName = Fawe.platform().getUUID(arg); if (fromName != null) { newDirFilter = dirFilter + fromName + File.separator; listGlobal = true; @@ -1103,7 +1103,7 @@ public class UtilityCommands { if (newList.isEmpty()) { String checkName = filter.replace("\\", "/").split("/")[0]; if (checkName.length() > 3 && checkName.length() <= 16) { - UUID fromName = Fawe.imp().getUUID(checkName); + UUID fromName = Fawe.platform().getUUID(checkName); if (fromName != null) { lowerFilter = filter.replaceFirst(checkName, fromName.toString()).toLowerCase(Locale.ROOT); for (int i = 0; i < normalizedNames.length; i++) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index c145fa61f..4a5883b90 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -81,7 +81,7 @@ public class WorldEditCommands { @CommandPermissions(queued = false) public void version(Actor actor) { //FAWE start - use own, minimized message that doesn't print "Platforms" and "Capabilities" - FaweVersion fVer = Fawe.get().getVersion(); + FaweVersion fVer = Fawe.instance().getVersion(); String fVerStr = fVer == null ? "unknown" : "-" + fVer.build; actor.print(TextComponent.of("FastAsyncWorldEdit" + fVerStr)); actor.print(TextComponent.of("Authors: Empire92, MattBDev, IronApollo, dordsor21 and NotMyFault")); @@ -105,7 +105,7 @@ public class WorldEditCommands { .queryCapability(Capability.CONFIGURATION) .getConfiguration())); //FAWE start - Fawe.get().setupConfigs(); + Fawe.instance().setupConfigs(); //FAWE end actor.print(Caption.of("worldedit.reload.config")); } @@ -120,9 +120,9 @@ public class WorldEditCommands { String dest; try { final File logFile = new File("logs/latest.log"); - final File config = new File(Fawe.imp().getDirectory(), "config.yml"); - final File worldeditConfig = new File(Fawe.imp().getDirectory(), "worldedit-config.yml"); - dest = IncendoPaster.debugPaste(logFile, Fawe.imp().getDebugInfo(), config, worldeditConfig); + final File config = new File(Fawe.platform().getDirectory(), "config.yml"); + final File worldeditConfig = new File(Fawe.platform().getDirectory(), "worldedit-config.yml"); + dest = IncendoPaster.debugPaste(logFile, Fawe.platform().getDebugInfo(), config, worldeditConfig); } catch (IOException e) { actor.printInfo(TextComponent.of(e.getMessage())); return; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java index f1e8c2e04..79bd7be24 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java @@ -56,7 +56,7 @@ public enum SelectionWand implements DoubleActionBlockTool { if (selector.selectPrimary(blockPoint, ActorSelectorLimits.forActor(player))) { //FAWE start - if (Settings.IMP.EXPERIMENTAL.OTHER) { + if (Settings.settings().EXPERIMENTAL.OTHER) { LOGGER.info("actSecondary Hit and about to explain with explainPrimarySelection"); } //FAWE end @@ -79,7 +79,7 @@ public enum SelectionWand implements DoubleActionBlockTool { if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) { //FAWE start - if (Settings.IMP.EXPERIMENTAL.OTHER) { + if (Settings.settings().EXPERIMENTAL.OTHER) { LOGGER.info("actPrimary Hit and about to explain with explainSecondarySelection"); } //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java index 023b33672..f2310a211 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/EntityRemover.java @@ -148,7 +148,7 @@ public class EntityRemover { if (registryType != null) { if (type.matches(registryType)) { //FAWE start - Calling this async violates thread safety - TaskManager.IMP.sync(entity::remove); + TaskManager.taskManager().sync(entity::remove); //FAWE end return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java index eeb5989f2..5bf1ccc6c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/ConfirmHandler.java @@ -29,7 +29,7 @@ public class ConfirmHandler implements CommandCallListener { } Actor actor = actorOpt.get(); // don't check confirmation if actor doesn't need to confirm - if (!Settings.IMP.getLimit(actor).CONFIRM_LARGE) { + if (!Settings.settings().getLimit(actor).CONFIRM_LARGE) { return; } if (!confirmAnnotation.value().passes(actor, parameters, 1)) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Preload.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Preload.java index 3c1104321..ae05397bd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Preload.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Preload.java @@ -32,7 +32,7 @@ public @interface Preload { @Override public void preload(Actor actor, InjectedValueAccess context) { World world = context.injectedValue(Key.of(EditSession.class)).get().getWorld(); - Preloader preloader = Fawe.imp().getPreloader(true); + Preloader preloader = Fawe.platform().getPreloader(true); if (preloader != null) { preloader.update(actor, world); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PreloadHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PreloadHandler.java index 034101537..9e1dc106f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PreloadHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/PreloadHandler.java @@ -29,7 +29,7 @@ public class PreloadHandler implements CommandCallListener { } Actor actor = actorOpt.get(); // Don't attempt to preload if effectively disabled - if (Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT <= 1) { + if (Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT <= 1) { return; } preloadAnnotation.value().preload(actor, parameters); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java index 5d4206c71..b6c39a34c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -425,7 +425,7 @@ public interface Player extends Entity, Actor { default void unregister() { cancel(true); LocalSession session = getSession(); - if (Settings.IMP.CLIPBOARD.USE_DISK && Settings.IMP.CLIPBOARD.DELETE_ON_LOGOUT) { + if (Settings.settings().CLIPBOARD.USE_DISK && Settings.settings().CLIPBOARD.DELETE_ON_LOGOUT) { ClipboardHolder holder = session.getExistingClipboard(); if (holder != null) { for (Clipboard clipboard : holder.getClipboards()) { @@ -441,10 +441,10 @@ public interface Player extends Entity, Actor { doc.getFile().delete(); } } - } else if (Settings.IMP.CLIPBOARD.DELETE_ON_LOGOUT || Settings.IMP.CLIPBOARD.USE_DISK) { + } else if (Settings.settings().CLIPBOARD.DELETE_ON_LOGOUT || Settings.settings().CLIPBOARD.USE_DISK) { session.setClipboard(null); } - if (Settings.IMP.HISTORY.DELETE_ON_LOGOUT) { + if (Settings.settings().HISTORY.DELETE_ON_LOGOUT) { session.clearHistory(); } } @@ -456,8 +456,8 @@ public interface Player extends Entity, Actor { */ default void loadClipboardFromDisk() { File file = MainUtil.getFile( - Fawe.imp().getDirectory(), - Settings.IMP.PATHS.CLIPBOARD + File.separator + getUniqueId() + ".bd" + Fawe.platform().getDirectory(), + Settings.settings().PATHS.CLIPBOARD + File.separator + getUniqueId() + ".bd" ); try { if (file.exists() && file.length() > 5) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java index 1edad0ba1..0b8909198 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractNonPlayerActor.java @@ -110,7 +110,7 @@ public abstract class AbstractNonPlayerActor implements Actor { if (async) { asyncNotifyQueue.run(wrapped); } else { - TaskManager.IMP.taskNow(wrapped, false); + TaskManager.taskManager().taskNow(wrapped, false); } return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index 87d137283..d02819dc6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -491,7 +491,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public Region[] getAllowedRegions(FaweMaskManager.MaskType type) { - return WEManager.IMP.getMask(this, type, true); + return WEManager.weManager().getMask(this, type, true); } @Override @@ -501,7 +501,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public Region[] getDisallowedRegions(FaweMaskManager.MaskType type) { - return WEManager.IMP.getMask(this, type, false); + return WEManager.weManager().getMask(this, type, false); } @Override @@ -677,7 +677,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { if (async) { asyncNotifyQueue.run(wrapped); } else { - TaskManager.IMP.taskNow(wrapped, false); + TaskManager.taskManager().taskNow(wrapped, false); } return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java index 1f938ea82..a2871270b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java @@ -220,13 +220,13 @@ public interface Actor extends Identifiable, SessionOwner, Subject, MapMetadatab default boolean checkAction() { long time = getMeta("faweActionTick", Long.MIN_VALUE); - long tick = Fawe.get().getTimer().getTick(); + long tick = Fawe.instance().getTimer().getTick(); setMeta("faweActionTick", tick); return tick > time; } default FaweLimit getLimit() { - return Settings.IMP.getLimit(this); + return Settings.settings().getLimit(this); } default boolean runAsyncIfFree(Runnable r) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index 626703203..4c23e353d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -434,7 +434,7 @@ public final class PlatformCommandManager { public void registerAllCommands() { //FAWE start - if (Settings.IMP.ENABLED_COMPONENTS.COMMANDS) { + if (Settings.settings().ENABLED_COMPONENTS.COMMANDS) { // TODO: Ping @MattBDev to reimplement (or remove) 2020-02-04 // registerSubCommands( // "patterns", @@ -674,7 +674,7 @@ public final class PlatformCommandManager { Actor actor = event.getActor(); String args = event.getArguments(); - TaskManager.IMP.taskNow(() -> { + TaskManager.taskManager().taskNow(() -> { if (!Fawe.isMainThread()) { Thread.currentThread().setName("FAWE Thread for player: " + actor.getName()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java index a29903a6d..d3944a153 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java @@ -244,7 +244,7 @@ public class AbstractDelegateExtent implements Extent { @Override public Extent addProcessor(IBatchProcessor processor) { - if (Settings.IMP.EXPERIMENTAL.OTHER) { + if (Settings.settings().EXPERIMENTAL.OTHER) { LOGGER.info("addProcessor Info: \t " + processor.getClass().getName()); LOGGER.info("The following is not an error or a crash:"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); @@ -262,7 +262,7 @@ public class AbstractDelegateExtent implements Extent { @Override public Extent addPostProcessor(IBatchProcessor processor) { - if (Settings.IMP.EXPERIMENTAL.OTHER) { + if (Settings.settings().EXPERIMENTAL.OTHER) { LOGGER.info("addPostProcessor Info: \t " + processor.getClass().getName()); LOGGER.info("The following is not an error or a crash:"); StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java index 9d4fa8dfd..334ab4da4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java @@ -870,7 +870,7 @@ public interface Extent extends InputExtent, OutputExtent { } default Extent enableHistory(AbstractChangeSet changeSet) { - if (Settings.IMP.HISTORY.SEND_BEFORE_HISTORY) { + if (Settings.settings().HISTORY.SEND_BEFORE_HISTORY) { return addPostProcessor(changeSet); } else { return addProcessor(changeSet); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java index 345ff978f..c28f4a07a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/MaskingExtent.java @@ -62,7 +62,7 @@ public class MaskingExtent extends AbstractDelegateExtent implements IBatchProce checkNotNull(mask); this.mask = mask; //FAWE start - this.threadIdToFilter = FaweCache.IMP.createCache(() -> new CharFilterBlock(getExtent())); + this.threadIdToFilter = FaweCache.INSTANCE.createCache(() -> new CharFilterBlock(getExtent())); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index 241425a8e..e65f9d634 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -86,9 +86,9 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl } static Clipboard create(Region region, UUID uuid) { - if (Settings.IMP.CLIPBOARD.USE_DISK) { + if (Settings.settings().CLIPBOARD.USE_DISK) { return new DiskOptimizedClipboard(region, uuid); - } else if (Settings.IMP.CLIPBOARD.COMPRESSION_LEVEL == 0) { + } else if (Settings.settings().CLIPBOARD.COMPRESSION_LEVEL == 0) { return new CPUOptimizedClipboard(region); } else { return new MemoryOptimizedClipboard(region); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java index 70e6d4161..b00c9ea5b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormats.java @@ -187,21 +187,21 @@ public class ClipboardFormats { } return null; } - URL base = new URL(Settings.IMP.WEB.URL); + URL base = new URL(Settings.settings().WEB.URL); input = new URL(base, "uploads/" + input.substring(4) + "." + format.getPrimaryFileExtension()).toString(); } if (input.startsWith("http")) { return null; } - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").matcher(input).find() && !player.hasPermission("worldedit.schematic.load.other")) { player.print(Caption.of("fawe.error.no-perm", "worldedit.schematic.load.other")); return null; } File working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS + File dir = Settings.settings().PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working; File f; if (input.startsWith("#")) { @@ -219,7 +219,7 @@ public class ClipboardFormats { return null; } } else { - if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS + if (Settings.settings().PATHS.PER_PLAYER_SCHEMATICS && Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").matcher(input).find() && !player.hasPermission("worldedit.schematic.load.other")) { if (message) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java index 7a379d622..2a10e9f4b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicWriter.java @@ -120,7 +120,7 @@ public class SpongeSchematicWriter implements ClipboardWriter { metadata.put("WEOffsetX", new IntTag(offset.getBlockX())); metadata.put("WEOffsetY", new IntTag(offset.getBlockY())); metadata.put("WEOffsetZ", new IntTag(offset.getBlockZ())); - metadata.put("FAWEVersion", new IntTag(Fawe.get().getVersion().build)); + metadata.put("FAWEVersion", new IntTag(Fawe.instance().getVersion().build)); schematic.put("Metadata", new CompoundTag(metadata)); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java index 674ac46e6..8382319c9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/transform/BlockTransformExtent.java @@ -438,7 +438,7 @@ public class BlockTransformExtent extends ResettableExtent { if (directions != null) { int oldIndex = property.getIndex(state.getInternalId()); if (oldIndex >= directions.length) { - if (Settings.IMP.ENABLED_COMPONENTS.DEBUG) { + if (Settings.settings().ENABLED_COMPONENTS.DEBUG) { LOGGER.warn(String.format( "Index outside direction array length found for block:{%s} property:{%s}", state.getBlockType().getId(), diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java index c061b0b35..88cf4fc6f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/world/SurvivalModeExtent.java @@ -99,7 +99,7 @@ public class SurvivalModeExtent extends AbstractDelegateExtent { Collection drops = world.getBlockDrops(location); boolean canSet = super.setBlock(location, block); if (canSet) { - TaskManager.IMP.sync(new RunnableVal<>() { + TaskManager.taskManager().sync(new RunnableVal<>() { @Override public void run(Object value) { for (BaseItemStack stack : drops) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java index 7966f1217..8decb381a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java @@ -290,13 +290,13 @@ public abstract class BreadthFirstSearch implements Operation { BlockVectorSet chunkLoadSet = new BlockVectorSet(); for (currentDepth = 0; !queue.isEmpty() && currentDepth <= maxDepth; currentDepth++) { int loadCount = 0; - if (singleQueue != null && Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT > 1) { + if (singleQueue != null && Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT > 1) { int cx = Integer.MIN_VALUE; int cz = Integer.MIN_VALUE; outer: for (BlockVector3 from : queue) { for (BlockVector3 direction : dirs) { - if (loadCount > Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT) { + if (loadCount > Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT) { break outer; } int x = from.getBlockX() + direction.getBlockX(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java index c12c793ef..ff6b67e03 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java @@ -93,7 +93,7 @@ public class RegionVisitor implements Operation { @Override public Operation resume(RunContext run) throws WorldEditException { //FAWE start > allow chunk preloading - if (singleQueue != null && Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT > 1) { + if (singleQueue != null && Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT > 1) { /* * The following is done to reduce iteration cost * - Preload chunks just in time @@ -107,7 +107,7 @@ public class RegionVisitor implements Operation { int lastTrailChunkZ = Integer.MIN_VALUE; int lastLeadChunkX = Integer.MIN_VALUE; int lastLeadChunkZ = Integer.MIN_VALUE; - int loadingTarget = Settings.IMP.QUEUE.PRELOAD_CHUNK_COUNT; + int loadingTarget = Settings.settings().QUEUE.PRELOAD_CHUNK_COUNT; while (trailIter.hasNext()) { BlockVector3 pt = trailIter.next(); apply(pt); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java index 4cf937ac4..82e89aee7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java @@ -467,7 +467,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { @Override public Iterator iterator() { //FAWE start - if (Settings.IMP.HISTORY.COMPRESSION_LEVEL >= 9) { + if (Settings.settings().HISTORY.COMPRESSION_LEVEL >= 9) { return iterator_old(); } //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java index 10e2f45f5..8515b8952 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -430,7 +430,7 @@ public interface Region extends Iterable, Cloneable, IBatchProcess int by = layer << 4; int ty = by + 15; if (containsEntireCuboid(bx, tx, by, ty, bz, tz)) { - set.setBlocks(layer, FaweCache.IMP.EMPTY_CHAR_4096); + set.setBlocks(layer, FaweCache.INSTANCE.EMPTY_CHAR_4096); processExtra = true; continue; } From ca5ad58f012596065572205e4d0a814ce21ff44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien?= <43724816+Aurelien30000@users.noreply.github.com> Date: Thu, 23 Dec 2021 12:39:11 +0100 Subject: [PATCH 35/81] Fix WEManager (#1487) * Fix WeManager? * Fix WeManager? * Also register WEManager if not available, like TaskManager. --- .../java/com/fastasyncworldedit/core/util/WEManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java index 3b2a4782e..9839d84e6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java @@ -32,7 +32,7 @@ public class WEManager { * @deprecated Use {@link #weManager()} instead. */ @Deprecated(forRemoval = true, since = "2.0.0") - private final WEManager IMP = new WEManager(); + public static WEManager IMP = new WEManager(); private final ArrayDeque managers = new ArrayDeque<>(); private WEManager() { @@ -45,6 +45,9 @@ public class WEManager { * @return an instance of the WEManager */ public static WEManager weManager() { + if (INSTANCE == null) { + INSTANCE = new WEManager(); + } return INSTANCE; } From 28079e81299d3fc5cc20c902a01fb7cfc63638aa Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Thu, 23 Dec 2021 15:59:05 +0100 Subject: [PATCH 36/81] refactor: Also deprecated `IMP` for DBHandler --- .../fastasyncworldedit/core/FaweCache.java | 2 +- .../core/command/tool/brush/InspectBrush.java | 2 +- .../core/database/DBHandler.java | 22 ++++++++++++++++--- .../platform/binding/ProvideBindings.java | 2 +- .../core/history/DiskStorageHistory.java | 2 +- .../history/RollbackOptimizedHistory.java | 2 +- .../core/util/WEManager.java | 4 ---- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java index e0f840a3f..087402810 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java @@ -67,7 +67,7 @@ public enum FaweCache implements Trimable { /** * @since 2.0.0 */ - INSTANCE;// singleton + INSTANCE; private static final Logger LOGGER = LogManagerCompat.getLogger(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java index 82d99c416..f0de661a1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/InspectBrush.java @@ -81,7 +81,7 @@ public class InspectBrush extends BrushTool { final int y = target.getBlockY(); final int z = target.getBlockZ(); World world = player.getWorld(); - RollbackDatabase db = DBHandler.IMP.getDatabase(world); + RollbackDatabase db = DBHandler.dbHandler().getDatabase(world); int count = 0; for (Supplier supplier : db.getEdits(target, false)) { count++; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java index d160c24c8..fd1263b11 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java @@ -9,12 +9,28 @@ import java.util.concurrent.ConcurrentHashMap; public class DBHandler { - private static final Logger LOGGER = LogManagerCompat.getLogger(); - + /** + * @deprecated Use {@link #dbHandler()} instead. + */ + @Deprecated(forRemoval = true, since = "2.0.0") public static final DBHandler IMP = new DBHandler(); - + private static final Logger LOGGER = LogManagerCompat.getLogger(); + private static DBHandler INSTANCE; private final Map databases = new ConcurrentHashMap<>(8, 0.9f, 1); + /** + * Get an instance of the DBHandler. + * + * @return an instance of the DBHandler. + * @since 2.0.0 + */ + public static DBHandler dbHandler() { + if (INSTANCE == null) { + INSTANCE = new DBHandler(); + } + return INSTANCE; + } + public RollbackDatabase getDatabase(World world) { RollbackDatabase database = databases.get(world); if (database != null) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java index b296b5577..8a5b25058 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/platform/binding/ProvideBindings.java @@ -68,7 +68,7 @@ public class ProvideBindings extends Bindings { @Binding public RollbackDatabase database(World world) { - return DBHandler.IMP.getDatabase(world); + return DBHandler.dbHandler().getDatabase(world); } @AllowedRegion(FaweMaskManager.MaskType.OWNER) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java index 5adeb0c91..7d0bfe76e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java @@ -121,7 +121,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet { public void delete() { deleteFiles(); if (Settings.settings().HISTORY.USE_DATABASE) { - RollbackDatabase db = DBHandler.IMP.getDatabase(getWorld()); + RollbackDatabase db = DBHandler.dbHandler().getDatabase(getWorld()); db.delete(uuid, index); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java index ee2862cdf..6e7e4068b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/RollbackOptimizedHistory.java @@ -99,7 +99,7 @@ public class RollbackOptimizedHistory extends DiskStorageHistory { public void close() throws IOException { super.close(); // Save to DB - RollbackDatabase db = DBHandler.IMP.getDatabase(getWorld()); + RollbackDatabase db = DBHandler.dbHandler().getDatabase(getWorld()); if (db != null) { db.logEdit(this); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java index 9839d84e6..cf7e4f4de 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java @@ -35,10 +35,6 @@ public class WEManager { public static WEManager IMP = new WEManager(); private final ArrayDeque managers = new ArrayDeque<>(); - private WEManager() { - INSTANCE = this; - } - /** * Get an instance of the WEManager. * From 0c8db1e1feb1645991508c28c8f4bc714a842453 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Sat, 25 Dec 2021 19:03:30 +0100 Subject: [PATCH 37/81] feat: Add a bunch of new types to the flora generator --- .../function/generator/FloraGenerator.java | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java index d199fcb61..5ea9aa66e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/FloraGenerator.java @@ -20,10 +20,13 @@ package com.sk89q.worldedit.function.generator; import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.RandomPattern; +import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; @@ -40,6 +43,11 @@ public class FloraGenerator implements RegionFunction { private final boolean biomeAware = false; private final Pattern desertPattern = getDesertPattern(); private final Pattern temperatePattern = getTemperatePattern(); + //FAWE start + private final Pattern mushroomPattern = mushroomPattern(); + private final Pattern netherPattern = netherPattern(); + private final Pattern warpedNyliumPattern = warpedNyliumPattern(); + //FAWE end /** * Create a new flora generator. @@ -101,17 +109,75 @@ public class FloraGenerator implements RegionFunction { return pattern; } + //FAWE start + /** + * Get a pattern for plants to place inside a mushroom environment. + * + * @return a pattern that places flora + */ + public static Pattern mushroomPattern() { + RandomPattern pattern = new RandomPattern(); + pattern.add(BlockTypes.RED_MUSHROOM.getDefaultState(), 10); + pattern.add(BlockTypes.BROWN_MUSHROOM.getDefaultState(), 10); + return pattern; + } + + /** + * Get a pattern for plants to place inside a nether environment. + * + * @return a pattern that places flora + */ + public static Pattern netherPattern() { + RandomPattern pattern = new RandomPattern(); + pattern.add(BlockTypes.CRIMSON_ROOTS.getDefaultState(), 10); + pattern.add(BlockTypes.CRIMSON_FUNGUS.getDefaultState(), 20); + pattern.add(BlockTypes.WARPED_FUNGUS.getDefaultState(), 5); + return pattern; + } + + /** + * Get a pattern for plants to place inside a nether environment. + * + * @return a pattern that places flora + */ + public static Pattern warpedNyliumPattern() { + RandomPattern pattern = new RandomPattern(); + pattern.add(BlockTypes.WARPED_ROOTS.getDefaultState(), 15); + pattern.add(BlockTypes.NETHER_SPROUTS.getDefaultState(), 20); + pattern.add(BlockTypes.WARPED_FUNGUS.getDefaultState(), 7); + pattern.add(BlockTypes.CRIMSON_ROOTS.getDefaultState(), 10); + return pattern; + } + //FAWE end + @Override public boolean apply(BlockVector3 position) throws WorldEditException { + //FAWE start + int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.GAME_HOOKS).getDataVersion(); + //FAWE end BlockState block = editSession.getBlock(position); if (block.getBlockType() == BlockTypes.GRASS_BLOCK) { editSession.setBlock(position.add(0, 1, 0), temperatePattern.applyBlock(position)); return true; - } else if (block.getBlockType() == BlockTypes.SAND) { + //FAWE start - add red sand + } else if (block.getBlockType() == BlockTypes.SAND || block.getBlockType() == BlockTypes.RED_SAND) { + //FAWE end editSession.setBlock(position.add(0, 1, 0), desertPattern.applyBlock(position)); return true; + //FAWE start - add new types + } else if (block.getBlockType() == BlockTypes.MYCELIUM || block.getBlockType() == BlockTypes.NETHERRACK) { + editSession.setBlock(position.add(0, 1, 0), mushroomPattern.applyBlock(position)); + return true; + } else if (dataVersion >= Constants.DATA_VERSION_MC_1_16) { + if (block.getBlockType() == BlockTypes.SOUL_SOIL || block.getBlockType() == BlockTypes.CRIMSON_NYLIUM) { + editSession.setBlock(position.add(0, 1, 0), netherPattern.applyBlock(position)); + return true; + } else if (block.getBlockType() == BlockTypes.WARPED_NYLIUM) { + editSession.setBlock(position.add(0, 1, 0), warpedNyliumPattern.applyBlock(position)); + } } + //FAWE end return false; } From 018042769d00d04e5c0a12043079773a8dcd024c Mon Sep 17 00:00:00 2001 From: SirYwell Date: Sun, 26 Dec 2021 09:31:03 +0100 Subject: [PATCH 38/81] use spigot-compatible palette constructor --- .../impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java index 47b67b009..abb0a1ab8 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java @@ -363,15 +363,14 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } // Create palette with data + @SuppressWarnings("deprecation") // constructor is deprecated on paper, but needed to keep compatibility with spigot final PalettedContainer blockStatePalettedContainer = new PalettedContainer<>( Block.BLOCK_STATE_REGISTRY, PalettedContainer.Strategy.SECTION_STATES, PalettedContainer.Strategy.SECTION_STATES.getConfiguration(Block.BLOCK_STATE_REGISTRY, bitsPerEntry), nmsBits, - palette, - null, - null + palette ); LevelChunkSection levelChunkSection; try { From 4ab140f6a13e892097e4c2ff5c9feb6956a1897a Mon Sep 17 00:00:00 2001 From: SirYwell Date: Sun, 26 Dec 2021 10:37:32 +0100 Subject: [PATCH 39/81] use spigot-compatible packet constructor --- .../v1_18_R1/PaperweightPlatformAdapter.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java index abb0a1ab8..78ad00245 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java @@ -269,9 +269,27 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { } LevelChunk levelChunk = optional.get(); TaskManager.taskManager().task(() -> { - ClientboundLevelChunkWithLightPacket packet = - new ClientboundLevelChunkWithLightPacket(levelChunk, nmsWorld.getChunkSource().getLightEngine(), null, null - , true, false); // last false is to not bother with x-ray + ClientboundLevelChunkWithLightPacket packet; + if (PaperLib.isPaper()) { + packet = new ClientboundLevelChunkWithLightPacket( + levelChunk, + nmsWorld.getChunkSource().getLightEngine(), + null, + null, + true, + false // last false is to not bother with x-ray + ); + } else { + // deprecated on paper + //noinspection deprecation + packet = new ClientboundLevelChunkWithLightPacket( + levelChunk, + nmsWorld.getChunkSource().getLightEngine(), + null, + null, + true + ); + } nearbyPlayers(nmsWorld, coordIntPair).forEach(p -> p.connection.send(packet)); }); } From a717df3c5f39ae1bf106441ce2afe2e780838abc Mon Sep 17 00:00:00 2001 From: SirYwell Date: Sun, 26 Dec 2021 16:18:09 +0100 Subject: [PATCH 40/81] implement 1.18 regen --- .../ext/fawe/v1_18_R1/PaperweightAdapter.java | 8 +- .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 4 +- .../fawe/v1_18_R1/regen/PaperweightRegen.java | 1223 +++++++---------- .../bukkit/adapter/Regenerator.java | 68 +- 4 files changed, 568 insertions(+), 735 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index 01b5ac23f..c30dfe662 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -673,7 +673,9 @@ public final class PaperweightAdapter implements BukkitImplAdapter public static + public static WorldGenSettings replaceSeed(ServerLevel originalWorld, long seed, WorldGenSettings originalOpts) { + // FAWE end RegistryWriteOps nbtReadRegOps = RegistryWriteOps.create( NbtOps.INSTANCE, originalWorld.getServer().registryAccess() @@ -700,8 +702,10 @@ public final class PaperweightAdapter implements BukkitImplAdapter private static @SuppressWarnings("unchecked") - private Dynamic recursivelySetSeed( + private static Dynamic recursivelySetSeed( + // FAWE end Dynamic dynamic, long seed, Set> seen diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index c04b4254a..ad53a1789 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_18_R1.PaperweightAdapter; import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.nbt.PaperweightLazyCompoundTag; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen.PaperweightRegen; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.block.BlockStateIdAccess; @@ -616,8 +617,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements @Override public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { -// return new PaperweightRegen(bukkitWorld, region, target, options).regenerate(); - return false; + return new PaperweightRegen(bukkitWorld, region, target, options).regenerate(); } @Override diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java index 85fb06d67..c2ce83d38 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -1,722 +1,501 @@ -//package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen; -// -//import com.fastasyncworldedit.bukkit.adapter.Regenerator; -//import com.fastasyncworldedit.core.Fawe; -//import com.fastasyncworldedit.core.queue.IChunkCache; -//import com.fastasyncworldedit.core.queue.IChunkGet; -//import com.fastasyncworldedit.core.util.ReflectionUtils; -//import com.fastasyncworldedit.core.util.TaskManager; -//import com.google.common.collect.ImmutableList; -//import com.mojang.datafixers.util.Either; -//import com.mojang.serialization.Codec; -//import com.mojang.serialization.Dynamic; -//import com.mojang.serialization.Lifecycle; -//import com.sk89q.worldedit.bukkit.adapter.Refraction; -//import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightGetBlocks; -//import com.sk89q.worldedit.extent.Extent; -//import com.sk89q.worldedit.internal.util.LogManagerCompat; -//import com.sk89q.worldedit.regions.Region; -//import com.sk89q.worldedit.util.io.file.SafeFiles; -//import com.sk89q.worldedit.world.RegenOptions; -//import io.papermc.lib.PaperLib; -//import net.minecraft.core.MappedRegistry; -//import net.minecraft.core.Registry; -//import net.minecraft.core.RegistryAccess; -//import net.minecraft.data.BuiltinRegistries; -//import net.minecraft.data.worldgen.biome.Biomes; -//import net.minecraft.nbt.CompoundTag; -//import net.minecraft.nbt.NbtOps; -//import net.minecraft.resources.RegistryReadOps; -//import net.minecraft.resources.ResourceKey; -//import net.minecraft.resources.ResourceLocation; -//import net.minecraft.server.MinecraftServer; -//import net.minecraft.server.level.ServerChunkCache; -//import net.minecraft.server.level.ServerLevel; -//import net.minecraft.server.level.ThreadedLevelLightEngine; -//import net.minecraft.server.level.progress.ChunkProgressListener; -//import net.minecraft.util.LinearCongruentialGenerator; -//import net.minecraft.world.level.ChunkPos; -//import net.minecraft.world.level.Level; -//import net.minecraft.world.level.LevelHeightAccessor; -//import net.minecraft.world.level.LevelSettings; -//import net.minecraft.world.level.biome.Biome; -//import net.minecraft.world.level.biome.BiomeSource; -//import net.minecraft.world.level.biome.MultiNoiseBiomeSource; -//import net.minecraft.world.level.chunk.ChunkAccess; -//import net.minecraft.world.level.chunk.ChunkGenerator; -//import net.minecraft.world.level.chunk.ChunkStatus; -//import net.minecraft.world.level.chunk.LevelChunk; -//import net.minecraft.world.level.chunk.ProtoChunk; -//import net.minecraft.world.level.chunk.UpgradeData; -//import net.minecraft.world.level.dimension.LevelStem; -//import net.minecraft.world.level.levelgen.FlatLevelSource; -//import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -//import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -//import net.minecraft.world.level.levelgen.WorldGenSettings; -//import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; -//import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; -//import net.minecraft.world.level.levelgen.synth.ImprovedNoise; -//import net.minecraft.world.level.storage.LevelStorageSource; -//import net.minecraft.world.level.storage.PrimaryLevelData; -//import org.apache.logging.log4j.Logger; -//import org.bukkit.Bukkit; -//import org.bukkit.craftbukkit.v1_18_R1.CraftServer; -//import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; -//import org.bukkit.craftbukkit.v1_18_R1.generator.CustomChunkGenerator; -//import org.bukkit.generator.BlockPopulator; -// -//import javax.annotation.Nullable; -//import java.io.IOException; -//import java.lang.reflect.Field; -//import java.lang.reflect.Method; -//import java.nio.file.Path; -//import java.util.Collections; -//import java.util.HashSet; -//import java.util.LinkedHashMap; -//import java.util.List; -//import java.util.Map; -//import java.util.Random; -//import java.util.Set; -//import java.util.concurrent.CompletableFuture; -//import java.util.concurrent.ConcurrentHashMap; -//import java.util.function.BooleanSupplier; -//import java.util.function.LongFunction; -//import java.util.function.Supplier; -//import java.util.stream.Collectors; -// -//public class PaperweightRegen extends Regenerator { -// -// private static final Logger LOGGER = LogManagerCompat.getLogger(); -// -// private static final Field serverWorldsField; -// private static final Field worldPaperConfigField; -// private static final Field flatBedrockField; -// private static final Field generatorSettingFlatField; -// private static final Field generatorSettingBaseSupplierField; -// private static final Field delegateField; -// private static final Field chunkProviderField; -// -// //list of chunk stati in correct order without FULL -// private static final Map chunkStati = new LinkedHashMap<>(); -// -// static { -// chunkStati.put(ChunkStatus.EMPTY, Concurrency.FULL); // empty: radius -1, does nothing -// chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Concurrency.NONE); // structure starts: uses unsynchronized maps -// chunkStati.put( -// ChunkStatus.STRUCTURE_REFERENCES, -// Concurrency.FULL -// ); // structure refs: radius 8, but only writes to current chunk -// chunkStati.put(ChunkStatus.BIOMES, Concurrency.FULL); // biomes: radius 0 -// chunkStati.put(ChunkStatus.NOISE, Concurrency.RADIUS); // noise: radius 8 -// chunkStati.put(ChunkStatus.SURFACE, Concurrency.NONE); // surface: radius 0, requires NONE -// chunkStati.put(ChunkStatus.CARVERS, Concurrency.NONE); // carvers: radius 0, but RADIUS and FULL change results -// chunkStati.put( -// ChunkStatus.LIQUID_CARVERS, -// Concurrency.NONE -// ); // liquid carvers: radius 0, but RADIUS and FULL change results -// chunkStati.put(ChunkStatus.FEATURES, Concurrency.NONE); // features: uses unsynchronized maps -// chunkStati.put( -// ChunkStatus.LIGHT, -// Concurrency.FULL -// ); // light: radius 1, but no writes to other chunks, only current chunk -// chunkStati.put(ChunkStatus.SPAWN, Concurrency.FULL); // spawn: radius 0 -// chunkStati.put(ChunkStatus.HEIGHTMAPS, Concurrency.FULL); // heightmaps: radius 0 -// -// try { -// serverWorldsField = CraftServer.class.getDeclaredField("worlds"); -// serverWorldsField.setAccessible(true); -// -// Field tmpPaperConfigField; -// Field tmpFlatBedrockField; -// try { //only present on paper -// tmpPaperConfigField = Level.class.getDeclaredField("paperConfig"); -// tmpPaperConfigField.setAccessible(true); -// -// tmpFlatBedrockField = tmpPaperConfigField.getType().getDeclaredField("generateFlatBedrock"); -// tmpFlatBedrockField.setAccessible(true); -// } catch (Exception e) { -// tmpPaperConfigField = null; -// tmpFlatBedrockField = null; -// } -// worldPaperConfigField = tmpPaperConfigField; -// flatBedrockField = tmpFlatBedrockField; -// -// generatorSettingBaseSupplierField = NoiseBasedChunkGenerator.class.getDeclaredField(Refraction.pickName( -// "settings", "g")); -// generatorSettingBaseSupplierField.setAccessible(true); -// -// generatorSettingFlatField = FlatLevelSource.class.getDeclaredField(Refraction.pickName("settings", "e")); -// generatorSettingFlatField.setAccessible(true); -// -// delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); -// delegateField.setAccessible(true); -// -// chunkProviderField = ServerLevel.class.getDeclaredField(Refraction.pickName("chunkSource", "C")); -// chunkProviderField.setAccessible(true); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } -// } -// -// //runtime -// private ServerLevel originalServerWorld; -// private ServerChunkCache originalChunkProvider; -// private ServerLevel freshWorld; -// private ServerChunkCache freshChunkProvider; -// private LevelStorageSource.LevelStorageAccess session; -// private StructureManager structureManager; -// private ThreadedLevelLightEngine threadedLevelLightEngine; -// private ChunkGenerator chunkGenerator; -// -// private Path tempDir; -// -// private boolean generateFlatBedrock = false; -// -// public PaperweightRegen(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { -// super(originalBukkitWorld, region, target, options); -// } -// -// @Override -// protected boolean prepare() { -// this.originalServerWorld = ((CraftWorld) originalBukkitWorld).getHandle(); -// originalChunkProvider = originalServerWorld.getChunkSource(); -// if (!(originalChunkProvider instanceof ServerChunkCache)) { -// return false; -// } -// -// //flat bedrock? (only on paper) -// if (worldPaperConfigField != null) { -// try { -// generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalServerWorld)); -// } catch (Exception ignored) { -// } -// } -// -// seed = options.getSeed().orElse(originalServerWorld.getSeed()); -// chunkStati.forEach((s, c) -> super.chunkStati.put(new ChunkStatusWrap(s), c)); -// -// return true; -// } -// -// @Override -// protected boolean initNewWorld() throws Exception { -// //world folder -// tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen"); -// -// //prepare for world init (see upstream implementation for reference) -// org.bukkit.World.Environment environment = originalBukkitWorld.getEnvironment(); -// org.bukkit.generator.ChunkGenerator generator = originalBukkitWorld.getGenerator(); -// LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(tempDir); -// ResourceKey levelStemResourceKey = getWorldDimKey(environment); -// session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); -// PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; -// -// MinecraftServer server = originalServerWorld.getCraftServer().getServer(); -// PrimaryLevelData levelProperties = (PrimaryLevelData) server.getWorldData(); -// RegistryReadOps nbtRegOps = RegistryReadOps.createAndLoad( -// NbtOps.INSTANCE, server.resources.getResourceManager(), -// RegistryAccess.builtin() -// ); -// WorldGenSettings newOpts = WorldGenSettings.CODEC -// .encodeStart(nbtRegOps, levelProperties.worldGenSettings()) -// .flatMap(tag -> WorldGenSettings.CODEC.parse(this.recursivelySetSeed( -// new Dynamic<>(nbtRegOps, tag), -// seed, -// new HashSet<>() -// ))) -// .result() -// .orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); -// LevelSettings newWorldSettings = new LevelSettings( -// "worldeditregentempworld", -// originalWorldData.settings.gameType(), -// originalWorldData.settings.hardcore(), -// originalWorldData.settings.difficulty(), -// originalWorldData.settings.allowCommands(), -// originalWorldData.settings.gameRules(), -// originalWorldData.settings.getDataPackConfig() -// ); -// PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); -// -// //init world -// freshWorld = Fawe.instance().getQueueHandler().sync((Supplier) () -> new ServerLevel( -// server, -// server.executor, -// session, -// newWorldData, -// originalServerWorld.dimension(), -// originalServerWorld.dimensionType(), -// new RegenNoOpWorldLoadListener(), -// // placeholder. Required for new ChunkProviderServer, but we create and then set it later -// newOpts.dimensions().get(levelStemResourceKey).generator(), -// originalServerWorld.isDebug(), -// seed, -// ImmutableList.of(), -// false, -// environment, -// generator, -// originalBukkitWorld.getBiomeProvider() -// ) { -// private final Biome singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.get(ResourceLocation.tryParse( -// options -// .getBiomeType() -// .getId())) : null; -// -// @Override -// public void tick(BooleanSupplier shouldKeepTicking) { //no ticking -// } -// -// @Override -// public Biome getUncachedNoiseBiome(int biomeX, int biomeY, int biomeZ) { -// if (options.hasBiomeType()) { -// return singleBiome; -// } -// return PaperweightRegen.this.chunkGenerator.getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ, -// PaperweightRegen.this.chunkGenerator.climateSampler()); -// } -// }).get(); -// freshWorld.noSave = true; -// removeWorldFromWorldsMap(); -// newWorldData.checkName(originalServerWorld.serverLevelData.getLevelName()); //rename to original world name -// if (worldPaperConfigField != null) { -// worldPaperConfigField.set(freshWorld, originalServerWorld.paperConfig); -// } -// -// //generator -// if (originalChunkProvider.getGenerator() instanceof FlatLevelSource) { -// FlatLevelGeneratorSettings generatorSettingFlat = (FlatLevelGeneratorSettings) generatorSettingFlatField.get( -// originalChunkProvider.getGenerator()); -// chunkGenerator = new FlatLevelSource(generatorSettingFlat); -// } else if (originalChunkProvider.getGenerator() instanceof NoiseBasedChunkGenerator) { -// Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField -// .get(originalChunkProvider.getGenerator()); -// BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); -// if (biomeSource instanceof MultiNoiseBiomeSource) { -// biomeSource = fastMultiNoiseBiomeSource(biomeSource); -// } -// chunkGenerator = new NoiseBasedChunkGenerator(((NoiseBasedChunkGenerator) chunkGenerator).noises, biomeSource, seed, -// generatorSettingBaseSupplier -// ); -// } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator) { -// chunkGenerator = (ChunkGenerator) delegateField.get(originalChunkProvider.getGenerator()); -// } else { -// LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); -// return false; -// } -// if (generator != null) { -// chunkGenerator = new CustomChunkGenerator(freshWorld, chunkGenerator, generator); -// generateConcurrent = generator.isParallelCapable(); -// } -// -// freshChunkProvider = new ServerChunkCache( -// freshWorld, -// session, -// server.getFixerUpper(), -// server.getStructureManager(), -// server.executor, -// chunkGenerator, -// freshWorld.spigotConfig.viewDistance, -// server.forceSynchronousWrites(), -// new RegenNoOpWorldLoadListener(), -// (chunkCoordIntPair, state) -> { -// }, -// () -> server.overworld().getDataStorage() -// ) { -// // redirect to LevelChunks created in #createChunks -// @Override -// public ChunkAccess getChunk(int x, int z, ChunkStatus chunkstatus, boolean flag) { -// return getChunkAt(x, z); -// } -// }; -// -// ReflectionUtils.unsafeSet(chunkProviderField, freshWorld, freshChunkProvider); -// //let's start then -// structureManager = server.getStructureManager(); -// threadedLevelLightEngine = freshChunkProvider.getLightEngine(); -// -// return true; -// } -// -// @Override -// protected void cleanup() { -// try { -// session.close(); -// } catch (Exception ignored) { -// } -// -// //shutdown chunk provider -// try { -// Fawe.instance().getQueueHandler().sync(() -> { -// try { -// freshChunkProvider.close(false); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// }); -// } catch (Exception ignored) { -// } -// -// //remove world from server -// try { -// Fawe.instance().getQueueHandler().sync(this::removeWorldFromWorldsMap); -// } catch (Exception ignored) { -// } -// -// //delete directory -// try { -// SafeFiles.tryHardToDeleteDir(tempDir); -// } catch (Exception ignored) { -// } -// } -// -// @Override -// protected ProtoChunk createProtoChunk(int x, int z) { -// return PaperLib.isPaper() -// ? new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld, freshWorld) // paper -// : new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld); // spigot -// } -// -// @Override -// protected LevelChunk createChunk(ProtoChunk protoChunk) { -// return new LevelChunk( -// freshWorld, -// protoChunk, -// null // we don't want to add entities -// ); -// } -// -// @Override -// protected ChunkStatusWrap getFullChunkStatus() { -// return new ChunkStatusWrap(ChunkStatus.FULL); -// } -// -// @Override -// protected List getBlockPopulators() { -// return originalServerWorld.getWorld().getPopulators(); -// } -// -// @Override -// protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { -// // BlockPopulator#populate has to be called synchronously for TileEntity access -// TaskManager.taskManager().task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); -// } -// -// @Override -// protected IChunkCache initSourceQueueCache() { -// return (chunkX, chunkZ) -> new PaperweightGetBlocks(freshWorld, chunkX, chunkZ) { -// @Override -// public LevelChunk ensureLoaded(ServerLevel nmsWorld, int x, int z) { -// return getChunkAt(x, z); -// } -// }; -// } -// -// //util -// private void removeWorldFromWorldsMap() { -// Fawe.instance().getQueueHandler().sync(() -> { -// try { -// Map map = (Map) serverWorldsField.get(Bukkit.getServer()); -// map.remove("worldeditregentempworld"); -// } catch (IllegalAccessException e) { -// throw new RuntimeException(e); -// } -// }); -// } -// -// private ResourceKey getWorldDimKey(org.bukkit.World.Environment env) { -// switch (env) { -// case NETHER: -// return LevelStem.NETHER; -// case THE_END: -// return LevelStem.END; -// case NORMAL: -// default: -// return LevelStem.OVERWORLD; -// } -// } -// -// private Dynamic recursivelySetSeed( -// Dynamic dynamic, -// long seed, -// Set> dynamicSet -// ) { -// return !dynamicSet.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { -// if (pair.getFirst().asString("").equals("seed")) { -// return pair.mapSecond((v) -> v.createLong(seed)); -// } else { -// return ((Dynamic) pair.getSecond()).getValue() instanceof CompoundTag -// ? pair.mapSecond((v) -> this.recursivelySetSeed((Dynamic) v, seed, dynamicSet)) -// : pair; -// -// } -// }); -// } -// -// private BiomeSource fastMultiNoiseBiomeSource(BiomeSource biomeSource) throws Exception { -// Field legacyBiomeInitLayerField = MultiNoiseBiomeSource.class.getDeclaredField( -// Refraction.pickName("legacyBiomeInitLayer", "i")); -// legacyBiomeInitLayerField.setAccessible(true); -// Field largeBiomesField = NoiseGeneratorSettings.class.getDeclaredField(Refraction.pickName("largeBiomes", "j")); -// largeBiomesField.setAccessible(true); -// Field biomeRegistryField = MultiNoiseBiomeSource.class.getDeclaredField(Refraction.pickName("biomes", "k")); -// biomeRegistryField.setAccessible(true); -// Field areaLazyField = Layer.class.getDeclaredField(Refraction.pickName("area", "b")); -// areaLazyField.setAccessible(true); -// Method initAreaFactoryMethod = Layers.class.getDeclaredMethod( -// Refraction.pickName("getDefaultLayer", "a"), -// boolean.class, -// int.class, -// int.class, -// LongFunction.class -// ); -// initAreaFactoryMethod.setAccessible(true); -// -// //init new WorldChunkManagerOverworld -// boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(biomeSource); -// boolean largebiomes = largeBiomesField.getBoolean(biomeSource); -// Registry biomeRegistryMojang = (Registry) biomeRegistryField.get(biomeSource); -// Registry biomeRegistry; -// if (options.hasBiomeType()) { -// Biome biome = BuiltinRegistries.BIOME.get(ResourceLocation.tryParse(options.getBiomeType().getId())); -// biomeRegistry = new MappedRegistry<>( -// ResourceKey.createRegistryKey(new ResourceLocation("fawe_biomes")), -// Lifecycle.experimental() -// ); -// ((MappedRegistry) biomeRegistry).registerMapping(0, BuiltinRegistries.BIOME.getResourceKey(biome).get(), biome, -// Lifecycle.experimental() -// ); -// } else { -// biomeRegistry = biomeRegistryMojang; -// } -// -// //replace genLayer -// AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke( -// null, -// legacyBiomeInitLayer, -// largebiomes ? 6 : 4, -// 4, -// (LongFunction) (salt -> new FastWorldGenContextArea(seed, salt)) -// ); -// biomeSource = new FastOverworldBiomeSource(biomeRegistry, new FastGenLayer(factory)); -// -// return biomeSource; -// } -// -// private static class FastOverworldBiomeSource extends BiomeSource { -// -// private final Registry biomeRegistry; -// private final boolean isSingleRegistry; -// private final FastGenLayer fastGenLayer; -// -// public FastOverworldBiomeSource( -// Registry biomeRegistry, -// FastGenLayer genLayer -// ) { -// super(biomeRegistry.stream().collect(Collectors.toList())); -// this.biomeRegistry = biomeRegistry; -// this.isSingleRegistry = biomeRegistry.entrySet().size() == 1; -// this.fastGenLayer = genLayer; -// } -// -// @Override -// protected Codec codec() { -// return MultiNoiseBiomeSource.CODEC; -// } -// -// @Override -// public BiomeSource withSeed(final long seed) { -// return null; -// } -// -// @Override -// public Biome getNoiseBiome(int biomeX, int biomeY, int biomeZ) { -// if (this.isSingleRegistry) { -// return this.biomeRegistry.byId(0); -// } -// return this.fastGenLayer.get(this.biomeRegistry, biomeX, biomeZ); -// } -// -// } -// -// private static class FastWorldGenContextArea implements BigContext { -// -// private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); -// private final ImprovedNoise improvedNoise; -// private final long magicrandom; -// private final ConcurrentHashMap map = new ConcurrentHashMap<>(); //needed for multithreaded generation -// -// public FastWorldGenContextArea(long seed, long lconst) { -// this.magicrandom = mix(seed, lconst); -// this.improvedNoise = new ImprovedNoise(new SimpleRandomSource(seed)); -// } -// -// private static long mix(long seed, long salt) { -// long l = LinearCongruentialGenerator.next(salt, salt); -// l = LinearCongruentialGenerator.next(l, salt); -// l = LinearCongruentialGenerator.next(l, salt); -// long m = LinearCongruentialGenerator.next(seed, l); -// m = LinearCongruentialGenerator.next(m, l); -// m = LinearCongruentialGenerator.next(m, l); -// return m; -// } -// -// @Override -// public FastAreaLazy createResult(PixelTransformer pixelTransformer) { -// return new FastAreaLazy(sharedAreaMap, pixelTransformer); -// } -// -// @Override -// public void initRandom(long x, long z) { -// long l = this.magicrandom; -// l = LinearCongruentialGenerator.next(l, x); -// l = LinearCongruentialGenerator.next(l, z); -// l = LinearCongruentialGenerator.next(l, x); -// l = LinearCongruentialGenerator.next(l, z); -// this.map.put(Thread.currentThread().getId(), l); -// } -// -// @Override -// public int nextRandom(int y) { -// long tid = Thread.currentThread().getId(); -// long e = this.map.computeIfAbsent(tid, i -> 0L); -// int mod = (int) Math.floorMod(e >> 24L, (long) y); -// this.map.put(tid, LinearCongruentialGenerator.next(e, this.magicrandom)); -// return mod; -// } -// -// @Override -// public ImprovedNoise getBiomeNoise() { -// return this.improvedNoise; -// } -// -// } -// -// private static class FastGenLayer extends Layer { -// -// private final FastAreaLazy fastAreaLazy; -// -// public FastGenLayer(AreaFactory factory) { -// super(() -> null); -// this.fastAreaLazy = factory.make(); -// } -// -// @Override -// public Biome get(Registry registry, int x, int z) { -// ResourceKey key = Biomes.byId(this.fastAreaLazy.get(x, z)); -// if (key == null) { -// return registry.get(Biomes.byId(0)); -// } -// Biome biome = registry.get(key); -// if (biome == null) { -// return registry.get(Biomes.byId(0)); -// } -// return biome; -// } -// -// } -// -// private static class FastAreaLazy implements Area { -// -// private final PixelTransformer transformer; -// //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a synchronized context -// //using a map for each thread worsens the performance significantly due to cache misses (factor 5) -// private final ConcurrentHashMap sharedMap; -// -// public FastAreaLazy(ConcurrentHashMap sharedMap, PixelTransformer transformer) { -// this.sharedMap = sharedMap; -// this.transformer = transformer; -// } -// -// @Override -// public int get(int x, int z) { -// long zx = ChunkPos.asLong(x, z); -// return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); -// } -// -// } -// -// private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { -// -// private RegenNoOpWorldLoadListener() { -// } -// -// @Override -// public void updateSpawnPos(ChunkPos spawnPos) { -// } -// -// @Override -// public void onStatusChange(ChunkPos pos, @Nullable ChunkStatus status) { -// } -// -// @Override -// public void start() { -// -// } -// -// @Override -// public void stop() { -// } -// -// // TODO Paper only(?) @Override -// public void setChunkRadius(int radius) { -// } -// -// } -// -// private class FastProtoChunk extends ProtoChunk { -// -// // avoid warning on paper -// public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world, ServerLevel serverLevel) { -// super(pos, upgradeData, world, serverLevel); -// } -// -// // compatibility with spigot -// public FastProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor levelHeightAccessor) { -// super(pos, upgradeData, levelHeightAccessor); -// } -// -// public boolean generateFlatBedrock() { -// return generateFlatBedrock; -// } -// -// // no one will ever see the entities! -// @Override -// public List getEntities() { -// return Collections.emptyList(); -// } -// -// } -// -// protected class ChunkStatusWrap extends ChunkStatusWrapper { -// -// private final ChunkStatus chunkStatus; -// -// public ChunkStatusWrap(ChunkStatus chunkStatus) { -// this.chunkStatus = chunkStatus; -// } -// -// @Override -// public int requiredNeighborChunkRadius() { -// return chunkStatus.getRange(); -// } -// -// @Override -// public String name() { -// return chunkStatus.getName(); -// } -// -// @Override -// public CompletableFuture processChunk(Long xz, List accessibleChunks) { -// return chunkStatus.generate( -// Runnable::run, // TODO revisit, we might profit from this somehow? -// freshWorld, -// chunkGenerator, -// structureManager, -// threadedLevelLightEngine, -// c -> CompletableFuture.completedFuture(Either.left(c)), -// accessibleChunks -// ); -// } -// -// } -// -//} +package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.regen; + +import com.fastasyncworldedit.bukkit.adapter.Regenerator; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.queue.IChunkCache; +import com.fastasyncworldedit.core.queue.IChunkGet; +import com.fastasyncworldedit.core.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.TaskManager; +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Lifecycle; +import com.sk89q.worldedit.bukkit.adapter.Refraction; +import com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_18_R1.PaperweightAdapter; +import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_18_R1.PaperweightGetBlocks; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.internal.util.LogManagerCompat; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.io.file.SafeFiles; +import com.sk89q.worldedit.world.RegenOptions; +import net.minecraft.core.Registry; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ThreadedLevelLightEngine; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelHeightAccessor; +import net.minecraft.world.level.LevelSettings; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.ProtoChunk; +import net.minecraft.world.level.chunk.UpgradeData; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.FlatLevelSource; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.levelgen.blending.BlendingData; +import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.PrimaryLevelData; +import org.apache.logging.log4j.Logger; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R1.CraftServer; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_18_R1.generator.CustomChunkGenerator; +import org.bukkit.generator.BlockPopulator; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.function.BooleanSupplier; +import java.util.function.Supplier; + +public class PaperweightRegen extends Regenerator { + + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private static final Field serverWorldsField; + private static final Field worldPaperConfigField; + private static final Field flatBedrockField; + private static final Field generatorSettingFlatField; + private static final Field generatorSettingBaseSupplierField; + private static final Field delegateField; + private static final Field chunkProviderField; + + //list of chunk stati in correct order without FULL + private static final Map chunkStati = new LinkedHashMap<>(); + + static { + chunkStati.put(ChunkStatus.EMPTY, Concurrency.FULL); // empty: radius -1, does nothing + chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Concurrency.NONE); // structure starts: uses unsynchronized maps + chunkStati.put( + ChunkStatus.STRUCTURE_REFERENCES, + Concurrency.FULL + ); // structure refs: radius 8, but only writes to current chunk + chunkStati.put(ChunkStatus.BIOMES, Concurrency.FULL); // biomes: radius 0 + chunkStati.put(ChunkStatus.NOISE, Concurrency.RADIUS); // noise: radius 8 + chunkStati.put(ChunkStatus.SURFACE, Concurrency.NONE); // surface: radius 0, requires NONE + chunkStati.put(ChunkStatus.CARVERS, Concurrency.NONE); // carvers: radius 0, but RADIUS and FULL change results + chunkStati.put( + ChunkStatus.LIQUID_CARVERS, + Concurrency.NONE + ); // liquid carvers: radius 0, but RADIUS and FULL change results + chunkStati.put(ChunkStatus.FEATURES, Concurrency.NONE); // features: uses unsynchronized maps + chunkStati.put( + ChunkStatus.LIGHT, + Concurrency.FULL + ); // light: radius 1, but no writes to other chunks, only current chunk + chunkStati.put(ChunkStatus.SPAWN, Concurrency.FULL); // spawn: radius 0 + chunkStati.put(ChunkStatus.HEIGHTMAPS, Concurrency.FULL); // heightmaps: radius 0 + + try { + serverWorldsField = CraftServer.class.getDeclaredField("worlds"); + serverWorldsField.setAccessible(true); + + Field tmpPaperConfigField; + Field tmpFlatBedrockField; + try { //only present on paper + tmpPaperConfigField = Level.class.getDeclaredField("paperConfig"); + tmpPaperConfigField.setAccessible(true); + + tmpFlatBedrockField = tmpPaperConfigField.getType().getDeclaredField("generateFlatBedrock"); + tmpFlatBedrockField.setAccessible(true); + } catch (Exception e) { + tmpPaperConfigField = null; + tmpFlatBedrockField = null; + } + worldPaperConfigField = tmpPaperConfigField; + flatBedrockField = tmpFlatBedrockField; + + generatorSettingBaseSupplierField = NoiseBasedChunkGenerator.class.getDeclaredField(Refraction.pickName( + "settings", "f")); + generatorSettingBaseSupplierField.setAccessible(true); + + generatorSettingFlatField = FlatLevelSource.class.getDeclaredField(Refraction.pickName("settings", "e")); + generatorSettingFlatField.setAccessible(true); + + delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); + delegateField.setAccessible(true); + + chunkProviderField = ServerLevel.class.getDeclaredField(Refraction.pickName("chunkSource", "L")); + chunkProviderField.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + //runtime + private ServerLevel originalServerWorld; + private ServerChunkCache originalChunkProvider; + private ServerLevel freshWorld; + private ServerChunkCache freshChunkProvider; + private LevelStorageSource.LevelStorageAccess session; + private StructureManager structureManager; + private ThreadedLevelLightEngine threadedLevelLightEngine; + private ChunkGenerator chunkGenerator; + + private Path tempDir; + + private boolean generateFlatBedrock = false; + + public PaperweightRegen(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { + super(originalBukkitWorld, region, target, options); + } + + @Override + protected boolean prepare() { + this.originalServerWorld = ((CraftWorld) originalBukkitWorld).getHandle(); + originalChunkProvider = originalServerWorld.getChunkSource(); + if (!(originalChunkProvider instanceof ServerChunkCache)) { + return false; + } + + //flat bedrock? (only on paper) + if (worldPaperConfigField != null) { + try { + generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalServerWorld)); + } catch (Exception ignored) { + } + } + + seed = options.getSeed().orElse(originalServerWorld.getSeed()); + chunkStati.forEach((s, c) -> super.chunkStati.put(new ChunkStatusWrap(s), c)); + + return true; + } + + @Override + protected boolean initNewWorld() throws Exception { + //world folder + tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen"); + + //prepare for world init (see upstream implementation for reference) + org.bukkit.World.Environment environment = originalBukkitWorld.getEnvironment(); + org.bukkit.generator.ChunkGenerator generator = originalBukkitWorld.getGenerator(); + LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(tempDir); + ResourceKey levelStemResourceKey = getWorldDimKey(environment); + session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); + PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; + + MinecraftServer server = originalServerWorld.getCraftServer().getServer(); + PrimaryLevelData levelProperties = (PrimaryLevelData) server.getWorldData(); + WorldGenSettings originalOpts = levelProperties.worldGenSettings(); + WorldGenSettings newOpts = options.getSeed().isPresent() + ? PaperweightAdapter.replaceSeed(originalServerWorld, seed, originalOpts) + : originalOpts; + LevelSettings newWorldSettings = new LevelSettings( + "worldeditregentempworld", + originalWorldData.settings.gameType(), + originalWorldData.settings.hardcore(), + originalWorldData.settings.difficulty(), + originalWorldData.settings.allowCommands(), + originalWorldData.settings.gameRules(), + originalWorldData.settings.getDataPackConfig() + ); + PrimaryLevelData newWorldData = new PrimaryLevelData(newWorldSettings, newOpts, Lifecycle.stable()); + + //init world + freshWorld = Fawe.instance().getQueueHandler().sync((Supplier) () -> new ServerLevel( + server, + server.executor, + session, + newWorldData, + originalServerWorld.dimension(), + originalServerWorld.dimensionType(), + new RegenNoOpWorldLoadListener(), + // placeholder. Required for new ChunkProviderServer, but we create and then set it later + newOpts.dimensions().get(levelStemResourceKey).generator(), + originalServerWorld.isDebug(), + seed, + ImmutableList.of(), + false, + environment, + generator, + originalBukkitWorld.getBiomeProvider() + ) { + private final Biome singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.get(ResourceLocation.tryParse( + options + .getBiomeType() + .getId())) : null; + + @Override + public void tick(BooleanSupplier shouldKeepTicking) { //no ticking + } + + @Override + public Biome getUncachedNoiseBiome(int biomeX, int biomeY, int biomeZ) { + if (options.hasBiomeType()) { + return singleBiome; + } + return PaperweightRegen.this.chunkGenerator.getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ, + PaperweightRegen.this.chunkGenerator.climateSampler() + ); + } + }).get(); + freshWorld.noSave = true; + removeWorldFromWorldsMap(); + newWorldData.checkName(originalServerWorld.serverLevelData.getLevelName()); //rename to original world name + if (worldPaperConfigField != null) { + worldPaperConfigField.set(freshWorld, originalServerWorld.paperConfig); + } + + //generator + if (originalChunkProvider.getGenerator() instanceof FlatLevelSource flatLevelSource) { + FlatLevelGeneratorSettings generatorSettingFlat = flatLevelSource.settings(); + chunkGenerator = new FlatLevelSource(generatorSettingFlat); + } else if (originalChunkProvider.getGenerator() instanceof NoiseBasedChunkGenerator noiseBasedChunkGenerator) { + Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField + .get(originalChunkProvider.getGenerator()); + BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); + chunkGenerator = new NoiseBasedChunkGenerator(noiseBasedChunkGenerator.noises, biomeSource, seed, + generatorSettingBaseSupplier + ); + } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator customChunkGenerator) { + chunkGenerator = customChunkGenerator.delegate; + } else { + LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); + return false; + } + if (generator != null) { + chunkGenerator = new CustomChunkGenerator(freshWorld, chunkGenerator, generator); + generateConcurrent = generator.isParallelCapable(); + } + + freshChunkProvider = new ServerChunkCache( + freshWorld, + session, + server.getFixerUpper(), + server.getStructureManager(), + server.executor, + chunkGenerator, + freshWorld.spigotConfig.viewDistance, + freshWorld.spigotConfig.simulationDistance, + server.forceSynchronousWrites(), + new RegenNoOpWorldLoadListener(), + (chunkCoordIntPair, state) -> { + }, + () -> server.overworld().getDataStorage() + ) { + // redirect to LevelChunks created in #createChunks + @Override + public ChunkAccess getChunk(int x, int z, ChunkStatus chunkstatus, boolean flag) { + return getChunkAt(x, z); + } + }; + + ReflectionUtils.unsafeSet(chunkProviderField, freshWorld, freshChunkProvider); + //let's start then + structureManager = server.getStructureManager(); + threadedLevelLightEngine = freshChunkProvider.getLightEngine(); + + return true; + } + + @Override + protected void cleanup() { + try { + session.close(); + } catch (Exception ignored) { + } + + //shutdown chunk provider + try { + Fawe.instance().getQueueHandler().sync(() -> { + try { + freshChunkProvider.close(false); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (Exception ignored) { + } + + //remove world from server + try { + Fawe.instance().getQueueHandler().sync(this::removeWorldFromWorldsMap); + } catch (Exception ignored) { + } + + //delete directory + try { + SafeFiles.tryHardToDeleteDir(tempDir); + } catch (Exception ignored) { + } + } + + @Override + protected ProtoChunk createProtoChunk(int x, int z) { + return new FastProtoChunk(new ChunkPos(x, z), UpgradeData.EMPTY, freshWorld, + this.freshWorld.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null + ); + } + + @Override + protected LevelChunk createChunk(ProtoChunk protoChunk) { + return new LevelChunk( + freshWorld, + protoChunk, + null // we don't want to add entities + ); + } + + @Override + protected ChunkStatusWrap getFullChunkStatus() { + return new ChunkStatusWrap(ChunkStatus.FULL); + } + + @Override + protected List getBlockPopulators() { + return originalServerWorld.getWorld().getPopulators(); + } + + @Override + protected void populate(LevelChunk levelChunk, Random random, BlockPopulator blockPopulator) { + // BlockPopulator#populate has to be called synchronously for TileEntity access + TaskManager.taskManager().task(() -> blockPopulator.populate(freshWorld.getWorld(), random, levelChunk.getBukkitChunk())); + } + + @Override + protected IChunkCache initSourceQueueCache() { + return (chunkX, chunkZ) -> new PaperweightGetBlocks(freshWorld, chunkX, chunkZ) { + @Override + public LevelChunk ensureLoaded(ServerLevel nmsWorld, int x, int z) { + return getChunkAt(x, z); + } + }; + } + + //util + private void removeWorldFromWorldsMap() { + Fawe.instance().getQueueHandler().sync(() -> { + try { + Map map = (Map) serverWorldsField.get(Bukkit.getServer()); + map.remove("worldeditregentempworld"); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + } + + private ResourceKey getWorldDimKey(org.bukkit.World.Environment env) { + switch (env) { + case NETHER: + return LevelStem.NETHER; + case THE_END: + return LevelStem.END; + case NORMAL: + default: + return LevelStem.OVERWORLD; + } + } + + private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { + + private RegenNoOpWorldLoadListener() { + } + + @Override + public void updateSpawnPos(ChunkPos spawnPos) { + } + + @Override + public void onStatusChange(ChunkPos pos, @Nullable ChunkStatus status) { + } + + @Override + public void start() { + + } + + @Override + public void stop() { + } + + // TODO Paper only(?) @Override + public void setChunkRadius(int radius) { + } + + } + + private class FastProtoChunk extends ProtoChunk { + + public FastProtoChunk( + final ChunkPos pos, + final UpgradeData upgradeData, + final LevelHeightAccessor world, + final Registry biomeRegistry, + @Nullable final BlendingData blendingData + ) { + super(pos, upgradeData, world, biomeRegistry, blendingData); + } + + // avoid warning on paper + + // compatibility with spigot + + public boolean generateFlatBedrock() { + return generateFlatBedrock; + } + + // no one will ever see the entities! + @Override + public List getEntities() { + return Collections.emptyList(); + } + + } + + protected class ChunkStatusWrap extends ChunkStatusWrapper { + + private final ChunkStatus chunkStatus; + + public ChunkStatusWrap(ChunkStatus chunkStatus) { + this.chunkStatus = chunkStatus; + } + + @Override + public int requiredNeighborChunkRadius() { + return chunkStatus.getRange(); + } + + @Override + public String name() { + return chunkStatus.getName(); + } + + @Override + public CompletableFuture processChunk(Long xz, List accessibleChunks) { + return chunkStatus.generate( + Runnable::run, // TODO revisit, we might profit from this somehow? + freshWorld, + chunkGenerator, + structureManager, + threadedLevelLightEngine, + c -> CompletableFuture.completedFuture(Either.left(c)), + accessibleChunks, + true + ); + } + + } + +} diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index 58fd32512..f08c76ee7 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -5,7 +5,9 @@ import com.fastasyncworldedit.core.queue.IChunkCache; import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.queue.implementation.SingleThreadQueueExtent; import com.fastasyncworldedit.core.util.MathMan; +import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; @@ -14,6 +16,8 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockTypes; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -32,6 +36,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -283,19 +288,64 @@ public abstract class Regenerator biome)); + } else if (genbiomes) { + target.setBlocks(region, new WithBiomePlacementPattern(vec -> source.getBiome(vec))); + } + } + + // FIXME this shouldn't be needed + private BlockStateHolder avoidReserved(BaseBlock baseBlock) { + if (baseBlock.getBlockType() == BlockTypes.__RESERVED__) { + return BlockTypes.AIR.getDefaultState(); + } + return baseBlock; + } + + private class PlacementPattern implements Pattern { + + @Override + public BaseBlock applyBlock(final BlockVector3 position) { + return source.getFullBlock(position); + } + + @Override + public boolean apply(final Extent extent, final BlockVector3 get, final BlockVector3 set) throws WorldEditException { + return extent.setBlock(set.getX(), set.getY(), set.getZ(), + avoidReserved(source.getFullBlock(get.getX(), get.getY(), get.getZ())) + ); + } + + } + + private class WithBiomePlacementPattern implements Pattern { + + private final Function biomeGetter; + + private WithBiomePlacementPattern(final Function biomeGetter) { + this.biomeGetter = biomeGetter; + } + + @Override + public BaseBlock applyBlock(final BlockVector3 position) { + return source.getFullBlock(position); + } + + @Override + public boolean apply(final Extent extent, final BlockVector3 get, final BlockVector3 set) throws WorldEditException { + return extent.setBlock(set.getX(), set.getY(), set.getZ(), + avoidReserved(source.getFullBlock(get.getX(), get.getY(), get.getZ())) + ) + && extent.setBiome(set.getX(), set.getY(), set.getZ(), biomeGetter.apply(get)); + } + } //functions to be implemented by sub class From 07695786cab9469a14b1493effd21ada45f54a0e Mon Sep 17 00:00:00 2001 From: SirYwell Date: Sun, 26 Dec 2021 19:51:32 +0100 Subject: [PATCH 41/81] return air instead of reserved on get blocks --- .../fawe/v1_18_R1/PaperweightGetBlocks.java | 2 +- .../bukkit/adapter/Regenerator.java | 24 ++++++------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java index 94d3d0de0..ab7407be8 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -896,7 +896,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc final BitStorage bits = (BitStorage) PaperweightPlatformAdapter.fieldStorage.get(dataObject); if (bits instanceof ZeroBitStorage) { - Arrays.fill(data, (char) 0); + Arrays.fill(data, (char) 1); return data; } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index f08c76ee7..576e88aab 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -5,6 +5,7 @@ import com.fastasyncworldedit.core.queue.IChunkCache; import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.queue.implementation.SingleThreadQueueExtent; import com.fastasyncworldedit.core.util.MathMan; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; @@ -16,8 +17,6 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockTypes; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; @@ -156,7 +155,10 @@ public abstract class Regenerator Date: Mon, 27 Dec 2021 00:00:49 +0100 Subject: [PATCH 42/81] refactor: Shift `FileAlreadyExistsException` catch to a higher level --- .../com/sk89q/worldedit/internal/SchematicsEventListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/SchematicsEventListener.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/SchematicsEventListener.java index 2eeab1287..75907138d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/SchematicsEventListener.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/SchematicsEventListener.java @@ -39,7 +39,7 @@ public class SchematicsEventListener { try { Files.createDirectories(config.resolve(event.getConfiguration().saveDir)); } catch (FileAlreadyExistsException e) { - LOGGER.info("Schematic directory exists as file. Possible symlink.", e); + LOGGER.debug("Schematic directory exists as file. Possible symlink.", e); } catch (IOException e) { LOGGER.warn("Failed to create schematics directory", e); } From f9ecb449cf601328a818e629343b8f5107f8cb96 Mon Sep 17 00:00:00 2001 From: SirYwell Date: Mon, 27 Dec 2021 06:02:16 +0100 Subject: [PATCH 43/81] read the actual block from ZeroBitStorage --- .../bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java index ab7407be8..f5335eca2 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -896,7 +896,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc final BitStorage bits = (BitStorage) PaperweightPlatformAdapter.fieldStorage.get(dataObject); if (bits instanceof ZeroBitStorage) { - Arrays.fill(data, (char) 1); + Arrays.fill(data, adapter.adaptToChar(blocks.get(0, 0, 0))); // get(int) is only public on paper return data; } From f236934a395acf646dc6ec5901501aa9678acfc7 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 28 Dec 2021 22:46:19 +0000 Subject: [PATCH 44/81] Add get default version min/max world height to platform - Fixes #1500 --- .../fastasyncworldedit/bukkit/FaweBukkit.java | 2 +- .../bukkit/regions/GriefPreventionFeature.java | 6 ++++-- .../bukkit/util/MinecraftVersion.java | 1 + .../bukkit/BukkitServerInterface.java | 11 +++++++++++ .../core/regions/RegionWrapper.java | 10 +++++++++- .../extension/input/ParserContext.java | 6 ++++-- .../worldedit/extension/platform/Platform.java | 11 +++++++++++ .../sk89q/worldedit/extent/OutputExtent.java | 6 +++++- .../worldedit/function/mask/OffsetMask.java | 7 ++++++- .../function/visitor/BreadthFirstSearch.java | 7 ++++++- .../function/visitor/DownwardVisitor.java | 7 ++++++- .../function/visitor/NonRisingVisitor.java | 7 ++++++- .../function/visitor/RecursiveVisitor.java | 7 ++++++- .../worldedit/regions/AbstractRegion.java | 18 ++++++++++++++---- .../com/sk89q/worldedit/regions/Region.java | 15 ++++++++++++++- .../sk89q/worldedit/world/AbstractWorld.java | 6 ++++-- 16 files changed, 108 insertions(+), 19 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 8aff475d1..3f11d04f6 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -84,7 +84,7 @@ public class FaweBukkit implements IFawe, Listener { Bukkit.getServer().shutdown(); } - chunksStretched = new MinecraftVersion().isEqualOrHigher(MinecraftVersion.NETHER); + chunksStretched = new MinecraftVersion().isEqualOrLower(MinecraftVersion.NETHER); platformAdapter = new NMSAdapter(); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java index 0798cf973..c75349b76 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java @@ -1,7 +1,9 @@ package com.fastasyncworldedit.bukkit.regions; import com.fastasyncworldedit.core.regions.FaweMask; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; @@ -38,12 +40,12 @@ public class GriefPreventionFeature extends BukkitMaskManager implements Listene claim.getGreaterBoundaryCorner().getBlockX(); final BlockVector3 pos1 = BlockVector3.at( claim.getLesserBoundaryCorner().getBlockX(), - 0, + player.getWorld().getMinHeight(), claim.getLesserBoundaryCorner().getBlockZ() ); final BlockVector3 pos2 = BlockVector3.at( claim.getGreaterBoundaryCorner().getBlockX(), - 256, + player.getWorld().getMaxHeight(), claim.getGreaterBoundaryCorner().getBlockZ() ); return new FaweMask(new CuboidRegion(pos1, pos2)) { diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java index cba863428..7715c65e2 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java @@ -12,6 +12,7 @@ public class MinecraftVersion implements Comparable { public static final MinecraftVersion NETHER = new MinecraftVersion(1, 16); public static final MinecraftVersion CAVES_17 = new MinecraftVersion(1, 17); + public static final MinecraftVersion CAVES_18 = new MinecraftVersion(1, 18); private final int major; private final int minor; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 83fc8c889..033790560 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.bukkit; +import com.fastasyncworldedit.bukkit.util.MinecraftVersion; import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; import com.google.common.collect.Sets; import com.sk89q.bukkit.util.CommandInfo; @@ -278,5 +279,15 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser } return this.relighterFactory; } + + @Override + public int getVersionMinY() { + return new MinecraftVersion().isEqualOrLower(MinecraftVersion.CAVES_18) ? -64 : 0; + } + + @Override + public int getVersionMaxY() { + return new MinecraftVersion().isEqualOrLower(MinecraftVersion.CAVES_18) ? 319 : 255; + } //FAWE end } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java index a5d38deee..55a39eb21 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java @@ -1,5 +1,7 @@ package com.fastasyncworldedit.core.regions; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; @@ -27,7 +29,13 @@ public class RegionWrapper extends CuboidRegion { */ @Deprecated public RegionWrapper(final int minX, final int maxX, final int minZ, final int maxZ) { - this(minX, maxX, 0, 255, minZ, maxZ); + this(minX, + maxX, + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), + minZ, + maxZ + ); } public RegionWrapper(final int minX, final int maxX, final int minY, final int maxY, final int minZ, final int maxZ) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java index e1f6cdca1..30ac850a5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java @@ -21,8 +21,10 @@ package com.sk89q.worldedit.extension.input; import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.factory.MaskFactory; 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.extent.Extent; import com.sk89q.worldedit.world.World; @@ -303,8 +305,8 @@ public class ParserContext { minY = extent.getMinY(); maxY = extent.getMaxY(); } else { - minY = 0; - maxY = 255; + minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); + maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); } return minY; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java index abb84c3fe..dd4012ebe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java @@ -22,6 +22,7 @@ package com.sk89q.worldedit.extension.platform; import com.fastasyncworldedit.core.extent.processor.lighting.Relighter; import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; import com.sk89q.worldedit.LocalConfiguration; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.registry.Keyed; @@ -235,5 +236,15 @@ public interface Platform extends Keyed { */ @Nonnull RelighterFactory getRelighterFactory(); + + /** + * Get the default minimum Y value of worlds based on Minecraft version (inclusive). + */ + int getVersionMinY(); + + /** + * Get the default maximum Y value of worlds based on Minecraft version (inclusive). + */ + int getVersionMaxY(); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java index ffe880557..df2e07723 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java @@ -22,7 +22,9 @@ package com.sk89q.worldedit.extent; import com.fastasyncworldedit.core.extent.processor.heightmap.HeightMapType; import com.fastasyncworldedit.core.math.MutableBlockVector3; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; @@ -95,7 +97,9 @@ public interface OutputExtent { @Deprecated default boolean setBiome(BlockVector2 position, BiomeType biome) { boolean result = false; - for (int y = 0; y < 256; y++) { + int minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); + int maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); + for (int y = minY; y < maxY; y++) { result |= setBiome(position.toBlockVector3().mutY(y), biome); } return result; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java index 91e92964f..2f83000b8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.function.mask; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.math.BlockVector3; import javax.annotation.Nullable; @@ -47,7 +49,10 @@ public class OffsetMask extends AbstractMask { */ @Deprecated public OffsetMask(Mask mask, BlockVector3 offset) { - this(mask, offset, 0, 255); + this(mask, offset, + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY() + ); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java index 8decb381a..baab0e4c5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java @@ -28,7 +28,9 @@ import com.fastasyncworldedit.core.queue.implementation.SingleThreadQueueExtent; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.operation.Operation; @@ -110,7 +112,10 @@ public abstract class BreadthFirstSearch implements Operation { */ public BreadthFirstSearch(RegionFunction function) { //FAWE start - int depth, min/max y - this(function, Integer.MAX_VALUE, 0, 255, null); + this(function, Integer.MAX_VALUE, + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + ); } //FAWE start - int depth, min/max y, preloading diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java index 7ea7f99e6..0ebeacce0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.function.visitor; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; @@ -48,7 +50,10 @@ public class DownwardVisitor extends RecursiveVisitor { @Deprecated public DownwardVisitor(Mask mask, RegionFunction function, int baseY) { //FAWE start - int depth, min/max y - this(mask, function, baseY, Integer.MAX_VALUE, 0, 255, null); + this(mask, function, baseY, Integer.MAX_VALUE, WorldEdit + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java index c4dedc1b3..d206d84fe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.function.visitor; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; @@ -39,7 +41,10 @@ public class NonRisingVisitor extends RecursiveVisitor { @Deprecated public NonRisingVisitor(Mask mask, RegionFunction function) { //FAWE start - int depth, y min/max - this(mask, function, Integer.MAX_VALUE, 0, 255, null); + this(mask, function, Integer.MAX_VALUE, WorldEdit + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java index 861210a46..c96e4b063 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java @@ -19,6 +19,8 @@ package com.sk89q.worldedit.function.visitor; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; @@ -41,7 +43,10 @@ public class RecursiveVisitor extends BreadthFirstSearch { * @param function the function */ public RecursiveVisitor(Mask mask, RegionFunction function) { - this(mask, function, Integer.MAX_VALUE, 0, 255, null); + this(mask, function, Integer.MAX_VALUE, WorldEdit + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java index 2768f914b..bfcb40400 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java @@ -20,6 +20,8 @@ package com.sk89q.worldedit.regions; import com.fastasyncworldedit.core.math.BlockVectorSet; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; @@ -221,14 +223,22 @@ public abstract class AbstractRegion extends AbstractSet implement // Sub-class utilities protected final int getWorldMinY() { - //FAWE start > Integer.MIN_VALUE -> 0 (to avoid crazy for loops...) TODO: See if there's a way to find a "server default" - return world == null ? 0 : world.getMinY(); + //FAWE start > Server default based on version + return world == null ? WorldEdit + .getInstance() + .getPlatformManager() + .queryCapability(Capability.WORLD_EDITING) + .getVersionMinY() : world.getMinY(); //FAWE end } protected final int getWorldMaxY() { - //FAWE start > Integer.MAX_VALUE -> 255 (to avoid crazy for loops...) TODO: See if there's a way to find a "server default" - return world == null ? 255 : world.getMaxY(); + //FAWE start > Server default based on version + return world == null ? WorldEdit + .getInstance() + .getPlatformManager() + .queryCapability(Capability.WORLD_EDITING) + .getVersionMaxY() : world.getMaxY(); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java index 8515b8952..240f039fb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -29,6 +29,8 @@ import com.fastasyncworldedit.core.queue.IBatchProcessor; import com.fastasyncworldedit.core.queue.IChunk; import com.fastasyncworldedit.core.queue.IChunkGet; import com.fastasyncworldedit.core.queue.IChunkSet; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; @@ -226,7 +228,18 @@ public interface Region extends Iterable, Cloneable, IBatchProcess BlockVector3 pos1 = getMinimumPoint(); BlockVector3 pos2 = getMaximumPoint(); return pos1.getBlockX() == Integer.MIN_VALUE && pos1.getBlockZ() == Integer.MIN_VALUE && pos2.getBlockX() == Integer.MAX_VALUE && pos2 - .getBlockZ() == Integer.MAX_VALUE && pos1.getBlockY() <= 0 && pos2.getBlockY() >= 255; + .getBlockZ() == Integer.MAX_VALUE + && pos1.getBlockY() <= WorldEdit + .getInstance() + .getPlatformManager() + .queryCapability( + Capability.WORLD_EDITING) + .getVersionMinY() + && pos2.getBlockY() >= WorldEdit + .getInstance() + .getPlatformManager() + .queryCapability(Capability.WORLD_EDITING) + .getVersionMaxY(); } default int getMinimumY() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index 1f498a873..bee63181f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -20,9 +20,11 @@ package com.sk89q.worldedit.world; import com.fastasyncworldedit.core.function.mask.BlockMaskBuilder; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.operation.Operation; @@ -66,12 +68,12 @@ public abstract class AbstractWorld implements World { @Override public int getMinY() { - return 0; + return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); } @Override public int getMaxY() { - return 255; + return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); } @Override From f6319d36a12156e48ab34476ac7cfbe728fa12b6 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 28 Dec 2021 22:58:25 +0000 Subject: [PATCH 45/81] Add methods to CLIPlatform --- .../java/com/sk89q/worldedit/cli/CLIPlatform.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java index eb17c0f37..0704d056b 100644 --- a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.AbstractPlatform; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Preference; +import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.World; @@ -169,6 +170,16 @@ class CLIPlatform extends AbstractPlatform { return (_a, _b, _c) -> NullRelighter.INSTANCE; } + @Override + public int getVersionMinY() { + return dataVersion >= Constants.DATA_VERSION_MC_1_18 ? -64 : 0; + } + + @Override + public int getVersionMaxY() { + return dataVersion >= Constants.DATA_VERSION_MC_1_18 ? 319 : 255; + } + public void addWorld(World world) { worlds.add(world); } From 36857a50642129a7e6e425d6c48fe0032b9e0cc9 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 28 Dec 2021 23:02:48 +0000 Subject: [PATCH 46/81] Fix #1490 --- .../core/queue/implementation/blocks/CharSetBlocks.java | 1 - .../main/java/com/sk89q/worldedit/command/BiomeCommands.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index df8bde411..a8b3ccf30 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -97,7 +97,6 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { updateSectionIndexRange(y >> 4); - y -= minSectionPosition << 4; int layer = (y >> 4) - minSectionPosition; if (biomes == null) { biomes = new BiomeType[sectionCount][]; 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 d0c338b52..e9a97ab68 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 @@ -193,7 +193,7 @@ public class BiomeCommands { player.print(Caption.of( "worldedit.setbiome.changed", - TextComponent.of(visitor.getAffected()) + TextComponent.of(visitor.getAffected() / (editSession.getMaxY() - editSession.getMinY())) )); } From 3ec19120465fa25bd01046fc6d1f277a6ae03ab6 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 28 Dec 2021 23:22:59 +0000 Subject: [PATCH 47/81] Fix tests --- .../fastasyncworldedit/util/StubPlatform.java | 113 ++++++++++++++++++ .../util/RegionOptimizedVectorSorterTest.java | 6 + 2 files changed, 119 insertions(+) create mode 100644 worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java diff --git a/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java b/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java new file mode 100644 index 000000000..9d7ac96c2 --- /dev/null +++ b/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java @@ -0,0 +1,113 @@ +package com.fastasyncworldedit.util; + +import com.fastasyncworldedit.core.extent.processor.lighting.RelighterFactory; +import com.sk89q.worldedit.LocalConfiguration; +import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.extension.platform.AbstractPlatform; +import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.extension.platform.Preference; +import com.sk89q.worldedit.internal.Constants; +import com.sk89q.worldedit.util.SideEffect; +import com.sk89q.worldedit.world.World; +import com.sk89q.worldedit.world.registry.Registries; +import org.enginehub.piston.CommandManager; +import org.jetbrains.annotations.Nullable; + +import java.util.EnumMap; +import java.util.Map; +import java.util.Set; + +public class StubPlatform extends AbstractPlatform { + + @Override + public Registries getRegistries() { + return null; + } + + @Override + public int getDataVersion() { + return Constants.DATA_VERSION_MC_1_18; + } + + @Override + public boolean isValidMobType(final String type) { + return false; + } + + @Override + public void reload() { + + } + + @Nullable + @Override + public Player matchPlayer(final Player player) { + return null; + } + + @Nullable + @Override + public World matchWorld(final World world) { + return null; + } + + @Override + public void registerCommands(final CommandManager commandManager) { + + } + + @Override + public void setGameHooksEnabled(final boolean enabled) { + + } + + @Override + public LocalConfiguration getConfiguration() { + return null; + } + + @Override + public String getVersion() { + return "TEST"; + } + + @Override + public String getPlatformName() { + return "TEST"; + } + + @Override + public String getPlatformVersion() { + return "TEST"; + } + + @Override + public Map getCapabilities() { + Map capabilities = new EnumMap<>(Capability.class); + capabilities.put(Capability.WORLD_EDITING, Preference.PREFER_OTHERS); + return capabilities; + } + + @Override + public Set getSupportedSideEffects() { + return null; + } + + @Override + public RelighterFactory getRelighterFactory() { + return null; + } + + // Use most "extreme" value + @Override + public int getVersionMinY() { + return -64; + } + + // Use most "extreme" value + @Override + public int getVersionMaxY() { + return 319; + } + +} diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/util/RegionOptimizedVectorSorterTest.java b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/util/RegionOptimizedVectorSorterTest.java index bb4a26739..a1582bf04 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/util/RegionOptimizedVectorSorterTest.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/util/RegionOptimizedVectorSorterTest.java @@ -19,7 +19,9 @@ package com.sk89q.worldedit.internal.util; +import com.fastasyncworldedit.util.StubPlatform; import com.google.common.collect.Lists; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import it.unimi.dsi.fastutil.ints.IntRBTreeSet; @@ -71,6 +73,10 @@ public class RegionOptimizedVectorSorterTest { 0, 1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000 }) void checkSorted(int size) { + //FAWE start - required for AbstractRegion recalculation testing height limits with null world + WorldEdit.getInstance().getPlatformManager().register(new StubPlatform()); + WorldEdit.getInstance().getPlatformManager().handlePlatformsRegistered(null); + //FAWE end Random rng = new Random(size); List toSort; if (size == 0) { From d19369401f9ea73244e4ed3041f9536954900a8a Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 00:18:12 +0000 Subject: [PATCH 48/81] Don't force tick limiter enable/disable --- .../src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java | 1 - 1 file changed, 1 deletion(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 3f11d04f6..77f5f275c 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -68,7 +68,6 @@ public class FaweBukkit implements IFawe, Listener { public FaweBukkit(Plugin plugin) { this.plugin = plugin; try { - Settings.settings().TICK_LIMITER.ENABLED = !Bukkit.hasWhitelist(); Fawe.set(this); Fawe.setupInjector(); try { From 5d4a2a4a0d8ee9a39563717c804374e583e5e1e6 Mon Sep 17 00:00:00 2001 From: JOO200 Date: Wed, 29 Dec 2021 05:58:56 +0100 Subject: [PATCH 49/81] Use Math.floor instead of int cast 757bef1f7d2b16317ab3d18427ad22183344e28d --- .../math/convolution/HeightMapFilter.java | 2 +- .../math/convolution/SnowHeightMap.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMapFilter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMapFilter.java index 9015a17ac..7d6d7cedd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMapFilter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMapFilter.java @@ -105,7 +105,7 @@ public class HeightMapFilter { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { - outData[index++] = (int) calculateHeight(inDataFloat, width, height, offset, matrix, x, y); + outData[index++] = (int) Math.floor(calculateHeight(inDataFloat, width, height, offset, matrix, x, y)); } } return outData; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/SnowHeightMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/SnowHeightMap.java index df030639e..7de599f39 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/SnowHeightMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/SnowHeightMap.java @@ -178,13 +178,13 @@ public class SnowHeightMap { ++blocksChanged; // Grow -- start from 1 below top replacing airblocks - for (int y = (int) newHeight - 1 - originY; y >= 0; --y) { - if (y >= newHeight - 1 - originY - layerBlocks) { + for (int y = (int) Math.floor(newHeight - 1 - originY); y >= 0; --y) { + if (y >= Math.floor(newHeight - 1 - originY - layerBlocks)) { //FAWE start - avoid BlockVector3 creation for no reason session.setBlock(xr, originY + y, zr, fillerSnow); //FAWE end } else { - int copyFrom = (int) (y * scale); + int copyFrom = (int) Math.floor(y * scale); //FAWE start - avoid BlockVector3 creation for no reason BlockState block = session.getBlock(xr, originY + copyFrom, zr); session.setBlock(xr, originY + y, zr, block); @@ -195,13 +195,13 @@ public class SnowHeightMap { } } else { // Shrink -- start from bottom - for (int y = 0; y < (int) newHeight - originY; ++y) { - if (y >= (int) newHeight - originY - layerBlocks) { + for (int y = 0; y < (int) Math.floor(newHeight - originY); ++y) { + if (y >= (int) Math.floor(newHeight - originY - layerBlocks)) { //FAWE start - avoid BlockVector3 creation for no reason session.setBlock(xr, originY + y, zr, fillerSnow); //FAWE end } else { - int copyFrom = (int) (y * scale); + int copyFrom = (int) Math.floor(y * scale); //FAWE start - avoid BlockVector3 creation for no reason BlockState block = session.getBlock(xr, originY + copyFrom, zr); session.setBlock(xr, originY + y, zr, block); @@ -214,7 +214,7 @@ public class SnowHeightMap { ++blocksChanged; // Fill rest with air - for (int y = (int) newHeight + 1; y <= curHeight; ++y) { + for (int y = (int) Math.floor(newHeight + 1); y <= Math.floor(curHeight); ++y) { //FAWE start - avoid BlockVector3 creation for no reason session.setBlock(xr, y, zr, fillerAir); //FAWE end @@ -229,7 +229,8 @@ public class SnowHeightMap { } private void setSnowLayer(int x, int z, float newHeight) throws MaxChangedBlocksException { - int numOfLayers = (int) ((newHeight % 1) * 8) + 1; + int y = (int) Math.floor(newHeight); + int numOfLayers = (int) ((newHeight - y) * 8) + 1; //FAWE start - avoid BlockVector3 creation for no reason session.setBlock(x, (int) newHeight, z, BlockTypes.SNOW.getDefaultState().with(LAYERS, numOfLayers)); //FAWE end From bca3a1b04d7d412ac66e5db1e9c124d3abd09cf8 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 14:46:30 +0000 Subject: [PATCH 50/81] More precise method names in MinecraftVersion - Also ensure correct comparisons are made in FaweBukkit and BukkitServerInterface - Fixes #1504 --- .../fastasyncworldedit/bukkit/FaweBukkit.java | 2 +- .../bukkit/util/MinecraftVersion.java | 13 +++++++++---- .../bukkit/BukkitServerInterface.java | 4 ++-- .../util/MinecraftVersionTest.java | 18 +++++++++--------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 77f5f275c..8419955d4 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -83,7 +83,7 @@ public class FaweBukkit implements IFawe, Listener { Bukkit.getServer().shutdown(); } - chunksStretched = new MinecraftVersion().isEqualOrLower(MinecraftVersion.NETHER); + chunksStretched = new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.NETHER); platformAdapter = new NMSAdapter(); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java index 7715c65e2..43fa6b0b6 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java @@ -69,7 +69,7 @@ public class MinecraftVersion implements Comparable { * @param other The other version to compare against. * @return {@code true} if this version is higher or equal compared to the other version. */ - public boolean isEqualOrHigher(MinecraftVersion other) { + public boolean isEqualOrHigherThan(MinecraftVersion other) { return compareTo(other) >= 0; } @@ -77,7 +77,7 @@ public class MinecraftVersion implements Comparable { * @param other The other version to compare against. * @return {@code true} if this version is lower or equal compared to the other version. */ - public boolean isEqualOrLower(MinecraftVersion other) { + public boolean isEqualOrLowerThan(MinecraftVersion other) { return compareTo(other) <= 0; } @@ -85,7 +85,7 @@ public class MinecraftVersion implements Comparable { * @param other The other version to compare against. * @return {@code true} if this version is higher than the other version. */ - public boolean isHigher(MinecraftVersion other) { + public boolean isHigherThan(MinecraftVersion other) { return compareTo(other) > 0; } @@ -93,7 +93,7 @@ public class MinecraftVersion implements Comparable { * @param other The other version to compare against. * @return {@code true} if this version is lower than to the other version. */ - public boolean isLower(MinecraftVersion other) { + public boolean isLowerThan(MinecraftVersion other) { return compareTo(other) < 0; } @@ -140,6 +140,11 @@ public class MinecraftVersion implements Comparable { return getRelease() == that.getRelease(); } + @Override + public String toString() { + return major + "." + minor + "." + release; + } + /** * Determines the server version based on the CraftBukkit package path, e.g. {@code org.bukkit.craftbukkit.v1_16_R3}, * where v1_16_R3 is the resolved version. diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 033790560..10df72cef 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -282,12 +282,12 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser @Override public int getVersionMinY() { - return new MinecraftVersion().isEqualOrLower(MinecraftVersion.CAVES_18) ? -64 : 0; + return new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.CAVES_18) ? -64 : 0; } @Override public int getVersionMaxY() { - return new MinecraftVersion().isEqualOrLower(MinecraftVersion.CAVES_18) ? 319 : 255; + return new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.CAVES_18) ? 319 : 255; } //FAWE end } diff --git a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/MinecraftVersionTest.java b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/MinecraftVersionTest.java index 561d2be37..9d54616d4 100644 --- a/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/MinecraftVersionTest.java +++ b/worldedit-bukkit/src/test/java/com/fastasyncworldedit/util/MinecraftVersionTest.java @@ -20,14 +20,14 @@ public class MinecraftVersionTest { @Test public void testEqualOrHigher() { - assertTrue(latestVersion.isEqualOrHigher(new MinecraftVersion(1, 16, 3))); - assertTrue(latestVersion.isEqualOrHigher(new MinecraftVersion(1, 16, 2))); - assertFalse(latestVersion.isEqualOrHigher(new MinecraftVersion(1, 16, 4))); + assertTrue(latestVersion.isEqualOrHigherThan(new MinecraftVersion(1, 16, 3))); + assertTrue(latestVersion.isEqualOrHigherThan(new MinecraftVersion(1, 16, 2))); + assertFalse(latestVersion.isEqualOrHigherThan(new MinecraftVersion(1, 16, 4))); } @Test public void testEqualOrHigherWithoutRelease() { - assertTrue(latestVersion.isEqualOrHigher(new MinecraftVersion(1, 16))); + assertTrue(latestVersion.isEqualOrHigherThan(new MinecraftVersion(1, 16))); } @Test @@ -39,15 +39,15 @@ public class MinecraftVersionTest { @Test public void testEqualOrLower() { - assertTrue(latestVersion.isEqualOrLower(new MinecraftVersion(1, 16, 3))); - assertTrue(latestVersion.isEqualOrLower(new MinecraftVersion(1, 16, 4))); - assertFalse(latestVersion.isEqualOrLower(new MinecraftVersion(1, 16, 2))); + assertTrue(latestVersion.isEqualOrLowerThan(new MinecraftVersion(1, 16, 3))); + assertTrue(latestVersion.isEqualOrLowerThan(new MinecraftVersion(1, 16, 4))); + assertFalse(latestVersion.isEqualOrLowerThan(new MinecraftVersion(1, 16, 2))); } @Test public void testForChunkStretched() { - assertTrue(latestVersion.isEqualOrHigher(MinecraftVersion.NETHER)); - assertFalse(latestVersion.isLower(new MinecraftVersion(1, 14, 2))); + assertTrue(latestVersion.isEqualOrHigherThan(MinecraftVersion.NETHER)); + assertFalse(latestVersion.isLowerThan(new MinecraftVersion(1, 14, 2))); } } From 177d7319579f8f13205c69a0469db1d5be938a24 Mon Sep 17 00:00:00 2001 From: Jordan Date: Wed, 29 Dec 2021 16:17:20 +0100 Subject: [PATCH 51/81] Add back statically-set reserved IDs for air blocks only, make it clear they're "reserved" (#1502) * Add back statically-set reserved IDs for air blocks only, make it clear they're "reserved" Also: - Ensure that reserved is never returned in GET block operations - "empty" thus doesn't exist in the GET update methods; remove the needless checks - Allow GET/SET chunks to determine their own default values for non-present blocks/sections * Add comments --- .../v1_17_R1_2/PaperweightFaweAdapter.java | 2 +- .../fawe/v1_17_R1_2/PaperweightGetBlocks.java | 20 ++--- .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 2 +- .../fawe/v1_18_R1/PaperweightGetBlocks.java | 20 ++--- .../bukkit/adapter/NMSAdapter.java | 54 +++++++------- .../history/changeset/AbstractChangeSet.java | 5 +- .../core/queue/IBlocks.java | 19 ++--- .../implementation/blocks/BitSetBlocks.java | 3 +- .../implementation/blocks/CharBlocks.java | 9 ++- .../implementation/blocks/CharGetBlocks.java | 7 +- .../implementation/blocks/CharSetBlocks.java | 6 ++ .../world/block/BlockTypesCache.java | 73 ++++++++----------- .../worldedit/world/block/package-info.java | 6 ++ 13 files changed, 109 insertions(+), 117 deletions(-) create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/world/block/package-info.java diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java index ad2ec33ef..eb1ff164b 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java @@ -425,7 +425,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1 ); - return 0; + return BlockTypesCache.ReservedIDs.AIR; } } } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java index 23095aceb..fd8808909 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockTypesCache; import io.papermc.lib.PaperLib; import io.papermc.paper.event.block.BeaconDeactivatedEvent; import net.minecraft.core.BlockPos; @@ -844,16 +845,16 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc // Section is null, return empty array if (section == null) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); return data; } if (data != null && data.length != 4096) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); } if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); } DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section); synchronized (lock) { @@ -878,8 +879,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc for (int i = 0; i < 4096; i++) { char paletteVal = data[i]; char ordinal = adapter.ibdIDToOrdinal(paletteVal); - // Don't read "empty". - data[i] = ordinal == 0 ? 1 : ordinal; + data[i] = ordinal; } return data; } @@ -898,18 +898,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc val = ordinal(palette.valueFor(i), adapter); paletteToOrdinal[i] = val; } - // Don't read "empty". - if (val == 0) { - val = 1; - } data[i] = val; } } else { char ordinal = ordinal(palette.valueFor(0), adapter); - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } Arrays.fill(data, ordinal); } } finally { @@ -929,7 +921,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) { if (ibd == null) { - return 1; + return BlockTypesCache.ReservedIDs.AIR; } else { return adapter.adaptToChar(ibd); } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index ad53a1789..4a20a5eeb 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -420,7 +420,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", blockState.getBlock(), Block.BLOCK_STATE_REGISTRY.getId(blockState), ibdToStateOrdinal.length, e1 ); - return 0; + return BlockTypesCache.ReservedIDs.AIR; } } } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java index f5335eca2..00cda1dc7 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.block.BlockTypesCache; import io.papermc.lib.PaperLib; import io.papermc.paper.event.block.BeaconDeactivatedEvent; import net.minecraft.core.BlockPos; @@ -874,16 +875,16 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc // Section is null, return empty array if (section == null) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); return data; } if (data != null && data.length != 4096) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); } if (data == null || data == FaweCache.INSTANCE.EMPTY_CHAR_4096) { data = new char[4096]; - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); } DelegateSemaphore lock = PaperweightPlatformAdapter.applyLock(section); synchronized (lock) { @@ -915,8 +916,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc for (int i = 0; i < 4096; i++) { char paletteVal = data[i]; char ordinal = adapter.ibdIDToOrdinal(paletteVal); - // Don't read "empty". - data[i] = ordinal == 0 ? 1 : ordinal; + data[i] = ordinal; } return data; } @@ -935,18 +935,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc val = ordinal(palette.valueFor(i), adapter); paletteToOrdinal[i] = val; } - // Don't read "empty". - if (val == 0) { - val = 1; - } data[i] = val; } } else { char ordinal = ordinal(palette.valueFor(0), adapter); - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } Arrays.fill(data, ordinal); } } finally { @@ -966,7 +958,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc private char ordinal(net.minecraft.world.level.block.state.BlockState ibd, PaperweightFaweAdapter adapter) { if (ibd == null) { - return 1; + return BlockTypesCache.ReservedIDs.AIR; } else { return adapter.adaptToChar(ibd); } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index f7bfd7d33..65d93b5b0 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -23,8 +23,8 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { int num_palette = 0; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; - if (ordinal == 0) { - ordinal = 1; + if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) { + ordinal = BlockTypesCache.ReservedIDs.AIR; } int palette = blockToPalette[ordinal]; if (palette == Integer.MAX_VALUE) { @@ -48,11 +48,11 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { - case 0: - ordinal = 1; - case 1: - case 2: - case 3: + case BlockTypesCache.ReservedIDs.__RESERVED__: + ordinal = BlockTypesCache.ReservedIDs.AIR; + case BlockTypesCache.ReservedIDs.AIR: + case BlockTypesCache.ReservedIDs.CAVE_AIR: + case BlockTypesCache.ReservedIDs.VOID_AIR: air++; break; default: @@ -94,13 +94,13 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { char[] getArr = null; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; - if (ordinal == 0) { + if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) { if (getArr == null) { getArr = get.apply(layer); } ordinal = getArr[i]; - if (ordinal == 0) { - ordinal = 1; + if (ordinal == BlockTypesCache.ReservedIDs.__RESERVED__) { + ordinal = BlockTypesCache.ReservedIDs.AIR; } } int palette = blockToPalette[ordinal]; @@ -119,24 +119,24 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length); } - char lastOrdinal = 0; + char lastOrdinal = BlockTypesCache.ReservedIDs.__RESERVED__; boolean lastticking = false; boolean tick_placed = Settings.settings().EXPERIMENTAL.ALLOW_TICK_PLACED; boolean tick_existing = Settings.settings().EXPERIMENTAL.ALLOW_TICK_EXISTING; for (int i = 0; i < 4096; i++) { char ordinal = set[i]; switch (ordinal) { - case 0: { + case BlockTypesCache.ReservedIDs.__RESERVED__ -> { if (getArr == null) { getArr = get.apply(layer); } ordinal = getArr[i]; switch (ordinal) { - case 0: - ordinal = 1; - case 1: - case 2: - case 3: + case BlockTypesCache.ReservedIDs.__RESERVED__: + ordinal = BlockTypesCache.ReservedIDs.AIR; + case BlockTypesCache.ReservedIDs.AIR: + case BlockTypesCache.ReservedIDs.CAVE_AIR: + case BlockTypesCache.ReservedIDs.VOID_AIR: air++; break; default: @@ -151,23 +151,19 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { } if (ticking) { BlockState state = BlockState.getFromOrdinal(ordinal); - ticking_blocks - .put( - BlockVector3.at(i & 15, (i >> 8) & 15, (i >> 4) & 15), - WorldEditPlugin.getInstance().getBukkitImplAdapter() - .getInternalBlockStateId(state).orElse(0) - ); + ticking_blocks.put(BlockVector3.at(i & 15, (i >> 8) & 15, (i >> 4) & 15), + WorldEditPlugin + .getInstance() + .getBukkitImplAdapter() + .getInternalBlockStateId(state) + .orElse(0) + ); } } } set[i] = ordinal; - break; } - case 1: - case 2: - case 3: - air++; - break; + case BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR -> air++; } if (!fastmode && tick_placed) { boolean ticking; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java index 83114a473..cceb1b7cd 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java @@ -30,6 +30,7 @@ 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.BlockTypesCache; import org.apache.logging.log4j.Logger; import java.io.IOException; @@ -185,8 +186,8 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { for (int x = 0; x < 16; x++, index++) { int xx = bx + x; int from = blocksGet[index]; - if (from == 0) { - from = 1; + if (from == BlockTypesCache.ReservedIDs.__RESERVED__) { + from = BlockTypesCache.ReservedIDs.AIR; } final int combinedFrom = from; final int combinedTo = blocksSet[index]; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index c37e2ee70..7080511e6 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -9,6 +9,7 @@ import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockState; +import com.sk89q.worldedit.world.block.BlockTypesCache; import com.sk89q.worldedit.world.registry.BlockRegistry; import javax.annotation.Nullable; @@ -115,11 +116,11 @@ public interface IBlocks extends Trimable { for (int i = 0; i < ids.length; i++) { char ordinal = ids[i]; switch (ordinal) { - case 0: - case 2: - case 3: - ids[i] = 1; - case 1: + case BlockTypesCache.ReservedIDs.__RESERVED__: + case BlockTypesCache.ReservedIDs.CAVE_AIR: + case BlockTypesCache.ReservedIDs.VOID_AIR: + ids[i] = BlockTypesCache.ReservedIDs.AIR; + case BlockTypesCache.ReservedIDs.AIR: continue; default: nonEmpty++; @@ -139,10 +140,10 @@ public interface IBlocks extends Trimable { for (int i = 0; i < palette.paletteToBlockLength; i++) { int ordinal = palette.paletteToBlock[i]; switch (ordinal) { - case 0: - case 2: - case 3: - case 1: + case BlockTypesCache.ReservedIDs.__RESERVED__: + case BlockTypesCache.ReservedIDs.AIR: + case BlockTypesCache.ReservedIDs.CAVE_AIR: + case BlockTypesCache.ReservedIDs.VOID_AIR: sectionWriter.write(0); break; default: diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java index 89c9d0519..3e01ecc40 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java @@ -9,6 +9,7 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockTypesCache; import javax.annotation.Nullable; import java.util.Arrays; @@ -59,7 +60,7 @@ public class BitSetBlocks implements IChunkSet { for (int y = 0, index = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++, index++) { - if (data[index] != 0) { + if (data[index] != BlockTypesCache.ReservedIDs.__RESERVED__) { row.set(null, x, by + y, z, minSectionPosition, maxSectionPosition); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java index 8b434cc8a..39735679d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java @@ -134,7 +134,7 @@ public abstract class CharBlocks implements IBlocks { return new char[4096]; } for (int i = 0; i < 4096; i++) { - data[i] = 0; + data[i] = defaultOrdinal(); } return data; } @@ -188,11 +188,16 @@ public abstract class CharBlocks implements IBlocks { int layer = y >> 4; final int index = (y & 15) << 8 | z << 4 | x; if (layer > maxSectionPosition || layer < minSectionPosition) { - return 0; + return defaultOrdinal(); } return get(layer, index); } + /** + * Default char value to be used when "updating"/resetting data arrays + */ + protected abstract char defaultOrdinal(); + // Not synchronized as it refers to a synchronized method and includes nothing that requires synchronization public void set(int x, int y, int z, char value) { final int layer = y >> 4; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java index fad00ca6b..2299e9b4d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java @@ -37,10 +37,15 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { if (data == null) { data = new char[4096]; } - Arrays.fill(data, (char) 1); + Arrays.fill(data, (char) BlockTypesCache.ReservedIDs.AIR); return data; } + @Override + protected char defaultOrdinal() { + return BlockTypesCache.ReservedIDs.AIR; + } + @Override public synchronized boolean trim(boolean aggressive, int layer) { layer -= minSectionPosition; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index a8b3ccf30..1b0451195 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -11,6 +11,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; +import com.sk89q.worldedit.world.block.BlockTypesCache; import java.util.Arrays; import java.util.Collections; @@ -326,6 +327,11 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { return super.load(layer); } + @Override + protected char defaultOrdinal() { + return BlockTypesCache.ReservedIDs.__RESERVED__; + } + // Checks and updates the various section arrays against the new layer index private void updateSectionIndexRange(int layer) { if (layer >= minSectionPosition && layer <= maxSectionPosition) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java index 4485945fc..ac3672495 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java @@ -13,6 +13,7 @@ import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.BlockRegistry; import com.sk89q.worldedit.world.registry.Registries; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -220,55 +221,30 @@ public class BlockTypesCache { BIT_MASK = ((1 << BIT_OFFSET) - 1); values = new BlockType[size]; - /*Field[] idFields = BlockID.class.getDeclaredFields(); - for (Field field : idFields) { - size = Math.max(field.getInt(null) + 1, size); - } - - // Register the statically declared ones first - for (Field field : idFields) { - if (field.getType() == int.class) { - int internalId = field.getInt(null); - String id = "minecraft:" + field.getName().toLowerCase(Locale.ROOT); - String defaultState = blockMap.remove(id); - if (defaultState == null) { - if (internalId != 0) { - continue; - } - defaultState = id; - } - if (values[internalId] != null) { - throw new IllegalStateException("Invalid duplicate id for " + field.getName()); - } - BlockType type = register(defaultState, internalId, stateList, tickList); - // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty - values[internalId] = type; - } - }*/ - - // Register "Reserved". Ensure air/reserved and 0/1/2/3 + // Register reserved IDs. Ensure air/reserved are 0/1/2/3 { - int internalId = 0; - for (String id : new String[]{"minecraft:__reserved__", "minecraft:air", "minecraft:cave_air", - "minecraft:void_air"}) { - String defaultState = blockMap.remove(id); - if (defaultState == null) { - defaultState = id; + for (Field field : ReservedIDs.class.getDeclaredFields()) { + if (field.getType() == int.class) { + int internalId = field.getInt(null); + String id = "minecraft:" + field.getName().toLowerCase(Locale.ROOT); + String defaultState = blockMap.remove(id); + if (defaultState == null) { + defaultState = id; + } + if (values[internalId] != null) { + throw new IllegalStateException(String.format( + "Invalid duplicate id for %s! Something has gone very wrong. Are " + + "any plugins shading FAWE?!", id)); + } + BlockType type = register(defaultState, internalId, stateList, tickList); + // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty + values[internalId] = type; } - if (values[internalId] != null) { - throw new IllegalStateException( - "Invalid duplicate id for __reserved__! Something has gone very wrong. Are " + - "any plugins shading FAWE?!"); - } - BlockType type = register(defaultState, internalId, stateList, tickList); - // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty - values[internalId] = type; - internalId++; } } { // Register real blocks - int internalId = 1; + int internalId = 0; for (Map.Entry entry : blockMap.entrySet()) { String defaultState = entry.getValue(); // Skip already registered ids @@ -328,4 +304,15 @@ public class BlockTypesCache { } } + /** + * Statically-set reserved IDs. Should be used as minimally as possible, and for IDs that will see frequent use + */ + public static class ReservedIDs { + public static final int __RESERVED__ = 0; + public static final int AIR = 1; + public static final int CAVE_AIR = 2; + public static final int VOID_AIR = 3; + + } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/package-info.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/package-info.java new file mode 100644 index 000000000..b8e54bc04 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/package-info.java @@ -0,0 +1,6 @@ +/** + * The following classes are FAWE additions: + * + * @see com.sk89q.worldedit.world.block.BlockTypesCache + */ +package com.sk89q.worldedit.world.block; From 1a281badc24e93af85a6d2b603a91f63654d08f1 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 15:30:12 +0000 Subject: [PATCH 52/81] Remove mentions of NMS from compilation instruction --- COMPILING.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/COMPILING.md b/COMPILING.md index b80ee040c..87bd2fe20 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -16,10 +16,6 @@ The build process uses Gradle, which you do *not* need to download. FastAsyncWor ## To compile... -### NMS -FastAsyncWorldEdit uses NMS (net.minecraft.server) code in a variety of spots. NMS is not distributed via maven and therefore FastAsyncWorldEdit may not build without errors if you didn't install it into your local repository beforehand. -You can do that by either running Spigot's [BuildTools](https://www.spigotmc.org/wiki/buildtools/) targeting the versions needed or using Paper's [paperclip](https://papermc.io/downloads) with `java -Dpaperclip.install=true -jar paperclip.jar`. - ### On Windows 1. Shift + right-click the folder with FastAsyncWorldEdit's files and click "Open command prompt". From 48e295391059f3e0365b4d3a811e6aa3f81c8a60 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 15:30:25 +0000 Subject: [PATCH 53/81] Update log4j version, update jd links to use "latest" --- buildSrc/src/main/kotlin/CommonJavaConfig.kt | 4 ++-- gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/CommonJavaConfig.kt b/buildSrc/src/main/kotlin/CommonJavaConfig.kt index 0f4d2e857..00b87806f 100644 --- a/buildSrc/src/main/kotlin/CommonJavaConfig.kt +++ b/buildSrc/src/main/kotlin/CommonJavaConfig.kt @@ -60,8 +60,8 @@ fun Project.applyCommonJavaConfiguration(sourcesJar: Boolean, banSlf4j: Boolean options.encoding = "UTF-8" links( "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/", - "https://jd.adventure.kyori.net/api/4.9.3/", - "https://javadoc.io/doc/org.apache.logging.log4j/log4j-api/2.14.1/", + "https://jd.adventure.kyori.net/api/latest/", + "https://javadoc.io/doc/org.apache.logging.log4j/log4j-api/latest/index.html", "https://www.antlr.org/api/Java/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/core/0.5.7/", "https://docs.enginehub.org/javadoc/org.enginehub.piston/default-impl/0.5.7/", diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d50d7f988..cfb4b3c80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] # Minecraft expectations fastutil = "8.5.6" -log4j = "2.17.0" +log4j = "2.17.1" guava = "31.0.1-jre" gson = "2.8.9" From f38859237a73ceddec102730cada3266741edc9a Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:00:49 +0000 Subject: [PATCH 54/81] Move to BinaryTags where appropriate in adapters --- .../adapter/ext/fawe/PaperweightAdapter.java | 36 +++++++++------- .../v1_17_R1_2/PaperweightFaweAdapter.java | 27 ++++++------ .../PaperweightPlatformAdapter.java | 6 +-- .../v1_17_R1_2/regen/PaperweightRegen.java | 32 +++++++------- .../ext/fawe/v1_18_R1/PaperweightAdapter.java | 43 ++++++++++--------- .../fawe/v1_18_R1/PaperweightFaweAdapter.java | 25 +++++------ .../v1_18_R1/PaperweightPlatformAdapter.java | 9 ++-- .../fawe/v1_18_R1/regen/PaperweightRegen.java | 20 ++++----- .../core/entity/LazyBaseEntity.java | 15 ++++--- 9 files changed, 111 insertions(+), 102 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java index ab2530fed..e3129e07b 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java @@ -56,6 +56,7 @@ 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.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.io.file.SafeFiles; @@ -171,11 +172,11 @@ import static com.google.common.base.Preconditions.checkState; public final class PaperweightAdapter implements BukkitImplAdapter { - private final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + private final Logger LOGGER = Logger.getLogger(getClass().getCanonicalName()); - private final Field serverWorldsField; - private final Method getChunkFutureMethod; - private final Field chunkProviderExecutorField; + private final Field worldsField; + private final Method getChunkFutureMainThreadMethod; + private final Field mainThreadProcessorField; private final Watchdog watchdog; // ------------------------------------------------------------------------ @@ -191,18 +192,18 @@ public final class PaperweightAdapter implements BukkitImplAdapter (CompoundBinaryTag) toNativeBinary(tag)) + ); } @Nullable @@ -667,7 +671,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter map = (Map) serverWorldsField.get(Bukkit.getServer()); + Map map = (Map) worldsField.get(Bukkit.getServer()); map.remove("worldeditregentempworld"); } catch (IllegalAccessException ignored) { } @@ -740,7 +744,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter> chunkLoadings = submitChunkLoadTasks(region, serverWorld); BlockableEventLoop executor; try { - executor = (BlockableEventLoop) chunkProviderExecutorField.get(serverWorld.getChunkSource()); + executor = (BlockableEventLoop) mainThreadProcessorField.get(serverWorld.getChunkSource()); } catch (IllegalAccessException e) { throw new IllegalStateException("Couldn't get executor for chunk loading.", e); } @@ -801,7 +805,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter>) - getChunkFutureMethod.invoke(chunkManager, chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true)) + getChunkFutureMainThreadMethod.invoke(chunkManager, chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true)) .thenApply(either -> either.left().orElse(null)) ); } catch (IllegalAccessException | InvocationTargetException e) { @@ -893,7 +897,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter saveTag = () -> { + Supplier saveTag = () -> { final net.minecraft.nbt.CompoundTag minecraftTag = new net.minecraft.nbt.CompoundTag(); readEntityIntoTag(mcEntity, minecraftTag); //add Id for AbstractChangeSet to work - final CompoundTag tag = (CompoundTag) toNative(minecraftTag); - final Map tags = new HashMap<>(tag.getValue()); - tags.put("Id", new StringTag(id)); - return new CompoundTag(tags); + final CompoundBinaryTag tag = (CompoundBinaryTag) toNative(minecraftTag); + final Map tags = new HashMap<>(); + tag.keySet().forEach(key -> tags.put(key, tag.get(key))); + tags.put("Id", StringBinaryTag.of(id)); + return CompoundBinaryTag.from(tags); }; return new LazyBaseEntity(type, saveTag); } else { @@ -541,7 +542,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements Registry.ITEM.get(ResourceLocation.tryParse(baseItemStack.getType().getId())), baseItemStack.getAmount() ); - stack.setTag(((net.minecraft.nbt.CompoundTag) fromNative(baseItemStack.getNbtData()))); + stack.setTag(((net.minecraft.nbt.CompoundTag) fromNativeBinary(baseItemStack.getNbt()))); return CraftItemStack.asCraftMirror(stack); } @@ -603,7 +604,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements 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()))); + weStack.setNbt(((CompoundBinaryTag) toNativeBinary(nmsStack.getTag()))); return weStack; } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java index 1f7706b57..b8b791e88 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightPlatformAdapter.java @@ -86,7 +86,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { private static final long fieldLockOffset; private static final Field fieldGameEventDispatcherSections; - private static final MethodHandle methodremoveTickingBlockEntity; + private static final MethodHandle methodremoveBlockEntityTicker; private static final Field fieldRemove; @@ -133,7 +133,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { ), BlockPos.class ); removeBlockEntityTicker.setAccessible(true); - methodremoveTickingBlockEntity = MethodHandles.lookup().unreflect(removeBlockEntityTicker); + methodremoveBlockEntityTicker = MethodHandles.lookup().unreflect(removeBlockEntityTicker); fieldRemove = BlockEntity.class.getDeclaredField(Refraction.pickName("remove", "p")); fieldRemove.setAccessible(true); @@ -440,7 +440,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { fieldRemove.set(beacon, true); } } - methodremoveTickingBlockEntity.invoke(levelChunk, beacon.getBlockPos()); + methodremoveBlockEntityTicker.invoke(levelChunk, beacon.getBlockPos()); } catch (Throwable throwable) { throwable.printStackTrace(); } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java index 6807c7a05..c7c1e708f 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java @@ -90,13 +90,13 @@ public class PaperweightRegen extends Regenerator chunkStati = new LinkedHashMap<>(); @@ -125,8 +125,8 @@ public class PaperweightRegen extends Regenerator { try { - Map map = (Map) serverWorldsField.get(Bukkit.getServer()); + Map map = (Map) worldsField.get(Bukkit.getServer()); map.remove("worldeditregentempworld"); } catch (IllegalAccessException e) { throw new RuntimeException(e); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index c30dfe662..b0d8eefb4 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -30,7 +30,6 @@ 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.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; @@ -55,6 +54,7 @@ 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.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.io.file.SafeFiles; @@ -172,11 +172,11 @@ import static com.google.common.base.Preconditions.checkState; public final class PaperweightAdapter implements BukkitImplAdapter { - private final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + private final Logger LOGGER = Logger.getLogger(getClass().getCanonicalName()); - private final Field serverWorldsField; - private final Method getChunkFutureMethod; - private final Field chunkProviderExecutorField; + private final Field worldsField; + private final Method getChunkFutureMainThreadMethod; + private final Field mainThreadProcessorField; private final Watchdog watchdog; // ------------------------------------------------------------------------ @@ -192,19 +192,19 @@ public final class PaperweightAdapter implements BukkitImplAdapter (CompoundBinaryTag) toNativeBinary(tag)) + ); } @Nullable @@ -442,9 +445,9 @@ public final class PaperweightAdapter implements BukkitImplAdapter map = (Map) serverWorldsField.get(Bukkit.getServer()); + Map map = (Map) worldsField.get(Bukkit.getServer()); map.remove("worldeditregentempworld"); } catch (IllegalAccessException ignored) { } @@ -738,7 +741,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter> chunkLoadings = submitChunkLoadTasks(region, serverWorld); BlockableEventLoop executor; try { - executor = (BlockableEventLoop) chunkProviderExecutorField.get(serverWorld.getChunkSource()); + executor = (BlockableEventLoop) mainThreadProcessorField.get(serverWorld.getChunkSource()); } catch (IllegalAccessException e) { throw new IllegalStateException("Couldn't get executor for chunk loading.", e); } @@ -797,7 +800,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter>) - getChunkFutureMethod.invoke(chunkManager, chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true)) + getChunkFutureMainThreadMethod.invoke(chunkManager, chunk.getX(), chunk.getZ(), ChunkStatus.FEATURES, true)) .thenApply(either -> either.left().orElse(null)) ); } catch (IllegalAccessException | InvocationTargetException e) { @@ -889,7 +892,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter saveTag = () -> { + Supplier saveTag = () -> { final net.minecraft.nbt.CompoundTag minecraftTag = new net.minecraft.nbt.CompoundTag(); readEntityIntoTag(mcEntity, minecraftTag); //add Id for AbstractChangeSet to work - final CompoundTag tag = (CompoundTag) toNative(minecraftTag); - final Map tags = new HashMap<>(tag.getValue()); - tags.put("Id", new StringTag(id)); - return new CompoundTag(tags); + final CompoundBinaryTag tag = (CompoundBinaryTag) toNativeBinary(minecraftTag); + final Map tags = new HashMap<>(); + tag.keySet().forEach(key -> tags.put(key, tag.get(key))); + tags.put("Id", StringBinaryTag.of(id)); + return CompoundBinaryTag.from(tags); }; return new LazyBaseEntity(type, saveTag); } else { @@ -598,7 +599,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements 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()))); + weStack.setNbt(((CompoundBinaryTag) toNativeBinary(nmsStack.getTag()))); return weStack; } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java index 78ad00245..27e22a05c 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightPlatformAdapter.java @@ -85,7 +85,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { public static final Field fieldPalette; - public static final Field fieldTickingFluidContent; + public static final Field fieldTickingFluidCount; public static final Field fieldTickingBlockCount; public static final Field fieldNonEmptyBlockCount; @@ -114,14 +114,13 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { dataConstructor = dataClazz.getDeclaredConstructors()[0]; dataConstructor.setAccessible(true); - //TODO FIXME 1.18 fieldStorage = dataClazz.getDeclaredField(Refraction.pickName("storage", "b")); fieldStorage.setAccessible(true); fieldPalette = dataClazz.getDeclaredField(Refraction.pickName("palette", "c")); fieldPalette.setAccessible(true); - fieldTickingFluidContent = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingFluidCount", "h")); - fieldTickingFluidContent.setAccessible(true); + fieldTickingFluidCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingFluidCount", "h")); + fieldTickingFluidCount.setAccessible(true); fieldTickingBlockCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("tickingBlockCount", "g")); fieldTickingBlockCount.setAccessible(true); fieldNonEmptyBlockCount = LevelChunkSection.class.getDeclaredField(Refraction.pickName("nonEmptyBlockCount", "f")); @@ -544,7 +543,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final LevelChunkSection section) throws IllegalAccessException { - fieldTickingFluidContent.setShort(section, (short) 0); // TODO FIXME + fieldTickingFluidCount.setShort(section, (short) 0); // TODO FIXME fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java index c2ce83d38..49285b665 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -74,12 +74,12 @@ public class PaperweightRegen extends Regenerator chunkStati = new LinkedHashMap<>(); @@ -123,7 +123,7 @@ public class PaperweightRegen extends Regenerator saveTag; + private Supplier saveTag; - public LazyBaseEntity(EntityType type, Supplier saveTag) { + public LazyBaseEntity(EntityType type, Supplier saveTag) { super(type); this.saveTag = saveTag; } @Nullable @Override - public CompoundTag getNbtData() { - Supplier tmp = saveTag; + public CompoundBinaryTag getNbt() { + Supplier tmp = saveTag; if (tmp != null) { saveTag = null; if (Fawe.isMainThread()) { - setNbtData(tmp.get()); + setNbt(tmp.get()); } else { - setNbtData(TaskManager.taskManager().sync(tmp)); + setNbt(TaskManager.taskManager().sync(tmp)); } } - return super.getNbtData(); + return super.getNbt(); } } From 3c2394afa49aeb35c9d3ac4940774826faaf2d84 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:06:49 +0000 Subject: [PATCH 55/81] Add comments to changed code --- .../worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java | 2 ++ .../bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java index e3129e07b..f8d3b5006 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java @@ -436,10 +436,12 @@ public final class PaperweightAdapter implements BukkitImplAdapter (CompoundBinaryTag) toNativeBinary(tag)) ); + //FAWE end } @Nullable diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index b0d8eefb4..ef3a20b68 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -427,10 +427,12 @@ public final class PaperweightAdapter implements BukkitImplAdapter (CompoundBinaryTag) toNativeBinary(tag)) ); + //FAWE end } @Nullable From 0d79d084a5d6e5024fb4f03980f15b0801e1579b Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:12:16 +0000 Subject: [PATCH 56/81] Rename worldedit to fawe where appropriate --- .../bukkit/adapter/ext/fawe/PaperweightAdapter.java | 2 +- .../impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java | 6 +++--- .../adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java | 2 +- .../adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java index f8d3b5006..f0246debf 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/PaperweightAdapter.java @@ -523,7 +523,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter levelStemResourceKey = getWorldDimKey(environment); - session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); + session = levelStorageSource.createAccess("faweregentempworld", levelStemResourceKey); PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; MinecraftServer server = originalServerWorld.getCraftServer().getServer(); @@ -221,7 +221,7 @@ public class PaperweightRegen extends Regenerator { try { Map map = (Map) worldsField.get(Bukkit.getServer()); - map.remove("worldeditregentempworld"); + map.remove("faweregentempworld"); } catch (IllegalAccessException e) { throw new RuntimeException(e); } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java index ef3a20b68..3c08adf0c 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_18_R1/PaperweightAdapter.java @@ -514,7 +514,7 @@ public final class PaperweightAdapter implements BukkitImplAdapter levelStemResourceKey = getWorldDimKey(environment); - session = levelStorageSource.createAccess("worldeditregentempworld", levelStemResourceKey); + session = levelStorageSource.createAccess("faweregentempworld", levelStemResourceKey); PrimaryLevelData originalWorldData = originalServerWorld.serverLevelData; MinecraftServer server = originalServerWorld.getCraftServer().getServer(); @@ -203,7 +203,7 @@ public class PaperweightRegen extends Regenerator { try { Map map = (Map) serverWorldsField.get(Bukkit.getServer()); - map.remove("worldeditregentempworld"); + map.remove("faweregentempworld"); } catch (IllegalAccessException e) { throw new RuntimeException(e); } From e2a1721a5c4d94e18c3bae35bdc86b0785c83f48 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:12:43 +0000 Subject: [PATCH 57/81] Use new language features --- .../nbt/PaperweightLazyCompoundTag.java | 19 +++++++++---------- .../v1_17_R1_2/regen/PaperweightRegen.java | 14 +++++--------- .../nbt/PaperweightLazyCompoundTag.java | 19 +++++++++---------- .../fawe/v1_18_R1/regen/PaperweightRegen.java | 14 +++++--------- 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/nbt/PaperweightLazyCompoundTag.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/nbt/PaperweightLazyCompoundTag.java index 41cc94827..f71a3954e 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/nbt/PaperweightLazyCompoundTag.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/nbt/PaperweightLazyCompoundTag.java @@ -66,8 +66,8 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public double asDouble(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsDouble(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsDouble(); } return 0; } @@ -86,20 +86,19 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public int asInt(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsInt(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsInt(); } return 0; } public List getList(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof net.minecraft.nbt.ListTag) { + if (tag instanceof net.minecraft.nbt.ListTag nbtList) { ArrayList list = new ArrayList<>(); - net.minecraft.nbt.ListTag nbtList = (net.minecraft.nbt.ListTag) tag; for (net.minecraft.nbt.Tag elem : nbtList) { - if (elem instanceof net.minecraft.nbt.CompoundTag) { - list.add(new PaperweightLazyCompoundTag((net.minecraft.nbt.CompoundTag) elem)); + if (elem instanceof net.minecraft.nbt.CompoundTag compoundTag) { + list.add(new PaperweightLazyCompoundTag(compoundTag)); } else { list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); } @@ -137,8 +136,8 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public long asLong(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsLong(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsLong(); } return 0; } diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java index 52161adfd..12a12d059 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java @@ -414,15 +414,11 @@ public class PaperweightRegen extends Regenerator getWorldDimKey(org.bukkit.World.Environment env) { - switch (env) { - case NETHER: - return LevelStem.NETHER; - case THE_END: - return LevelStem.END; - case NORMAL: - default: - return LevelStem.OVERWORLD; - } + return switch (env) { + case NETHER -> LevelStem.NETHER; + case THE_END -> LevelStem.END; + default -> LevelStem.OVERWORLD; + }; } private BiomeSource fastOverworldBiomeSource(BiomeSource biomeSource) throws Exception { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java index 3dfebd31c..1639ac951 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java @@ -66,8 +66,8 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public double asDouble(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsDouble(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsDouble(); } return 0; } @@ -86,20 +86,19 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public int asInt(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsInt(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsInt(); } return 0; } public List getList(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof net.minecraft.nbt.ListTag) { + if (tag instanceof net.minecraft.nbt.ListTag nbtList) { ArrayList list = new ArrayList<>(); - net.minecraft.nbt.ListTag nbtList = (net.minecraft.nbt.ListTag) tag; for (net.minecraft.nbt.Tag elem : nbtList) { - if (elem instanceof net.minecraft.nbt.CompoundTag) { - list.add(new PaperweightLazyCompoundTag((net.minecraft.nbt.CompoundTag) elem)); + if (elem instanceof net.minecraft.nbt.CompoundTag compoundTag) { + list.add(new PaperweightLazyCompoundTag(compoundTag)); } else { list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); } @@ -138,8 +137,8 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { public long asLong(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); - if (tag instanceof NumericTag) { - return ((NumericTag) tag).getAsLong(); + if (tag instanceof NumericTag numTag) { + return numTag.getAsLong(); } return 0; } diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java index 71cebcade..4269b48a5 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/regen/PaperweightRegen.java @@ -397,15 +397,11 @@ public class PaperweightRegen extends Regenerator getWorldDimKey(org.bukkit.World.Environment env) { - switch (env) { - case NETHER: - return LevelStem.NETHER; - case THE_END: - return LevelStem.END; - case NORMAL: - default: - return LevelStem.OVERWORLD; - } + return switch (env) { + case NETHER -> LevelStem.NETHER; + case THE_END -> LevelStem.END; + default -> LevelStem.OVERWORLD; + }; } private static class RegenNoOpWorldLoadListener implements ChunkProgressListener { From 19de815ab48c2125cd7de674e719b243f3860a9b Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 29 Dec 2021 17:13:20 +0100 Subject: [PATCH 58/81] chore: Format our loggers properly --- .../fastasyncworldedit/bukkit/listener/ChunkListener.java | 6 +++--- .../com/sk89q/worldedit/bukkit/BukkitServerInterface.java | 2 +- .../main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java | 8 ++++---- .../java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java | 4 ++-- .../main/java/com/sk89q/worldedit/cli/CLIWorldEdit.java | 2 +- .../core/extent/clipboard/io/FastSchematicReader.java | 2 +- .../main/java/com/sk89q/worldedit/EditSessionBuilder.java | 2 +- .../extent/clipboard/io/MCEditSchematicReader.java | 6 +++--- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java index 345a0abc9..f3051536d 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java @@ -377,8 +377,8 @@ public abstract class ChunkListener implements Listener { if (Math.abs(velocity.getX()) > vertical || Math.abs(velocity.getZ()) > vertical) { LOGGER.warn( - "[FAWE `tick-limiter`] Detected and cancelled rogue FireWork at " - + ent.getLocation()); + "[FAWE `tick-limiter`] Detected and cancelled rogue FireWork at {}", + ent.getLocation()); ent.remove(); } } @@ -408,7 +408,7 @@ public abstract class ChunkListener implements Listener { if (rateLimit <= 0) { rateLimit = 20; LOGGER.warn( - "[FAWE `tick-limiter`] Detected and cancelled item lag source at " + loc); + "[FAWE `tick-limiter`] Detected and cancelled item lag source at {}", loc); } event.setCancelled(true); } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 10df72cef..44414ffc4 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -275,7 +275,7 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser RelighterFactory getRelighterFactory() { if (this.relighterFactory == null) { this.relighterFactory = this.plugin.getBukkitImplAdapter().getRelighterFactory(); - LOGGER.info("Using " + this.relighterFactory.getClass().getCanonicalName() + " as relighter factory."); + LOGGER.info("Using {} as relighter factory.", this.relighterFactory.getClass().getCanonicalName()); } return this.relighterFactory; } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 91ffb6674..379476ec8 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -301,10 +301,10 @@ public class BukkitWorld extends AbstractWorld { if (treeTypeMapping.get(type) == null) { LOGGER.error("No TreeType mapping for TreeGenerator.TreeType." + type); //FAWE start - LOGGER.info("The above message is displayed because your FAWE version is newer than " + Bukkit.getVersion() + - " and contains features of future minecraft versions which do not exist in " - + Bukkit.getVersion() + ", hence the tree type " + type + " is not available. This is not an error. " + - "This version will work on your version of Minecraft. This is an informative message only"); + LOGGER.info("The above message is displayed because your FAWE version is newer than {}" + + " and contains features of future minecraft versions which do not exist in {} hence the tree type" + + "{} is not available. This is not an error. This version will work on your version of Minecraft." + + "This is an informative message only.", Bukkit.getVersion(), Bukkit.getVersion(), type); //FAWE end } } diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index 3fe92e41d..37f743e1c 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -367,8 +367,8 @@ public class WorldEditPlugin extends JavaPlugin { } else { //FAWE start - Identify as FAWE LOGGER.info("FastAsyncWorldEdit could not find a Bukkit adapter for this MC version, " - + "but it seems that you have another implementation of FastAsyncWorldEdit installed (" + platform.getPlatformName() + ") " - + "that handles the world editing."); + + "but it seems that you have another implementation of FastAsyncWorldEdit installed ({}) " + + "that handles the world editing.", platform.getPlatformName()); //FAWE end } this.adapter.invalidate(); diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIWorldEdit.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIWorldEdit.java index a9a57877a..73eb307ec 100644 --- a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIWorldEdit.java +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIWorldEdit.java @@ -190,7 +190,7 @@ public class CLIWorldEdit { this.commandSender = new CLICommandSender(this, LOGGER); this.platform = new CLIPlatform(this); //FAWE start - identify as Fawe - LOGGER.info("FastAsyncWorldEdit CLI (version " + getInternalVersion() + ") is loaded"); + LOGGER.info("FastAsyncWorldEdit CLI (version {}) is loaded", getInternalVersion()); //FAWE end } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java index 5c60b91c5..87ca68044 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/io/FastSchematicReader.java @@ -178,7 +178,7 @@ public class FastSchematicReader extends NBTSchematicReader { try { state = BlockState.get(palettePart); } catch (InputParseException ignored) { - LOGGER.warn("Invalid BlockState in palette: " + palettePart + ". Block will be replaced with air."); + LOGGER.warn("Invalid BlockState in palette: {}. Block will be replaced with air.", palettePart); state = BlockTypes.AIR.getDefaultState(); } int index = (int) entry.getValue(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java index e8af94c69..11e49f878 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSessionBuilder.java @@ -722,7 +722,7 @@ public final class EditSessionBuilder { "FAWE config.yml to let FAWE recognize the extent:")); event.getActor().print(toReturn.getClass().getName()); } else { - LOGGER.warn("Potentially unsafe extent blocked: " + toReturn.getClass().getName()); + LOGGER.warn("Potentially unsafe extent blocked: {}", toReturn.getClass().getName()); LOGGER.warn( " - For area restrictions and block logging, it is recommended that third party plugins use the FAWE API"); LOGGER.warn( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java index 2c743fd74..760598ad5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/MCEditSchematicReader.java @@ -206,7 +206,7 @@ public class MCEditSchematicReader extends NBTSchematicReader { //FAWE start - tile entity safety - perhaps caused by the old issue with tile entities created in the wrong // position in schematics? if (index >= blocks.length) { - LOGGER.warn("Skipping corrupt tile entity at position " + x + " " + y + " " + z + " in schematic."); + LOGGER.warn("Skipping corrupt tile entity at position {} {} {} in schematic.", x, y, z); continue; } @@ -275,8 +275,8 @@ public class MCEditSchematicReader extends NBTSchematicReader { byte data = blockData[index]; int combined = block << 8 | data; if (unknownBlocks.add(combined)) { - LOGGER.warn("Unknown block when loading schematic: " - + block + ":" + data + ". This is most likely a bad schematic."); + LOGGER.warn("Unknown block when loading schematic: {} {}. This is most likely a" + + "bad schematic.", block, data); } } } catch (WorldEditException ignored) { // BlockArrayClipboard won't throw this From e5cbdec67eafbc31ef5912da7f57ee117799d5d2 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:14:13 +0000 Subject: [PATCH 59/81] Remove unneeded comments --- .../adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java | 1 - .../impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java | 1 - 2 files changed, 2 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index 8e9806d37..6cdaea783 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -287,7 +287,6 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements return SideEffectSet.defaults().getSideEffectsToApply(); } - //TODO 1.18 address raw access of BlockStateHolder public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { CraftChunk craftChunk = (CraftChunk) chunk; LevelChunk levelChunk = craftChunk.getHandle(); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java index 1639ac951..042c1f0e9 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/nbt/PaperweightLazyCompoundTag.java @@ -108,7 +108,6 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag { return Collections.emptyList(); } - //TODO 1.18 be a ListBinaryTag ? public ListTag getListTag(String key) { net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key); if (tag instanceof net.minecraft.nbt.ListTag) { From ca5640e89eb4dc771bfd9b12865987d7a48fa858 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:16:23 +0000 Subject: [PATCH 60/81] Replace CachedChange class with record --- .../PaperweightFaweWorldNativeAccess.java | 20 +++++-------------- .../PaperweightFaweWorldNativeAccess.java | 20 +++++-------------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java index 68824d9e6..81aad941d 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java @@ -275,21 +275,11 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess Date: Wed, 29 Dec 2021 16:29:55 +0000 Subject: [PATCH 61/81] Remove/add some more comments --- .../adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java | 1 + .../adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java | 4 +--- .../adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java index fd8808909..34c636fc7 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightGetBlocks.java @@ -761,6 +761,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc throw e; } }; + //noinspection unchecked - required at compile time return (T) (Future) queueHandler.sync(chain); } else { if (callback == null) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java index 00cda1dc7..85ffe7710 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -673,7 +673,6 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } syncTasks[1] = () -> { - //TODO 1.18 be a CBT & ListBinaryTag ? for (final CompoundTag nativeTag : entities) { final Map entityTagMap = nativeTag.getValue(); final StringTag idTag = (StringTag) entityTagMap.get("Id"); @@ -769,7 +768,6 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc Runnable[] finalSyncTasks = syncTasks; // Chain the sync tasks and the callback - //TODO 1.18 address raw access Callable chain = () -> { try { // Run the sync tasks @@ -791,6 +789,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc throw e; } }; + //noinspection unchecked - required at compile time return (T) (Future) queueHandler.sync(chain); } else { if (callback == null) { @@ -1089,7 +1088,6 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc final PalettedContainer blocksExisting = existing.getStates(); final Object dataObject = PaperweightPlatformAdapter.fieldData.get(blocksExisting); - //TODO this field doesn't exist in 1.18 final Palette palette = (Palette) PaperweightPlatformAdapter.fieldPalette.get( dataObject); int paletteSize; diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java index d07b8b9b1..fd0dadb03 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks_Copy.java @@ -68,7 +68,6 @@ public class PaperweightGetBlocks_Copy implements IChunkGet { } protected void storeEntity(Entity entity) { - //TODO 1.18 address raw access & possibly be a CBT ? BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag(); entities.add((CompoundTag) adapter.toNative(entity.save(compoundTag))); From 867b28d43976262e456ba9bf0d639de5dd228dae Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:37:21 +0000 Subject: [PATCH 62/81] Remove remaining keywords frm CachedChanged. IJ doesn't warn? --- .../impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java | 2 +- .../impl/fawe/v1_18_R1/PaperweightFaweWorldNativeAccess.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java index 81aad941d..1873a6310 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweWorldNativeAccess.java @@ -275,7 +275,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess Date: Wed, 29 Dec 2021 16:39:44 +0000 Subject: [PATCH 63/81] Compress switch statements a bit using enhanced --- .../bukkit/adapter/NMSAdapter.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 65d93b5b0..bb86a8bc4 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -50,9 +50,7 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { switch (ordinal) { case BlockTypesCache.ReservedIDs.__RESERVED__: ordinal = BlockTypesCache.ReservedIDs.AIR; - case BlockTypesCache.ReservedIDs.AIR: - case BlockTypesCache.ReservedIDs.CAVE_AIR: - case BlockTypesCache.ReservedIDs.VOID_AIR: + case BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR: air++; break; default: @@ -130,15 +128,12 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { if (getArr == null) { getArr = get.apply(layer); } - ordinal = getArr[i]; - switch (ordinal) { + set[i] = switch (ordinal = getArr[i]) { case BlockTypesCache.ReservedIDs.__RESERVED__: ordinal = BlockTypesCache.ReservedIDs.AIR; - case BlockTypesCache.ReservedIDs.AIR: - case BlockTypesCache.ReservedIDs.CAVE_AIR: - case BlockTypesCache.ReservedIDs.VOID_AIR: + case BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR: air++; - break; + yield ordinal; default: if (!fastmode && !tick_placed && tick_existing) { boolean ticking; @@ -160,8 +155,8 @@ public class NMSAdapter implements FAWEPlatformAdapterImpl { ); } } - } - set[i] = ordinal; + yield ordinal; + }; } case BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR -> air++; } From f505828af1c4a527169bd0d948fa75d2f59bd481 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:44:18 +0000 Subject: [PATCH 64/81] More enhanced switches --- .../core/function/generator/CavesGen.java | 15 ++++----------- .../fastasyncworldedit/core/queue/IBlocks.java | 16 +++++----------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java index 3af6fcf78..28bfa0a4c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java @@ -277,17 +277,10 @@ public class CavesGen extends GenBase { } protected boolean isSuitableBlock(BlockStateHolder material, BlockStateHolder materialAbove) { - switch (material.getBlockType().getId()) { - case "minecraft:air": - case "minecraft:cave_air": - case "minecraft:void_air": - case "minecraft:water": - case "minecraft:lava": - case "minecraft:bedrock": - return false; - default: - return true; - } + return switch (material.getBlockType().getId()) { + case "minecraft:air", "minecraft:cave_air", "minecraft:void_air", "minecraft:water", "minecraft:lava", "minecraft:bedrock" -> false; + default -> true; + }; } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index 7080511e6..ff6842c0a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -116,9 +116,7 @@ public interface IBlocks extends Trimable { for (int i = 0; i < ids.length; i++) { char ordinal = ids[i]; switch (ordinal) { - case BlockTypesCache.ReservedIDs.__RESERVED__: - case BlockTypesCache.ReservedIDs.CAVE_AIR: - case BlockTypesCache.ReservedIDs.VOID_AIR: + case BlockTypesCache.ReservedIDs.__RESERVED__, BlockTypesCache.ReservedIDs.CAVE_AIR, BlockTypesCache.ReservedIDs.VOID_AIR: ids[i] = BlockTypesCache.ReservedIDs.AIR; case BlockTypesCache.ReservedIDs.AIR: continue; @@ -140,17 +138,13 @@ public interface IBlocks extends Trimable { for (int i = 0; i < palette.paletteToBlockLength; i++) { int ordinal = palette.paletteToBlock[i]; switch (ordinal) { - case BlockTypesCache.ReservedIDs.__RESERVED__: - case BlockTypesCache.ReservedIDs.AIR: - case BlockTypesCache.ReservedIDs.CAVE_AIR: - case BlockTypesCache.ReservedIDs.VOID_AIR: - sectionWriter.write(0); - break; - default: + case BlockTypesCache.ReservedIDs.__RESERVED__, BlockTypesCache.ReservedIDs.AIR, BlockTypesCache.ReservedIDs.CAVE_AIR, + BlockTypesCache.ReservedIDs.VOID_AIR -> sectionWriter.write(0); + default -> { BlockState state = BlockState.getFromOrdinal(ordinal); int mcId = registry.getInternalBlockStateId(state).getAsInt(); sectionWriter.writeVarInt(mcId); - break; + } } } sectionWriter.writeVarInt(palette.blockStatesLength); From 9e8f0e7325e4f869b1f465b34c13452a2a1fb3d8 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:44:41 +0000 Subject: [PATCH 65/81] Refactor: getVersionMin/MaxY -> versionMin/MaxY --- .../com/sk89q/worldedit/bukkit/BukkitServerInterface.java | 4 ++-- .../src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java | 4 ++-- .../com/fastasyncworldedit/core/regions/RegionWrapper.java | 4 ++-- .../com/sk89q/worldedit/extension/input/ParserContext.java | 4 ++-- .../java/com/sk89q/worldedit/extension/platform/Platform.java | 4 ++-- .../main/java/com/sk89q/worldedit/extent/OutputExtent.java | 4 ++-- .../java/com/sk89q/worldedit/function/mask/OffsetMask.java | 4 ++-- .../sk89q/worldedit/function/visitor/BreadthFirstSearch.java | 4 ++-- .../com/sk89q/worldedit/function/visitor/DownwardVisitor.java | 4 ++-- .../sk89q/worldedit/function/visitor/NonRisingVisitor.java | 4 ++-- .../sk89q/worldedit/function/visitor/RecursiveVisitor.java | 4 ++-- .../main/java/com/sk89q/worldedit/regions/AbstractRegion.java | 4 ++-- .../src/main/java/com/sk89q/worldedit/regions/Region.java | 4 ++-- .../main/java/com/sk89q/worldedit/world/AbstractWorld.java | 4 ++-- .../test/java/com/fastasyncworldedit/util/StubPlatform.java | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 44414ffc4..602ec139b 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -281,12 +281,12 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser } @Override - public int getVersionMinY() { + public int versionMinY() { return new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.CAVES_18) ? -64 : 0; } @Override - public int getVersionMaxY() { + public int versionMaxY() { return new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.CAVES_18) ? 319 : 255; } //FAWE end diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java index 0704d056b..e9a397b73 100644 --- a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIPlatform.java @@ -171,12 +171,12 @@ class CLIPlatform extends AbstractPlatform { } @Override - public int getVersionMinY() { + public int versionMinY() { return dataVersion >= Constants.DATA_VERSION_MC_1_18 ? -64 : 0; } @Override - public int getVersionMaxY() { + public int versionMaxY() { return dataVersion >= Constants.DATA_VERSION_MC_1_18 ? 319 : 255; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java index 55a39eb21..e382583aa 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java @@ -31,8 +31,8 @@ public class RegionWrapper extends CuboidRegion { public RegionWrapper(final int minX, final int maxX, final int minZ, final int maxZ) { this(minX, maxX, - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(), minZ, maxZ ); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java index 30ac850a5..cf3f7d753 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java @@ -305,8 +305,8 @@ public class ParserContext { minY = extent.getMinY(); maxY = extent.getMaxY(); } else { - minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); - maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); + minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(); + maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(); } return minY; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java index dd4012ebe..e904f1ef0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java @@ -240,11 +240,11 @@ public interface Platform extends Keyed { /** * Get the default minimum Y value of worlds based on Minecraft version (inclusive). */ - int getVersionMinY(); + int versionMinY(); /** * Get the default maximum Y value of worlds based on Minecraft version (inclusive). */ - int getVersionMaxY(); + int versionMaxY(); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java index df2e07723..d90bce937 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/OutputExtent.java @@ -97,8 +97,8 @@ public interface OutputExtent { @Deprecated default boolean setBiome(BlockVector2 position, BiomeType biome) { boolean result = false; - int minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); - int maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); + int minY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(); + int maxY = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(); for (int y = minY; y < maxY; y++) { result |= setBiome(position.toBlockVector3().mutY(y), biome); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java index 2f83000b8..2c809ada4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java @@ -50,8 +50,8 @@ public class OffsetMask extends AbstractMask { @Deprecated public OffsetMask(Mask mask, BlockVector3 offset) { this(mask, offset, - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY() + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY() ); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java index baab0e4c5..c1b36ef6b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java @@ -113,8 +113,8 @@ public abstract class BreadthFirstSearch implements Operation { public BreadthFirstSearch(RegionFunction function) { //FAWE start - int depth, min/max y this(function, Integer.MAX_VALUE, - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(), null ); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java index 0ebeacce0..f8204b085 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java @@ -51,8 +51,8 @@ public class DownwardVisitor extends RecursiveVisitor { public DownwardVisitor(Mask mask, RegionFunction function, int baseY) { //FAWE start - int depth, min/max y this(mask, function, baseY, Integer.MAX_VALUE, WorldEdit - .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(), null ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java index d206d84fe..90e8f01d9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java @@ -42,8 +42,8 @@ public class NonRisingVisitor extends RecursiveVisitor { public NonRisingVisitor(Mask mask, RegionFunction function) { //FAWE start - int depth, y min/max this(mask, function, Integer.MAX_VALUE, WorldEdit - .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(), null ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java index c96e4b063..dd18f9d1f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java @@ -44,8 +44,8 @@ public class RecursiveVisitor extends BreadthFirstSearch { */ public RecursiveVisitor(Mask mask, RegionFunction function) { this(mask, function, Integer.MAX_VALUE, WorldEdit - .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(), - WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(), null + .getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(), + WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(), null ); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java index bfcb40400..4728271c8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/AbstractRegion.java @@ -228,7 +228,7 @@ public abstract class AbstractRegion extends AbstractSet implement .getInstance() .getPlatformManager() .queryCapability(Capability.WORLD_EDITING) - .getVersionMinY() : world.getMinY(); + .versionMinY() : world.getMinY(); //FAWE end } @@ -238,7 +238,7 @@ public abstract class AbstractRegion extends AbstractSet implement .getInstance() .getPlatformManager() .queryCapability(Capability.WORLD_EDITING) - .getVersionMaxY() : world.getMaxY(); + .versionMaxY() : world.getMaxY(); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java index 339ea5763..407530eea 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -234,12 +234,12 @@ public interface Region extends Iterable, Cloneable, IBatchProcess .getPlatformManager() .queryCapability( Capability.WORLD_EDITING) - .getVersionMinY() + .versionMinY() && pos2.getBlockY() >= WorldEdit .getInstance() .getPlatformManager() .queryCapability(Capability.WORLD_EDITING) - .getVersionMaxY(); + .versionMaxY(); } default int getMinimumY() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java index bee63181f..53b47bbae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/AbstractWorld.java @@ -68,12 +68,12 @@ public abstract class AbstractWorld implements World { @Override public int getMinY() { - return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMinY(); + return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMinY(); } @Override public int getMaxY() { - return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getVersionMaxY(); + return WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).versionMaxY(); } @Override diff --git a/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java b/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java index 9d7ac96c2..6e9f81de8 100644 --- a/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java +++ b/worldedit-core/src/test/java/com/fastasyncworldedit/util/StubPlatform.java @@ -100,13 +100,13 @@ public class StubPlatform extends AbstractPlatform { // Use most "extreme" value @Override - public int getVersionMinY() { + public int versionMinY() { return -64; } // Use most "extreme" value @Override - public int getVersionMaxY() { + public int versionMaxY() { return 319; } From 52fa44516e1448ccbad2dbf29860cead8516ac89 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:47:34 +0000 Subject: [PATCH 66/81] Throw, catch, and rethrow our own exception to make sure we're finding the culprit to a possible shaded-FAWE. --- .../worldedit/world/block/BlockTypesCache.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java index ac3672495..325da5140 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockTypesCache.java @@ -232,9 +232,16 @@ public class BlockTypesCache { defaultState = id; } if (values[internalId] != null) { - throw new IllegalStateException(String.format( - "Invalid duplicate id for %s! Something has gone very wrong. Are " + - "any plugins shading FAWE?!", id)); + // Ugly way of ensuring a stacktrace is printed so we can see the culprit. Rethrow because we still + // want to cancel whatever initialised the class. + try { + throw new IllegalStateException(String.format( + "Invalid duplicate id for %s! Something has gone very wrong. Are " + + "any plugins shading FAWE?!", id)); + } catch (IllegalStateException e) { + e.printStackTrace(); + throw e; + } } BlockType type = register(defaultState, internalId, stateList, tickList); // Note: Throws IndexOutOfBoundsError if nothing is registered and blocksMap is empty From 235d0360daa66f33c3e4b027bc05109173d3e08a Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Wed, 29 Dec 2021 16:55:32 +0000 Subject: [PATCH 67/81] Don't wrap Exception thrown upon invalid schematic path inside a RuntimeException Fixes #1506 --- .../main/java/com/sk89q/worldedit/command/UtilityCommands.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 9a7de94a4..1389af7aa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -876,8 +876,7 @@ public class UtilityCommands { } try { if (!MainUtil.isInSubDirectory(root, file)) { - throw new RuntimeException( - new StopExecutionException(TextComponent.of("Invalid path"))); + throw new StopExecutionException(TextComponent.of("Invalid path")); } } catch (IOException ignored) { } From 122cba677ae8b14819caba908eb259b0d3d67474 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 29 Dec 2021 18:14:18 +0100 Subject: [PATCH 68/81] docs: Put `since` annotation on newly introduced API --- .../java/com/sk89q/worldedit/extension/platform/Platform.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java index e904f1ef0..fc53e5d44 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Platform.java @@ -239,11 +239,13 @@ public interface Platform extends Keyed { /** * Get the default minimum Y value of worlds based on Minecraft version (inclusive). + * @since 2.0.0 */ int versionMinY(); /** * Get the default maximum Y value of worlds based on Minecraft version (inclusive). + * @since 2.0.0 */ int versionMaxY(); //FAWE end From aaad86cf1d2b164054ad65e77f5bef8e56d6a8ed Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Wed, 29 Dec 2021 18:16:19 +0100 Subject: [PATCH 69/81] docs: Drop clarified todos --- .../adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java | 1 - .../adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java | 1 - .../bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java | 2 -- .../impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java | 1 - .../fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java | 1 - 5 files changed, 6 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java index 3e6839336..aa72fa9a7 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightBlockMaterial.java @@ -26,7 +26,6 @@ public class PaperweightBlockMaterial implements BlockMaterial { private final CraftBlockData craftBlockData; private final org.bukkit.Material craftMaterial; private final int opacity; - //TODO 1.18 be a CompoundBinaryTag ? private final CompoundTag tile; public PaperweightBlockMaterial(Block block) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java index 6cdaea783..a5b24b387 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightFaweAdapter.java @@ -354,7 +354,6 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements if (id != null) { EntityType type = com.sk89q.worldedit.world.entity.EntityTypes.get(id); - //TODO 1.18 be a CBT ? Supplier saveTag = () -> { final net.minecraft.nbt.CompoundTag minecraftTag = new net.minecraft.nbt.CompoundTag(); readEntityIntoTag(mcEntity, minecraftTag); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java index 85ffe7710..897001e45 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightGetBlocks.java @@ -229,7 +229,6 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc } @Override - //TODO 1.18 be CBT? public CompoundTag getTile(int x, int y, int z) { BlockEntity blockEntity = getChunk().getBlockEntity(new BlockPos((x & 15) + ( chunkX << 4), y, (z & 15) + ( @@ -314,7 +313,6 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc Entity entity = serverLevel.getEntity(uuid); if (entity != null) { org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - //TODO 1.18 CBT & #getNbt? return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); } for (List entry : /*getChunk().getEntitySlices()*/ new List[0]) { diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java index 767674188..999faecb0 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighter.java @@ -70,7 +70,6 @@ public class PaperweightStarlightRelighter implements Relighter { private final ReentrantLock areaLock = new ReentrantLock(); private final NMSRelighter delegate; - //TODO 1.18 address raw access of IQueueChunk public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent queue) { this.serverLevel = serverLevel; this.delegate = new NMSRelighter(queue); diff --git a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java index c8c9c0046..a7da862fa 100644 --- a/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java +++ b/worldedit-bukkit/adapters/adapter-1_18/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R1/PaperweightStarlightRelighterFactory.java @@ -16,7 +16,6 @@ public class PaperweightStarlightRelighterFactory implements RelighterFactory { @Override public @Nonnull - //TODO 1.18 address raw access of IQueueChunk Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { org.bukkit.World w = Bukkit.getWorld(world.getName()); if (w == null) { From 9faacb38ef6b4c388c04160509cbc73d816acc05 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Thu, 30 Dec 2021 16:01:23 +0000 Subject: [PATCH 70/81] Warn user if using small-edit history setting with extended world heights --- .../java/com/fastasyncworldedit/bukkit/FaweBukkit.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index 8419955d4..f207cd925 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -83,7 +83,9 @@ public class FaweBukkit implements IFawe, Listener { Bukkit.getServer().shutdown(); } - chunksStretched = new MinecraftVersion().isEqualOrHigherThan(MinecraftVersion.NETHER); + MinecraftVersion version = new MinecraftVersion(); + + chunksStretched = version.isEqualOrHigherThan(MinecraftVersion.NETHER); platformAdapter = new NMSAdapter(); @@ -102,6 +104,11 @@ public class FaweBukkit implements IFawe, Listener { // The tick limiter new ChunkListener9(); }); + + // Warn if small-edits are enabled with extended world heights + if (version.isEqualOrHigherThan(MinecraftVersion.CAVES_18) && Settings.settings().HISTORY.SMALL_EDITS) { + LOGGER.warn("Small-edits enabled (maximum y range of 0 -> 256) with 1.18 world heights. Are you sure?"); + } } @Override From f30ea9626864bc7ad9f228b4932c5060b5d9e465 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Thu, 30 Dec 2021 16:04:38 +0000 Subject: [PATCH 71/81] Refactor: add javadoc to Clipboard#create and improve variables when delegating to another paste method --- .../worldedit/extent/clipboard/Clipboard.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index e65f9d634..c4d940d7a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -70,6 +70,10 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl //FAWE end //FAWE start + + /** + * Creates a new {@link ReadOnlyClipboard}. + */ static Clipboard create(Region region) { checkNotNull(region); checkNotNull( @@ -85,6 +89,13 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl return ReadOnlyClipboard.of(session, region); } + /** + * Create a new {@link com.fastasyncworldedit.core.extent.clipboard.SimpleClipboard} instance. + * Will be one of the following, depending on settings: + * - {@link DiskOptimizedClipboard} + * - {@link CPUOptimizedClipboard} + * - {@link MemoryOptimizedClipboard} + */ static Clipboard create(Region region, UUID uuid) { if (Settings.settings().CLIPBOARD.USE_DISK) { return new DiskOptimizedClipboard(region, uuid); @@ -249,7 +260,7 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl */ default EditSession paste( World world, BlockVector3 to, boolean allowUndo, boolean pasteAir, - boolean copyEntities, @Nullable Transform transform + boolean pasteEntities, @Nullable Transform transform ) { checkNotNull(world); checkNotNull(to); @@ -275,7 +286,7 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl if (transform != null && !transform.isIdentity()) { extent = new BlockTransformExtent(this, transform); } else if (sourceMask == null) { - paste(editSession, to, pasteAir); + paste(editSession, to, pasteAir, pasteEntities, hasBiomes()); editSession.flushQueue(); return editSession; } @@ -285,7 +296,7 @@ public interface Clipboard extends Extent, Iterable, Closeable, Fl if (transform != null && !transform.isIdentity()) { copy.setTransform(transform); } - copy.setCopyingEntities(copyEntities); + copy.setCopyingEntities(pasteEntities); if (sourceMask != null) { new MaskTraverser(sourceMask).reset(extent); copy.setSourceMask(sourceMask); From 0994ea1e67e702c9bb652d0986297250b070f5f1 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Thu, 30 Dec 2021 16:05:16 +0000 Subject: [PATCH 72/81] Fix issue with offset/origin when pasting a clipboard via API without wrapping into a BlockArrayClipboard --- .../plotsquared/FaweDelegateRegionManager.java | 12 ++++++++---- .../extent/clipboard/DiskOptimizedClipboard.java | 4 ++-- .../core/extent/clipboard/SimpleClipboard.java | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java index 61f1943b1..d50300106 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java @@ -220,13 +220,17 @@ public class FaweDelegateRegionManager { Clipboard clipB = Clipboard.create(regionB, UUID.randomUUID()); ForwardExtentCopy copyA = new ForwardExtentCopy(sessionA, regionA, clipA, clipA.getMinimumPoint()); ForwardExtentCopy copyB = new ForwardExtentCopy(sessionB, regionB, clipB, clipB.getMinimumPoint()); + copyA.setCopyingBiomes(true); + copyB.setCopyingBiomes(true); try { Operations.completeLegacy(copyA); Operations.completeLegacy(copyB); - clipA.paste(sessionB, swapPos.getBlockVector3(), true); - clipB.paste(sessionA, pos1.getBlockVector3(), true); - sessionA.flushQueue(); - sessionB.flushQueue(); + clipA.flush(); + clipB.flush(); + clipA.paste(sessionB, swapPos.getBlockVector3(), true, true, true); + clipB.paste(sessionA, pos1.getBlockVector3(), true, true, true); + sessionA.close(); + sessionB.close(); } catch (MaxChangedBlocksException e) { e.printStackTrace(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java index 6ace08060..efde68a56 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/DiskOptimizedClipboard.java @@ -276,7 +276,7 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable int offsetZ = byteBuffer.getShort(20); region.shift(BlockVector3.at(offsetX, offsetY, offsetZ)); BlockArrayClipboard clipboard = new BlockArrayClipboard(region, this); - clipboard.setOrigin(getOrigin()); + clipboard.setOrigin(getOrigin().add(offset)); return clipboard; } catch (Throwable e) { e.printStackTrace(); @@ -289,7 +289,7 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable int ox = byteBuffer.getShort(10); int oy = byteBuffer.getShort(12); int oz = byteBuffer.getShort(14); - return BlockVector3.at(ox, oy, oz); + return BlockVector3.at(ox, oy, oz).subtract(offset); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java index 8847d0434..b3494e6d2 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/clipboard/SimpleClipboard.java @@ -7,10 +7,10 @@ import com.sk89q.worldedit.regions.Region; public abstract class SimpleClipboard implements Clipboard { + protected BlockVector3 offset; private final BlockVector3 size; private final int area; private final int volume; - private BlockVector3 offset; private BlockVector3 origin; SimpleClipboard(BlockVector3 dimensions, BlockVector3 offset) { From 42d6466a4c774521117d1e4660cdae16b5148ccf Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Fri, 31 Dec 2021 17:26:15 +0100 Subject: [PATCH 73/81] build: Remove drop our maven repository --- buildSrc/src/main/kotlin/CommonConfig.kt | 6 +----- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index 2e7572e4f..6e59e7f05 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -10,12 +10,7 @@ fun Project.applyCommonConfiguration() { version = rootProject.version repositories { - mavenLocal() mavenCentral() - maven { - name = "IntellectualSites" - url = uri("https://mvn.intellectualsites.com/content/groups/public/") - } maven { name = "EngineHub" url = uri("https://maven.enginehub.org/repo/") @@ -32,6 +27,7 @@ fun Project.applyCommonConfiguration() { name = "Athion" url = uri("https://ci.athion.net/plugin/repository/tools/") } + mavenLocal() } configurations.all { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cfb4b3c80..0feda764e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ fastutil = "8.5.6" log4j = "2.17.1" guava = "31.0.1-jre" -gson = "2.8.9" +gson = "2.8.8" # Platform expectations paper = "1.18.1-R0.1-SNAPSHOT" From 7e96853b89b0d29f7993cf73b6a75de65680a3c0 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Sat, 1 Jan 2022 18:46:28 +0100 Subject: [PATCH 74/81] docs: Fix deprecation tag --- .../src/main/java/com/fastasyncworldedit/core/Fawe.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 3640b7a88..6163a94ce 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -155,7 +155,7 @@ public class Fawe { /** * Get the implementation independent class. - * @ use {@link #instance()} + * @deprecated use {@link #instance()} */ @Deprecated(forRemoval = true, since = "2.0.0") public static Fawe get() { From 42dacfc7ef7b5ffd7492c80dd88b6e44a4229f9b Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 4 Jan 2022 13:28:29 +0000 Subject: [PATCH 75/81] Fix incorrect toNative method in 1.17 adapter --- .../adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java index 6d1faa718..0ff2fb4b0 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java @@ -365,7 +365,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements final net.minecraft.nbt.CompoundTag minecraftTag = new net.minecraft.nbt.CompoundTag(); readEntityIntoTag(mcEntity, minecraftTag); //add Id for AbstractChangeSet to work - final CompoundBinaryTag tag = (CompoundBinaryTag) toNative(minecraftTag); + final CompoundBinaryTag tag = (CompoundBinaryTag) toNativeBinary(minecraftTag); final Map tags = new HashMap<>(); tag.keySet().forEach(key -> tags.put(key, tag.get(key))); tags.put("Id", StringBinaryTag.of(id)); From b8399abfe17cdcdd78744f47a7870725e10fca86 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 4 Jan 2022 20:33:05 +0100 Subject: [PATCH 76/81] refactor: Deprecate tick limiter API for public use --- .../bukkit/listener/ChunkListener.java | 25 +++++++++++++++++++ .../bukkit/listener/ChunkListener9.java | 9 +++++++ .../core/configuration/Settings.java | 5 ++++ 3 files changed, 39 insertions(+) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java index f3051536d..5d2e35335 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java @@ -45,6 +45,11 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.bukkit.util.Vector; +/** + * @deprecated FAWE is not necessarily the tool you want to use to limit certain tick actions, e.g. fireworks or elytra flying. + * The code is untouched since the 1.12 era and there is no guarantee that it will work or will be maintained in the future. + */ +@Deprecated(since = "2.0.0") public abstract class ChunkListener implements Listener { private static final Logger LOGGER = LogManagerCompat.getLogger(); @@ -88,7 +93,15 @@ public abstract class ChunkListener implements Listener { protected abstract StackTraceElement getElement(Exception ex, int index); + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public static boolean physicsFreeze = false; + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public static boolean itemFreeze = false; protected final Long2ObjectOpenHashMap badChunks = new Long2ObjectOpenHashMap<>(); @@ -97,6 +110,10 @@ public abstract class ChunkListener implements Listener { private int lastZ = Integer.MIN_VALUE; private int[] lastCount; + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public int[] getCount(int cx, int cz) { if (lastX == cx && lastZ == cz) { return lastCount; @@ -112,6 +129,10 @@ public abstract class ChunkListener implements Listener { return tmp; } + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public void cleanup(Chunk chunk) { for (Entity entity : chunk.getEntities()) { if (entity.getType() == EntityType.DROPPED_ITEM) { @@ -128,6 +149,10 @@ public abstract class ChunkListener implements Listener { protected long physStart; protected long physTick; + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public final void reset() { physSkip = 0; physStart = System.currentTimeMillis(); diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java index 0d93b95d3..c20435ac3 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java @@ -9,11 +9,20 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPhysicsEvent; +/** + * @deprecated FAWE is not necessarily the tool you want to use to limit certain tick actions, e.g. fireworks or elytra flying. + * The code is untouched since the 1.12 era and there is no guarantee that it will work or will be maintained in the future. + */ +@Deprecated(since = "2.0.0") public class ChunkListener9 extends ChunkListener { private Exception exception; private StackTraceElement[] elements; + /** + * @deprecated see {@link com.fastasyncworldedit.bukkit.listener.ChunkListener9} for an explanation of the deprecation + */ + @Deprecated(since = "2.0.0") public ChunkListener9() { super(); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java index 8f899afd5..4b43c0376 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java @@ -672,6 +672,11 @@ public class Settings extends Config { } + /** + * @deprecated FAWE is not necessarily the tool you want to use to limit certain tick actions, e.g. fireworks or elytra flying. + * The code is untouched since the 1.12 era and there is no guarantee that it will work or will be maintained in the future. + */ + @Deprecated(since = "2.0.0") @Comment("Generic tick limiter (not necessarily WorldEdit related, but useful to stop abuse)") public static class TICK_LIMITER { From 30c2597aad7235129819c8d9ef76b47d108f615f Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 4 Jan 2022 20:33:43 +0100 Subject: [PATCH 77/81] ci: dordsor does love rebasing here too --- .github/workflows/rebase.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/rebase.yml diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml new file mode 100644 index 000000000..b4feba220 --- /dev/null +++ b/.github/workflows/rebase.yml @@ -0,0 +1,20 @@ +name: Rebase Pull Request +on: + issue_comment: + types: [created] + +jobs: + rebase: + name: Rebase + if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') && github.event.comment.author_association == 'MEMBER' + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v2.4.0 + with: + token: ${{ secrets.REBASE_TOKEN }} + fetch-depth: 0 + - name: Automatic Rebase + uses: cirrus-actions/rebase@1.5 + env: + GITHUB_TOKEN: ${{ secrets.REBASE_TOKEN }} From 631fd3c7f50c21e911b24daa4a749d685aad93c9 Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 4 Jan 2022 20:57:23 +0100 Subject: [PATCH 78/81] docs: Document annotations --- FAWE-ANNOTATIONS-EXPLAINED.adoc | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 FAWE-ANNOTATIONS-EXPLAINED.adoc diff --git a/FAWE-ANNOTATIONS-EXPLAINED.adoc b/FAWE-ANNOTATIONS-EXPLAINED.adoc new file mode 100644 index 000000000..d398a80a6 --- /dev/null +++ b/FAWE-ANNOTATIONS-EXPLAINED.adoc @@ -0,0 +1,46 @@ +:toc: +:toclevels: 2 + += Fawe annotations explained + +If we have modified parts of the WorldEdit codebase, we considered annotating it with different styles of comments, which +are explained in this document. + +== In-line annotations + +[source,java] +----------------- +public static Player adapt(com.sk89q.worldedit.entity.Player player) { + //FAWE start - Get player from PlayerProxy instead of BukkitPlayer if null + player = PlayerProxy.unwrap(player); + return player == null ? null : ((BukkitPlayer) player).getPlayer(); + //FAWE end +} +----------------- +The `-sources` jar retains comments, if you add the FAWE API to your maven or gradle project, you can view differences between the projects with ease. +Behind the `//FAWE start - ` you can find a comment what has been changed and why it has been changed. + +== Block annotations + +[source,java] +----------------- +//FAWE start + @Override + public void setPermission(String permission, boolean value) { + } +//FAWE end +----------------- +Annotations can cover whole methods or go beyond the method and wrap around several added methods. + +== Package annotations +Class additions are added under the `com.fastasyncworldedit` namespace, but sometimes classes need to be added in package private. +If that is done, you can find a `package-info.java` file within the package affected that outlines FAWE added classes: +[source,java] +----------------- +/** +* The following classes are FAWE additions: +* +* @see com.sk89q.worldedit.world.block.BlockTypesCache +*/ +package com.sk89q.worldedit.world.block; +----------------- From ef686af8ddceb9c782763344bae7d70eb1e74e9c Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 4 Jan 2022 21:01:49 +0100 Subject: [PATCH 79/81] Update upstream fb5ec19 Fix error for snapshot restore missing chunk --- .../java/com/sk89q/worldedit/world/storage/McRegionReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fee7a3d9e..193f03b06 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 class McRegionReader { // 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; From f4658cc668d33631e853f16dce0eb583d2a17c8d Mon Sep 17 00:00:00 2001 From: NotMyFault Date: Tue, 4 Jan 2022 21:15:45 +0100 Subject: [PATCH 80/81] docs: Document a few undocumented annotations --- ...OTATIONS-EXPLAINED.adoc => Annotation-Explanation.adoc | 8 ++++++++ .../regions/plotsquared/FaweDelegateSchematicHandler.java | 4 +--- 2 files changed, 9 insertions(+), 3 deletions(-) rename FAWE-ANNOTATIONS-EXPLAINED.adoc => Annotation-Explanation.adoc (81%) diff --git a/FAWE-ANNOTATIONS-EXPLAINED.adoc b/Annotation-Explanation.adoc similarity index 81% rename from FAWE-ANNOTATIONS-EXPLAINED.adoc rename to Annotation-Explanation.adoc index d398a80a6..100541872 100644 --- a/FAWE-ANNOTATIONS-EXPLAINED.adoc +++ b/Annotation-Explanation.adoc @@ -44,3 +44,11 @@ If that is done, you can find a `package-info.java` file within the package affe */ package com.sk89q.worldedit.world.block; ----------------- + +== Undocumented annotations +Specific changes are not annotated: + +* `com.fastasyncworldedit.core.configuration.Caption` in `com.sk89q.worldedit` packages have been changed from +`com.sk89q.worldedit.util.formatting.text.Text` to allow the usage of color codes for messages. + +* Certain Log4J loggers have been adjusted to use the proper format of placeholders. diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java index 7ed54786e..2195980c8 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java @@ -235,10 +235,8 @@ public class FaweDelegateSchematicHandler { Clipboard clip = schematicReader.read(); return new Schematic(clip); } catch (IOException e3) { + LOGGER.warn("{} | {} : {}", is, is.getClass().getCanonicalName(), e.getMessage()); e.printStackTrace(); - LOGGER.warn( - is + " | " + is.getClass().getCanonicalName() + " is not in GZIP format : " + e - .getMessage()); } } } From c27a34ce40f146eebc89df54c5065ad5128f9340 Mon Sep 17 00:00:00 2001 From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Date: Wed, 5 Jan 2022 10:21:44 -0500 Subject: [PATCH 81/81] feat: Add worldedit.schematic.list.other permission and functionality (#1507) * Add worldedit.schematic.list.other permission and functionality * Implement StringMan#containsUuid * Javadocs * chore: Add since annotation Co-authored-by: NotMyFault --- .../core/util/StringMan.java | 15 +++++++++++++ .../worldedit/command/UtilityCommands.java | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java index f15e010ce..432acfe2d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java @@ -9,11 +9,14 @@ import java.util.List; import java.util.Locale; import java.util.Set; import java.util.function.Function; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; public class StringMan { + private static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"); + public static boolean containsAny(CharSequence sequence, String any) { return IntStream.range(0, sequence.length()) .anyMatch(i -> any.indexOf(sequence.charAt(i)) != -1); @@ -542,4 +545,16 @@ public class StringMan { return IntStream.range(0, n).mapToObj(i -> s).collect(Collectors.joining()); } + /** + * Returns if there is a valid uuid contained inside the + * provided String. + * + * @param str provided string + * @return true if an uuid was found, false if not + * @since 2.0.0 + */ + public static boolean containsUuid(String str) { + return UUID_PATTERN.matcher(str).find(); + } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 1389af7aa..1037df0b1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -25,6 +25,7 @@ import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.function.QuadFunction; import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MaskTraverser; +import com.fastasyncworldedit.core.util.StringMan; import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.util.image.ImageUtil; import com.fastasyncworldedit.core.util.task.DelegateConsumer; @@ -1033,7 +1034,27 @@ public class UtilityCommands { if (playerFolder) { if (listMine) { File playerDir = MainUtil.resolveRelative(new File(dir, actor.getUniqueId() + dirFilter)); + //FAWE start - Schematic list other permission + if (!actor.hasPermission("worldedit.schematic.list.other") && StringMan.containsUuid(dirFilter)) { + return; + } if (playerDir.exists()) { + if (!actor.hasPermission("worldedit.schematic.list.other")) { + forEachFile = new DelegateConsumer<>(forEachFile) { + @Override + public void accept(File f) { + try { + if (f.isDirectory() && !UUID.fromString(f.getName()).equals(actor.getUniqueId())) { // Ignore + // directories of other players + return; + } + } catch (IllegalArgumentException ignored) { + } + super.accept(f); + } + }; + } + //FAWE end allFiles(playerDir.listFiles(), false, forEachFile); } }

    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