diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 19f7d7d5e..a6a7d369b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -8,6 +8,7 @@ body: value: | Thanks for taking the time to fill out this bug report for FastAsyncWorldEdit! Fill out the following form to your best ability to help us fix the problem. Only use this if you're absolutely sure that you found a bug and can reproduce it. For anything else, use: [our Discord server](https://discord.gg/intellectualsites) or [the wiki](https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki). + Do NOT use the public issue tracker to report security vulnerabilities! They are disclosed using [this](https://forms.gle/btgdRn9yhGtzEiGW8) form! - type: dropdown attributes: @@ -31,6 +32,7 @@ body: - '1.17.+' - '1.16.5' - '1.15.2' + - '1.17.1' validations: required: true @@ -92,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.16/ or an experimental build and the issue still persists. + - label: I am using the newest build from https://ci.athion.net/job/FastAsyncWorldEdit-1.17/ and the issue still persists. required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 4dbfd5dca..73260d35f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: false contact_links: + - name: Reporting Security Vulnerabilities + url: https://forms.gle/btgdRn9yhGtzEiGW8 + about: Use this form to report security vulnerabilities. Do not use the public issue tracker. - name: IntellectualSites Discord url: https://discord.gg/intellectualsites about: Our support Discord, please ask questions and seek support here. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2608813ee..f8629843e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,13 +11,13 @@ jobs: steps: - name: "Checkout Repository" uses: "actions/checkout@v2.3.4" - - name: "Setup JDK 11" - uses: "actions/setup-java@v2" + - name: "Setup JDK 16" + uses: "actions/setup-java@v2.1.0" with: distribution: "adopt" - java-version: "11" + java-version: "16" - name: "Cache Gradle" - uses: "actions/cache@v2.1.4" + uses: "actions/cache@v2.1.6" with: path: | "~/.gradle/caches" @@ -26,14 +26,14 @@ jobs: restore-keys: | "${{ runner.os }}-gradle-" - name: "Cache Local Maven Repository" - uses: "actions/cache@v2.1.4" + uses: "actions/cache@v2.1.6" with: path: "~/.m2/repository" key: "${{ runner.os }}-11-maven-${{ hashFiles('**/pom.xml') }}" restore-keys: | "${{ runner.os }}-11-maven-" - name: "Cache BuildTools Decompiled Code" - uses: "actions/cache@v2.1.4" + uses: "actions/cache@v2.1.6" with: path: "$GITHUB_WORKSPACE/work" key: "${{ runner.os }}-buildtools" @@ -46,7 +46,7 @@ jobs: - name: "Run BuildTools" run: "java -jar BuildTools.jar --rev 1.16.5" - name: "Clean Build" - run: "./gradlew clean build sourcesJar javadocJar" + run: "./gradlew clean build sourcesJar javadocJar -x test" - name: Cleanup Gradle Cache # Remove some files from the Gradle cache, so they aren't cached by GitHub Actions. # Restoring these files from a GitHub Actions cache might cause problems for future builds. diff --git a/.github/workflows/validate-gradle-wrapper.yml b/.github/workflows/validate-gradle-wrapper.yml index b4c46f704..7463dca05 100644 --- a/.github/workflows/validate-gradle-wrapper.yml +++ b/.github/workflows/validate-gradle-wrapper.yml @@ -9,4 +9,4 @@ jobs: - name: "Checkout Repository" uses: "actions/checkout@v2.3.4" - name: "Validate Gradle Wrapper" - uses: "gradle/wrapper-validation-action@v1.0.3" \ No newline at end of file + uses: "gradle/wrapper-validation-action@v1.0.4" diff --git a/COMPILING.md b/COMPILING.md index 75db3d923..cc1580e2c 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 11 installed. Gradle will download JDK 11 specifically if needed, +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, 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 8. +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 11 [here](https://adoptopenjdk.net/?variant=openjdk11&jvmVariant=hotspot). +You can get the JDK 16 [here](https://adoptopenjdk.net/?variant=openjdk16&jvmVariant=hotspot). The build process uses Gradle, which you do *not* need to download. FastAsyncWorldEdit is a multi-module project with three active modules: @@ -18,7 +18,7 @@ The build process uses Gradle, which you do *not* need to download. FastAsyncWor ### 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 with `java -Dpaperclip.install=true -jar paperclip.jar`. +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 diff --git a/README.md b/README.md index 454fc244c..b142a5c31 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ 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](https://ci.athion.net/job/FastAsyncWorldEdit-1.16/javadoc/) +* [JavaDocs](https://ci.athion.net/job/FastAsyncWorldEdit-1.17/javadoc/) ## Edit The Code diff --git a/build.gradle.kts b/build.gradle.kts index c6ec56c51..018b45f39 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ logger.lifecycle(""" ******************************************* """) -var rootVersion by extra("1.16") +var rootVersion by extra("1.17") var revision: String by extra("") var buildNumber by extra("") var date: String by extra("") diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt index 4b29b14e2..618e9fc71 100644 --- a/buildSrc/src/main/kotlin/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -13,6 +13,7 @@ fun Project.applyCommonConfiguration() { repositories { mavenLocal() + mavenCentral() maven { name = "IntellectualSites" url = uri("https://mvn.intellectualsites.com/content/groups/public/") @@ -51,8 +52,7 @@ fun Project.applyCommonConfiguration() { plugins.withId("java") { the().toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) - vendor.set(JvmVendorSpec.ADOPTOPENJDK) + languageVersion.set(JavaLanguageVersion.of(16)) } } diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt index a13d012a5..9330884cf 100644 --- a/buildSrc/src/main/kotlin/LibsConfig.kt +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -38,6 +38,8 @@ fun Project.applyLibrariesConfiguration() { val relocations = mapOf( "net.kyori.text" to "com.sk89q.worldedit.util.formatting.text", "net.kyori.minecraft" to "com.sk89q.worldedit.util.kyori", + "net.kyori.adventure.nbt" to "com.sk89q.worldedit.util.nbt" + ) tasks.register("jar") { diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt index 0e8b0f558..591edbd62 100644 --- a/buildSrc/src/main/kotlin/PlatformConfig.kt +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -38,6 +38,7 @@ fun Project.applyPlatformAndCoreConfiguration() { val disabledLint = listOf( "processing", "path", "fallthrough", "serial" ) + options.release.set(11) //options.compilerArgs.addAll(listOf("-Xlint:all") + disabledLint.map { "-Xlint:-$it" }) options.isDeprecation = false options.encoding = "UTF-8" @@ -77,7 +78,8 @@ fun Project.applyPlatformAndCoreConfiguration() { tasks.register("javadocJar") { dependsOn("javadoc") - archiveClassifier.set("javadoc") + archiveClassifier.set(null as String?) + archiveFileName.set("${rootProject.name}-${project.description}-${project.version}-javadoc.${archiveExtension.getOrElse("jar")}") from(tasks.getByName("javadoc").destinationDir) } @@ -93,7 +95,8 @@ fun Project.applyPlatformAndCoreConfiguration() { if (name == "worldedit-core" || name == "worldedit-bukkit") { tasks.register("sourcesJar") { dependsOn("classes") - archiveClassifier.set("sources") + archiveClassifier.set(null as String?) + archiveFileName.set("${rootProject.name}-${project.description}-${project.version}-sources.${archiveExtension.getOrElse("jar")}") from(sourceSets["main"].allSource) } @@ -133,8 +136,8 @@ val CLASSPATH = listOf("truezip", "truevfs", "js") .joinToString(separator = " ") sealed class WorldEditKind( - val name: String, - val mainClass: String = "com.sk89q.worldedit.internal.util.InfoEntryPoint" + val name: String, + val mainClass: String = "com.sk89q.worldedit.internal.util.InfoEntryPoint" ) { class Standalone(mainClass: String) : WorldEditKind("STANDALONE", mainClass) object Mod : WorldEditKind("MOD") @@ -146,10 +149,10 @@ fun Project.addJarManifest(kind: WorldEditKind, includeClasspath: Boolean = fals val version = project(":worldedit-core").version inputs.property("version", version) val attributes = mutableMapOf( - "Implementation-Version" to version, - "WorldEdit-Version" to version, - "WorldEdit-Kind" to kind.name, - "Main-Class" to kind.mainClass + "Implementation-Version" to version, + "WorldEdit-Version" to version, + "WorldEdit-Kind" to kind.name, + "Main-Class" to kind.mainClass ) if (includeClasspath) { attributes["Class-Path"] = CLASSPATH diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index 107442fe1..f8a8ba9a2 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -4,6 +4,8 @@ plugins { `java-library` } +project.description = "Bukkit" + applyPlatformAndCoreConfiguration() applyShadowConfiguration() @@ -15,11 +17,11 @@ repositories { maven { name = "PaperMC" url = uri("https://papermc.io/repo/repository/maven-public/") - } + } maven { name = "EngineHub" url = uri("https://maven.enginehub.org/repo/") - } + } maven { name = "Athion" url = uri("https://ci.athion.net/plugin/repository/tools/") @@ -27,23 +29,23 @@ repositories { maven { name = "JitPack" url = uri("https://jitpack.io") - } + } maven { name = "ProtocolLib" url = uri("https://repo.dmulloy2.net/nexus/repository/public/") - } + } maven { name = "Inventivetalent" url = uri("https://repo.inventivetalent.org/content/groups/public/") - } + } maven { name = "IntellectualSites 3rd Party" url = uri("https://mvn.intellectualsites.com/content/repositories/thirdparty") - } + } maven { name = "OSS Sonatype Snapshots" url = uri("https://oss.sonatype.org/content/repositories/snapshots/") - } + } maven { name = "OSS Sonatype Releases" url = uri("https://oss.sonatype.org/content/repositories/releases/") @@ -77,18 +79,17 @@ dependencies { isTransitive = false exclude(group = "org.slf4j", module = "slf4j-api") } - implementation(enforcedPlatform("org.apache.logging.log4j:log4j-bom:2.8.1") { - // Note: Paper will bump to 2.11.2, but we should only depend on 2.8 APIs for compatibility. + implementation(platform("org.apache.logging.log4j:log4j-bom:2.14.1") { because("Spigot provides Log4J (sort of, not in API, implicitly part of server)") }) implementation("org.apache.logging.log4j:log4j-api") - compileOnly("org.spigotmc:spigot:1.16.5-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot:1.17-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:21.0.0") implementation("io.papermc:paperlib:1.0.6") compileOnly("com.sk89q:dummypermscompat:1.10") { exclude("com.github.MilkBowl", "VaultAPI") } - testImplementation("org.mockito:mockito-core:3.11.1") + testImplementation("org.mockito:mockito-core:3.11.2") compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.5") { exclude("com.sk89q.worldedit", "worldedit-bukkit") exclude("com.sk89q.worldedit", "worldedit-core") @@ -98,7 +99,7 @@ dependencies { compileOnly("net.kyori:adventure-api:4.8.1") testImplementation("net.kyori:adventure-api:4.8.1") testImplementation("org.checkerframework:checker-qual:3.15.0") - testImplementation("org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT") { isTransitive = true } + testImplementation("org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT") { isTransitive = true } api("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT") api("org.lz4:lz4-java:1.8.0") api("net.jpountz:lz4-java-stream:1.0.0") { isTransitive = false } @@ -117,7 +118,8 @@ dependencies { implementation("com.palmergames.bukkit:towny:0.84.0.9") { isTransitive = false } implementation("com.thevoxelbox.voxelsniper:voxelsniper:5.171.0") { isTransitive = false } implementation("com.comphenix.protocol:ProtocolLib:4.6.0") { isTransitive = false } - implementation("org.incendo.serverlib:ServerLib:2.2.0") + implementation("org.incendo.serverlib:ServerLib:2.2.1") + api("com.plotsquared:PlotSquared-Bukkit:6.0.6-SNAPSHOT") } tasks.named("processResources") { @@ -143,7 +145,7 @@ tasks.named("shadowJar") { from(zipTree("src/main/resources/worldedit-adapters.jar").matching { exclude("META-INF/") }) - archiveFileName.set("FastAsyncWorldEdit-Bukkit-${project.version}.jar") + archiveFileName.set("${rootProject.name}-Bukkit-${project.version}.${archiveExtension.getOrElse("jar")}") dependencies { // In tandem with not bundling log4j, we shouldn't relocate base package here. // relocate("org.apache.logging", "com.sk89q.worldedit.log4j") @@ -163,21 +165,24 @@ tasks.named("shadowJar") { relocate("it.unimi.dsi.fastutil", "com.sk89q.worldedit.bukkit.fastutil") { include(dependency("it.unimi.dsi:fastutil")) } - relocate("org.incendo.serverlib", "com.boydti.fawe.serverlib") { - include(dependency("org.incendo.serverlib:ServerLib:2.2.0")) + relocate("org.incendo.serverlib", "com.fastasyncworldedit.serverlib") { + include(dependency("org.incendo.serverlib:ServerLib:2.2.1")) } - relocate("com.intellectualsites.paster", "com.boydti.fawe.paster") { + relocate("com.intellectualsites.paster", "com.fastasyncworldedit.paster") { include(dependency("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT")) } - relocate("com.github.luben", "com.boydti.fawe.zstd") { + relocate("com.github.luben", "com.fastasyncworldedit.core.zstd") { include(dependency("com.github.luben:zstd-jni:1.5.0-2")) } - relocate("net.jpountz", "com.boydti.fawe.jpountz") { + relocate("net.jpountz", "com.fastasyncworldedit.core.jpountz") { include(dependency("net.jpountz:lz4-java-stream:1.0.0")) } - relocate("org.lz4", "com.boydti.fawe.lz4") { + relocate("org.lz4", "com.fastasyncworldedit.core.lz4") { include(dependency("org.lz4:lz4-java:1.8.0")) } + relocate("net.kyori", "com.fastasyncworldedit.core.adventure") { + include(dependency("net.kyori:adventure-nbt:4.7.0")) + } } } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/NMSRelighterFactory.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/NMSRelighterFactory.java deleted file mode 100644 index 52d2383e4..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/NMSRelighterFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.boydti.fawe.bukkit; - -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.lighting.NMSRelighter; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.beta.implementation.lighting.RelighterFactory; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RelightMode; -import com.sk89q.worldedit.world.World; -import org.jetbrains.annotations.NotNull; - -public class NMSRelighterFactory implements RelighterFactory { - @Override - public @NotNull Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { - return new NMSRelighter(queue, - relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE)); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BlockMaterial_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BlockMaterial_1_15_2.java deleted file mode 100644 index 7db8f8a29..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BlockMaterial_1_15_2.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - -import com.boydti.fawe.bukkit.adapter.mc1_15_2.nbt.LazyCompoundTag_1_15_2; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.util.ReflectionUtil; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_15_R1.Block; -import net.minecraft.server.v1_15_R1.BlockAccessAir; -import net.minecraft.server.v1_15_R1.BlockPosition; -import net.minecraft.server.v1_15_R1.EnumPistonReaction; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.ITileEntity; -import net.minecraft.server.v1_15_R1.Material; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.TileEntity; -import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; - -public class BlockMaterial_1_15_2 implements BlockMaterial { - private final Block block; - private final IBlockData defaultState; - private final Material material; - private final boolean isTranslucent; - private final CraftBlockData craftBlockData; - private final org.bukkit.Material craftMaterial; - private final int opacity; - private final CompoundTag tile; - - public BlockMaterial_1_15_2(Block block) { - this(block, block.getBlockData()); - } - - public BlockMaterial_1_15_2(Block block, IBlockData defaultState) { - this.block = block; - this.defaultState = defaultState; - this.material = defaultState.getMaterial(); - this.craftBlockData = CraftBlockData.fromData(defaultState); - this.craftMaterial = craftBlockData.getMaterial(); - this.isTranslucent = !(boolean) ReflectionUtil.getField(Block.class, block, "v"); - opacity = defaultState.b(BlockAccessAir.INSTANCE, BlockPosition.ZERO); - TileEntity tileEntity = !block.isTileEntity() ? null : ((ITileEntity)block).createTile(null); - tile = tileEntity == null ? null : new LazyCompoundTag_1_15_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - public Block getBlock() { - return block; - } - - public IBlockData getState() { - return defaultState; - } - - public CraftBlockData getCraftBlockData() { - return craftBlockData; - } - - public Material getMaterial() { - return material; - } - - @Override - public boolean isAir() { - return defaultState.isAir(); - } - - @Override - public boolean isFullCube() { - return craftMaterial.isOccluding(); - } - - @Override - public boolean isOpaque() { - return material.f(); - } - - @Override - public boolean isPowerSource() { - return defaultState.isPowerSource(); - } - - @Override - public boolean isLiquid() { - return material.isLiquid(); - } - - @Override - public boolean isSolid() { - return material.isBuildable(); - } - - @Override - public float getHardness() { - return block.strength; - } - - @Override - public float getResistance() { - return block.getDurability(); - } - - @Override - public float getSlipperiness() { - return block.m(); - } - - @Override - public int getLightValue() { - return defaultState.h(); - } - - @Override - public int getLightOpacity() { - return opacity; - } - - @Override - public boolean isFragileWhenPushed() { - return material.getPushReaction() == EnumPistonReaction.DESTROY; - } - - @Override - public boolean isUnpushable() { - return material.getPushReaction() == EnumPistonReaction.BLOCK; - } - - @Override - public boolean isTicksRandomly() { - return block.isTicking(defaultState); - } - - @Override - public boolean isMovementBlocker() { - return material.isSolid(); - } - - @Override - public boolean isBurnable() { - return material.isBurnable(); - } - - @Override - public boolean isToolRequired() { - return !material.isAlwaysDestroyable(); - } - - @Override - public boolean isReplacedDuringPlacement() { - return material.isReplaceable(); - } - - @Override - public boolean isTranslucent() { - return isTranslucent; - } - - @Override - public boolean hasContainer() { - return block instanceof ITileEntity; - } - - @Override - public boolean isTile() { - return block.isTileEntity(); - } - - @Override - public CompoundTag getDefaultTile() { - return tile; - } - - @Override - public int getMapColor() { - return material.i().rgb; - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitAdapter_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitAdapter_1_15_2.java deleted file mode 100644 index 853c87675..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitAdapter_1_15_2.java +++ /dev/null @@ -1,308 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArray; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.UnsafeUtility; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import io.papermc.lib.PaperLib; -import net.minecraft.server.v1_15_R1.BiomeBase; -import net.minecraft.server.v1_15_R1.BiomeStorage; -import net.minecraft.server.v1_15_R1.Block; -import net.minecraft.server.v1_15_R1.Chunk; -import net.minecraft.server.v1_15_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_15_R1.ChunkSection; -import net.minecraft.server.v1_15_R1.DataBits; -import net.minecraft.server.v1_15_R1.DataPalette; -import net.minecraft.server.v1_15_R1.DataPaletteBlock; -import net.minecraft.server.v1_15_R1.DataPaletteLinear; -import net.minecraft.server.v1_15_R1.GameProfileSerializer; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.LightEngineStorage; -import net.minecraft.server.v1_15_R1.NibbleArray; -import net.minecraft.server.v1_15_R1.PacketPlayOutLightUpdate; -import net.minecraft.server.v1_15_R1.PacketPlayOutMapChunk; -import net.minecraft.server.v1_15_R1.PlayerChunk; -import net.minecraft.server.v1_15_R1.PlayerChunkMap; -import net.minecraft.server.v1_15_R1.World; -import net.minecraft.server.v1_15_R1.WorldServer; -import org.bukkit.craftbukkit.v1_15_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -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.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Function; - -public final class BukkitAdapter_1_15_2 extends NMSAdapter { - /* - NMS fields - */ - public static final Field fieldBits; - public static final Field fieldPalette; - public static final Field fieldSize; - - public static final Field fieldFluidCount; - public static final Field fieldTickingBlockCount; - public static final Field fieldNonEmptyBlockCount; - - private static final Field fieldBiomeArray; - - private final static MethodHandle methodGetVisibleChunk; - - public static final MethodHandle methodSetLightNibbleArray; - - private static final int CHUNKSECTION_BASE; - private static final int CHUNKSECTION_SHIFT; - - private static final Field fieldLock; - private static final long fieldLockOffset; - - static { - try { - fieldSize = DataPaletteBlock.class.getDeclaredField("i"); - fieldSize.setAccessible(true); - fieldBits = DataPaletteBlock.class.getDeclaredField("a"); - fieldBits.setAccessible(true); - fieldPalette = DataPaletteBlock.class.getDeclaredField("h"); - fieldPalette.setAccessible(true); - - fieldFluidCount = ChunkSection.class.getDeclaredField("e"); - fieldFluidCount.setAccessible(true); - fieldTickingBlockCount = ChunkSection.class.getDeclaredField("tickingBlockCount"); - fieldTickingBlockCount.setAccessible(true); - fieldNonEmptyBlockCount = ChunkSection.class.getDeclaredField("nonEmptyBlockCount"); - fieldNonEmptyBlockCount.setAccessible(true); - - fieldBiomeArray = BiomeStorage.class.getDeclaredField("g"); - fieldBiomeArray.setAccessible(true); - - Method declaredGetVisibleChunk = PlayerChunkMap.class.getDeclaredMethod("getVisibleChunk", long.class); - declaredGetVisibleChunk.setAccessible(true); - methodGetVisibleChunk = MethodHandles.lookup().unreflect(declaredGetVisibleChunk); - - Method declaredSetLightNibbleArray = LightEngineStorage.class.getDeclaredMethod("a", long.class, NibbleArray.class); - declaredSetLightNibbleArray.setAccessible(true); - methodSetLightNibbleArray = MethodHandles.lookup().unreflect(declaredSetLightNibbleArray); - - Unsafe unsafe = UnsafeUtility.getUNSAFE(); - fieldLock = DataPaletteBlock.class.getDeclaredField("j"); - fieldLockOffset = unsafe.objectFieldOffset(fieldLock); - - CHUNKSECTION_BASE = unsafe.arrayBaseOffset(ChunkSection[].class); - int scale = unsafe.arrayIndexScale(ChunkSection[].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); - } - } - - protected static boolean setSectionAtomic(ChunkSection[] sections, ChunkSection expected, ChunkSection value, int layer) { - long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; - if (layer >= 0 && layer < sections.length) { - return UnsafeUtility.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); - } - return false; - } - - protected static DelegateLock applyLock(ChunkSection 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 = UnsafeUtility.getUNSAFE(); - DataPaletteBlock blocks = section.getBlocks(); - ReentrantLock currentLock = (ReentrantLock) unsafe.getObject(blocks, fieldLockOffset); - if (currentLock instanceof DelegateLock) { - return (DelegateLock) currentLock; - } - DelegateLock newLock = new DelegateLock(currentLock); - unsafe.putObject(blocks, fieldLockOffset, newLock); - return newLock; - } - } catch (Throwable e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static Chunk ensureLoaded(World nmsWorld, int chunkX, int chunkZ) { - Chunk nmsChunk = nmsWorld.getChunkIfLoaded(chunkX, chunkZ); - if (nmsChunk != null) { - return nmsChunk; - } - if (Fawe.isMainThread()) { - return nmsWorld.getChunkAt(chunkX, chunkZ); - } - if (PaperLib.isPaper()) { - CraftWorld craftWorld = nmsWorld.getWorld(); - CompletableFuture future = craftWorld.getChunkAtAsync(chunkX, chunkZ, true); - try { - CraftChunk chunk = (CraftChunk) future.get(); - return chunk.getHandle(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - // TODO optimize - return TaskManager.IMP.sync(() -> nmsWorld.getChunkAt(chunkX, chunkZ)); - } - - public static PlayerChunk getPlayerChunk(WorldServer nmsWorld, final int cx, final int cz) { - PlayerChunkMap chunkMap = nmsWorld.getChunkProvider().playerChunkMap; - try { - return (PlayerChunk) methodGetVisibleChunk.invoke(chunkMap, ChunkCoordIntPair.pair(cx, cz)); - } catch (Throwable thr) { - throw new RuntimeException(thr); - } - } - - public static void sendChunk(WorldServer nmsWorld, int chunkX, int chunkZ, int mask, boolean lighting) { - PlayerChunk playerChunk = getPlayerChunk(nmsWorld, chunkX, chunkZ); - if (playerChunk == null) { - return; - } - ChunkCoordIntPair chunkCoordIntPair = new ChunkCoordIntPair(chunkX, chunkZ); - Optional optional = ((Either) playerChunk.a().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); - Chunk chunk = optional.orElseGet(() -> - nmsWorld.getChunkProvider().getChunkAtIfLoadedImmediately(chunkX, chunkZ)); - if (chunk == null) { - return; - } - PacketPlayOutMapChunk chunkPacket = new PacketPlayOutMapChunk(chunk, 65535); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(chunkPacket); - }); - if (lighting) { - PacketPlayOutLightUpdate packet = - new PacketPlayOutLightUpdate(chunkCoordIntPair, nmsWorld.getChunkProvider().getLightEngine()); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(packet); - }); - } - } - - /* - NMS conversion - */ - public static ChunkSection newChunkSection(final int layer, final char[] blocks, boolean fastmode) { - return newChunkSection(layer, null, blocks, fastmode); - } - - public static ChunkSection newChunkSection(final int layer, final Function get, char[] set, boolean fastmode) { - 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); - } else { - air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, - num_palette_buffer, get, set, ticking_blocks, fastmode); - } - 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 - } - - final int blockBitArrayEnd = (bitsPerEntry * 4096) >> 6; - if (num_palette == 1) { - for (int i = 0; i < blockBitArrayEnd; i++) { - blockStates[i] = 0; - } - } else { - final BitArray bitArray = new BitArray(bitsPerEntry, 4096, blockStates); - bitArray.fromRaw(blocksCopy); - } - - ChunkSection section = newChunkSection(layer); - // set palette & data bits - final DataPaletteBlock dataPaletteBlocks = section.getBlocks(); - // private DataPalette h; - // protected DataBits a; - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final DataBits nmsBits = new DataBits(bitsPerEntry, 4096, bits); - final DataPalette palette; - palette = new DataPaletteLinear<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::d); - - // set palette - 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 IBlockData ibd = ((BlockMaterial_1_15_2) state.getMaterial()).getState(); - palette.a(ibd); - } - try { - fieldBits.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, palette); - fieldSize.set(dataPaletteBlocks, bitsPerEntry); - setCount(ticking_blocks.size(), 4096 - air, section); - if (!fastmode) { - ticking_blocks.forEach((pos, ordinal) -> section - .setType(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), - Block.getByCombinedId(ordinal))); - } - } catch (final IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } - - return section; - } catch (final Throwable e) { - Arrays.fill(blockToPalette, Integer.MAX_VALUE); - throw e; - } - } - - private static ChunkSection newChunkSection(int layer) { - return new ChunkSection(layer << 4); - } - - public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final ChunkSection section) throws NoSuchFieldException, IllegalAccessException { - fieldFluidCount.setShort(section, (short) 0); // TODO FIXME - fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); - fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); - } - - public static BiomeBase[] getBiomeArray(BiomeStorage storage) { - try { - return (BiomeBase[]) fieldBiomeArray.get(storage); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2.java deleted file mode 100644 index 991b27f4f..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2.java +++ /dev/null @@ -1,916 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.BukkitGetBlocks; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.nbt.LazyCompoundTag_1_15_2; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.AdaptedMap; -import com.boydti.fawe.object.collection.BitArray; -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.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_15_R2; -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 net.minecraft.server.v1_15_R1.BiomeBase; -import net.minecraft.server.v1_15_R1.BiomeStorage; -import net.minecraft.server.v1_15_R1.BlockPosition; -import net.minecraft.server.v1_15_R1.Chunk; -import net.minecraft.server.v1_15_R1.ChunkSection; -import net.minecraft.server.v1_15_R1.DataBits; -import net.minecraft.server.v1_15_R1.DataPalette; -import net.minecraft.server.v1_15_R1.DataPaletteBlock; -import net.minecraft.server.v1_15_R1.DataPaletteHash; -import net.minecraft.server.v1_15_R1.DataPaletteLinear; -import net.minecraft.server.v1_15_R1.Entity; -import net.minecraft.server.v1_15_R1.EntityTypes; -import net.minecraft.server.v1_15_R1.EnumSkyBlock; -import net.minecraft.server.v1_15_R1.HeightMap; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.LightEngine; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.NBTTagInt; -import net.minecraft.server.v1_15_R1.NibbleArray; -import net.minecraft.server.v1_15_R1.SectionPosition; -import net.minecraft.server.v1_15_R1.TileEntity; -import net.minecraft.server.v1_15_R1.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.jetbrains.annotations.NotNull; - -import java.util.AbstractSet; -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.function.Function; -import javax.annotation.Nullable; - -public class BukkitGetBlocks_1_15_2 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 LazyCompoundTag_1_15_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - public ChunkSection[] sections; - public Chunk nmsChunk; - public WorldServer world; - public int chunkX; - public int chunkZ; - public NibbleArray[] blockLight = new NibbleArray[16]; - public NibbleArray[] skyLight = new NibbleArray[16]; - private boolean createCopy = false; - private BukkitGetBlocks_1_15_2_Copy copy = null; - private boolean forceLoadSections = true; - private boolean lightUpdate = false; - - public BukkitGetBlocks_1_15_2(World world, int chunkX, int chunkZ) { - this(((CraftWorld) world).getHandle(), chunkX, chunkZ); - } - - public BukkitGetBlocks_1_15_2(WorldServer world, int chunkX, int chunkZ) { - this.world = world; - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public int getChunkX() { - return chunkX; - } - - @Override - public void setCreateCopy(boolean createCopy) { - this.createCopy = createCopy; - } - - @Override - public boolean isCreateCopy() { - return createCopy; - } - - @Override - public IChunkGet getCopy() { - return copy; - } - - @Override - public void setLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.BLOCK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setSkyLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.SKY); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) { - BitArray bitArray = new BitArray(9, 256); - bitArray.fromRaw(data); - getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(bitArray.getData()); - } - - public int getChunkZ() { - return chunkZ; - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeStorage index = getChunk().getBiomeIndex(); - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) { - break; - } - } - } else { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(base)) : null; - } - - @Override - public void removeSectionLighting(int layer, boolean sky) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - if (nibble != null) { - lightUpdate = true; - synchronized (nibble) { - byte[] bytes = PaperLib.isPaper() ? nibble.getIfSet() : nibble.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - if (sky) { - SectionPosition sectionPositionSky = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleSky = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPositionSky); - if (nibbleSky != null) { - lightUpdate = true; - synchronized (nibbleSky) { - byte[] bytes = PaperLib.isPaper() ? nibbleSky.getIfSet() : nibbleSky.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - } - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - TileEntity tileEntity = getChunk().getTileEntity(new BlockPosition((x & 15) + ( - chunkX << 4), y, (z & 15) + (chunkZ << 4))); - if (tileEntity == null) { - return null; - } - return new LazyCompoundTag_1_15_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - @Override - public Map getTiles() { - Map nmsTiles = getChunk().getTileEntities(); - 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; - if (skyLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.SKY, sectionPosition, nibbleArray); - } - skyLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return skyLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override - public int getEmmittedLight(int x, int y, int z) { - int layer = y >> 4; - if (blockLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = new byte[2048]; - // Safe enough to assume if it's not created, it's not got any emitted light. Unlikely to be created before lighting is fixed anyway. - Arrays.fill(a, (byte) 0); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.BLOCK, sectionPosition, nibbleArray); - } - blockLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return blockLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override public int[] getHeightMap(HeightMapType type) { - long[] longArray = getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(); - BitArray bitArray = new BitArray(9, 256, longArray); - return bitArray.toRaw(new int[256]); - } - - @Override - public CompoundTag getEntity(UUID uuid) { - Entity entity = world.getEntity(uuid); - if (entity != null) { - org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - for (List entry : getChunk().getEntitySlices()) { - if (entry != null) { - for (Entity ent : entry) { - if (uuid.equals(ent.getUniqueID())) { - org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - } - } - } - return null; - } - - @Override - public Set getEntities() { - List[] slices = getChunk().getEntitySlices(); - 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)) { - return false; - } - CompoundTag getTag = (CompoundTag) get; - 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.getUniqueID(); - if (uuid.equals(getUUID)) { - return true; - } - } - } - } - return false; - } - - @NotNull - @Override - public Iterator iterator() { - Iterable result = Iterables.transform(Iterables.concat(slices), new com.google.common.base.Function() { - @Nullable - @Override - public CompoundTag apply(@Nullable Entity input) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - return (CompoundTag) adapter.toNative(input.save(tag)); - } - }); - return result.iterator(); - } - }; - } - - private void updateGet(BukkitGetBlocks_1_15_2 get, Chunk nmsChunk, ChunkSection[] chunkSections, ChunkSection section, char[] arr, int layer) { - synchronized (get) { - if (this.getChunk() != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); - this.reset(); - } - if (this.sections == null) { - this.sections = new ChunkSection[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 ChunkSection[]{section}.clone()[0]; - } - this.blocks[layer] = arr; - } - } - - private void removeEntity(Entity entity) { - entity.die(); - } - - public Chunk ensureLoaded(net.minecraft.server.v1_15_R1.World nmsWorld, int chunkX, int chunkZ) { - return BukkitAdapter_1_15_2.ensureLoaded(nmsWorld, chunkX, chunkZ); - } - - @Override - public synchronized > T call(IChunkSet set, Runnable finalizer) { - forceLoadSections = false; - copy = createCopy ? new BukkitGetBlocks_1_15_2_Copy(world) : null; - try { - WorldServer nmsWorld = world; - Chunk 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 tiles = new HashMap<>(nmsChunk.getTileEntities()); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - final BlockPosition 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) { - TileEntity tile = entry.getValue(); - nmsChunk.removeTileEntity(tile.getPosition()); - if (createCopy) { - copy.storeTile(tile); - } - } - } - } - } - - int bitMask = 0; - synchronized (nmsChunk) { - ChunkSection[] sections = nmsChunk.getSections(); - - for (int layer = 0; layer < 16; layer++) { - if (!set.hasSection(layer)) { - continue; - } - - bitMask |= 1 << layer; - - char[] tmp = set.load(layer); - char[] setArr = new char[4096]; - System.arraycopy(tmp, 0, setArr, 0, 4096); - if (createCopy) { - char[] tmpLoad = loadPrivately(layer); - char[] copyArr = new char[4096]; - System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); - copy.storeSection(layer, copyArr); - } - - ChunkSection newSection; - ChunkSection existingSection = sections[layer]; - if (existingSection == null) { - newSection = BukkitAdapter_1_15_2.newChunkSection(layer, setArr, fastmode); - if (BukkitAdapter_1_15_2.setSectionAtomic(sections, null, newSection, layer)) { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - continue; - } else { - existingSection = sections[layer]; - if (existingSection == null) { - LOGGER.error("Skipping invalid null section. chunk:" + chunkX + "," - + chunkZ + " layer: " + layer); - continue; - } - } - } - BukkitAdapter_1_15_2.fieldTickingBlockCount.set(existingSection, (short) 0); - - //ensure that the server doesn't try to tick the chunksection while we're editing it. - DelegateLock lock = BukkitAdapter_1_15_2.applyLock(existingSection); - - synchronized (this) { - synchronized (lock) { - lock.untilFree(); - if (this.getChunk() != nmsChunk) { - this.nmsChunk = 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(layer))) { - this.reset(layer); - } else if (lock.isModified()) { - this.reset(layer); - } - newSection = BukkitAdapter_1_15_2.newChunkSection(layer, this::loadPrivately, setArr, fastmode); - if (!BukkitAdapter_1_15_2.setSectionAtomic(sections, existingSection, newSection, layer)) { - LOGGER.error("Failed to set chunk section:" + chunkX + "," + chunkZ + " layer: " + layer); - } else { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - BiomeStorage currentBiomes = nmsChunk.getBiomeIndex(); - 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) { - final Biome craftBiome = BukkitAdapter.adapt(biome); - BiomeBase nmsBiome = CraftBlock.biomeToBiomeBase(craftBiome); - currentBiomes.setBiome(x, y, z, nmsBiome); - } - } - } - } - } - - Map heightMaps = set.getHeightMaps(); - for (Map.Entry entry : heightMaps.entrySet()) { - BukkitGetBlocks_1_15_2.this.setHeightmapToGet(entry.getKey(), entry.getValue()); - } - BukkitGetBlocks_1_15_2.this.setLightingToGet(set.getLight()); - BukkitGetBlocks_1_15_2.this.setSkyLightingToGet(set.getSkyLight()); - - Runnable[] syncTasks = null; - - int bx = chunkX << 4; - int bz = chunkZ << 4; - - Set entityRemoves = set.getEntityRemoves(); - if (entityRemoves != null && !entityRemoves.isEmpty()) { - syncTasks = new Runnable[3]; - - syncTasks[2] = () -> { - final List[] entities = nmsChunk.getEntitySlices(); - - 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.getUniqueID())) { - 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] = () -> { - 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.debug("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(); - - EntityTypes type = EntityTypes.a(id).orElse(null); - if (type != null) { - Entity entity = type.a(nmsWorld); - if (entity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - - entity.f(tag); - entity.setLocation(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 BlockPosition pos = new BlockPosition(x, y, z); - - synchronized (nmsWorld) { - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity == null || tileEntity.isRemoved()) { - nmsWorld.removeTileEntity(pos); - tileEntity = nmsWorld.getTileEntity(pos); - } - if (tileEntity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(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.d(true); // Set Modified - nmsChunk.mustNotSave = false; - nmsChunk.markDirty(); - // 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 - 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 synchronized char[] loadPrivately(int layer) { - if (super.blocks[layer] != null) { - char[] blocks = new char[4096]; - System.arraycopy(super.blocks[layer], 0, blocks, 0, 4096); - return blocks; - } else { - return BukkitGetBlocks_1_15_2.this.update(layer, null, true); - } - } - - @Override - public synchronized void send(int mask, boolean lighting) { - BukkitAdapter_1_15_2.sendChunk(world, chunkX, chunkZ, mask, lighting); - } - - @Override - public synchronized char[] update(int layer, char[] data, boolean aggressive) { - ChunkSection 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 == FaweCache.IMP.EMPTY_CHAR_4096) { - data = new char[4096]; - Arrays.fill(data, (char) 1); - } - DelegateLock lock = BukkitAdapter_1_15_2.applyLock(section); - synchronized (lock) { - lock.untilFree(); - lock.setModified(false); - // Efficiently convert ChunkSection to raw data - try { - FAWE_Spigot_v1_15_R2 adapter = ((FAWE_Spigot_v1_15_R2) WorldEditPlugin.getInstance().getBukkitImplAdapter()); - - final DataPaletteBlock blocks = section.getBlocks(); - final DataBits bits = (DataBits) BukkitAdapter_1_15_2.fieldBits.get(blocks); - final DataPalette palette = (DataPalette) BukkitAdapter_1_15_2.fieldPalette.get(blocks); - - final int bitsPerEntry = bits.c(); - final long[] blockStates = bits.a(); - - new BitArray(bitsPerEntry, 4096, blockStates).toRaw(data); - - int num_palette; - if (palette instanceof DataPaletteLinear) { - num_palette = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - num_palette = ((DataPaletteHash) palette).b(); - } else { - num_palette = 0; - int[] paletteToBlockInts = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - char[] paletteToBlockChars = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); - try { - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char ordinal = paletteToBlockChars[paletteVal]; - if (ordinal == Character.MAX_VALUE) { - paletteToBlockInts[num_palette++] = paletteVal; - IBlockData ibd = palette.a(data[i]); - if (ibd == null) { - ordinal = BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - ordinal = adapter.adaptToChar(ibd); - } - paletteToBlockChars[paletteVal] = ordinal; - } - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } - data[i] = ordinal; - } - } finally { - for (int i = 0; i < num_palette; i++) { - int paletteVal = paletteToBlockInts[i]; - paletteToBlockChars[paletteVal] = Character.MAX_VALUE; - } - } - 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.a(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.a(i), adapter); - paletteToOrdinal[i] = val; - } - // Don't read "empty". - if (val == 0) { - val = 1; - } - data[i] = val; - } - } else { - char ordinal = ordinal(palette.a(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 e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - private final char ordinal(IBlockData ibd, FAWE_Spigot_v1_15_R2 adapter) { - if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - return adapter.adaptToChar(ibd); - } - } - - public ChunkSection[] getSections(boolean force) { - force &= forceLoadSections; - ChunkSection[] tmp = sections; - if (tmp == null || force) { - synchronized (this) { - tmp = sections; - if (tmp == null || force) { - ChunkSection[] chunkSections = getChunk().getSections(); - tmp = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, tmp, 0, chunkSections.length); - sections = tmp; - } - } - } - return tmp; - } - - public Chunk getChunk() { - Chunk tmp = nmsChunk; - if (tmp == null) { - synchronized (this) { - tmp = nmsChunk; - if (tmp == null) { - nmsChunk = tmp = ensureLoaded(this.world, chunkX, chunkZ); - } - } - } - return tmp; - } - - private void fillLightNibble(char[][] light, EnumSkyBlock skyBlock) { - for (int Y = 0; Y < 16; Y++) { - if (light[Y] == null) { - continue; - } - SectionPosition sectionPosition = SectionPosition.a(nmsChunk.getPos(), Y); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(skyBlock).a(sectionPosition); - if (nibble == null) { - byte[] a = new byte[2048]; - Arrays.fill(a, skyBlock == EnumSkyBlock.SKY ? (byte) 15 : (byte) 0); - nibble = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(skyBlock, sectionPosition, nibble); - } - synchronized (nibble) { - for (int i = 0; i < 4096; i++) { - if (light[Y][i] < 16) { - nibble.a(i, light[Y][i]); - } - } - } - } - } - - @Override - public boolean hasSection(int layer) { - return getSections(false)[layer] != null; - } - - @Override - public boolean trim(boolean aggressive) { - skyLight = new NibbleArray[16]; - blockLight = new NibbleArray[16]; - if (aggressive) { - sections = null; - nmsChunk = null; - return super.trim(true); - } else { - for (int i = 0; i < 16; i++) { - if (!hasSection(i) || !super.sections[i].isFull()) { - continue; - } - ChunkSection existing = getSections(true)[i]; - try { - final DataPaletteBlock blocksExisting = existing.getBlocks(); - - final DataPalette palette = (DataPalette) BukkitAdapter_1_15_2.fieldPalette.get(blocksExisting); - int paletteSize; - - if (palette instanceof DataPaletteLinear) { - paletteSize = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - paletteSize = ((DataPaletteHash) palette).b(); - } 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2_Copy.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2_Copy.java deleted file mode 100644 index 3a6aec938..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2_Copy.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.nbt.LazyCompoundTag_1_15_2; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -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.v1_15_R1.BiomeBase; -import net.minecraft.server.v1_15_R1.BiomeStorage; -import net.minecraft.server.v1_15_R1.Entity; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.TileEntity; -import net.minecraft.server.v1_15_R1.WorldServer; -import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Range; - -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 BukkitGetBlocks_1_15_2_Copy implements IChunkGet { - - private final Map tiles = new HashMap<>(); - private final Set entities = new HashSet<>(); - private BiomeStorage biomeStorage; - private final char[][] blocks = new char[16][]; - private final WorldServer world; - - protected BukkitGetBlocks_1_15_2_Copy(WorldServer world) { - this.world = world; - } - - protected void storeTile(TileEntity tile) { - tiles.put(BlockVector3.at(tile.getPosition().getX(), tile.getPosition().getY(), tile.getPosition().getZ()), - new LazyCompoundTag_1_15_2(Suppliers.memoize(() -> tile.save(new NBTTagCompound())))); - } - - @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) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - entities.add((CompoundTag) adapter.toNative(entity.save(tag))); - } - - @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 void setCreateCopy(boolean createCopy) { - - } - - @Override - public boolean isCreateCopy() { - return false; - } - - @Override - public void setLightingToGet(char[][] lighting) {} - - @Override - public void setSkyLightingToGet(char[][] lighting) {} - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) {} - - protected void storeBiomes(BiomeStorage biomeStorage) { - this.biomeStorage = new BiomeStorage(BukkitAdapter_1_15_2.getBiomeArray(biomeStorage).clone()); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) break; - } - } else { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(base)) : 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; - } - - 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(@Range(from = 0, to = 15) int layer) { - return blocks[layer] != null; - } - - @Override - public char[] load(int layer) { - 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 getEmmittedLight(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; - 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/FAWEWorldNativeAccess_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/FAWEWorldNativeAccess_1_15_2.java deleted file mode 100644 index 4e6f03370..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/FAWEWorldNativeAccess_1_15_2.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.TaskManager; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_15_R2; -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 net.minecraft.server.v1_15_R1.Block; -import net.minecraft.server.v1_15_R1.BlockPosition; -import net.minecraft.server.v1_15_R1.Chunk; -import net.minecraft.server.v1_15_R1.ChunkProviderServer; -import net.minecraft.server.v1_15_R1.EnumDirection; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.MinecraftServer; -import net.minecraft.server.v1_15_R1.NBTBase; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.PlayerChunk; -import net.minecraft.server.v1_15_R1.TileEntity; -import net.minecraft.server.v1_15_R1.World; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; -import org.bukkit.event.block.BlockPhysicsEvent; - -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; -import javax.annotation.Nullable; - -public class FAWEWorldNativeAccess_1_15_2 implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - - private final FAWE_Spigot_v1_15_R2 adapter; - private final WeakReference world; - private SideEffectSet sideEffectSet; - private final AtomicInteger lastTick; - private final Set cachedChanges = new HashSet<>(); - private final Set cachedChunksToSend = new HashSet<>(); - - public FAWEWorldNativeAccess_1_15_2(FAWE_Spigot_v1_15_R2 adapter, WeakReference world) { - this.adapter = adapter; - this.world = world; - // 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 World getWorld() { - return Objects.requireNonNull(world.get(), "The reference to the world was lost"); - } - - @Override - public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { - this.sideEffectSet = sideEffectSet; - } - - @Override - public Chunk getChunk(int x, int z) { - return getWorld().getChunkAt(x, z); - } - - @Override - public IBlockData toNative(com.sk89q.worldedit.world.block.BlockState state) { - int stateId = adapter.ordinalToIbdID(state.getOrdinalChar()); - return BlockStateIdAccess.isValidInternalId(stateId) - ? Block.getByCombinedId(stateId) - : ((CraftBlockData) BukkitAdapter.adapt(state)).getState(); - } - - @Override - public IBlockData getBlockState(Chunk chunk, BlockPosition position) { - return chunk.getType(position); - } - - @Nullable - @Override - public synchronized IBlockData setBlockState(Chunk chunk, BlockPosition position, IBlockData state) { - int currentTick = MinecraftServer.currentTick; - if (Fawe.isMainThread()) { - return chunk.setType(position, state, - 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(chunk, position, state)); - cachedChunksToSend.add(new IntPair(chunk.bukkitChunk.getX(), chunk.bukkitChunk.getZ())); - boolean nextTick = lastTick.get() > currentTick; - if (nextTick || cachedChanges.size() >= 1024) { - if (nextTick) { - lastTick.set(currentTick); - } - flushAsync(nextTick); - } - return state; - } - - - @Override - public IBlockData getValidBlockForPosition(IBlockData block, BlockPosition position) { - return Block.b(block, getWorld(), position); - } - - @Override - public BlockPosition getPosition(int x, int y, int z) { - return new BlockPosition(x, y, z); - } - - @Override - public void updateLightingForBlock(BlockPosition position) { - getWorld().getChunkProvider().getLightEngine().a(position); - } - - @Override - public boolean updateTileEntity(BlockPosition position, CompoundTag tag) { - // We will assume that the tile entity was created for us, - // though we do not do this on the other versions - TileEntity tileEntity = getWorld().getTileEntity(position); - if (tileEntity == null) { - return false; - } - NBTBase nativeTag = adapter.fromNative(tag); - tileEntity.load((NBTTagCompound) nativeTag); - return true; - } - - @Override - public void notifyBlockUpdate(BlockPosition position, IBlockData oldState, IBlockData newState) { - getWorld().notify(position, oldState, newState, UPDATE | NOTIFY); - } - - @Override - public boolean isChunkTicking(Chunk chunk) { - return chunk.getState().isAtLeast(PlayerChunk.State.TICKING); - } - - @Override - public void markBlockChanged(BlockPosition position) { - ((ChunkProviderServer) getWorld().getChunkProvider()).flagDirty(position); - } - - private static final EnumDirection[] NEIGHBOUR_ORDER = { - EnumDirection.WEST, EnumDirection.EAST, - EnumDirection.DOWN, EnumDirection.UP, - EnumDirection.NORTH, EnumDirection.SOUTH - }; - - @Override - public void notifyNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState) { - World world = getWorld(); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - world.update(pos, oldState.getBlock()); - } else { - // When we don't want events, manually run the physics without them. - // Un-nest neighbour updating - for (EnumDirection direction : NEIGHBOUR_ORDER) { - BlockPosition shifted = pos.shift(direction); - world.getType(shifted).doPhysics(world, shifted, oldState.getBlock(), pos, false); - } - } - if (newState.isComplexRedstone()) { - world.updateAdjacentComparators(pos, newState.getBlock()); - } - } - - @Override - public void updateNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState, int recursionLimit) { - World world = getWorld(); - // a == updateNeighbors - // b == updateDiagonalNeighbors - oldState.b(world, pos, NOTIFY); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - CraftWorld craftWorld = world.getWorld(); - if (craftWorld != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(craftWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), CraftBlockData.fromData(newState)); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - } - newState.a(world, pos, NOTIFY); - newState.b(world, pos, NOTIFY); - } - - @Override - public void onBlockStateChange(BlockPosition pos, IBlockData oldState, IBlockData newState) { - getWorld().a(pos, oldState, newState); - } - - private synchronized void flushAsync(final boolean sendChunks) { - final Set changes = Collections.unmodifiableSet(new HashSet<>(cachedChanges)); - cachedChanges.clear(); - final Set toSend; - if (sendChunks) { - toSend = Collections.unmodifiableSet(new HashSet<>(cachedChunksToSend)); - cachedChunksToSend.clear(); - } else { - toSend = Collections.emptySet(); - } - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - changes.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - if (!sendChunks) { - return; - } - for (IntPair chunk : toSend) { - BukkitAdapter_1_15_2.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - TaskManager.IMP.async(() -> TaskManager.IMP.sync(r)); - } - - @Override - public synchronized void flush() { - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - cachedChanges.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - for (IntPair chunk : cachedChunksToSend) { - BukkitAdapter_1_15_2.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - if (Fawe.isMainThread()) { - r.run(); - } else { - TaskManager.IMP.sync(r); - } - cachedChanges.clear(); - cachedChunksToSend.clear(); - } - - private static final class CachedChange { - - private final Chunk chunk; - private final BlockPosition position; - private final IBlockData blockData; - - private CachedChange(Chunk chunk, BlockPosition position, IBlockData blockData) { - this.chunk = chunk; - this.position = position; - this.blockData = blockData; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/MapChunkUtil_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/MapChunkUtil_1_15_2.java deleted file mode 100644 index 7a7bac16c..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/MapChunkUtil_1_15_2.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2; - -import com.boydti.fawe.bukkit.adapter.MapChunkUtil; -import net.minecraft.server.v1_15_R1.PacketPlayOutMapChunk; - -public class MapChunkUtil_1_15_2 extends MapChunkUtil { - public MapChunkUtil_1_15_2() throws NoSuchFieldException { - fieldX = PacketPlayOutMapChunk.class.getDeclaredField("a"); - fieldZ = PacketPlayOutMapChunk.class.getDeclaredField("b"); - fieldBitMask = PacketPlayOutMapChunk.class.getDeclaredField("c"); - fieldHeightMap = PacketPlayOutMapChunk.class.getDeclaredField("d"); - fieldChunkData = PacketPlayOutMapChunk.class.getDeclaredField("f"); - fieldBlockEntities = PacketPlayOutMapChunk.class.getDeclaredField("g"); - fieldFull = PacketPlayOutMapChunk.class.getDeclaredField("h"); - fieldX.setAccessible(true); - fieldZ.setAccessible(true); - fieldBitMask.setAccessible(true); - fieldHeightMap.setAccessible(true); - fieldChunkData.setAccessible(true); - fieldBlockEntities.setAccessible(true); - fieldFull.setAccessible(true); - } - - @Override - public PacketPlayOutMapChunk createPacket() { - return new PacketPlayOutMapChunk(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/nbt/LazyCompoundTag_1_15_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/nbt/LazyCompoundTag_1_15_2.java deleted file mode 100644 index e37700956..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/nbt/LazyCompoundTag_1_15_2.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_15_2.nbt; - -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.WorldEditPlugin; -import net.minecraft.server.v1_15_R1.NBTBase; -import net.minecraft.server.v1_15_R1.NBTNumber; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.NBTTagList; - -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 LazyCompoundTag_1_15_2 extends CompoundTag { - - private final Supplier nmsTag; - private CompoundTag cachedValue; - - public LazyCompoundTag_1_15_2(Supplier tag) { - super(new HashMap<>()); - this.nmsTag = tag; - } - - public LazyCompoundTag_1_15_2(NBTTagCompound tag) { - this(() -> tag); - } - - public NBTTagCompound get() { - return nmsTag.get(); - } - - @Override - public Map getValue() { - if (cachedValue == null) { - cachedValue = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(nmsTag.get()); - } - return cachedValue.getValue(); - } - - public boolean containsKey(String key) { - return nmsTag.get().hasKey(key); - } - - public byte[] getByteArray(String key) { - return nmsTag.get().getByteArray(key); - } - - public byte getByte(String key) { - return nmsTag.get().getByte(key); - } - - public double getDouble(String key) { - return nmsTag.get().getDouble(key); - } - - public double asDouble(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asDouble(); - } - return 0; - } - - public float getFloat(String key) { - return nmsTag.get().getFloat(key); - } - - public int[] getIntArray(String key) { - return nmsTag.get().getIntArray(key); - } - - public int getInt(String key) { - return nmsTag.get().getInt(key); - } - - public int asInt(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asInt(); - } - return 0; - } - - public List getList(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - ArrayList list = new ArrayList<>(); - NBTTagList nbtList = (NBTTagList) tag; - for (NBTBase elem : nbtList) { - if (elem instanceof NBTTagCompound) { - list.add(new LazyCompoundTag_1_15_2((NBTTagCompound) elem)); - } else { - list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); - } - } - return list; - } - return Collections.emptyList(); - } - - public ListTag getListTag(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - 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 nmsTag.get().getLongArray(key); - } - - public long getLong(String key) { - return nmsTag.get().getLong(key); - } - - public long asLong(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asLong(); - } - return 0; - } - - public short getShort(String key) { - return nmsTag.get().getShort(key); - } - - public String getString(String key) { - return nmsTag.get().getString(key); - } - - @Override - public String toString() { - return nmsTag.get().toString(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BlockMaterial_1_16_1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BlockMaterial_1_16_1.java deleted file mode 100644 index 4b7816089..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BlockMaterial_1_16_1.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - -import com.boydti.fawe.bukkit.adapter.mc1_16_1.nbt.LazyCompoundTag_1_16_1; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.util.ReflectionUtil; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_16_R1.Block; -import net.minecraft.server.v1_16_R1.BlockAccessAir; -import net.minecraft.server.v1_16_R1.BlockBase; -import net.minecraft.server.v1_16_R1.BlockPosition; -import net.minecraft.server.v1_16_R1.EnumPistonReaction; -import net.minecraft.server.v1_16_R1.IBlockData; -import net.minecraft.server.v1_16_R1.ITileEntity; -import net.minecraft.server.v1_16_R1.Material; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.TileEntity; -import org.bukkit.craftbukkit.v1_16_R1.block.data.CraftBlockData; - -public class BlockMaterial_1_16_1 implements BlockMaterial { - private final Block block; - private final IBlockData defaultState; - private final Material material; - private final boolean isTranslucent; - private final CraftBlockData craftBlockData; - private final org.bukkit.Material craftMaterial; - private final int opacity; - private final CompoundTag tile; - - public BlockMaterial_1_16_1(Block block) { - this(block, block.getBlockData()); - } - - public BlockMaterial_1_16_1(Block block, IBlockData defaultState) { - this.block = block; - this.defaultState = defaultState; - this.material = defaultState.getMaterial(); - this.craftBlockData = CraftBlockData.fromData(defaultState); - this.craftMaterial = craftBlockData.getMaterial(); - BlockBase.Info blockInfo = ReflectionUtil.getField(BlockBase.class, block, "aB"); - this.isTranslucent = !(boolean)ReflectionUtil.getField(BlockBase.Info.class, blockInfo, "n"); - opacity = defaultState.b(BlockAccessAir.INSTANCE, BlockPosition.ZERO); - TileEntity tileEntity = !block.isTileEntity() ? null : ((ITileEntity)block).createTile(null); - tile = tileEntity == null ? null : new LazyCompoundTag_1_16_1(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - public Block getBlock() { - return block; - } - - public IBlockData getState() { - return defaultState; - } - - public CraftBlockData getCraftBlockData() { - return craftBlockData; - } - - public Material getMaterial() { - return material; - } - - @Override - public boolean isAir() { - return defaultState.isAir(); - } - - @Override - public boolean isFullCube() { - return craftMaterial.isOccluding(); - } - - @Override - public boolean isOpaque() { - return material.f(); - } - - @Override - public boolean isPowerSource() { - return defaultState.isPowerSource(); - } - - @Override - public boolean isLiquid() { - return material.isLiquid(); - } - - @Override - public boolean isSolid() { - return material.isBuildable(); - } - - @Override - public float getHardness() { - return craftBlockData.getState().strength; - } - - @Override - public float getResistance() { - return block.getDurability(); - } - - @Override - public float getSlipperiness() { - return block.getFrictionFactor(); - } - - @Override - public int getLightValue() { - return defaultState.f(); - } - - @Override - public int getLightOpacity() { - return opacity; - } - - @Override - public boolean isFragileWhenPushed() { - return material.getPushReaction() == EnumPistonReaction.DESTROY; - } - - @Override - public boolean isUnpushable() { - return material.getPushReaction() == EnumPistonReaction.BLOCK; - } - - @Override - public boolean isTicksRandomly() { - return block.isTicking(defaultState); - } - - @Override - public boolean isMovementBlocker() { - return material.isSolid(); - } - - @Override - public boolean isBurnable() { - return material.isBurnable(); - } - - @Override - public boolean isToolRequired() { - //TODO Removed in 1.16.1 Replacement not found. - return true; - } - - @Override - public boolean isReplacedDuringPlacement() { - return material.isReplaceable(); - } - - @Override - public boolean isTranslucent() { - return isTranslucent; - } - - @Override - public boolean hasContainer() { - return block instanceof ITileEntity; - } - - @Override - public boolean isTile() { - return block.isTileEntity(); - } - - @Override - public CompoundTag getDefaultTile() { - return tile; - } - - @Override - public int getMapColor() { - return material.h().rgb; - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitAdapter_1_16_1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitAdapter_1_16_1.java deleted file mode 100644 index 3c05deaf2..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitAdapter_1_16_1.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.UnsafeUtility; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import io.papermc.lib.PaperLib; -import net.minecraft.server.v1_16_R1.BiomeBase; -import net.minecraft.server.v1_16_R1.BiomeStorage; -import net.minecraft.server.v1_16_R1.Block; -import net.minecraft.server.v1_16_R1.Chunk; -import net.minecraft.server.v1_16_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R1.ChunkSection; -import net.minecraft.server.v1_16_R1.DataBits; -import net.minecraft.server.v1_16_R1.DataPalette; -import net.minecraft.server.v1_16_R1.DataPaletteBlock; -import net.minecraft.server.v1_16_R1.DataPaletteLinear; -import net.minecraft.server.v1_16_R1.GameProfileSerializer; -import net.minecraft.server.v1_16_R1.IBlockData; -import net.minecraft.server.v1_16_R1.PacketPlayOutLightUpdate; -import net.minecraft.server.v1_16_R1.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R1.PlayerChunk; -import net.minecraft.server.v1_16_R1.PlayerChunkMap; -import net.minecraft.server.v1_16_R1.World; -import net.minecraft.server.v1_16_R1.WorldServer; -import org.bukkit.craftbukkit.v1_16_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -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.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Function; - -public final class BukkitAdapter_1_16_1 extends NMSAdapter { - /* - NMS fields - */ - public static final Field fieldBits; - public static final Field fieldPalette; - public static final Field fieldSize; - - public static final Field fieldBitsPerEntry; - - public static final Field fieldFluidCount; - public static final Field fieldTickingBlockCount; - public static final Field fieldNonEmptyBlockCount; - - private static final Field fieldBiomeArray; - - private final static MethodHandle methodGetVisibleChunk; - - private static final int CHUNKSECTION_BASE; - private static final int CHUNKSECTION_SHIFT; - - private static final Field fieldLock; - private static final long fieldLockOffset; - - static { - try { - fieldSize = DataPaletteBlock.class.getDeclaredField("i"); - fieldSize.setAccessible(true); - fieldBits = DataPaletteBlock.class.getDeclaredField("a"); - fieldBits.setAccessible(true); - fieldPalette = DataPaletteBlock.class.getDeclaredField("h"); - fieldPalette.setAccessible(true); - - fieldBitsPerEntry = DataBits.class.getDeclaredField("c"); - fieldBitsPerEntry.setAccessible(true); - - fieldFluidCount = ChunkSection.class.getDeclaredField("e"); - fieldFluidCount.setAccessible(true); - fieldTickingBlockCount = ChunkSection.class.getDeclaredField("tickingBlockCount"); - fieldTickingBlockCount.setAccessible(true); - fieldNonEmptyBlockCount = ChunkSection.class.getDeclaredField("nonEmptyBlockCount"); - fieldNonEmptyBlockCount.setAccessible(true); - - fieldBiomeArray = BiomeStorage.class.getDeclaredField("g"); - fieldBiomeArray.setAccessible(true); - - Method declaredGetVisibleChunk = PlayerChunkMap.class.getDeclaredMethod("getVisibleChunk", long.class); - declaredGetVisibleChunk.setAccessible(true); - methodGetVisibleChunk = MethodHandles.lookup().unreflect(declaredGetVisibleChunk); - - Unsafe unsafe = UnsafeUtility.getUNSAFE(); - fieldLock = DataPaletteBlock.class.getDeclaredField("j"); - fieldLockOffset = unsafe.objectFieldOffset(fieldLock); - - CHUNKSECTION_BASE = unsafe.arrayBaseOffset(ChunkSection[].class); - int scale = unsafe.arrayIndexScale(ChunkSection[].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); - } - } - - protected static boolean setSectionAtomic(ChunkSection[] sections, ChunkSection expected, ChunkSection value, int layer) { - long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; - if (layer >= 0 && layer < sections.length) { - return UnsafeUtility.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); - } - return false; - } - - protected static DelegateLock applyLock(ChunkSection 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 = UnsafeUtility.getUNSAFE(); - DataPaletteBlock blocks = section.getBlocks(); - ReentrantLock currentLock = (ReentrantLock) unsafe.getObject(blocks, fieldLockOffset); - if (currentLock instanceof DelegateLock) { - return (DelegateLock) currentLock; - } - DelegateLock newLock = new DelegateLock(currentLock); - unsafe.putObject(blocks, fieldLockOffset, newLock); - return newLock; - } - } catch (Throwable e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static Chunk ensureLoaded(World nmsWorld, int chunkX, int chunkZ) { - Chunk nmsChunk = nmsWorld.getChunkProvider().getChunkAt(chunkX, chunkZ, false); - if (nmsChunk != null) { - return nmsChunk; - } - if (Fawe.isMainThread()) { - return nmsWorld.getChunkAt(chunkX, chunkZ); - } - if (PaperLib.isPaper()) { - CraftWorld craftWorld = nmsWorld.getWorld(); - CompletableFuture future = craftWorld.getChunkAtAsync(chunkX, chunkZ, true); - try { - CraftChunk chunk = (CraftChunk) future.get(); - return chunk.getHandle(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - // TODO optimize - return TaskManager.IMP.sync(() -> nmsWorld.getChunkAt(chunkX, chunkZ)); - } - - public static PlayerChunk getPlayerChunk(WorldServer nmsWorld, final int cx, final int cz) { - PlayerChunkMap chunkMap = nmsWorld.getChunkProvider().playerChunkMap; - try { - return (PlayerChunk) methodGetVisibleChunk.invoke(chunkMap, ChunkCoordIntPair.pair(cx, cz)); - } catch (Throwable thr) { - throw new RuntimeException(thr); - } - } - - public static void sendChunk(WorldServer nmsWorld, int chunkX, int chunkZ, int mask, boolean lighting) { - PlayerChunk playerChunk = getPlayerChunk(nmsWorld, chunkX, chunkZ); - if (playerChunk == null) { - return; - } - ChunkCoordIntPair chunkCoordIntPair = new ChunkCoordIntPair(chunkX, chunkZ); - Optional optional = ((Either) playerChunk.a().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); - Chunk chunk = optional.orElseGet(() -> - nmsWorld.getChunkProvider().getChunkAtIfLoadedImmediately(chunkX, chunkZ)); - if (chunk == null) { - return; - } - PacketPlayOutMapChunk chunkPacket = new PacketPlayOutMapChunk(chunk, 65535, true); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(chunkPacket); - }); - if (lighting) { - //This needs to be true otherwise Minecraft will update lighting from/at the chunk edges (bad) - boolean trustEdges = true; - PacketPlayOutLightUpdate packet = - new PacketPlayOutLightUpdate(chunkCoordIntPair, nmsWorld.getChunkProvider().getLightEngine(), - trustEdges); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(packet); - }); - } - } - - /* - NMS conversion - */ - public static ChunkSection newChunkSection(final int layer, final char[] blocks, boolean fastmode) { - return newChunkSection(layer, null, blocks, fastmode); - } - - public static ChunkSection newChunkSection(final int layer, final Function get, char[] set, boolean fastmode) { - 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); - } else { - air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, - num_palette_buffer, get, set, ticking_blocks, fastmode); - } - 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 - } - - 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); - } - - ChunkSection section = newChunkSection(layer); - // set palette & data bits - final DataPaletteBlock dataPaletteBlocks = section.getBlocks(); - // private DataPalette h; - // protected DataBits a; - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final DataBits nmsBits = new DataBits(bitsPerEntry, 4096, bits); - final DataPalette palette; - palette = new DataPaletteLinear<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::c); - - // set palette - 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 IBlockData ibd = ((BlockMaterial_1_16_1) state.getMaterial()).getState(); - palette.a(ibd); - } - try { - fieldBits.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, palette); - fieldSize.set(dataPaletteBlocks, bitsPerEntry); - setCount(ticking_blocks.size(), 4096 - air, section); - if (!fastmode) { - ticking_blocks.forEach((pos, ordinal) -> section - .setType(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), - Block.getByCombinedId(ordinal))); - } - } catch (final IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } - - return section; - } catch (final Throwable e) { - Arrays.fill(blockToPalette, Integer.MAX_VALUE); - throw e; - } - } - - private static ChunkSection newChunkSection(int layer) { - return new ChunkSection(layer << 4); - } - - public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final ChunkSection section) throws NoSuchFieldException, IllegalAccessException { - fieldFluidCount.setShort(section, (short) 0); // TODO FIXME - fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); - fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); - } - - public static BiomeBase[] getBiomeArray(BiomeStorage storage) { - try { - return (BiomeBase[]) fieldBiomeArray.get(storage); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1.java deleted file mode 100644 index 3c537bc0f..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1.java +++ /dev/null @@ -1,917 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.BukkitGetBlocks; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.nbt.LazyCompoundTag_1_16_1; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.AdaptedMap; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -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.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R1; -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 net.minecraft.server.v1_16_R1.BiomeBase; -import net.minecraft.server.v1_16_R1.BiomeStorage; -import net.minecraft.server.v1_16_R1.BlockPosition; -import net.minecraft.server.v1_16_R1.Chunk; -import net.minecraft.server.v1_16_R1.ChunkSection; -import net.minecraft.server.v1_16_R1.DataBits; -import net.minecraft.server.v1_16_R1.DataPalette; -import net.minecraft.server.v1_16_R1.DataPaletteBlock; -import net.minecraft.server.v1_16_R1.DataPaletteHash; -import net.minecraft.server.v1_16_R1.DataPaletteLinear; -import net.minecraft.server.v1_16_R1.Entity; -import net.minecraft.server.v1_16_R1.EntityTypes; -import net.minecraft.server.v1_16_R1.EnumSkyBlock; -import net.minecraft.server.v1_16_R1.HeightMap; -import net.minecraft.server.v1_16_R1.IBlockData; -import net.minecraft.server.v1_16_R1.LightEngine; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.NBTTagInt; -import net.minecraft.server.v1_16_R1.NibbleArray; -import net.minecraft.server.v1_16_R1.SectionPosition; -import net.minecraft.server.v1_16_R1.TileEntity; -import net.minecraft.server.v1_16_R1.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.block.CraftBlock; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.jetbrains.annotations.NotNull; - -import java.util.AbstractSet; -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.function.Function; -import javax.annotation.Nullable; - -public class BukkitGetBlocks_1_16_1 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 LazyCompoundTag_1_16_1(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - public ChunkSection[] sections; - public Chunk nmsChunk; - public WorldServer world; - public int chunkX; - public int chunkZ; - public NibbleArray[] blockLight = new NibbleArray[16]; - public NibbleArray[] skyLight = new NibbleArray[16]; - private boolean createCopy = false; - private BukkitGetBlocks_1_16_1_Copy copy = null; - private boolean forceLoadSections = true; - private boolean lightUpdate = false; - - public BukkitGetBlocks_1_16_1(World world, int chunkX, int chunkZ) { - this(((CraftWorld) world).getHandle(), chunkX, chunkZ); - } - - public BukkitGetBlocks_1_16_1(WorldServer world, int chunkX, int chunkZ) { - this.world = world; - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - - public int getChunkX() { - return chunkX; - } - - @Override - public void setCreateCopy(boolean createCopy) { - this.createCopy = createCopy; - } - - @Override - public boolean isCreateCopy() { - return createCopy; - } - - @Override - public IChunkGet getCopy() { - return copy; - } - - @Override - public void setLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.BLOCK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setSkyLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.SKY); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) { - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256); - bitArray.fromRaw(data); - getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(bitArray.getData()); - } - - public int getChunkZ() { - return chunkZ; - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeStorage index = getChunk().getBiomeIndex(); - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) { - break; - } - } - } else { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(base)) : null; - } - - @Override - public void removeSectionLighting(int layer, boolean sky) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - if (nibble != null) { - lightUpdate = true; - synchronized (nibble) { - byte[] bytes = PaperLib.isPaper() ? nibble.getIfSet() : nibble.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - if (sky) { - SectionPosition sectionPositionSky = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleSky = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPositionSky); - if (nibbleSky != null) { - lightUpdate = true; - synchronized (nibbleSky) { - byte[] bytes = PaperLib.isPaper() ? nibbleSky.getIfSet() : nibbleSky.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - } - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - TileEntity tileEntity = getChunk().getTileEntity(new BlockPosition((x & 15) + ( - chunkX << 4), y, (z & 15) + ( - chunkZ << 4))); - if (tileEntity == null) { - return null; - } - return new LazyCompoundTag_1_16_1(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - @Override - public Map getTiles() { - Map nmsTiles = getChunk().getTileEntities(); - 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; - if (skyLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.SKY, sectionPosition, nibbleArray, true); - } - skyLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return skyLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override public int getEmmittedLight(int x, int y, int z) { - int layer = y >> 4; - if (blockLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.BLOCK, sectionPosition, nibbleArray, true); - } - blockLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return blockLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override public int[] getHeightMap(HeightMapType type) { - long[] longArray = getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(); - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256, longArray); - return bitArray.toRaw(new int[256]); - } - - @Override - public CompoundTag getEntity(UUID uuid) { - Entity entity = world.getEntity(uuid); - if (entity != null) { - org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - for (List entry : getChunk().getEntitySlices()) { - if (entry != null) { - for (Entity ent : entry) { - if (uuid.equals(ent.getUniqueID())) { - org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - } - } - } - return null; - } - - @Override - public Set getEntities() { - List[] slices = getChunk().getEntitySlices(); - 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)) { - return false; - } - CompoundTag getTag = (CompoundTag) get; - 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.getUniqueID(); - if (uuid.equals(getUUID)) { - return true; - } - } - } - } - return false; - } - - @NotNull - @Override - public Iterator iterator() { - Iterable result = Iterables.transform(Iterables.concat(slices), new com.google.common.base.Function() { - @Nullable - @Override - public CompoundTag apply(@Nullable Entity input) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - return (CompoundTag) adapter.toNative(input.save(tag)); - } - }); - return result.iterator(); - } - }; - } - - private void updateGet(BukkitGetBlocks_1_16_1 get, Chunk nmsChunk, ChunkSection[] chunkSections, ChunkSection section, char[] arr, int layer) { - synchronized (get) { - if (this.getChunk() != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); - this.reset(); - } - if (this.sections == null) { - this.sections = new ChunkSection[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 ChunkSection[]{section}.clone()[0]; - } - this.blocks[layer] = arr; - } - } - - private void removeEntity(Entity entity) { - entity.die(); - } - - public Chunk ensureLoaded(net.minecraft.server.v1_16_R1.World nmsWorld, int chunkX, int chunkZ) { - return BukkitAdapter_1_16_1.ensureLoaded(nmsWorld, chunkX, chunkZ); - } - - @Override - public synchronized > T call(IChunkSet set, Runnable finalizer) { - forceLoadSections = false; - copy = createCopy ? new BukkitGetBlocks_1_16_1_Copy(world) : null; - try { - WorldServer nmsWorld = world; - Chunk 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 tiles = new HashMap<>(nmsChunk.getTileEntities()); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - final BlockPosition 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) { - TileEntity tile = entry.getValue(); - nmsChunk.removeTileEntity(tile.getPosition()); - if (createCopy) { - copy.storeTile(tile); - } - } - } - } - } - - int bitMask = 0; - synchronized (nmsChunk) { - ChunkSection[] sections = nmsChunk.getSections(); - - for (int layer = 0; layer < 16; layer++) { - if (!set.hasSection(layer)) { - continue; - } - - bitMask |= 1 << layer; - - char[] tmp = set.load(layer); - char[] setArr = new char[4096]; - System.arraycopy(tmp, 0, setArr, 0, 4096); - if (createCopy) { - char[] tmpLoad = loadPrivately(layer); - char[] copyArr = new char[4096]; - System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); - copy.storeSection(layer, copyArr); - } - - ChunkSection newSection; - ChunkSection existingSection = sections[layer]; - if (existingSection == null) { - newSection = BukkitAdapter_1_16_1.newChunkSection(layer, setArr, fastmode); - if (BukkitAdapter_1_16_1.setSectionAtomic(sections, null, newSection, layer)) { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - continue; - } else { - existingSection = sections[layer]; - if (existingSection == null) { - LOGGER.error("Skipping invalid null section. chunk:" + chunkX + "," + - chunkZ + " layer: " + layer); - continue; - } - } - } - BukkitAdapter_1_16_1.fieldTickingBlockCount.set(existingSection, (short) 0); - - //ensure that the server doesn't try to tick the chunksection while we're editing it. - DelegateLock lock = BukkitAdapter_1_16_1.applyLock(existingSection); - - synchronized (this) { - synchronized (lock) { - lock.untilFree(); - if (this.getChunk() != nmsChunk) { - this.nmsChunk = 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(layer))) { - this.reset(layer); - } else if (lock.isModified()) { - this.reset(layer); - } - newSection = BukkitAdapter_1_16_1 - .newChunkSection(layer, this::loadPrivately, setArr, fastmode); - if (!BukkitAdapter_1_16_1 - .setSectionAtomic(sections, existingSection, newSection, layer)) { - LOGGER.error("Failed to set chunk section:" + chunkX + "," + chunkZ + " layer: " + layer); - } else { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - BiomeStorage currentBiomes = nmsChunk.getBiomeIndex(); - 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) { - final Biome craftBiome = BukkitAdapter.adapt(biome); - BiomeBase nmsBiome = CraftBlock.biomeToBiomeBase(craftBiome); - currentBiomes.setBiome(x, y, z, nmsBiome); - } - } - } - } - } - - Map heightMaps = set.getHeightMaps(); - for (Map.Entry entry : heightMaps.entrySet()) { - BukkitGetBlocks_1_16_1.this.setHeightmapToGet(entry.getKey(), entry.getValue()); - } - BukkitGetBlocks_1_16_1.this.setLightingToGet(set.getLight()); - BukkitGetBlocks_1_16_1.this.setSkyLightingToGet(set.getSkyLight()); - - Runnable[] syncTasks = null; - - int bx = chunkX << 4; - int bz = chunkZ << 4; - - Set entityRemoves = set.getEntityRemoves(); - if (entityRemoves != null && !entityRemoves.isEmpty()) { - syncTasks = new Runnable[3]; - - syncTasks[2] = () -> { - final List[] entities = nmsChunk.getEntitySlices(); - - 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.getUniqueID())) { - 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] = () -> { - 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.debug("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(); - - EntityTypes type = EntityTypes.a(id).orElse(null); - if (type != null) { - Entity entity = type.a(nmsWorld); - if (entity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - entity.load(tag); - entity.setLocation(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 BlockPosition pos = new BlockPosition(x, y, z); - - synchronized (nmsWorld) { - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity == null || tileEntity.isRemoved()) { - nmsWorld.removeTileEntity(pos); - tileEntity = nmsWorld.getTileEntity(pos); - } - if (tileEntity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), 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.d(true); // Set Modified - nmsChunk.mustNotSave = false; - nmsChunk.markDirty(); - // 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 - 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 synchronized char[] loadPrivately(int layer) { - if (super.blocks[layer] != null) { - char[] blocks = new char[4096]; - System.arraycopy(super.blocks[layer], 0, blocks, 0, 4096); - return blocks; - } else { - return BukkitGetBlocks_1_16_1.this.update(layer, null, true); - } - } - - @Override - public synchronized void send(int mask, boolean lighting) { - BukkitAdapter_1_16_1.sendChunk(world, chunkX, chunkZ, mask, lighting); - } - - @Override - public synchronized char[] update(int layer, char[] data, boolean aggressive) { - ChunkSection 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 == FaweCache.IMP.EMPTY_CHAR_4096) { - data = new char[4096]; - Arrays.fill(data, (char) 1); - } - DelegateLock lock = BukkitAdapter_1_16_1.applyLock(section); - synchronized (lock) { - lock.untilFree(); - lock.setModified(false); - // Efficiently convert ChunkSection to raw data - try { - FAWE_Spigot_v1_16_R1 adapter = ((FAWE_Spigot_v1_16_R1) WorldEditPlugin.getInstance().getBukkitImplAdapter()); - - final DataPaletteBlock blocks = section.getBlocks(); - final DataBits bits = (DataBits) BukkitAdapter_1_16_1.fieldBits.get(blocks); - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_1.fieldPalette.get(blocks); - - final int bitsPerEntry = (int) BukkitAdapter_1_16_1.fieldBitsPerEntry.get(bits); - final long[] blockStates = bits.a(); - - new BitArrayUnstretched(bitsPerEntry, 4096, blockStates).toRaw(data); - - int num_palette; - if (palette instanceof DataPaletteLinear) { - num_palette = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - num_palette = ((DataPaletteHash) palette).b(); - } else { - num_palette = 0; - int[] paletteToBlockInts = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - char[] paletteToBlockChars = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); - try { - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char ordinal = paletteToBlockChars[paletteVal]; - if (ordinal == Character.MAX_VALUE) { - paletteToBlockInts[num_palette++] = paletteVal; - IBlockData ibd = palette.a(data[i]); - if (ibd == null) { - ordinal = BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - ordinal = adapter.adaptToChar(ibd); - } - paletteToBlockChars[paletteVal] = ordinal; - } - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } - data[i] = ordinal; - } - } finally { - for (int i = 0; i < num_palette; i++) { - int paletteVal = paletteToBlockInts[i]; - paletteToBlockChars[paletteVal] = Character.MAX_VALUE; - } - } - 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.a(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.a(i), adapter); - paletteToOrdinal[i] = val; - } - // Don't read "empty". - if (val == 0) { - val = 1; - } - data[i] = val; - } - } else { - char ordinal = ordinal(palette.a(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 e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - private final char ordinal(IBlockData ibd, FAWE_Spigot_v1_16_R1 adapter) { - if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - return adapter.adaptToChar(ibd); - } - } - - public ChunkSection[] getSections(boolean force) { - force &= forceLoadSections; - ChunkSection[] tmp = sections; - if (tmp == null || force) { - synchronized (this) { - tmp = sections; - if (tmp == null || force) { - ChunkSection[] chunkSections = getChunk().getSections(); - tmp = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, tmp, 0, chunkSections.length); - sections = tmp; - } - } - } - return tmp; - } - - public Chunk getChunk() { - Chunk tmp = nmsChunk; - if (tmp == null) { - synchronized (this) { - tmp = nmsChunk; - if (tmp == null) { - nmsChunk = tmp = ensureLoaded(this.world, chunkX, chunkZ); - } - } - } - return tmp; - } - - private void fillLightNibble(char[][] light, EnumSkyBlock skyBlock) { - for (int Y = 0; Y < 16; Y++) { - if (light[Y] == null) { - continue; - } - SectionPosition sectionPosition = SectionPosition.a(nmsChunk.getPos(), Y); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(skyBlock).a(sectionPosition); - if (nibble == null) { - byte[] a = new byte[2048]; - Arrays.fill(a, skyBlock == EnumSkyBlock.SKY ? (byte) 15 : (byte) 0); - nibble = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(skyBlock, sectionPosition, nibble, true); - } - synchronized (nibble) { - for (int i = 0; i < 4096; i++) { - if (light[Y][i] < 16) { - nibble.a(i, light[Y][i]); - } - } - } - } - } - - @Override - public boolean hasSection(int layer) { - return getSections(false)[layer] != null; - } - - @Override - public boolean trim(boolean aggressive) { - skyLight = new NibbleArray[16]; - blockLight = new NibbleArray[16]; - if (aggressive) { - sections = null; - nmsChunk = null; - return super.trim(true); - } else { - for (int i = 0; i < 16; i++) { - if (!hasSection(i) || !super.sections[i].isFull()) { - continue; - } - ChunkSection existing = getSections(true)[i]; - try { - final DataPaletteBlock blocksExisting = existing.getBlocks(); - - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_1.fieldPalette.get(blocksExisting); - int paletteSize; - - if (palette instanceof DataPaletteLinear) { - paletteSize = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - paletteSize = ((DataPaletteHash) palette).b(); - } 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1_Copy.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1_Copy.java deleted file mode 100644 index b2f1037d0..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1_Copy.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.nbt.LazyCompoundTag_1_16_1; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -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.v1_16_R1.BiomeBase; -import net.minecraft.server.v1_16_R1.BiomeStorage; -import net.minecraft.server.v1_16_R1.Entity; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.TileEntity; -import net.minecraft.server.v1_16_R1.WorldServer; -import org.bukkit.craftbukkit.v1_16_R1.block.CraftBlock; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Range; - -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 BukkitGetBlocks_1_16_1_Copy implements IChunkGet { - - private final Map tiles = new HashMap<>(); - private final Set entities = new HashSet<>(); - private BiomeStorage biomeStorage; - private final char[][] blocks = new char[16][]; - private final WorldServer world; - - protected BukkitGetBlocks_1_16_1_Copy(WorldServer world) { - this.world = world; - } - - protected void storeTile(TileEntity tile) { - tiles.put(BlockVector3.at(tile.getPosition().getX(), tile.getPosition().getY(), tile.getPosition().getZ()), - new LazyCompoundTag_1_16_1(Suppliers.memoize(() -> tile.save(new NBTTagCompound())))); - } - - @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) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - entities.add((CompoundTag) adapter.toNative(entity.save(tag))); - } - - @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 void setCreateCopy(boolean createCopy) { - - } - - @Override - public boolean isCreateCopy() { - return false; - } - - @Override - public void setLightingToGet(char[][] lighting) {} - - @Override - public void setSkyLightingToGet(char[][] lighting) {} - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) {} - - protected void storeBiomes(BiomeStorage biomeStorage) { - this.biomeStorage = new BiomeStorage(BukkitAdapter_1_16_1.getBiomeArray(biomeStorage).clone()); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) break; - } - } else { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(base)) : 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; - } - - 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(@Range(from = 0, to = 15) int layer) { - return blocks[layer] != null; - } - - @Override - public char[] load(int layer) { - 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 getEmmittedLight(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; - 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/FAWEWorldNativeAccess_1_16_R1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/FAWEWorldNativeAccess_1_16_R1.java deleted file mode 100644 index 5032c15eb..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/FAWEWorldNativeAccess_1_16_R1.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.TaskManager; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R1; -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.server.v1_16_R1.Block; -import net.minecraft.server.v1_16_R1.BlockPosition; -import net.minecraft.server.v1_16_R1.Chunk; -import net.minecraft.server.v1_16_R1.ChunkProviderServer; -import net.minecraft.server.v1_16_R1.EnumDirection; -import net.minecraft.server.v1_16_R1.IBlockData; -import net.minecraft.server.v1_16_R1.MinecraftServer; -import net.minecraft.server.v1_16_R1.NBTBase; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.PlayerChunk; -import net.minecraft.server.v1_16_R1.TileEntity; -import net.minecraft.server.v1_16_R1.World; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.block.data.CraftBlockData; -import org.bukkit.event.block.BlockPhysicsEvent; - -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; -import javax.annotation.Nullable; - -public class FAWEWorldNativeAccess_1_16_R1 implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - - private final FAWE_Spigot_v1_16_R1 adapter; - private final WeakReference world; - private SideEffectSet sideEffectSet; - private final AtomicInteger lastTick; - private final Set cachedChanges = new HashSet<>(); - private final Set cachedChunksToSend = new HashSet<>(); - - public FAWEWorldNativeAccess_1_16_R1(FAWE_Spigot_v1_16_R1 adapter, WeakReference world) { - this.adapter = adapter; - this.world = world; - // 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 World getWorld() { - return Objects.requireNonNull(world.get(), "The reference to the world was lost"); - } - - @Override - public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { - this.sideEffectSet = sideEffectSet; - } - - @Override - public Chunk getChunk(int x, int z) { - return getWorld().getChunkAt(x, z); - } - - @Override - public IBlockData toNative(BlockState state) { - int stateId = adapter.ordinalToIbdID(state.getOrdinalChar()); - return BlockStateIdAccess.isValidInternalId(stateId) - ? Block.getByCombinedId(stateId) - : ((CraftBlockData) BukkitAdapter.adapt(state)).getState(); - } - - @Override - public IBlockData getBlockState(Chunk chunk, BlockPosition position) { - return chunk.getType(position); - } - - @Nullable - @Override - public synchronized IBlockData setBlockState(Chunk chunk, BlockPosition position, IBlockData state) { - int currentTick = MinecraftServer.currentTick; - if (Fawe.isMainThread()) { - return chunk.setType(position, state, - 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(chunk, position, state)); - cachedChunksToSend.add(new IntPair(chunk.bukkitChunk.getX(), chunk.bukkitChunk.getZ())); - boolean nextTick = lastTick.get() > currentTick; - if (nextTick || cachedChanges.size() >= 1024) { - if (nextTick) { - lastTick.set(currentTick); - } - flushAsync(nextTick); - } - return state; - } - - - @Override - public IBlockData getValidBlockForPosition(IBlockData block, BlockPosition position) { - return Block.b(block, getWorld(), position); - } - - @Override - public BlockPosition getPosition(int x, int y, int z) { - return new BlockPosition(x, y, z); - } - - @Override - public void updateLightingForBlock(BlockPosition position) { - getWorld().getChunkProvider().getLightEngine().a(position); - } - - @Override - public boolean updateTileEntity(BlockPosition position, CompoundTag tag) { - // We will assume that the tile entity was created for us, - // though we do not do this on the other versions - TileEntity tileEntity = getWorld().getTileEntity(position); - if (tileEntity == null) { - return false; - } - NBTBase nativeTag = adapter.fromNative(tag); - tileEntity.load(tileEntity.getBlock(), (NBTTagCompound) nativeTag); - return true; - } - - @Override - public void notifyBlockUpdate(BlockPosition position, IBlockData oldState, IBlockData newState) { - getWorld().notify(position, oldState, newState, UPDATE | NOTIFY); - } - - @Override - public boolean isChunkTicking(Chunk chunk) { - return chunk.getState().isAtLeast(PlayerChunk.State.TICKING); - } - - @Override - public void markBlockChanged(BlockPosition position) { - ((ChunkProviderServer) getWorld().getChunkProvider()).flagDirty(position); - } - - private static final EnumDirection[] NEIGHBOUR_ORDER = { - EnumDirection.WEST, EnumDirection.EAST, - EnumDirection.DOWN, EnumDirection.UP, - EnumDirection.NORTH, EnumDirection.SOUTH - }; - - @Override - public void notifyNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState) { - World world = getWorld(); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - world.update(pos, oldState.getBlock()); - } else { - // When we don't want events, manually run the physics without them. - // Un-nest neighbour updating - for (EnumDirection direction : NEIGHBOUR_ORDER) { - BlockPosition shifted = pos.shift(direction); - world.getType(shifted).doPhysics(world, shifted, oldState.getBlock(), pos, false); - } - } - if (newState.isComplexRedstone()) { - world.updateAdjacentComparators(pos, newState.getBlock()); - } - } - - @Override - public void updateNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState, int recursionLimit) { - World world = getWorld(); - // a == updateNeighbors - // b == updateDiagonalNeighbors - oldState.b(world, pos, NOTIFY, recursionLimit); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - CraftWorld craftWorld = world.getWorld(); - if (craftWorld != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(craftWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), CraftBlockData.fromData(newState)); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - } - newState.a(world, pos, NOTIFY, recursionLimit); - newState.b(world, pos, NOTIFY, recursionLimit); - } - - @Override - public void onBlockStateChange(BlockPosition pos, IBlockData oldState, IBlockData newState) { - getWorld().a(pos, oldState, newState); - } - - private synchronized void flushAsync(final boolean sendChunks) { - final Set changes = Collections.unmodifiableSet(new HashSet<>(cachedChanges)); - cachedChanges.clear(); - final Set toSend; - if (sendChunks) { - toSend = Collections.unmodifiableSet(new HashSet<>(cachedChunksToSend)); - cachedChunksToSend.clear(); - } else { - toSend = Collections.emptySet(); - } - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - changes.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - if (!sendChunks) { - return; - } - for (IntPair chunk : toSend) { - BukkitAdapter_1_16_1.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - TaskManager.IMP.async(() -> TaskManager.IMP.sync(r)); - } - - @Override - public synchronized void flush() { - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - cachedChanges.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - for (IntPair chunk : cachedChunksToSend) { - BukkitAdapter_1_16_1.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - if (Fawe.isMainThread()) { - r.run(); - } else { - TaskManager.IMP.sync(r); - } - cachedChanges.clear(); - cachedChunksToSend.clear(); - } - - private static final class CachedChange { - - private final Chunk chunk; - private final BlockPosition position; - private final IBlockData blockData; - - private CachedChange(Chunk chunk, BlockPosition position, IBlockData blockData) { - this.chunk = chunk; - this.position = position; - this.blockData = blockData; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/MapChunkUtil_1_16_1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/MapChunkUtil_1_16_1.java deleted file mode 100644 index 062f623ac..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/MapChunkUtil_1_16_1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1; - -import com.boydti.fawe.bukkit.adapter.MapChunkUtil; -import net.minecraft.server.v1_16_R1.PacketPlayOutMapChunk; - -public class MapChunkUtil_1_16_1 extends MapChunkUtil { - public MapChunkUtil_1_16_1() throws NoSuchFieldException { - fieldX = PacketPlayOutMapChunk.class.getDeclaredField("a"); - fieldZ = PacketPlayOutMapChunk.class.getDeclaredField("b"); - fieldBitMask = PacketPlayOutMapChunk.class.getDeclaredField("c"); - fieldHeightMap = PacketPlayOutMapChunk.class.getDeclaredField("d"); - fieldChunkData = PacketPlayOutMapChunk.class.getDeclaredField("f"); - fieldBlockEntities = PacketPlayOutMapChunk.class.getDeclaredField("g"); - fieldFull = PacketPlayOutMapChunk.class.getDeclaredField("h"); - fieldX.setAccessible(true); - fieldZ.setAccessible(true); - fieldBitMask.setAccessible(true); - fieldHeightMap.setAccessible(true); - fieldChunkData.setAccessible(true); - fieldBlockEntities.setAccessible(true); - fieldFull.setAccessible(true); - } - - @Override - public PacketPlayOutMapChunk createPacket() { - return new PacketPlayOutMapChunk(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/nbt/LazyCompoundTag_1_16_1.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/nbt/LazyCompoundTag_1_16_1.java deleted file mode 100644 index cb77adb38..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/nbt/LazyCompoundTag_1_16_1.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_1.nbt; - -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.WorldEditPlugin; -import net.minecraft.server.v1_16_R1.NBTBase; -import net.minecraft.server.v1_16_R1.NBTNumber; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.NBTTagList; - -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 LazyCompoundTag_1_16_1 extends CompoundTag { - - private final Supplier nmsTag; - private CompoundTag cachedValue; - - public LazyCompoundTag_1_16_1(Supplier tag) { - super(new HashMap<>()); - this.nmsTag = tag; - } - - public LazyCompoundTag_1_16_1(NBTTagCompound tag) { - this(() -> tag); - } - - public NBTTagCompound get() { - return nmsTag.get(); - } - - @Override - public Map getValue() { - if (cachedValue == null) { - cachedValue = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(nmsTag.get()); - } - return cachedValue.getValue(); - } - - public boolean containsKey(String key) { - return nmsTag.get().hasKey(key); - } - - public byte[] getByteArray(String key) { - return nmsTag.get().getByteArray(key); - } - - public byte getByte(String key) { - return nmsTag.get().getByte(key); - } - - public double getDouble(String key) { - return nmsTag.get().getDouble(key); - } - - public double asDouble(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asDouble(); - } - return 0; - } - - public float getFloat(String key) { - return nmsTag.get().getFloat(key); - } - - public int[] getIntArray(String key) { - return nmsTag.get().getIntArray(key); - } - - public int getInt(String key) { - return nmsTag.get().getInt(key); - } - - public int asInt(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asInt(); - } - return 0; - } - - public List getList(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - ArrayList list = new ArrayList<>(); - NBTTagList nbtList = (NBTTagList) tag; - for (NBTBase elem : nbtList) { - if (elem instanceof NBTTagCompound) { - list.add(new LazyCompoundTag_1_16_1((NBTTagCompound) elem)); - } else { - list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); - } - } - return list; - } - return Collections.emptyList(); - } - - public ListTag getListTag(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - 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 nmsTag.get().getLongArray(key); - } - - public long getLong(String key) { - return nmsTag.get().getLong(key); - } - - public long asLong(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asLong(); - } - return 0; - } - - public short getShort(String key) { - return nmsTag.get().getShort(key); - } - - public String getString(String key) { - return nmsTag.get().getString(key); - } - - @Override - public String toString() { - return nmsTag.get().toString(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BlockMaterial_1_16_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BlockMaterial_1_16_2.java deleted file mode 100644 index 00f8be486..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BlockMaterial_1_16_2.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - -import com.boydti.fawe.bukkit.adapter.mc1_16_2.nbt.LazyCompoundTag_1_16_2; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.util.ReflectionUtil; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_16_R2.Block; -import net.minecraft.server.v1_16_R2.BlockAccessAir; -import net.minecraft.server.v1_16_R2.BlockBase; -import net.minecraft.server.v1_16_R2.BlockPosition; -import net.minecraft.server.v1_16_R2.EnumPistonReaction; -import net.minecraft.server.v1_16_R2.IBlockData; -import net.minecraft.server.v1_16_R2.ITileEntity; -import net.minecraft.server.v1_16_R2.Material; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.TileEntity; -import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData; - -public class BlockMaterial_1_16_2 implements BlockMaterial { - private final Block block; - private final IBlockData defaultState; - private final Material material; - private final boolean isTranslucent; - private final CraftBlockData craftBlockData; - private final org.bukkit.Material craftMaterial; - private final int opacity; - private final CompoundTag tile; - - public BlockMaterial_1_16_2(Block block) { - this(block, block.getBlockData()); - } - - public BlockMaterial_1_16_2(Block block, IBlockData defaultState) { - this.block = block; - this.defaultState = defaultState; - this.material = defaultState.getMaterial(); - this.craftBlockData = CraftBlockData.fromData(defaultState); - this.craftMaterial = craftBlockData.getMaterial(); - BlockBase.Info blockInfo = ReflectionUtil.getField(BlockBase.class, block, "aB"); - this.isTranslucent = !(boolean)ReflectionUtil.getField(BlockBase.Info.class, blockInfo, "n"); - opacity = defaultState.b(BlockAccessAir.INSTANCE, BlockPosition.ZERO); - TileEntity tileEntity = !block.isTileEntity() ? null : ((ITileEntity)block).createTile(null); - tile = tileEntity == null ? null : new LazyCompoundTag_1_16_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - public Block getBlock() { - return block; - } - - public IBlockData getState() { - return defaultState; - } - - public CraftBlockData getCraftBlockData() { - return craftBlockData; - } - - public Material getMaterial() { - return material; - } - - @Override - public boolean isAir() { - return defaultState.isAir(); - } - - @Override - public boolean isFullCube() { - return craftMaterial.isOccluding(); - } - - @Override - public boolean isOpaque() { - return material.f(); - } - - @Override - public boolean isPowerSource() { - return defaultState.isPowerSource(); - } - - @Override - public boolean isLiquid() { - return material.isLiquid(); - } - - @Override - public boolean isSolid() { - return material.isBuildable(); - } - - @Override - public float getHardness() { - return craftBlockData.getState().strength; - } - - @Override - public float getResistance() { - return block.getDurability(); - } - - @Override - public float getSlipperiness() { - return block.getFrictionFactor(); - } - - @Override - public int getLightValue() { - return defaultState.f(); - } - - @Override - public int getLightOpacity() { - return opacity; - } - - @Override - public boolean isFragileWhenPushed() { - return material.getPushReaction() == EnumPistonReaction.DESTROY; - } - - @Override - public boolean isUnpushable() { - return material.getPushReaction() == EnumPistonReaction.BLOCK; - } - - @Override - public boolean isTicksRandomly() { - return block.isTicking(defaultState); - } - - @Override - public boolean isMovementBlocker() { - return material.isSolid(); - } - - @Override - public boolean isBurnable() { - return material.isBurnable(); - } - - @Override - public boolean isToolRequired() { - //TODO Removed in 1.16.1 Replacement not found. - return true; - } - - @Override - public boolean isReplacedDuringPlacement() { - return material.isReplaceable(); - } - - @Override - public boolean isTranslucent() { - return isTranslucent; - } - - @Override - public boolean hasContainer() { - return block instanceof ITileEntity; - } - - @Override - public boolean isTile() { - return block.isTileEntity(); - } - - @Override - public CompoundTag getDefaultTile() { - return tile; - } - - @Override - public int getMapColor() { - return material.h().rgb; - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitAdapter_1_16_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitAdapter_1_16_2.java deleted file mode 100644 index 7f013d5c7..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitAdapter_1_16_2.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.UnsafeUtility; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import io.papermc.lib.PaperLib; -import net.minecraft.server.v1_16_R2.BiomeBase; -import net.minecraft.server.v1_16_R2.BiomeStorage; -import net.minecraft.server.v1_16_R2.Block; -import net.minecraft.server.v1_16_R2.Chunk; -import net.minecraft.server.v1_16_R2.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R2.ChunkSection; -import net.minecraft.server.v1_16_R2.DataBits; -import net.minecraft.server.v1_16_R2.DataPalette; -import net.minecraft.server.v1_16_R2.DataPaletteBlock; -import net.minecraft.server.v1_16_R2.DataPaletteLinear; -import net.minecraft.server.v1_16_R2.GameProfileSerializer; -import net.minecraft.server.v1_16_R2.IBlockData; -import net.minecraft.server.v1_16_R2.PacketPlayOutLightUpdate; -import net.minecraft.server.v1_16_R2.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R2.PlayerChunk; -import net.minecraft.server.v1_16_R2.PlayerChunkMap; -import net.minecraft.server.v1_16_R2.World; -import net.minecraft.server.v1_16_R2.WorldServer; -import org.bukkit.craftbukkit.v1_16_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -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.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Function; - -public final class BukkitAdapter_1_16_2 extends NMSAdapter { - /* - NMS fields - */ - public static final Field fieldBits; - public static final Field fieldPalette; - public static final Field fieldSize; - - public static final Field fieldBitsPerEntry; - - public static final Field fieldFluidCount; - public static final Field fieldTickingBlockCount; - public static final Field fieldNonEmptyBlockCount; - - private static final Field fieldBiomeArray; - - 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; - - static { - try { - fieldSize = DataPaletteBlock.class.getDeclaredField("i"); - fieldSize.setAccessible(true); - fieldBits = DataPaletteBlock.class.getDeclaredField("a"); - fieldBits.setAccessible(true); - fieldPalette = DataPaletteBlock.class.getDeclaredField("h"); - fieldPalette.setAccessible(true); - - fieldBitsPerEntry = DataBits.class.getDeclaredField("c"); - fieldBitsPerEntry.setAccessible(true); - - fieldFluidCount = ChunkSection.class.getDeclaredField("e"); - fieldFluidCount.setAccessible(true); - fieldTickingBlockCount = ChunkSection.class.getDeclaredField("tickingBlockCount"); - fieldTickingBlockCount.setAccessible(true); - fieldNonEmptyBlockCount = ChunkSection.class.getDeclaredField("nonEmptyBlockCount"); - fieldNonEmptyBlockCount.setAccessible(true); - - fieldBiomeArray = BiomeStorage.class.getDeclaredField("h"); - fieldBiomeArray.setAccessible(true); - - Method declaredGetVisibleChunk = PlayerChunkMap.class.getDeclaredMethod("getVisibleChunk", long.class); - declaredGetVisibleChunk.setAccessible(true); - methodGetVisibleChunk = MethodHandles.lookup().unreflect(declaredGetVisibleChunk); - - Unsafe unsafe = UnsafeUtility.getUNSAFE(); - fieldLock = DataPaletteBlock.class.getDeclaredField("j"); - fieldLockOffset = unsafe.objectFieldOffset(fieldLock); - - CHUNKSECTION_BASE = unsafe.arrayBaseOffset(ChunkSection[].class); - int scale = unsafe.arrayIndexScale(ChunkSection[].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); - } - } - - protected static boolean setSectionAtomic(ChunkSection[] sections, ChunkSection expected, ChunkSection value, int layer) { - long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; - if (layer >= 0 && layer < sections.length) { - return UnsafeUtility.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); - } - return false; - } - - protected static DelegateLock applyLock(ChunkSection 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 = UnsafeUtility.getUNSAFE(); - DataPaletteBlock blocks = section.getBlocks(); - ReentrantLock currentLock = (ReentrantLock) unsafe.getObject(blocks, fieldLockOffset); - if (currentLock instanceof DelegateLock) { - return (DelegateLock) currentLock; - } - DelegateLock newLock = new DelegateLock(currentLock); - unsafe.putObject(blocks, fieldLockOffset, newLock); - return newLock; - } - } catch (Throwable e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static Chunk ensureLoaded(World nmsWorld, int chunkX, int chunkZ) { - Chunk nmsChunk = nmsWorld.getChunkProvider().getChunkAt(chunkX, chunkZ, false); - if (nmsChunk != null) { - return nmsChunk; - } - if (Fawe.isMainThread()) { - return nmsWorld.getChunkAt(chunkX, chunkZ); - } - if (PaperLib.isPaper()) { - CraftWorld craftWorld = nmsWorld.getWorld(); - CompletableFuture future = craftWorld.getChunkAtAsync(chunkX, chunkZ, true); - try { - CraftChunk chunk = (CraftChunk) future.get(); - return chunk.getHandle(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - // TODO optimize - return TaskManager.IMP.sync(() -> nmsWorld.getChunkAt(chunkX, chunkZ)); - } - - public static PlayerChunk getPlayerChunk(WorldServer nmsWorld, final int chunkX, final int chunkZ) { - PlayerChunkMap chunkMap = nmsWorld.getChunkProvider().playerChunkMap; - try { - return (PlayerChunk) methodGetVisibleChunk.invoke(chunkMap, ChunkCoordIntPair.pair(chunkX, chunkZ)); - } catch (Throwable thr) { - throw new RuntimeException(thr); - } - } - - public static void sendChunk(WorldServer nmsWorld, int chunkX, int chunkZ, int mask, boolean lighting) { - PlayerChunk playerChunk = getPlayerChunk(nmsWorld, chunkX, chunkZ); - if (playerChunk == null) { - return; - } - ChunkCoordIntPair chunkCoordIntPair = new ChunkCoordIntPair(chunkX, chunkZ); - Optional optional = ((Either) playerChunk.a().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); - Chunk chunk = optional.orElseGet(() -> - nmsWorld.getChunkProvider().getChunkAtIfLoadedImmediately(chunkX, chunkZ)); - if (chunk == null) { - return; - } - PacketPlayOutMapChunk chunkPacket = new PacketPlayOutMapChunk(chunk, 65535); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(chunkPacket); - }); - if (lighting) { - //This needs to be true otherwise Minecraft will update lighting from/at the chunk edges (bad) - boolean trustEdges = true; - PacketPlayOutLightUpdate packet = - new PacketPlayOutLightUpdate(chunkCoordIntPair, nmsWorld.getChunkProvider().getLightEngine(), - trustEdges); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(packet); - }); - } - } - - /* - NMS conversion - */ - public static ChunkSection newChunkSection(final int layer, final char[] blocks, boolean fastmode) { - return newChunkSection(layer, null, blocks, fastmode); - } - - public static ChunkSection newChunkSection(final int layer, final Function get, char[] set, boolean fastmode) { - 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); - } else { - air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, - num_palette_buffer, get, set, ticking_blocks, fastmode); - } - 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 - } - - 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); - } - - ChunkSection section = newChunkSection(layer); - // set palette & data bits - final DataPaletteBlock dataPaletteBlocks = section.getBlocks(); - // private DataPalette h; - // protected DataBits a; - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final DataBits nmsBits = new DataBits(bitsPerEntry, 4096, bits); - final DataPalette palette; - palette = new DataPaletteLinear<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::c); - - // set palette - 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 IBlockData ibd = ((BlockMaterial_1_16_2) state.getMaterial()).getState(); - palette.a(ibd); - } - try { - fieldBits.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, palette); - fieldSize.set(dataPaletteBlocks, bitsPerEntry); - setCount(ticking_blocks.size(), 4096 - air, section); - if (!fastmode) { - ticking_blocks.forEach((pos, ordinal) -> section - .setType(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), - Block.getByCombinedId(ordinal))); - } - } catch (final IllegalAccessException e) { - throw new RuntimeException(e); - } - - return section; - } catch (final Throwable e) { - Arrays.fill(blockToPalette, Integer.MAX_VALUE); - throw e; - } - } - - private static ChunkSection newChunkSection(int layer) { - return new ChunkSection(layer << 4); - } - - public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final ChunkSection section) throws IllegalAccessException { - fieldFluidCount.setShort(section, (short) 0); // TODO FIXME - fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); - fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); - } - - public static BiomeBase[] getBiomeArray(BiomeStorage storage) { - try { - return (BiomeBase[]) fieldBiomeArray.get(storage); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2.java deleted file mode 100644 index 4e502e3a4..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2.java +++ /dev/null @@ -1,920 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.BukkitGetBlocks; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.nbt.LazyCompoundTag_1_16_2; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.AdaptedMap; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -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.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R2; -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 net.minecraft.server.v1_16_R2.BiomeBase; -import net.minecraft.server.v1_16_R2.BiomeStorage; -import net.minecraft.server.v1_16_R2.BlockPosition; -import net.minecraft.server.v1_16_R2.Chunk; -import net.minecraft.server.v1_16_R2.ChunkSection; -import net.minecraft.server.v1_16_R2.DataBits; -import net.minecraft.server.v1_16_R2.DataPalette; -import net.minecraft.server.v1_16_R2.DataPaletteBlock; -import net.minecraft.server.v1_16_R2.DataPaletteHash; -import net.minecraft.server.v1_16_R2.DataPaletteLinear; -import net.minecraft.server.v1_16_R2.Entity; -import net.minecraft.server.v1_16_R2.EntityTypes; -import net.minecraft.server.v1_16_R2.EnumSkyBlock; -import net.minecraft.server.v1_16_R2.HeightMap; -import net.minecraft.server.v1_16_R2.IBlockData; -import net.minecraft.server.v1_16_R2.IRegistry; -import net.minecraft.server.v1_16_R2.LightEngine; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.NBTTagInt; -import net.minecraft.server.v1_16_R2.NibbleArray; -import net.minecraft.server.v1_16_R2.SectionPosition; -import net.minecraft.server.v1_16_R2.TileEntity; -import net.minecraft.server.v1_16_R2.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.AbstractSet; -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.function.Function; - -public class BukkitGetBlocks_1_16_2 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 LazyCompoundTag_1_16_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - public ChunkSection[] sections; - public Chunk nmsChunk; - public WorldServer world; - public int chunkX; - public int chunkZ; - public NibbleArray[] blockLight = new NibbleArray[16]; - public NibbleArray[] skyLight = new NibbleArray[16]; - private boolean createCopy = false; - private BukkitGetBlocks_1_16_2_Copy copy = null; - private boolean forceLoadSections = true; - private boolean lightUpdate = false; - - public BukkitGetBlocks_1_16_2(World world, int chunkX, int chunkZ) { - this(((CraftWorld) world).getHandle(), chunkX, chunkZ); - } - - public BukkitGetBlocks_1_16_2(WorldServer world, int chunkX, int chunkZ) { - this.world = world; - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public int getChunkX() { - return chunkX; - } - - @Override - public void setCreateCopy(boolean createCopy) { - this.createCopy = createCopy; - } - - @Override - public boolean isCreateCopy() { - return createCopy; - } - - @Override - public IChunkGet getCopy() { - return copy; - } - - @Override - public void setLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.BLOCK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setSkyLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.SKY); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) { - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256); - bitArray.fromRaw(data); - getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(bitArray.getData()); - } - - public int getChunkZ() { - return chunkZ; - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeStorage index = getChunk().getBiomeIndex(); - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) { - break; - } - } - } else { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(world.r().b(IRegistry.ay), base)) : null; - } - - @Override - public void removeSectionLighting(int layer, boolean sky) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - if (nibble != null) { - lightUpdate = true; - synchronized (nibble) { - byte[] bytes = PaperLib.isPaper() ? nibble.getIfSet() : nibble.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - if (sky) { - SectionPosition sectionPositionSky = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleSky = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPositionSky); - if (nibbleSky != null) { - lightUpdate = true; - synchronized (nibbleSky) { - byte[] bytes = PaperLib.isPaper() ? nibbleSky.getIfSet() : nibbleSky.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - } - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - TileEntity tileEntity = getChunk().getTileEntity(new BlockPosition((x & 15) + ( - chunkX << 4), y, (z & 15) + ( - chunkZ << 4))); - if (tileEntity == null) { - return null; - } - return new LazyCompoundTag_1_16_2(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - @Override - public Map getTiles() { - Map nmsTiles = getChunk().getTileEntities(); - 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; - if (skyLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.SKY, sectionPosition, nibbleArray, true); - } - skyLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return skyLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override - public int getEmmittedLight(int x, int y, int z) { - int layer = y >> 4; - if (blockLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.BLOCK, sectionPosition, nibbleArray, true); - } - blockLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return blockLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override - public int[] getHeightMap(HeightMapType type) { - long[] longArray = getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(); - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256, longArray); - return bitArray.toRaw(new int[256]); - } - - @Override - public CompoundTag getEntity(UUID uuid) { - Entity entity = world.getEntity(uuid); - if (entity != null) { - org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - for (List entry : getChunk().getEntitySlices()) { - if (entry != null) { - for (Entity ent : entry) { - if (uuid.equals(ent.getUniqueID())) { - org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - } - } - } - return null; - } - - @Override - public Set getEntities() { - List[] slices = getChunk().getEntitySlices(); - 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)) { - return false; - } - CompoundTag getTag = (CompoundTag) get; - 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.getUniqueID(); - if (uuid.equals(getUUID)) { - return true; - } - } - } - } - return false; - } - - @NotNull - @Override - public Iterator iterator() { - Iterable result = Iterables.transform(Iterables.concat(slices), new com.google.common.base.Function() { - @Nullable - @Override - public CompoundTag apply(@Nullable Entity input) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - return (CompoundTag) adapter.toNative(input.save(tag)); - } - }); - return result.iterator(); - } - }; - } - - private void updateGet(BukkitGetBlocks_1_16_2 get, Chunk nmsChunk, ChunkSection[] chunkSections, ChunkSection section, char[] arr, int layer) { - synchronized (get) { - if (this.getChunk() != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); - this.reset(); - } - if (this.sections == null) { - this.sections = new ChunkSection[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 ChunkSection[]{section}.clone()[0]; - } - this.blocks[layer] = arr; - } - } - - private void removeEntity(Entity entity) { - entity.die(); - } - - public Chunk ensureLoaded(net.minecraft.server.v1_16_R2.World nmsWorld, int chunkX, int chunkZ) { - return BukkitAdapter_1_16_2.ensureLoaded(nmsWorld, chunkX, chunkZ); - } - - @Override - public synchronized > T call(IChunkSet set, Runnable finalizer) { - forceLoadSections = false; - copy = createCopy ? new BukkitGetBlocks_1_16_2_Copy(world) : null; - try { - WorldServer nmsWorld = world; - Chunk 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 tiles = new HashMap<>(nmsChunk.getTileEntities()); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - final BlockPosition 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) { - TileEntity tile = entry.getValue(); - nmsChunk.removeTileEntity(tile.getPosition()); - if (createCopy) { - copy.storeTile(tile); - } - } - } - } - } - - int bitMask = 0; - synchronized (nmsChunk) { - ChunkSection[] sections = nmsChunk.getSections(); - - for (int layer = 0; layer < 16; layer++) { - if (!set.hasSection(layer)) { - continue; - } - - bitMask |= 1 << layer; - - char[] tmp = set.load(layer); - char[] setArr = new char[4096]; - System.arraycopy(tmp, 0, setArr, 0, 4096); - if (createCopy) { - char[] tmpLoad = loadPrivately(layer); - char[] copyArr = new char[4096]; - System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); - copy.storeSection(layer, copyArr); - } - - ChunkSection newSection; - ChunkSection existingSection = sections[layer]; - if (existingSection == null) { - newSection = BukkitAdapter_1_16_2.newChunkSection(layer, setArr, fastmode); - if (BukkitAdapter_1_16_2.setSectionAtomic(sections, null, newSection, layer)) { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - continue; - } else { - existingSection = sections[layer]; - if (existingSection == null) { - LOGGER.error("Skipping invalid null section. chunk:" + chunkX + "," - + chunkZ + " layer: " + layer); - continue; - } - } - } - BukkitAdapter_1_16_2.fieldTickingBlockCount.set(existingSection, (short) 0); - - //ensure that the server doesn't try to tick the chunksection while we're editing it. - DelegateLock lock = BukkitAdapter_1_16_2.applyLock(existingSection); - - synchronized (this) { - synchronized (lock) { - lock.untilFree(); - if (this.getChunk() != nmsChunk) { - this.nmsChunk = 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(layer))) { - this.reset(layer); - } else if (lock.isModified()) { - this.reset(layer); - } - newSection = BukkitAdapter_1_16_2 - .newChunkSection(layer, this::loadPrivately, setArr, fastmode); - if (!BukkitAdapter_1_16_2 - .setSectionAtomic(sections, existingSection, newSection, layer)) { - LOGGER.error("Failed to set chunk section:" + chunkX + "," + chunkZ + " layer: " + layer); - } else { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - BiomeStorage currentBiomes = nmsChunk.getBiomeIndex(); - 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) { - final Biome craftBiome = BukkitAdapter.adapt(biome); - BiomeBase nmsBiome = CraftBlock.biomeToBiomeBase(nmsWorld.r().b(IRegistry.ay), craftBiome); - currentBiomes.setBiome(x, y, z, nmsBiome); - } - } - } - } - } - - Map heightMaps = set.getHeightMaps(); - for (Map.Entry entry : heightMaps.entrySet()) { - BukkitGetBlocks_1_16_2.this.setHeightmapToGet(entry.getKey(), entry.getValue()); - } - BukkitGetBlocks_1_16_2.this.setLightingToGet(set.getLight()); - BukkitGetBlocks_1_16_2.this.setSkyLightingToGet(set.getSkyLight()); - - Runnable[] syncTasks = null; - - int bx = chunkX << 4; - int bz = chunkZ << 4; - - Set entityRemoves = set.getEntityRemoves(); - if (entityRemoves != null && !entityRemoves.isEmpty()) { - syncTasks = new Runnable[3]; - - syncTasks[2] = () -> { - final List[] entities = nmsChunk.getEntitySlices(); - - 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.getUniqueID())) { - 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] = () -> { - 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.debug("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(); - - EntityTypes type = EntityTypes.a(id).orElse(null); - if (type != null) { - Entity entity = type.a(nmsWorld); - if (entity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - entity.load(tag); - entity.setLocation(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 BlockPosition pos = new BlockPosition(x, y, z); - - synchronized (nmsWorld) { - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity == null || tileEntity.isRemoved()) { - nmsWorld.removeTileEntity(pos); - tileEntity = nmsWorld.getTileEntity(pos); - } - if (tileEntity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), 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.d(true); // Set Modified - nmsChunk.mustNotSave = false; - nmsChunk.markDirty(); - // 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 - 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 synchronized char[] loadPrivately(int layer) { - if (super.blocks[layer] != null) { - char[] blocks = new char[4096]; - System.arraycopy(super.blocks[layer], 0, blocks, 0, 4096); - return blocks; - } else { - return BukkitGetBlocks_1_16_2.this.update(layer, null, true); - } - } - - @Override - public synchronized void send(int mask, boolean lighting) { - BukkitAdapter_1_16_2.sendChunk(world, chunkX, chunkZ, mask, lighting); - } - - @Override - public synchronized char[] update(int layer, char[] data, boolean aggressive) { - ChunkSection 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 == FaweCache.IMP.EMPTY_CHAR_4096) { - data = new char[4096]; - Arrays.fill(data, (char) 1); - } - DelegateLock lock = BukkitAdapter_1_16_2.applyLock(section); - synchronized (lock) { - lock.untilFree(); - lock.setModified(false); - // Efficiently convert ChunkSection to raw data - try { - FAWE_Spigot_v1_16_R2 adapter = ((FAWE_Spigot_v1_16_R2) WorldEditPlugin.getInstance().getBukkitImplAdapter()); - - final DataPaletteBlock blocks = section.getBlocks(); - final DataBits bits = (DataBits) BukkitAdapter_1_16_2.fieldBits.get(blocks); - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_2.fieldPalette.get(blocks); - - final int bitsPerEntry = (int) BukkitAdapter_1_16_2.fieldBitsPerEntry.get(bits); - final long[] blockStates = bits.a(); - - new BitArrayUnstretched(bitsPerEntry, 4096, blockStates).toRaw(data); - - int num_palette; - if (palette instanceof DataPaletteLinear) { - num_palette = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - num_palette = ((DataPaletteHash) palette).b(); - } else { - num_palette = 0; - int[] paletteToBlockInts = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - char[] paletteToBlockChars = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); - try { - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char ordinal = paletteToBlockChars[paletteVal]; - if (ordinal == Character.MAX_VALUE) { - paletteToBlockInts[num_palette++] = paletteVal; - IBlockData ibd = palette.a(data[i]); - if (ibd == null) { - ordinal = BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - ordinal = adapter.adaptToChar(ibd); - } - paletteToBlockChars[paletteVal] = ordinal; - } - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } - data[i] = ordinal; - } - } finally { - for (int i = 0; i < num_palette; i++) { - int paletteVal = paletteToBlockInts[i]; - paletteToBlockChars[paletteVal] = Character.MAX_VALUE; - } - } - 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.a(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.a(i), adapter); - paletteToOrdinal[i] = val; - } - // Don't read "empty". - if (val == 0) { - val = 1; - } - data[i] = val; - } - } else { - char ordinal = ordinal(palette.a(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 e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - private final char ordinal(IBlockData ibd, FAWE_Spigot_v1_16_R2 adapter) { - if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - return adapter.adaptToChar(ibd); - } - } - - public ChunkSection[] getSections(boolean force) { - force &= forceLoadSections; - ChunkSection[] tmp = sections; - if (tmp == null || force) { - synchronized (this) { - tmp = sections; - if (tmp == null || force) { - ChunkSection[] chunkSections = getChunk().getSections(); - tmp = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, tmp, 0, chunkSections.length); - sections = tmp; - } - } - } - return tmp; - } - - public Chunk getChunk() { - Chunk tmp = nmsChunk; - if (tmp == null) { - synchronized (this) { - tmp = nmsChunk; - if (tmp == null) { - nmsChunk = tmp = ensureLoaded(this.world, chunkX, chunkZ); - } - } - } - return tmp; - } - - private void fillLightNibble(char[][] light, EnumSkyBlock skyBlock) { - for (int Y = 0; Y < 16; Y++) { - if (light[Y] == null) { - continue; - } - SectionPosition sectionPosition = SectionPosition.a(nmsChunk.getPos(), Y); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(skyBlock).a(sectionPosition); - if (nibble == null) { - byte[] a = new byte[2048]; - Arrays.fill(a, skyBlock == EnumSkyBlock.SKY ? (byte) 15 : (byte) 0); - nibble = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(skyBlock, sectionPosition, nibble, true); - } - synchronized (nibble) { - for (int i = 0; i < 4096; i++) { - if (light[Y][i] < 16) { - nibble.a(i, light[Y][i]); - } - } - } - } - } - - @Override - public boolean hasSection(int layer) { - return getSections(false)[layer] != null; - } - - @Override - public boolean trim(boolean aggressive) { - skyLight = new NibbleArray[16]; - blockLight = new NibbleArray[16]; - if (aggressive) { - sections = null; - nmsChunk = null; - return super.trim(true); - } else { - for (int i = 0; i < 16; i++) { - if (!hasSection(i) || !super.sections[i].isFull()) { - continue; - } - ChunkSection existing = getSections(true)[i]; - try { - final DataPaletteBlock blocksExisting = existing.getBlocks(); - - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_2.fieldPalette.get(blocksExisting); - int paletteSize; - - if (palette instanceof DataPaletteLinear) { - paletteSize = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - paletteSize = ((DataPaletteHash) palette).b(); - } 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2_Copy.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2_Copy.java deleted file mode 100644 index 688a492bb..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2_Copy.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.nbt.LazyCompoundTag_1_16_2; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -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.v1_16_R2.BiomeBase; -import net.minecraft.server.v1_16_R2.BiomeStorage; -import net.minecraft.server.v1_16_R2.Entity; -import net.minecraft.server.v1_16_R2.IRegistry; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.TileEntity; -import net.minecraft.server.v1_16_R2.WorldServer; -import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Range; - -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 BukkitGetBlocks_1_16_2_Copy implements IChunkGet { - - private final Map tiles = new HashMap<>(); - private final Set entities = new HashSet<>(); - private BiomeStorage biomeStorage; - private final char[][] blocks = new char[16][]; - private final WorldServer world; - - protected BukkitGetBlocks_1_16_2_Copy(WorldServer world) { - this.world = world; - } - - protected void storeTile(TileEntity tile) { - tiles.put(BlockVector3.at(tile.getPosition().getX(), tile.getPosition().getY(), tile.getPosition().getZ()), - new LazyCompoundTag_1_16_2(Suppliers.memoize(() -> tile.save(new NBTTagCompound())))); - } - - @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) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - entities.add((CompoundTag) adapter.toNative(entity.save(tag))); - } - - @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 void setCreateCopy(boolean createCopy) { - - } - - @Override - public boolean isCreateCopy() { - return false; - } - - @Override - public void setLightingToGet(char[][] lighting) {} - - @Override - public void setSkyLightingToGet(char[][] lighting) {} - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) {} - - protected void storeBiomes(BiomeStorage biomeStorage) { - this.biomeStorage = new BiomeStorage(biomeStorage.g, BukkitAdapter_1_16_2.getBiomeArray(biomeStorage).clone()); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) break; - } - } else { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(world.r().b(IRegistry.ay), base)) : 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; - } - - 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(@Range(from = 0, to = 15) int layer) { - return blocks[layer] != null; - } - - @Override - public char[] load(int layer) { - 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 getEmmittedLight(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; - 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/FAWEWorldNativeAccess_1_16_R2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/FAWEWorldNativeAccess_1_16_R2.java deleted file mode 100644 index e02b833d8..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/FAWEWorldNativeAccess_1_16_R2.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.TaskManager; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R2; -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.server.v1_16_R2.Block; -import net.minecraft.server.v1_16_R2.BlockPosition; -import net.minecraft.server.v1_16_R2.Chunk; -import net.minecraft.server.v1_16_R2.ChunkProviderServer; -import net.minecraft.server.v1_16_R2.EnumDirection; -import net.minecraft.server.v1_16_R2.IBlockData; -import net.minecraft.server.v1_16_R2.MinecraftServer; -import net.minecraft.server.v1_16_R2.NBTBase; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.PlayerChunk; -import net.minecraft.server.v1_16_R2.TileEntity; -import net.minecraft.server.v1_16_R2.World; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData; -import org.bukkit.event.block.BlockPhysicsEvent; - -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; -import javax.annotation.Nullable; - -public class FAWEWorldNativeAccess_1_16_R2 implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - - private final FAWE_Spigot_v1_16_R2 adapter; - private final WeakReference world; - private SideEffectSet sideEffectSet; - private final AtomicInteger lastTick; - private final Set cachedChanges = new HashSet<>(); - private final Set cachedChunksToSend = new HashSet<>(); - - public FAWEWorldNativeAccess_1_16_R2(FAWE_Spigot_v1_16_R2 adapter, WeakReference world) { - this.adapter = adapter; - this.world = world; - // 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 World getWorld() { - return Objects.requireNonNull(world.get(), "The reference to the world was lost"); - } - - @Override - public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { - this.sideEffectSet = sideEffectSet; - } - - @Override - public Chunk getChunk(int x, int z) { - return getWorld().getChunkAt(x, z); - } - - @Override - public IBlockData toNative(BlockState state) { - int stateId = adapter.ordinalToIbdID(state.getOrdinalChar()); - return BlockStateIdAccess.isValidInternalId(stateId) - ? Block.getByCombinedId(stateId) - : ((CraftBlockData) BukkitAdapter.adapt(state)).getState(); - } - - @Override - public IBlockData getBlockState(Chunk chunk, BlockPosition position) { - return chunk.getType(position); - } - - @Nullable - @Override - public synchronized IBlockData setBlockState(Chunk chunk, BlockPosition position, IBlockData state) { - int currentTick = MinecraftServer.currentTick; - if (Fawe.isMainThread()) { - return chunk.setType(position, state, - 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(chunk, position, state)); - cachedChunksToSend.add(new IntPair(chunk.bukkitChunk.getX(), chunk.bukkitChunk.getZ())); - boolean nextTick = lastTick.get() > currentTick; - if (nextTick || cachedChanges.size() >= 1024) { - if (nextTick) { - lastTick.set(currentTick); - } - flushAsync(nextTick); - } - return state; - } - - - @Override - public IBlockData getValidBlockForPosition(IBlockData block, BlockPosition position) { - return Block.b(block, getWorld(), position); - } - - @Override - public BlockPosition getPosition(int x, int y, int z) { - return new BlockPosition(x, y, z); - } - - @Override - public void updateLightingForBlock(BlockPosition position) { - getWorld().getChunkProvider().getLightEngine().a(position); - } - - @Override - public boolean updateTileEntity(BlockPosition position, CompoundTag tag) { - // We will assume that the tile entity was created for us, - // though we do not do this on the other versions - TileEntity tileEntity = getWorld().getTileEntity(position); - if (tileEntity == null) { - return false; - } - NBTBase nativeTag = adapter.fromNative(tag); - tileEntity.load(tileEntity.getBlock(), (NBTTagCompound) nativeTag); - return true; - } - - @Override - public void notifyBlockUpdate(BlockPosition position, IBlockData oldState, IBlockData newState) { - getWorld().notify(position, oldState, newState, UPDATE | NOTIFY); - } - - @Override - public boolean isChunkTicking(Chunk chunk) { - return chunk.getState().isAtLeast(PlayerChunk.State.TICKING); - } - - @Override - public void markBlockChanged(BlockPosition position) { - ((ChunkProviderServer) getWorld().getChunkProvider()).flagDirty(position); - } - - private static final EnumDirection[] NEIGHBOUR_ORDER = { - EnumDirection.WEST, EnumDirection.EAST, - EnumDirection.DOWN, EnumDirection.UP, - EnumDirection.NORTH, EnumDirection.SOUTH - }; - - @Override - public void notifyNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState) { - World world = getWorld(); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - world.update(pos, oldState.getBlock()); - } else { - // When we don't want events, manually run the physics without them. - // Un-nest neighbour updating - for (EnumDirection direction : NEIGHBOUR_ORDER) { - BlockPosition shifted = pos.shift(direction); - world.getType(shifted).doPhysics(world, shifted, oldState.getBlock(), pos, false); - } - } - if (newState.isComplexRedstone()) { - world.updateAdjacentComparators(pos, newState.getBlock()); - } - } - - @Override - public void updateNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState, int recursionLimit) { - World world = getWorld(); - // a == updateNeighbors - // b == updateDiagonalNeighbors - oldState.b(world, pos, NOTIFY, recursionLimit); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - CraftWorld craftWorld = world.getWorld(); - if (craftWorld != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(craftWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), CraftBlockData.fromData(newState)); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - } - newState.a(world, pos, NOTIFY, recursionLimit); - newState.b(world, pos, NOTIFY, recursionLimit); - } - - @Override - public void onBlockStateChange(BlockPosition pos, IBlockData oldState, IBlockData newState) { - getWorld().a(pos, oldState, newState); - } - - private synchronized void flushAsync(final boolean sendChunks) { - final Set changes = Collections.unmodifiableSet(new HashSet<>(cachedChanges)); - cachedChanges.clear(); - final Set toSend; - if (sendChunks) { - toSend = Collections.unmodifiableSet(new HashSet<>(cachedChunksToSend)); - cachedChunksToSend.clear(); - } else { - toSend = Collections.emptySet(); - } - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - changes.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - if (!sendChunks) { - return; - } - for (IntPair chunk : toSend) { - BukkitAdapter_1_16_2.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - TaskManager.IMP.async(() -> TaskManager.IMP.sync(r)); - } - - @Override - public synchronized void flush() { - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - cachedChanges.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - for (IntPair chunk : cachedChunksToSend) { - BukkitAdapter_1_16_2.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, 0, false); - } - } - }; - if (Fawe.isMainThread()) { - r.run(); - } else { - TaskManager.IMP.sync(r); - } - cachedChanges.clear(); - cachedChunksToSend.clear(); - } - - private static final class CachedChange { - - private final Chunk chunk; - private final BlockPosition position; - private final IBlockData blockData; - - private CachedChange(Chunk chunk, BlockPosition position, IBlockData blockData) { - this.chunk = chunk; - this.position = position; - this.blockData = blockData; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/MapChunkUtil_1_16_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/MapChunkUtil_1_16_2.java deleted file mode 100644 index 824ea56f3..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/MapChunkUtil_1_16_2.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2; - -import com.boydti.fawe.bukkit.adapter.MapChunkUtil; -import net.minecraft.server.v1_16_R2.PacketPlayOutMapChunk; - -public class MapChunkUtil_1_16_2 extends MapChunkUtil { - public MapChunkUtil_1_16_2() throws NoSuchFieldException { - fieldX = PacketPlayOutMapChunk.class.getDeclaredField("a"); - fieldZ = PacketPlayOutMapChunk.class.getDeclaredField("b"); - fieldBitMask = PacketPlayOutMapChunk.class.getDeclaredField("c"); - fieldHeightMap = PacketPlayOutMapChunk.class.getDeclaredField("d"); - fieldChunkData = PacketPlayOutMapChunk.class.getDeclaredField("f"); - fieldBlockEntities = PacketPlayOutMapChunk.class.getDeclaredField("g"); - fieldFull = PacketPlayOutMapChunk.class.getDeclaredField("h"); - fieldX.setAccessible(true); - fieldZ.setAccessible(true); - fieldBitMask.setAccessible(true); - fieldHeightMap.setAccessible(true); - fieldChunkData.setAccessible(true); - fieldBlockEntities.setAccessible(true); - fieldFull.setAccessible(true); - } - - @Override - public PacketPlayOutMapChunk createPacket() { - return new PacketPlayOutMapChunk(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/nbt/LazyCompoundTag_1_16_2.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/nbt/LazyCompoundTag_1_16_2.java deleted file mode 100644 index d43ef3f11..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/nbt/LazyCompoundTag_1_16_2.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_2.nbt; - -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.WorldEditPlugin; -import net.minecraft.server.v1_16_R2.NBTBase; -import net.minecraft.server.v1_16_R2.NBTNumber; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.NBTTagList; - -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 LazyCompoundTag_1_16_2 extends CompoundTag { - - private final Supplier nmsTag; - private CompoundTag cachedValue; - - public LazyCompoundTag_1_16_2(Supplier tag) { - super(new HashMap<>()); - this.nmsTag = tag; - } - - public LazyCompoundTag_1_16_2(NBTTagCompound tag) { - this(() -> tag); - } - - public NBTTagCompound get() { - return nmsTag.get(); - } - - @Override - public Map getValue() { - if (cachedValue == null) { - cachedValue = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(nmsTag.get()); - } - return cachedValue.getValue(); - } - - public boolean containsKey(String key) { - return nmsTag.get().hasKey(key); - } - - public byte[] getByteArray(String key) { - return nmsTag.get().getByteArray(key); - } - - public byte getByte(String key) { - return nmsTag.get().getByte(key); - } - - public double getDouble(String key) { - return nmsTag.get().getDouble(key); - } - - public double asDouble(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asDouble(); - } - return 0; - } - - public float getFloat(String key) { - return nmsTag.get().getFloat(key); - } - - public int[] getIntArray(String key) { - return nmsTag.get().getIntArray(key); - } - - public int getInt(String key) { - return nmsTag.get().getInt(key); - } - - public int asInt(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asInt(); - } - return 0; - } - - public List getList(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - ArrayList list = new ArrayList<>(); - NBTTagList nbtList = (NBTTagList) tag; - for (NBTBase elem : nbtList) { - if (elem instanceof NBTTagCompound) { - list.add(new LazyCompoundTag_1_16_2((NBTTagCompound) elem)); - } else { - list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); - } - } - return list; - } - return Collections.emptyList(); - } - - public ListTag getListTag(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - 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 nmsTag.get().getLongArray(key); - } - - public long getLong(String key) { - return nmsTag.get().getLong(key); - } - - public long asLong(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asLong(); - } - return 0; - } - - public short getShort(String key) { - return nmsTag.get().getShort(key); - } - - public String getString(String key) { - return nmsTag.get().getString(key); - } - - @Override - public String toString() { - return nmsTag.get().toString(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BlockMaterial_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BlockMaterial_1_16_5.java deleted file mode 100644 index e70bc0086..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BlockMaterial_1_16_5.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.bukkit.adapter.mc1_16_5.nbt.LazyCompoundTag_1_16_5; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.util.ReflectionUtil; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_16_R3.Block; -import net.minecraft.server.v1_16_R3.BlockAccessAir; -import net.minecraft.server.v1_16_R3.BlockBase; -import net.minecraft.server.v1_16_R3.BlockPosition; -import net.minecraft.server.v1_16_R3.EnumPistonReaction; -import net.minecraft.server.v1_16_R3.IBlockData; -import net.minecraft.server.v1_16_R3.ITileEntity; -import net.minecraft.server.v1_16_R3.Material; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.TileEntity; -import org.bukkit.craftbukkit.v1_16_R3.block.data.CraftBlockData; - -public class BlockMaterial_1_16_5 implements BlockMaterial { - private final Block block; - private final IBlockData defaultState; - private final Material material; - private final boolean isTranslucent; - private final CraftBlockData craftBlockData; - private final org.bukkit.Material craftMaterial; - private final int opacity; - private final CompoundTag tile; - - public BlockMaterial_1_16_5(Block block) { - this(block, block.getBlockData()); - } - - public BlockMaterial_1_16_5(Block block, IBlockData defaultState) { - this.block = block; - this.defaultState = defaultState; - this.material = defaultState.getMaterial(); - this.craftBlockData = CraftBlockData.fromData(defaultState); - this.craftMaterial = craftBlockData.getMaterial(); - BlockBase.Info blockInfo = ReflectionUtil.getField(BlockBase.class, block, "aB"); - this.isTranslucent = !(boolean)ReflectionUtil.getField(BlockBase.Info.class, blockInfo, "n"); - opacity = defaultState.b(BlockAccessAir.INSTANCE, BlockPosition.ZERO); - TileEntity tileEntity = !block.isTileEntity() ? null : ((ITileEntity)block).createTile(null); - tile = tileEntity == null ? null : new LazyCompoundTag_1_16_5(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - public Block getBlock() { - return block; - } - - public IBlockData getState() { - return defaultState; - } - - public CraftBlockData getCraftBlockData() { - return craftBlockData; - } - - public Material getMaterial() { - return material; - } - - @Override - public boolean isAir() { - return defaultState.isAir(); - } - - @Override - public boolean isFullCube() { - return craftMaterial.isOccluding(); - } - - @Override - public boolean isOpaque() { - return material.f(); - } - - @Override - public boolean isPowerSource() { - return defaultState.isPowerSource(); - } - - @Override - public boolean isLiquid() { - return material.isLiquid(); - } - - @Override - public boolean isSolid() { - return material.isBuildable(); - } - - @Override - public float getHardness() { - return craftBlockData.getState().strength; - } - - @Override - public float getResistance() { - return block.getDurability(); - } - - @Override - public float getSlipperiness() { - return block.getFrictionFactor(); - } - - @Override - public int getLightValue() { - return defaultState.f(); - } - - @Override - public int getLightOpacity() { - return opacity; - } - - @Override - public boolean isFragileWhenPushed() { - return material.getPushReaction() == EnumPistonReaction.DESTROY; - } - - @Override - public boolean isUnpushable() { - return material.getPushReaction() == EnumPistonReaction.BLOCK; - } - - @Override - public boolean isTicksRandomly() { - return block.isTicking(defaultState); - } - - @Override - public boolean isMovementBlocker() { - return material.isSolid(); - } - - @Override - public boolean isBurnable() { - return material.isBurnable(); - } - - @Override - public boolean isToolRequired() { - //TODO Removed in 1.16.1 Replacement not found. - return true; - } - - @Override - public boolean isReplacedDuringPlacement() { - return material.isReplaceable(); - } - - @Override - public boolean isTranslucent() { - return isTranslucent; - } - - @Override - public boolean hasContainer() { - return block instanceof ITileEntity; - } - - @Override - public boolean isTile() { - return block.isTileEntity(); - } - - @Override - public CompoundTag getDefaultTile() { - return tile; - } - - @Override - public int getMapColor() { - return material.h().rgb; - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitAdapter_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitAdapter_1_16_5.java deleted file mode 100644 index 3d3c31114..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitAdapter_1_16_5.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.UnsafeUtility; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import io.papermc.lib.PaperLib; -import net.minecraft.server.v1_16_R3.BiomeBase; -import net.minecraft.server.v1_16_R3.BiomeStorage; -import net.minecraft.server.v1_16_R3.Block; -import net.minecraft.server.v1_16_R3.Chunk; -import net.minecraft.server.v1_16_R3.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R3.ChunkSection; -import net.minecraft.server.v1_16_R3.DataBits; -import net.minecraft.server.v1_16_R3.DataPalette; -import net.minecraft.server.v1_16_R3.DataPaletteBlock; -import net.minecraft.server.v1_16_R3.DataPaletteLinear; -import net.minecraft.server.v1_16_R3.GameProfileSerializer; -import net.minecraft.server.v1_16_R3.IBlockData; -import net.minecraft.server.v1_16_R3.PacketPlayOutLightUpdate; -import net.minecraft.server.v1_16_R3.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R3.PlayerChunk; -import net.minecraft.server.v1_16_R3.PlayerChunkMap; -import net.minecraft.server.v1_16_R3.World; -import net.minecraft.server.v1_16_R3.WorldServer; -import org.bukkit.craftbukkit.v1_16_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -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.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Function; - -public final class BukkitAdapter_1_16_5 extends NMSAdapter { - /* - NMS fields - */ - public static final Field fieldBits; - public static final Field fieldPalette; - public static final Field fieldSize; - - public static final Field fieldBitsPerEntry; - - public static final Field fieldFluidCount; - public static final Field fieldTickingBlockCount; - public static final Field fieldNonEmptyBlockCount; - - private static final Field fieldBiomeArray; - - 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; - - static { - try { - fieldSize = DataPaletteBlock.class.getDeclaredField("i"); - fieldSize.setAccessible(true); - fieldBits = DataPaletteBlock.class.getDeclaredField("a"); - fieldBits.setAccessible(true); - fieldPalette = DataPaletteBlock.class.getDeclaredField("h"); - fieldPalette.setAccessible(true); - - fieldBitsPerEntry = DataBits.class.getDeclaredField("c"); - fieldBitsPerEntry.setAccessible(true); - - fieldFluidCount = ChunkSection.class.getDeclaredField("e"); - fieldFluidCount.setAccessible(true); - fieldTickingBlockCount = ChunkSection.class.getDeclaredField("tickingBlockCount"); - fieldTickingBlockCount.setAccessible(true); - fieldNonEmptyBlockCount = ChunkSection.class.getDeclaredField("nonEmptyBlockCount"); - fieldNonEmptyBlockCount.setAccessible(true); - - fieldBiomeArray = BiomeStorage.class.getDeclaredField("h"); - fieldBiomeArray.setAccessible(true); - - Method declaredGetVisibleChunk = PlayerChunkMap.class.getDeclaredMethod("getVisibleChunk", long.class); - declaredGetVisibleChunk.setAccessible(true); - methodGetVisibleChunk = MethodHandles.lookup().unreflect(declaredGetVisibleChunk); - - Unsafe unsafe = UnsafeUtility.getUNSAFE(); - fieldLock = DataPaletteBlock.class.getDeclaredField("j"); - fieldLockOffset = unsafe.objectFieldOffset(fieldLock); - - CHUNKSECTION_BASE = unsafe.arrayBaseOffset(ChunkSection[].class); - int scale = unsafe.arrayIndexScale(ChunkSection[].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); - } - } - - protected static boolean setSectionAtomic(ChunkSection[] sections, ChunkSection expected, ChunkSection value, int layer) { - long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; - if (layer >= 0 && layer < sections.length) { - return UnsafeUtility.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); - } - return false; - } - - protected static DelegateLock applyLock(ChunkSection 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 = UnsafeUtility.getUNSAFE(); - DataPaletteBlock blocks = section.getBlocks(); - ReentrantLock currentLock = (ReentrantLock) unsafe.getObject(blocks, fieldLockOffset); - if (currentLock instanceof DelegateLock) { - return (DelegateLock) currentLock; - } - DelegateLock newLock = new DelegateLock(currentLock); - unsafe.putObject(blocks, fieldLockOffset, newLock); - return newLock; - } - } catch (Throwable e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static Chunk ensureLoaded(World nmsWorld, int chunkX, int chunkZ) { - Chunk nmsChunk = nmsWorld.getChunkProvider().getChunkAt(chunkX, chunkZ, false); - if (nmsChunk != null) { - return nmsChunk; - } - if (Fawe.isMainThread()) { - return nmsWorld.getChunkAt(chunkX, chunkZ); - } - if (PaperLib.isPaper()) { - CraftWorld craftWorld = nmsWorld.getWorld(); - CompletableFuture future = craftWorld.getChunkAtAsync(chunkX, chunkZ, true); - try { - CraftChunk chunk = (CraftChunk) future.get(); - return chunk.getHandle(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - // TODO optimize - return TaskManager.IMP.sync(() -> nmsWorld.getChunkAt(chunkX, chunkZ)); - } - - public static PlayerChunk getPlayerChunk(WorldServer nmsWorld, final int chunkX, final int chunkZ) { - PlayerChunkMap chunkMap = nmsWorld.getChunkProvider().playerChunkMap; - try { - return (PlayerChunk) methodGetVisibleChunk.invoke(chunkMap, ChunkCoordIntPair.pair(chunkX, chunkZ)); - } catch (Throwable thr) { - throw new RuntimeException(thr); - } - } - - public static void sendChunk(WorldServer nmsWorld, int chunkX, int chunkZ, boolean lighting) { - PlayerChunk playerChunk = getPlayerChunk(nmsWorld, chunkX, chunkZ); - if (playerChunk == null) { - return; - } - ChunkCoordIntPair chunkCoordIntPair = new ChunkCoordIntPair(chunkX, chunkZ); - Optional optional = ((Either) playerChunk.a().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); - Chunk chunk = optional.orElseGet(() -> - nmsWorld.getChunkProvider().getChunkAtIfLoadedImmediately(chunkX, chunkZ)); - if (chunk == null) { - return; - } - PacketPlayOutMapChunk chunkPacket = new PacketPlayOutMapChunk(chunk, 65535); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(chunkPacket); - }); - if (lighting) { - //This needs to be true otherwise Minecraft will update lighting from/at the chunk edges (bad) - boolean trustEdges = true; - PacketPlayOutLightUpdate packet = - new PacketPlayOutLightUpdate(chunkCoordIntPair, nmsWorld.getChunkProvider().getLightEngine(), - trustEdges); - playerChunk.players.a(chunkCoordIntPair, false).forEach(p -> { - p.playerConnection.sendPacket(packet); - }); - } - } - - /* - NMS conversion - */ - public static ChunkSection newChunkSection(final int layer, final char[] blocks, boolean fastmode) { - return newChunkSection(layer, null, blocks, fastmode); - } - - public static ChunkSection newChunkSection(final int layer, final Function get, char[] set, boolean fastmode) { - 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); - } else { - air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, - num_palette_buffer, get, set, ticking_blocks, fastmode); - } - 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 - } - - 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); - } - - ChunkSection section = newChunkSection(layer); - // set palette & data bits - final DataPaletteBlock dataPaletteBlocks = section.getBlocks(); - // private DataPalette h; - // protected DataBits a; - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final DataBits nmsBits = new DataBits(bitsPerEntry, 4096, bits); - final DataPalette palette; - palette = new DataPaletteLinear<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::c); - - // set palette - 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 IBlockData ibd = ((BlockMaterial_1_16_5) state.getMaterial()).getState(); - palette.a(ibd); - } - try { - fieldBits.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, palette); - fieldSize.set(dataPaletteBlocks, bitsPerEntry); - setCount(ticking_blocks.size(), 4096 - air, section); - if (!fastmode) { - ticking_blocks.forEach((pos, ordinal) -> section - .setType(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), - Block.getByCombinedId(ordinal))); - } - } catch (final IllegalAccessException e) { - throw new RuntimeException(e); - } - - return section; - } catch (final Throwable e) { - Arrays.fill(blockToPalette, Integer.MAX_VALUE); - throw e; - } - } - - private static ChunkSection newChunkSection(int layer) { - return new ChunkSection(layer << 4); - } - - public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final ChunkSection section) throws IllegalAccessException { - fieldFluidCount.setShort(section, (short) 0); // TODO FIXME - fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); - fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); - } - - public static BiomeBase[] getBiomeArray(BiomeStorage storage) { - try { - return (BiomeBase[]) fieldBiomeArray.get(storage); - } catch (IllegalAccessException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5.java deleted file mode 100644 index 1e4e2dc7b..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5.java +++ /dev/null @@ -1,920 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.BukkitGetBlocks; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.nbt.LazyCompoundTag_1_16_5; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.AdaptedMap; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -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.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R3; -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 net.minecraft.server.v1_16_R3.BiomeBase; -import net.minecraft.server.v1_16_R3.BiomeStorage; -import net.minecraft.server.v1_16_R3.BlockPosition; -import net.minecraft.server.v1_16_R3.Chunk; -import net.minecraft.server.v1_16_R3.ChunkSection; -import net.minecraft.server.v1_16_R3.DataBits; -import net.minecraft.server.v1_16_R3.DataPalette; -import net.minecraft.server.v1_16_R3.DataPaletteBlock; -import net.minecraft.server.v1_16_R3.DataPaletteHash; -import net.minecraft.server.v1_16_R3.DataPaletteLinear; -import net.minecraft.server.v1_16_R3.Entity; -import net.minecraft.server.v1_16_R3.EntityTypes; -import net.minecraft.server.v1_16_R3.EnumSkyBlock; -import net.minecraft.server.v1_16_R3.HeightMap; -import net.minecraft.server.v1_16_R3.IBlockData; -import net.minecraft.server.v1_16_R3.IRegistry; -import net.minecraft.server.v1_16_R3.LightEngine; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagInt; -import net.minecraft.server.v1_16_R3.NibbleArray; -import net.minecraft.server.v1_16_R3.SectionPosition; -import net.minecraft.server.v1_16_R3.TileEntity; -import net.minecraft.server.v1_16_R3.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.AbstractSet; -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.function.Function; - -public class BukkitGetBlocks_1_16_5 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 LazyCompoundTag_1_16_5(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - public ChunkSection[] sections; - public Chunk nmsChunk; - public WorldServer world; - public int chunkX; - public int chunkZ; - public NibbleArray[] blockLight = new NibbleArray[16]; - public NibbleArray[] skyLight = new NibbleArray[16]; - private boolean createCopy = false; - private BukkitGetBlocks_1_16_5_Copy copy = null; - private boolean forceLoadSections = true; - private boolean lightUpdate = false; - - public BukkitGetBlocks_1_16_5(World world, int chunkX, int chunkZ) { - this(((CraftWorld) world).getHandle(), chunkX, chunkZ); - } - - public BukkitGetBlocks_1_16_5(WorldServer world, int chunkX, int chunkZ) { - this.world = world; - this.chunkX = chunkX; - this.chunkZ = chunkZ; - } - - public int getChunkX() { - return chunkX; - } - - @Override - public void setCreateCopy(boolean createCopy) { - this.createCopy = createCopy; - } - - @Override - public boolean isCreateCopy() { - return createCopy; - } - - @Override - public IChunkGet getCopy() { - return copy; - } - - @Override - public void setLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.BLOCK); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setSkyLightingToGet(char[][] light) { - if (light != null) { - lightUpdate = true; - try { - fillLightNibble(light, EnumSkyBlock.SKY); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) { - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256); - bitArray.fromRaw(data); - getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(bitArray.getData()); - } - - public int getChunkZ() { - return chunkZ; - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeStorage index = getChunk().getBiomeIndex(); - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) { - break; - } - } - } else { - base = index.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(world.r().b(IRegistry.ay), base)) : null; - } - - @Override - public void removeSectionLighting(int layer, boolean sky) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - if (nibble != null) { - lightUpdate = true; - synchronized (nibble) { - byte[] bytes = PaperLib.isPaper() ? nibble.getIfSet() : nibble.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - if (sky) { - SectionPosition sectionPositionSky = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleSky = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPositionSky); - if (nibbleSky != null) { - lightUpdate = true; - synchronized (nibbleSky) { - byte[] bytes = PaperLib.isPaper() ? nibbleSky.getIfSet() : nibbleSky.asBytes(); - if (!PaperLib.isPaper() || bytes != NibbleArray.EMPTY_NIBBLE) { - Arrays.fill(bytes, (byte) 0); - } - } - } - } - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - TileEntity tileEntity = getChunk().getTileEntity(new BlockPosition((x & 15) + ( - chunkX << 4), y, (z & 15) + ( - chunkZ << 4))); - if (tileEntity == null) { - return null; - } - return new LazyCompoundTag_1_16_5(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - @Override - public Map getTiles() { - Map nmsTiles = getChunk().getTileEntities(); - 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; - if (skyLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.SKY).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.SKY, sectionPosition, nibbleArray, true); - } - skyLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return skyLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override - public int getEmmittedLight(int x, int y, int z) { - int layer = y >> 4; - if (blockLight[layer] == null) { - SectionPosition sectionPosition = SectionPosition.a(getChunk().getPos(), layer); - NibbleArray nibbleArray = world.getChunkProvider().getLightEngine().a(EnumSkyBlock.BLOCK).a(sectionPosition); - // If the server hasn't generated the section's NibbleArray yet, it will be null - if (nibbleArray == null) { - byte[] a = 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(a, (byte) 15); - nibbleArray = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(EnumSkyBlock.BLOCK, sectionPosition, nibbleArray, true); - } - blockLight[layer] = nibbleArray; - } - long l = BlockPosition.a(x, y, z); - return blockLight[layer].a(SectionPosition.b(BlockPosition.b(l)), SectionPosition.b(BlockPosition.c(l)), SectionPosition.b(BlockPosition.d(l))); - } - - @Override - public int[] getHeightMap(HeightMapType type) { - long[] longArray = getChunk().heightMap.get(HeightMap.Type.valueOf(type.name())).a(); - BitArrayUnstretched bitArray = new BitArrayUnstretched(9, 256, longArray); - return bitArray.toRaw(new int[256]); - } - - @Override - public CompoundTag getEntity(UUID uuid) { - Entity entity = world.getEntity(uuid); - if (entity != null) { - org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - for (List entry : getChunk().getEntitySlices()) { - if (entry != null) { - for (Entity ent : entry) { - if (uuid.equals(ent.getUniqueID())) { - org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - } - } - } - return null; - } - - @Override - public Set getEntities() { - List[] slices = getChunk().getEntitySlices(); - 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)) { - return false; - } - CompoundTag getTag = (CompoundTag) get; - 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.getUniqueID(); - if (uuid.equals(getUUID)) { - return true; - } - } - } - } - return false; - } - - @NotNull - @Override - public Iterator iterator() { - Iterable result = Iterables.transform(Iterables.concat(slices), new com.google.common.base.Function() { - @Nullable - @Override - public CompoundTag apply(@Nullable Entity input) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - return (CompoundTag) adapter.toNative(input.save(tag)); - } - }); - return result.iterator(); - } - }; - } - - private void updateGet(BukkitGetBlocks_1_16_5 get, Chunk nmsChunk, ChunkSection[] chunkSections, ChunkSection section, char[] arr, int layer) { - synchronized (get) { - if (this.getChunk() != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, this.sections, 0, chunkSections.length); - this.reset(); - } - if (this.sections == null) { - this.sections = new ChunkSection[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 ChunkSection[]{section}.clone()[0]; - } - this.blocks[layer] = arr; - } - } - - private void removeEntity(Entity entity) { - entity.die(); - } - - public Chunk ensureLoaded(net.minecraft.server.v1_16_R3.World nmsWorld, int chunkX, int chunkZ) { - return BukkitAdapter_1_16_5.ensureLoaded(nmsWorld, chunkX, chunkZ); - } - - @Override - public synchronized > T call(IChunkSet set, Runnable finalizer) { - forceLoadSections = false; - copy = createCopy ? new BukkitGetBlocks_1_16_5_Copy(world) : null; - try { - WorldServer nmsWorld = world; - Chunk 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 tiles = new HashMap<>(nmsChunk.getTileEntities()); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - final BlockPosition 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) { - TileEntity tile = entry.getValue(); - nmsChunk.removeTileEntity(tile.getPosition()); - if (createCopy) { - copy.storeTile(tile); - } - } - } - } - } - - int bitMask = 0; - synchronized (nmsChunk) { - ChunkSection[] sections = nmsChunk.getSections(); - - for (int layer = 0; layer < 16; layer++) { - if (!set.hasSection(layer)) { - continue; - } - - bitMask |= 1 << layer; - - char[] tmp = set.load(layer); - char[] setArr = new char[4096]; - System.arraycopy(tmp, 0, setArr, 0, 4096); - if (createCopy) { - char[] tmpLoad = loadPrivately(layer); - char[] copyArr = new char[4096]; - System.arraycopy(tmpLoad, 0, copyArr, 0, 4096); - copy.storeSection(layer, copyArr); - } - - ChunkSection newSection; - ChunkSection existingSection = sections[layer]; - if (existingSection == null) { - newSection = BukkitAdapter_1_16_5.newChunkSection(layer, setArr, fastmode); - if (BukkitAdapter_1_16_5.setSectionAtomic(sections, null, newSection, layer)) { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - continue; - } else { - existingSection = sections[layer]; - if (existingSection == null) { - LOGGER.error("Skipping invalid null section. chunk:" + chunkX + "," - + chunkZ + " layer: " + layer); - continue; - } - } - } - BukkitAdapter_1_16_5.fieldTickingBlockCount.set(existingSection, (short) 0); - - //ensure that the server doesn't try to tick the chunksection while we're editing it. - DelegateLock lock = BukkitAdapter_1_16_5.applyLock(existingSection); - - synchronized (this) { - synchronized (lock) { - lock.untilFree(); - if (this.getChunk() != nmsChunk) { - this.nmsChunk = 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(layer))) { - this.reset(layer); - } else if (lock.isModified()) { - this.reset(layer); - } - newSection = BukkitAdapter_1_16_5 - .newChunkSection(layer, this::loadPrivately, setArr, fastmode); - if (!BukkitAdapter_1_16_5 - .setSectionAtomic(sections, existingSection, newSection, layer)) { - LOGGER.error("Failed to set chunk section:" + chunkX + "," + chunkZ + " layer: " + layer); - } else { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - BiomeStorage currentBiomes = nmsChunk.getBiomeIndex(); - 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) { - final Biome craftBiome = BukkitAdapter.adapt(biome); - BiomeBase nmsBiome = CraftBlock.biomeToBiomeBase(nmsWorld.r().b(IRegistry.ay), craftBiome); - currentBiomes.setBiome(x, y, z, nmsBiome); - } - } - } - } - } - - Map heightMaps = set.getHeightMaps(); - for (Map.Entry entry : heightMaps.entrySet()) { - BukkitGetBlocks_1_16_5.this.setHeightmapToGet(entry.getKey(), entry.getValue()); - } - BukkitGetBlocks_1_16_5.this.setLightingToGet(set.getLight()); - BukkitGetBlocks_1_16_5.this.setSkyLightingToGet(set.getSkyLight()); - - Runnable[] syncTasks = null; - - int bx = chunkX << 4; - int bz = chunkZ << 4; - - Set entityRemoves = set.getEntityRemoves(); - if (entityRemoves != null && !entityRemoves.isEmpty()) { - syncTasks = new Runnable[3]; - - syncTasks[2] = () -> { - final List[] entities = nmsChunk.getEntitySlices(); - - 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.getUniqueID())) { - 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] = () -> { - 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.debug("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(); - - EntityTypes type = EntityTypes.a(id).orElse(null); - if (type != null) { - Entity entity = type.a(nmsWorld); - if (entity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - entity.load(tag); - entity.setLocation(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 BlockPosition pos = new BlockPosition(x, y, z); - - synchronized (nmsWorld) { - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity == null || tileEntity.isRemoved()) { - nmsWorld.removeTileEntity(pos); - tileEntity = nmsWorld.getTileEntity(pos); - } - if (tileEntity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), 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.d(true); // Set Modified - nmsChunk.mustNotSave = false; - nmsChunk.markDirty(); - // 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 - 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 synchronized char[] loadPrivately(int layer) { - if (super.blocks[layer] != null) { - char[] blocks = new char[4096]; - System.arraycopy(super.blocks[layer], 0, blocks, 0, 4096); - return blocks; - } else { - return BukkitGetBlocks_1_16_5.this.update(layer, null, false); - } - } - - @Override - public synchronized void send(int mask, boolean lighting) { - BukkitAdapter_1_16_5.sendChunk(world, chunkX, chunkZ, lighting); - } - - @Override - public synchronized char[] update(int layer, char[] data, boolean aggressive) { - ChunkSection 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 == FaweCache.IMP.EMPTY_CHAR_4096) { - data = new char[4096]; - Arrays.fill(data, (char) 1); - } - DelegateLock lock = BukkitAdapter_1_16_5.applyLock(section); - synchronized (lock) { - lock.untilFree(); - lock.setModified(false); - // Efficiently convert ChunkSection to raw data - try { - FAWE_Spigot_v1_16_R3 adapter = ((FAWE_Spigot_v1_16_R3) WorldEditPlugin.getInstance().getBukkitImplAdapter()); - - final DataPaletteBlock blocks = section.getBlocks(); - final DataBits bits = (DataBits) BukkitAdapter_1_16_5.fieldBits.get(blocks); - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_5.fieldPalette.get(blocks); - - final int bitsPerEntry = (int) BukkitAdapter_1_16_5.fieldBitsPerEntry.get(bits); - final long[] blockStates = bits.a(); - - new BitArrayUnstretched(bitsPerEntry, 4096, blockStates).toRaw(data); - - int num_palette; - if (palette instanceof DataPaletteLinear) { - num_palette = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - num_palette = ((DataPaletteHash) palette).b(); - } else { - num_palette = 0; - int[] paletteToBlockInts = FaweCache.IMP.PALETTE_TO_BLOCK.get(); - char[] paletteToBlockChars = FaweCache.IMP.PALETTE_TO_BLOCK_CHAR.get(); - try { - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char ordinal = paletteToBlockChars[paletteVal]; - if (ordinal == Character.MAX_VALUE) { - paletteToBlockInts[num_palette++] = paletteVal; - IBlockData ibd = palette.a(data[i]); - if (ibd == null) { - ordinal = BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - ordinal = adapter.adaptToChar(ibd); - } - paletteToBlockChars[paletteVal] = ordinal; - } - // Don't read "empty". - if (ordinal == 0) { - ordinal = 1; - } - data[i] = ordinal; - } - } finally { - for (int i = 0; i < num_palette; i++) { - int paletteVal = paletteToBlockInts[i]; - paletteToBlockChars[paletteVal] = Character.MAX_VALUE; - } - } - 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.a(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.a(i), adapter); - paletteToOrdinal[i] = val; - } - // Don't read "empty". - if (val == 0) { - val = 1; - } - data[i] = val; - } - } else { - char ordinal = ordinal(palette.a(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 e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - private final char ordinal(IBlockData ibd, FAWE_Spigot_v1_16_R3 adapter) { - if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - return adapter.adaptToChar(ibd); - } - } - - public ChunkSection[] getSections(boolean force) { - force &= forceLoadSections; - ChunkSection[] tmp = sections; - if (tmp == null || force) { - synchronized (this) { - tmp = sections; - if (tmp == null || force) { - ChunkSection[] chunkSections = getChunk().getSections(); - tmp = new ChunkSection[chunkSections.length]; - System.arraycopy(chunkSections, 0, tmp, 0, chunkSections.length); - sections = tmp; - } - } - } - return tmp; - } - - public Chunk getChunk() { - Chunk tmp = nmsChunk; - if (tmp == null) { - synchronized (this) { - tmp = nmsChunk; - if (tmp == null) { - nmsChunk = tmp = ensureLoaded(this.world, chunkX, chunkZ); - } - } - } - return tmp; - } - - private void fillLightNibble(char[][] light, EnumSkyBlock skyBlock) { - for (int Y = 0; Y < 16; Y++) { - if (light[Y] == null) { - continue; - } - SectionPosition sectionPosition = SectionPosition.a(nmsChunk.getPos(), Y); - NibbleArray nibble = world.getChunkProvider().getLightEngine().a(skyBlock).a(sectionPosition); - if (nibble == null) { - byte[] a = new byte[2048]; - Arrays.fill(a, skyBlock == EnumSkyBlock.SKY ? (byte) 15 : (byte) 0); - nibble = new NibbleArray(a); - ((LightEngine) world.getChunkProvider().getLightEngine()).a(skyBlock, sectionPosition, nibble, true); - } - synchronized (nibble) { - for (int i = 0; i < 4096; i++) { - if (light[Y][i] < 16) { - nibble.a(i, light[Y][i]); - } - } - } - } - } - - @Override - public boolean hasSection(int layer) { - return getSections(false)[layer] != null; - } - - @Override - public boolean trim(boolean aggressive) { - skyLight = new NibbleArray[16]; - blockLight = new NibbleArray[16]; - if (aggressive) { - sections = null; - nmsChunk = null; - return super.trim(true); - } else { - for (int i = 0; i < 16; i++) { - if (!hasSection(i) || !super.sections[i].isFull()) { - continue; - } - ChunkSection existing = getSections(true)[i]; - try { - final DataPaletteBlock blocksExisting = existing.getBlocks(); - - final DataPalette palette = (DataPalette) BukkitAdapter_1_16_5.fieldPalette.get(blocksExisting); - int paletteSize; - - if (palette instanceof DataPaletteLinear) { - paletteSize = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - paletteSize = ((DataPaletteHash) palette).b(); - } 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5_Copy.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5_Copy.java deleted file mode 100644 index 52d9adc28..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5_Copy.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.nbt.LazyCompoundTag_1_16_5; -import com.google.common.base.Suppliers; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -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.v1_16_R3.BiomeBase; -import net.minecraft.server.v1_16_R3.BiomeStorage; -import net.minecraft.server.v1_16_R3.Entity; -import net.minecraft.server.v1_16_R3.IRegistry; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.TileEntity; -import net.minecraft.server.v1_16_R3.WorldServer; -import org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Range; - -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 BukkitGetBlocks_1_16_5_Copy implements IChunkGet { - - private final Map tiles = new HashMap<>(); - private final Set entities = new HashSet<>(); - private BiomeStorage biomeStorage; - private final char[][] blocks = new char[16][]; - private final WorldServer world; - - protected BukkitGetBlocks_1_16_5_Copy(WorldServer world) { - this.world = world; - } - - protected void storeTile(TileEntity tile) { - tiles.put(BlockVector3.at(tile.getPosition().getX(), tile.getPosition().getY(), tile.getPosition().getZ()), - new LazyCompoundTag_1_16_5(Suppliers.memoize(() -> tile.save(new NBTTagCompound())))); - } - - @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) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - entities.add((CompoundTag) adapter.toNative(entity.save(tag))); - } - - @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 void setCreateCopy(boolean createCopy) { - - } - - @Override - public boolean isCreateCopy() { - return false; - } - - @Override - public void setLightingToGet(char[][] lighting) {} - - @Override - public void setSkyLightingToGet(char[][] lighting) {} - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) {} - - protected void storeBiomes(BiomeStorage biomeStorage) { - this.biomeStorage = new BiomeStorage(biomeStorage.registry, BukkitAdapter_1_16_5.getBiomeArray(biomeStorage).clone()); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeBase base = null; - if (y == -1) { - for (y = 0; y < FaweCache.IMP.WORLD_HEIGHT; y++) { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - if (base != null) break; - } - } else { - base = biomeStorage.getBiome(x >> 2, y >> 2, z >> 2); - } - return base != null ? BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(world.r().b(IRegistry.ay), base)) : 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; - } - - 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(@Range(from = 0, to = 15) int layer) { - return blocks[layer] != null; - } - - @Override - public char[] load(int layer) { - 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 getEmmittedLight(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; - 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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/FAWEWorldNativeAccess_1_16_R3.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/FAWEWorldNativeAccess_1_16_R3.java deleted file mode 100644 index 94819b6e5..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/FAWEWorldNativeAccess_1_16_R3.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.TaskManager; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R3; -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.server.v1_16_R3.Block; -import net.minecraft.server.v1_16_R3.BlockPosition; -import net.minecraft.server.v1_16_R3.Chunk; -import net.minecraft.server.v1_16_R3.ChunkProviderServer; -import net.minecraft.server.v1_16_R3.EnumDirection; -import net.minecraft.server.v1_16_R3.IBlockData; -import net.minecraft.server.v1_16_R3.MinecraftServer; -import net.minecraft.server.v1_16_R3.NBTBase; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.PlayerChunk; -import net.minecraft.server.v1_16_R3.TileEntity; -import net.minecraft.server.v1_16_R3.World; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R3.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 FAWEWorldNativeAccess_1_16_R3 implements WorldNativeAccess { - private static final int UPDATE = 1; - private static final int NOTIFY = 2; - - private final FAWE_Spigot_v1_16_R3 adapter; - private final WeakReference world; - private SideEffectSet sideEffectSet; - private final AtomicInteger lastTick; - private final Set cachedChanges = new HashSet<>(); - private final Set cachedChunksToSend = new HashSet<>(); - - public FAWEWorldNativeAccess_1_16_R3(FAWE_Spigot_v1_16_R3 adapter, WeakReference world) { - this.adapter = adapter; - this.world = world; - // 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 World getWorld() { - return Objects.requireNonNull(world.get(), "The reference to the world was lost"); - } - - @Override - public void setCurrentSideEffectSet(SideEffectSet sideEffectSet) { - this.sideEffectSet = sideEffectSet; - } - - @Override - public Chunk getChunk(int x, int z) { - return getWorld().getChunkAt(x, z); - } - - @Override - public IBlockData toNative(BlockState state) { - int stateId = adapter.ordinalToIbdID(state.getOrdinalChar()); - return BlockStateIdAccess.isValidInternalId(stateId) - ? Block.getByCombinedId(stateId) - : ((CraftBlockData) BukkitAdapter.adapt(state)).getState(); - } - - @Override - public IBlockData getBlockState(Chunk chunk, BlockPosition position) { - return chunk.getType(position); - } - - @Nullable - @Override - public synchronized IBlockData setBlockState(Chunk chunk, BlockPosition position, IBlockData state) { - int currentTick = MinecraftServer.currentTick; - if (Fawe.isMainThread()) { - return chunk.setType(position, state, - 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(chunk, position, state)); - cachedChunksToSend.add(new IntPair(chunk.bukkitChunk.getX(), chunk.bukkitChunk.getZ())); - boolean nextTick = lastTick.get() > currentTick; - if (nextTick || cachedChanges.size() >= 1024) { - if (nextTick) { - lastTick.set(currentTick); - } - flushAsync(nextTick); - } - return state; - } - - @Override - public IBlockData getValidBlockForPosition(IBlockData block, BlockPosition position) { - return Block.b(block, getWorld(), position); - } - - @Override - public BlockPosition getPosition(int x, int y, int z) { - return new BlockPosition(x, y, z); - } - - @Override - public void updateLightingForBlock(BlockPosition position) { - getWorld().getChunkProvider().getLightEngine().a(position); - } - - @Override - public boolean updateTileEntity(BlockPosition position, CompoundTag tag) { - // We will assume that the tile entity was created for us, - // though we do not do this on the other versions - TileEntity tileEntity = getWorld().getTileEntity(position); - if (tileEntity == null) { - return false; - } - NBTBase nativeTag = adapter.fromNative(tag); - tileEntity.load(tileEntity.getBlock(), (NBTTagCompound) nativeTag); - return true; - } - - @Override - public void notifyBlockUpdate(BlockPosition position, IBlockData oldState, IBlockData newState) { - getWorld().notify(position, oldState, newState, UPDATE | NOTIFY); - } - - @Override - public boolean isChunkTicking(Chunk chunk) { - return chunk.getState().isAtLeast(PlayerChunk.State.TICKING); - } - - @Override - public void markBlockChanged(BlockPosition position) { - ((ChunkProviderServer) getWorld().getChunkProvider()).flagDirty(position); - } - - private static final EnumDirection[] NEIGHBOUR_ORDER = { - EnumDirection.WEST, EnumDirection.EAST, - EnumDirection.DOWN, EnumDirection.UP, - EnumDirection.NORTH, EnumDirection.SOUTH - }; - - @Override - public void notifyNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState) { - World world = getWorld(); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - world.update(pos, oldState.getBlock()); - } else { - // When we don't want events, manually run the physics without them. - // Un-nest neighbour updating - for (EnumDirection direction : NEIGHBOUR_ORDER) { - BlockPosition shifted = pos.shift(direction); - world.getType(shifted).doPhysics(world, shifted, oldState.getBlock(), pos, false); - } - } - if (newState.isComplexRedstone()) { - world.updateAdjacentComparators(pos, newState.getBlock()); - } - } - - @Override - public void updateNeighbors(BlockPosition pos, IBlockData oldState, IBlockData newState, int recursionLimit) { - World world = getWorld(); - // a == updateNeighbors - // b == updateDiagonalNeighbors - oldState.b(world, pos, NOTIFY, recursionLimit); - if (sideEffectSet.shouldApply(SideEffect.EVENTS)) { - CraftWorld craftWorld = world.getWorld(); - if (craftWorld != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(craftWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), CraftBlockData.fromData(newState)); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - } - newState.a(world, pos, NOTIFY, recursionLimit); - newState.b(world, pos, NOTIFY, recursionLimit); - } - - @Override - public void onBlockStateChange(BlockPosition pos, IBlockData oldState, IBlockData newState) { - getWorld().a(pos, oldState, newState); - } - - private synchronized void flushAsync(final boolean sendChunks) { - final Set changes = Collections.unmodifiableSet(new HashSet<>(cachedChanges)); - cachedChanges.clear(); - final Set toSend; - if (sendChunks) { - toSend = Collections.unmodifiableSet(new HashSet<>(cachedChunksToSend)); - cachedChunksToSend.clear(); - } else { - toSend = Collections.emptySet(); - } - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - changes.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - if (!sendChunks) { - return; - } - for (IntPair chunk : toSend) { - BukkitAdapter_1_16_5.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, false); - } - } - }; - TaskManager.IMP.async(() -> TaskManager.IMP.sync(r)); - } - - @Override - public synchronized void flush() { - RunnableVal r = new RunnableVal() { - @Override - public void run(Object value) { - cachedChanges.forEach(cc -> cc.chunk.setType(cc.position, cc.blockData, - sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE))); - for (IntPair chunk : cachedChunksToSend) { - BukkitAdapter_1_16_5.sendChunk(getWorld().getWorld().getHandle(), chunk.x, chunk.z, false); - } - } - }; - if (Fawe.isMainThread()) { - r.run(); - } else { - TaskManager.IMP.sync(r); - } - cachedChanges.clear(); - cachedChunksToSend.clear(); - } - - private static final class CachedChange { - - private final Chunk chunk; - private final BlockPosition position; - private final IBlockData blockData; - - private CachedChange(Chunk chunk, BlockPosition position, IBlockData blockData) { - this.chunk = chunk; - this.position = position; - this.blockData = blockData; - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/MapChunkUtil_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/MapChunkUtil_1_16_5.java deleted file mode 100644 index f7369ed5f..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/MapChunkUtil_1_16_5.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.bukkit.adapter.MapChunkUtil; -import net.minecraft.server.v1_16_R3.PacketPlayOutMapChunk; - -public class MapChunkUtil_1_16_5 extends MapChunkUtil { - public MapChunkUtil_1_16_5() throws NoSuchFieldException { - fieldX = PacketPlayOutMapChunk.class.getDeclaredField("a"); - fieldZ = PacketPlayOutMapChunk.class.getDeclaredField("b"); - fieldBitMask = PacketPlayOutMapChunk.class.getDeclaredField("c"); - fieldHeightMap = PacketPlayOutMapChunk.class.getDeclaredField("d"); - fieldChunkData = PacketPlayOutMapChunk.class.getDeclaredField("f"); - fieldBlockEntities = PacketPlayOutMapChunk.class.getDeclaredField("g"); - fieldFull = PacketPlayOutMapChunk.class.getDeclaredField("h"); - fieldX.setAccessible(true); - fieldZ.setAccessible(true); - fieldBitMask.setAccessible(true); - fieldHeightMap.setAccessible(true); - fieldChunkData.setAccessible(true); - fieldBlockEntities.setAccessible(true); - fieldFull.setAccessible(true); - } - - @Override - public PacketPlayOutMapChunk createPacket() { - return new PacketPlayOutMapChunk(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighterFactory_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighterFactory_1_16_5.java deleted file mode 100644 index 6002b9eea..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighterFactory_1_16_5.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.lighting.NullRelighter; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.beta.implementation.lighting.RelighterFactory; -import com.boydti.fawe.object.RelightMode; -import com.sk89q.worldedit.world.World; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.jetbrains.annotations.NotNull; - -public class TuinityRelighterFactory_1_16_5 implements RelighterFactory { - @Override - public @NotNull Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { - org.bukkit.World w = Bukkit.getWorld(world.getName()); - if (w == null) return NullRelighter.INSTANCE; - return new TuinityRelighter_1_16_5(((CraftWorld) w).getHandle(), queue); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighter_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighter_1_16_5.java deleted file mode 100644 index b902eee97..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighter_1_16_5.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5; - -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.lighting.NMSRelighter; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.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.v1_16_R3.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R3.ChunkStatus; -import net.minecraft.server.v1_16_R3.LightEngineThreaded; -import net.minecraft.server.v1_16_R3.MCUtil; -import net.minecraft.server.v1_16_R3.TicketType; -import net.minecraft.server.v1_16_R3.Unit; -import net.minecraft.server.v1_16_R3.WorldServer; -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 TuinityRelighter_1_16_5 implements Relighter { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private static final MethodHandle RELIGHT; - - 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.a("fawe_ticket", (a, b) -> 0); - private static final int LIGHT_LEVEL = MCUtil.getTicketLevelFor(ChunkStatus.LIGHT); - - private final WorldServer world; - private final ReentrantLock lock = new ReentrantLock(); - - private final Long2ObjectLinkedOpenHashMap regions = new Long2ObjectLinkedOpenHashMap<>(); - - private final ReentrantLock areaLock = new ReentrantLock(); - private final NMSRelighter delegate; - - static { - MethodHandle tmp = null; - try { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - tmp = lookup.findVirtual(LightEngineThreaded.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 LightEngineThreaded on Tuinity. " + - "Is everything up to date?", e); - } - RELIGHT = tmp; - } - - public TuinityRelighter_1_16_5(WorldServer world, IQueueExtent queue) { - this.world = world; - this.delegate = new NMSRelighter(queue, false); - } - - @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(ChunkCoordIntPair.pair(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 ChunkCoordIntPairs - Set coords = new HashSet<>(); - LongIterator iterator = chunks.iterator(); - while (iterator.hasNext()) { - coords.add(new ChunkCoordIntPair(iterator.nextLong())); - } - TaskManager.IMP.task(() -> { - // trigger chunk load and apply ticket on main thread - List> futures = new ArrayList<>(); - for (ChunkCoordIntPair pos : coords) { - futures.add(world.getWorld().getChunkAtAsync(pos.x, pos.z) - .thenAccept(c -> world.getChunkProvider().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 " + i + " chunks instead of " + 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(world.getChunkProvider().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 (ChunkCoordIntPair pos : coords) { - int x = pos.x; - int z = pos.z; - if (delay) { // we still need to send the block changes of that chunk - BukkitAdapter_1_16_5.sendChunk(world, x, z, false); - } - world.getChunkProvider().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/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/nbt/LazyCompoundTag_1_16_5.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/nbt/LazyCompoundTag_1_16_5.java deleted file mode 100644 index ad1646216..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/nbt/LazyCompoundTag_1_16_5.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_16_5.nbt; - -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.WorldEditPlugin; -import net.minecraft.server.v1_16_R3.NBTBase; -import net.minecraft.server.v1_16_R3.NBTNumber; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagList; - -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 LazyCompoundTag_1_16_5 extends CompoundTag { - - private final Supplier nmsTag; - private CompoundTag cachedValue; - - public LazyCompoundTag_1_16_5(Supplier tag) { - super(new HashMap<>()); - this.nmsTag = tag; - } - - public LazyCompoundTag_1_16_5(NBTTagCompound tag) { - this(() -> tag); - } - - public NBTTagCompound get() { - return nmsTag.get(); - } - - @Override - public Map getValue() { - if (cachedValue == null) { - cachedValue = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(nmsTag.get()); - } - return cachedValue.getValue(); - } - - public boolean containsKey(String key) { - return nmsTag.get().hasKey(key); - } - - public byte[] getByteArray(String key) { - return nmsTag.get().getByteArray(key); - } - - public byte getByte(String key) { - return nmsTag.get().getByte(key); - } - - public double getDouble(String key) { - return nmsTag.get().getDouble(key); - } - - public double asDouble(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asDouble(); - } - return 0; - } - - public float getFloat(String key) { - return nmsTag.get().getFloat(key); - } - - public int[] getIntArray(String key) { - return nmsTag.get().getIntArray(key); - } - - public int getInt(String key) { - return nmsTag.get().getInt(key); - } - - public int asInt(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asInt(); - } - return 0; - } - - public List getList(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - ArrayList list = new ArrayList<>(); - NBTTagList nbtList = (NBTTagList) tag; - for (NBTBase elem : nbtList) { - if (elem instanceof NBTTagCompound) { - list.add(new LazyCompoundTag_1_16_5((NBTTagCompound) elem)); - } else { - list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); - } - } - return list; - } - return Collections.emptyList(); - } - - public ListTag getListTag(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - 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 nmsTag.get().getLongArray(key); - } - - public long getLong(String key) { - return nmsTag.get().getLong(key); - } - - public long asLong(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asLong(); - } - return 0; - } - - public short getShort(String key) { - return nmsTag.get().getShort(key); - } - - public String getString(String key) { - return nmsTag.get().getString(key); - } - - @Override - public String toString() { - return nmsTag.get().toString(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweLocalBlockQueue.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweLocalBlockQueue.java deleted file mode 100644 index 977558acd..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweLocalBlockQueue.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.plotsquared.core.queue.LocalBlockQueue; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.function.pattern.Pattern; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; -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 BlockVector3 mutable = new MutableBlockVector3(); - private boolean setbiome = false; - - 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) { - setbiome = true; - return instance.setBiome(x, 0, z, biomeType); - } - - @Override - public boolean setBiome() { - return setbiome; - } - - @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/boydti/fawe/bukkit/regions/plotsquared/FaweTrim.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweTrim.java deleted file mode 100644 index c4ad5ae9e..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweTrim.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; - -import com.boydti.fawe.util.TaskManager; -import com.plotsquared.core.command.CommandCategory; -import com.plotsquared.core.command.CommandDeclaration; -import com.plotsquared.core.command.RequiredType; -import com.plotsquared.core.command.SubCommand; -import com.plotsquared.core.configuration.Captions; -import com.plotsquared.core.player.PlotPlayer; -import com.plotsquared.core.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/boydti/fawe/bukkit/regions/plotsquared/PlotSetBiome.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSetBiome.java deleted file mode 100644 index 0e5c93da7..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSetBiome.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; - -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.TaskManager; -import com.plotsquared.core.command.Command; -import com.plotsquared.core.command.CommandCategory; -import com.plotsquared.core.command.CommandDeclaration; -import com.plotsquared.core.command.MainCommand; -import com.plotsquared.core.command.RequiredType; -import com.plotsquared.core.configuration.Captions; -import com.plotsquared.core.player.PlotPlayer; -import com.plotsquared.core.plot.Plot; -import com.plotsquared.core.util.MainUtil; -import com.plotsquared.core.util.Permissions; -import com.plotsquared.core.util.StringMan; -import com.plotsquared.core.util.task.RunnableVal2; -import com.plotsquared.core.util.task.RunnableVal3; -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.toString() + 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 = new EditSessionBuilder(BukkitAdapter.adapt(Bukkit.getWorld(plot.getArea().getWorldName()))) - .autoQueue(false) - .checkMemory(false) - .allowedRegionsEverywhere() - .player(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/sk89q/worldedit/bukkit/BukkitPermissionAttachmentManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPermissionAttachmentManager.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java index d1bc5fb1b..19851ee65 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPermissionAttachmentManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java @@ -1,8 +1,10 @@ -package com.sk89q.worldedit.bukkit; +package com.fastasyncworldedit.bukkit; import javax.annotation.Nullable; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + +import com.sk89q.worldedit.bukkit.WorldEditPlugin; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachment; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java similarity index 81% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java index f57833d3f..6a9d1b30b 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/FaweBukkit.java @@ -1,31 +1,32 @@ -package com.boydti.fawe.bukkit; +package com.fastasyncworldedit.bukkit; -import com.boydti.fawe.FAWEPlatformAdapterImpl; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.IFawe; -import com.boydti.fawe.beta.implementation.cache.preloader.AsyncPreloader; -import com.boydti.fawe.beta.implementation.cache.preloader.Preloader; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.BukkitQueueHandler; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.bukkit.listener.BrushListener; -import com.boydti.fawe.bukkit.listener.ChunkListener9; -import com.boydti.fawe.bukkit.listener.RenderListener; -import com.boydti.fawe.bukkit.regions.GriefPreventionFeature; -import com.boydti.fawe.bukkit.regions.GriefDefenderFeature; -import com.boydti.fawe.bukkit.regions.ResidenceFeature; -import com.boydti.fawe.bukkit.regions.TownyFeature; -import com.boydti.fawe.bukkit.regions.Worldguard; -import com.boydti.fawe.bukkit.util.BukkitTaskManager; -import com.boydti.fawe.bukkit.util.ItemUtil; -import com.boydti.fawe.bukkit.util.MinecraftVersion; -import com.boydti.fawe.bukkit.util.image.BukkitImageViewer; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.ThirdPartyManager; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.WEManager; -import com.boydti.fawe.util.image.ImageViewer; +import com.fastasyncworldedit.core.FAWEPlatformAdapterImpl; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.IFawe; +import com.fastasyncworldedit.core.beta.implementation.preloader.AsyncPreloader; +import com.fastasyncworldedit.core.beta.implementation.preloader.Preloader; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.bukkit.adapter.BukkitQueueHandler; +import com.fastasyncworldedit.bukkit.adapter.NMSAdapter; +import com.fastasyncworldedit.bukkit.listener.BrushListener; +import com.fastasyncworldedit.bukkit.listener.ChunkListener9; +import com.fastasyncworldedit.bukkit.listener.RenderListener; +import com.fastasyncworldedit.bukkit.regions.GriefPreventionFeature; +import com.fastasyncworldedit.bukkit.regions.GriefDefenderFeature; +import com.fastasyncworldedit.bukkit.regions.ResidenceFeature; +import com.fastasyncworldedit.bukkit.regions.TownyFeature; +import com.fastasyncworldedit.bukkit.regions.Worldguard; +import com.fastasyncworldedit.bukkit.util.BukkitTaskManager; +import com.fastasyncworldedit.bukkit.util.ItemUtil; +import com.fastasyncworldedit.bukkit.util.MinecraftVersion; +import com.fastasyncworldedit.bukkit.util.image.BukkitImageViewer; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.ThirdPartyManager; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.WEManager; +import com.fastasyncworldedit.core.util.image.ImageViewer; +import com.plotsquared.core.PlotSquared; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitPlayer; import com.sk89q.worldedit.internal.util.LogManagerCompat; @@ -291,12 +292,13 @@ public class FaweBukkit implements IFawe, Listener { return; } if (plotSquared.getClass().getPackage().toString().contains("intellectualsites")) { - WEManager.IMP.managers - .add(new com.boydti.fawe.bukkit.regions.plotsquaredv4.PlotSquaredFeature()); + WEManager.IMP.managers.add(new com.fastasyncworldedit.bukkit.regions.plotsquaredv4.PlotSquaredFeature()); + LOGGER.info("Plugin 'PlotSquared' found. Using it now."); + } else if (PlotSquared.get().getVersion().version[0] == 6){ + WEManager.IMP.managers.add(new com.fastasyncworldedit.bukkit.regions.plotsquared.PlotSquaredFeature()); + LOGGER.info("Plugin 'PlotSquared' found. Using it now."); } else { - WEManager.IMP.managers - .add(new com.boydti.fawe.bukkit.regions.plotsquared.PlotSquaredFeature()); + LOGGER.error("Incompatible version of PlotSquared found. Please use PlotSquared v6."); } - LOGGER.info("Plugin 'PlotSquared' found. Using it now."); } } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitGetBlocks.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitGetBlocks.java similarity index 63% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitGetBlocks.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitGetBlocks.java index c06466cb7..6096c0ace 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitGetBlocks.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitGetBlocks.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; public interface BukkitGetBlocks { diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitQueueHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitQueueHandler.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java index 1abc98c2c..1170acf56 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/BukkitQueueHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/BukkitQueueHandler.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; import co.aikar.timings.Timings; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.listener.ChunkListener; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.bukkit.listener.ChunkListener; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; import org.spigotmc.AsyncCatcher; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/CachedBukkitAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/CachedBukkitAdapter.java similarity index 98% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/CachedBukkitAdapter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/CachedBukkitAdapter.java index 8b0af1f65..7d87748c0 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/CachedBukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/CachedBukkitAdapter.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/DelegateLock.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateLock.java similarity index 98% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/DelegateLock.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateLock.java index 5dc34791a..e81fd10e3 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/DelegateLock.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateLock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; import com.destroystokyo.paper.util.ReentrantLockWithGetOwner; diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateSemaphore.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateSemaphore.java new file mode 100644 index 000000000..50637d788 --- /dev/null +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateSemaphore.java @@ -0,0 +1,33 @@ +package com.fastasyncworldedit.bukkit.adapter; + +import java.util.concurrent.Semaphore; + +public class DelegateSemaphore extends Semaphore { + private final Semaphore delegate; + + public DelegateSemaphore(int permits, Semaphore delegate) { + super(permits); + this.delegate = delegate; + } + + // this is bad + @Override + public synchronized boolean tryAcquire() { + try { + this.delegate.acquire(); + return true; + } catch (InterruptedException e) { + return true; + } + } + + @Override + public synchronized void acquire() throws InterruptedException { + this.delegate.acquire(); + } + + @Override + public synchronized void release() { + this.delegate.release(); + } +} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IBukkitAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java similarity index 99% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IBukkitAdapter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java index 9e756d684..9f94a8aa9 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IBukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IBukkitAdapter.java @@ -1,4 +1,4 @@ -package com.sk89q.worldedit.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java similarity index 96% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java index 8f380fc06..b6f3c1a34 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/IDelegateBukkitImplAdapter.java @@ -1,12 +1,13 @@ -package com.sk89q.worldedit.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.bukkit.BukkitPlayer; import com.sk89q.worldedit.bukkit.BukkitWorld; +import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; @@ -21,6 +22,7 @@ import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -39,11 +41,6 @@ import java.util.OptionalInt; public interface IDelegateBukkitImplAdapter extends BukkitImplAdapter { BukkitImplAdapter getParent(); - @Override - default int getDataVersion() { - return getParent().getDataVersion(); - } - @Override @Nullable default DataFixer getDataFixer() { @@ -83,7 +80,7 @@ public interface IDelegateBukkitImplAdapter extends BukkitImplAdapter { } @Override - default void sendFakeNBT(Player player, BlockVector3 pos, CompoundTag nbtData) { + default void sendFakeNBT(Player player, BlockVector3 pos, CompoundBinaryTag nbtData) { getParent().sendFakeNBT(player, pos, nbtData); } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/MapChunkUtil.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/MapChunkUtil.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java index 9da0a131b..4841771ee 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/MapChunkUtil.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/MapChunkUtil.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.math.BlockVector3; @@ -18,7 +18,7 @@ public abstract class MapChunkUtil { protected Field fieldBlockEntities; protected Field fieldFull; - public abstract T createPacket(); + protected abstract T createPacket(); public T create(BukkitImplAdapter adapter, ChunkPacket packet) { try { diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java similarity index 97% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/NMSAdapter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 1732fc3e1..2b6f736f2 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; -import com.boydti.fawe.FAWEPlatformAdapterImpl; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.FAWEPlatformAdapterImpl; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockID; 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 new file mode 100644 index 000000000..ff436f235 --- /dev/null +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java @@ -0,0 +1,19 @@ +package com.fastasyncworldedit.bukkit.adapter; + +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.lighting.NMSRelighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RelightMode; +import com.sk89q.worldedit.world.World; +import org.jetbrains.annotations.NotNull; + +public class NMSRelighterFactory implements RelighterFactory { + @Override + public @NotNull Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent queue) { + return new NMSRelighter(queue, + relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE)); + } +} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java similarity index 98% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/Regenerator.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index fcfecf57a..65ce4ff07 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -1,10 +1,10 @@ -package com.sk89q.worldedit.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.queue.SingleThreadQueueExtent; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.beta.IChunkCache; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.queue.SingleThreadQueueExtent; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector2; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/SimpleBukkitAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/SimpleBukkitAdapter.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/SimpleBukkitAdapter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/SimpleBukkitAdapter.java index e197f60ce..c5420c7d6 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/SimpleBukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/SimpleBukkitAdapter.java @@ -1,5 +1,6 @@ -package com.sk89q.worldedit.bukkit.adapter; +package com.fastasyncworldedit.bukkit.adapter; +import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefDefenderFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java similarity index 88% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefDefenderFilter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java index 23dbbaed8..9679af1c6 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefDefenderFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefDefenderFilter.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.bukkit.filter; +package com.fastasyncworldedit.bukkit.filter; -import com.boydti.fawe.regions.general.CuboidRegionFilter; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.math.BlockVector2; import com.griefdefender.api.claim.Claim; import com.griefdefender.api.GriefDefender; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java similarity index 88% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java index d3ef21bb4..3087e01cc 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/GriefPreventionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/GriefPreventionFilter.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.bukkit.filter; +package com.fastasyncworldedit.bukkit.filter; -import com.boydti.fawe.regions.general.CuboidRegionFilter; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.math.BlockVector2; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.GriefPrevention; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java index ba5f2281f..215d71b04 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/filter/WorldGuardFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/filter/WorldGuardFilter.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.bukkit.filter; +package com.fastasyncworldedit.bukkit.filter; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/BrushListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java similarity index 93% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/BrushListener.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java index ef51702ca..888f59924 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/BrushListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/BrushListener.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.listener; +package com.fastasyncworldedit.bukkit.listener; -import com.boydti.fawe.object.brush.MovableTool; -import com.boydti.fawe.object.brush.ResettableTool; -import com.boydti.fawe.object.brush.scroll.ScrollTool; +import com.fastasyncworldedit.core.object.brush.MovableTool; +import com.fastasyncworldedit.core.object.brush.ResettableTool; +import com.fastasyncworldedit.core.object.brush.scroll.ScrollTool; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitPlayer; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java similarity index 97% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java index 9b8225e50..0048e3b1c 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.bukkit.listener; +package com.fastasyncworldedit.bukkit.listener; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.bukkit.FaweBukkit; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.FaweTimer; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.bukkit.FaweBukkit; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.FaweTimer; +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.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener9.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener9.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java index adaa01cd6..dd70aa8cc 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/ChunkListener9.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/ChunkListener9.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.bukkit.listener; +package com.fastasyncworldedit.bukkit.listener; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.FaweTimer; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.FaweTimer; +import com.fastasyncworldedit.core.util.MathMan; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/RenderListener.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java similarity index 96% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/RenderListener.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java index a50593081..7780d43a8 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/listener/RenderListener.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/listener/RenderListener.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.listener; +package com.fastasyncworldedit.bukkit.listener; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.TaskManager; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/preloader/PluginPreloader.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/preloader/PluginPreloader.java similarity index 98% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/preloader/PluginPreloader.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/preloader/PluginPreloader.java index 91c8ff3a0..2d3a497dd 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/preloader/PluginPreloader.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/preloader/PluginPreloader.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.preloader; +package com.fastasyncworldedit.bukkit.preloader; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMaskManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/BukkitMaskManager.java similarity index 75% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMaskManager.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/BukkitMaskManager.java index 921c7ab0b..f32434855 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/BukkitMaskManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/BukkitMaskManager.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; -import com.boydti.fawe.regions.FaweMaskManager; +import com.fastasyncworldedit.core.regions.FaweMaskManager; import org.bukkit.permissions.Permissible; public abstract class BukkitMaskManager extends FaweMaskManager { diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefDefenderFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java similarity index 92% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefDefenderFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java index 636efede5..ae7634cf6 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefDefenderFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefDefenderFeature.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; -import com.boydti.fawe.bukkit.filter.GriefDefenderFilter; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.bukkit.filter.GriefDefenderFilter; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.flowpowered.math.vector.Vector3i; import com.griefdefender.api.GriefDefender; import com.griefdefender.api.claim.Claim; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java index e253922ff..cde423567 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/GriefPreventionFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/GriefPreventionFeature.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; -import com.boydti.fawe.bukkit.filter.GriefPreventionFilter; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.bukkit.filter.GriefPreventionFilter; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/ResidenceFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/ResidenceFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java index 3c46a4c7c..2eb918d47 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/ResidenceFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/ResidenceFeature.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; import com.bekvon.bukkit.residence.Residence; import com.bekvon.bukkit.residence.protection.ClaimedResidence; import com.bekvon.bukkit.residence.protection.CuboidArea; -import com.boydti.fawe.bukkit.FaweBukkit; -import com.boydti.fawe.regions.FaweMask; +import com.fastasyncworldedit.bukkit.FaweBukkit; +import com.fastasyncworldedit.core.regions.FaweMask; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/TownyFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java similarity index 97% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/TownyFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java index 723f4b011..9304d89fb 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/TownyFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/TownyFeature.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; -import com.boydti.fawe.regions.FaweMask; +import com.fastasyncworldedit.core.regions.FaweMask; import com.palmergames.bukkit.towny.Towny; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.object.PlayerCache; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/Worldguard.java similarity index 96% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/Worldguard.java index a395dfb42..fa6f3638c 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/Worldguard.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/Worldguard.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.bukkit.regions; +package com.fastasyncworldedit.bukkit.regions; -import com.boydti.fawe.bukkit.filter.WorldGuardFilter; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.bukkit.filter.WorldGuardFilter; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweRegionManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java similarity index 73% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweRegionManager.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java index 98567f427..ea6abd83c 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweRegionManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; +package com.fastasyncworldedit.bukkit.regions.plotsquared; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.object.RelightMode; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.TaskManager; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.generator.HybridPlotManager; import com.plotsquared.core.generator.HybridPlotWorld; @@ -13,7 +13,6 @@ import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotAreaTerrainType; import com.plotsquared.core.plot.PlotAreaType; import com.plotsquared.core.plot.PlotManager; -import com.plotsquared.core.util.RegionManager; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEdit; @@ -33,41 +32,32 @@ import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Set; +import java.util.UUID; import static org.bukkit.Bukkit.getWorld; -public class FaweRegionManager extends RegionManager { +public class FaweDelegateRegionManager { - private final RegionManager parent; - - public FaweRegionManager(RegionManager parent) { - this.parent = parent; - } - - @Override - public int[] countEntities(Plot plot) { - return parent.countEntities(plot); - } - - @Override - public void clearAllEntities(Location pos1, Location pos2) { - parent.clearAllEntities(pos1, pos2); - } - - @Override - public boolean setCuboids(final PlotArea area, final Set regions, final Pattern blocks, final int minY, final int maxY) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.CUBOIDS) { - return parent.setCuboids(area, regions, blocks, minY, maxY); - } + public boolean setCuboids(final @NonNull PlotArea area, + final @NonNull Set regions, + final @NonNull Pattern blocks, + int minY, + int maxY, + Runnable whenDone) { TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { + synchronized (FaweDelegateRegionManager.class) { World world = BukkitAdapter.adapt(getWorld(area.getWorldName())); - EditSession session = new EditSessionBuilder(world).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); + EditSession session = + new EditSessionBuilder(world).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull() + .autoQueue(false).build(); for (CuboidRegion region : regions) { region.setPos1(region.getPos1().withY(minY)); region.setPos2(region.getPos2().withY(maxY)); @@ -77,32 +67,28 @@ public class FaweRegionManager extends RegionManager { session.flushQueue(); for (CuboidRegion region : regions) { FaweAPI.fixLighting(world, region, null, - RelightMode.valueOf(com.boydti.fawe.config.Settings.IMP.LIGHTING.MODE)); + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE)); } } catch (MaxChangedBlocksException e) { e.printStackTrace(); + } finally { + TaskManager.IMP.task(whenDone); } } }); return true; } - @Override public boolean notifyClear(PlotManager manager) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.CLEAR || !(manager instanceof HybridPlotManager)) { - return false; - } final HybridPlotWorld hpw = ((HybridPlotManager) manager).getHybridPlotWorld(); return hpw.getType() != PlotAreaType.AUGMENTED || hpw.getTerrain() == PlotAreaTerrainType.NONE; } - @Override - public boolean handleClear(final Plot plot, final Runnable whenDone, final PlotManager manager) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.CLEAR || !(manager instanceof HybridPlotManager)) { - return false; - } + public boolean handleClear(@NotNull Plot plot, + @Nullable Runnable whenDone, + @NotNull PlotManager manager) { TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { + synchronized (FaweDelegateRegionManager.class) { final HybridPlotWorld hybridPlotWorld = ((HybridPlotManager) manager).getHybridPlotWorld(); World world = BukkitAdapter.adapt(getWorld(hybridPlotWorld.getWorldName())); EditSession editSession = new EditSessionBuilder(world).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); @@ -157,56 +143,58 @@ public class FaweRegionManager extends RegionManager { // Be verbose in editsession flushing editSession.flushQueue(); FaweAPI.fixLighting(world, new CuboidRegion(plot.getBottomAbs().getBlockVector3(), plot.getTopAbs().getBlockVector3()), null, - RelightMode.valueOf(com.boydti.fawe.config.Settings.IMP.LIGHTING.MODE)); + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE)); TaskManager.IMP.task(whenDone); } }); return true; } - @Override - public void swap(final Location pos1, final Location pos2, final Location pos3, final Location pos4, final Runnable whenDone) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.COPY_AND_SWAP) { - parent.swap(pos1, pos2, pos3, pos4, whenDone); - } + public void swap(Location pos1, + Location pos2, + Location swapPos, + final Runnable whenDone) { TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { + synchronized (FaweDelegateRegionManager.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())); + World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); + World pos3World = BukkitAdapter.adapt(getWorld(swapPos.getWorldName())); WorldEdit.getInstance().getEditSessionFactory().getEditSession(pos1World, -1); EditSession sessionA = new EditSessionBuilder(pos1World).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); EditSession sessionB = new EditSessionBuilder(pos3World).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).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()); + CuboidRegion regionA = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()); + CuboidRegion regionB = new CuboidRegion(swapPos.getBlockVector3(), swapPos.getBlockVector3().add(pos2.getBlockVector3()).subtract(pos1.getBlockVector3())); + regionA.setWorld(pos1World); + regionB.setWorld(pos3World); + Clipboard clipA = Clipboard.create(regionA, UUID.randomUUID()); + 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()); try { Operations.completeLegacy(copyA); Operations.completeLegacy(copyB); + clipA.paste(sessionB, swapPos.getBlockVector3(), true); + clipB.paste(sessionA, pos1.getBlockVector3(), true); sessionA.flushQueue(); sessionB.flushQueue(); } catch (MaxChangedBlocksException e) { e.printStackTrace(); } FaweAPI.fixLighting(pos1World, new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()), null, - RelightMode.valueOf(com.boydti.fawe.config.Settings.IMP.LIGHTING.MODE)); - FaweAPI.fixLighting(pos1World, new CuboidRegion(pos3.getBlockVector3(), pos4.getBlockVector3()), null, - RelightMode.valueOf(com.boydti.fawe.config.Settings.IMP.LIGHTING.MODE)); + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE)); + FaweAPI.fixLighting(pos1World, new CuboidRegion(swapPos.getBlockVector3(), + BlockVector3.at(swapPos.getX() + pos2.getX() - pos1.getX(), 0, swapPos.getZ() + pos2.getZ() - pos1.getZ())), null, + RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE)); TaskManager.IMP.task(whenDone); } }); } - @Override public void setBiome(CuboidRegion region, int extendBiome, BiomeType biome, String world, Runnable whenDone) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.SET_BIOME) { - parent.setBiome(region, extendBiome, biome, world, whenDone); - } region.expand(BlockVector3.at(extendBiome, 0, extendBiome)); region.expand(BlockVector3.at(-extendBiome, 0, -extendBiome)); TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { + synchronized (FaweDelegateRegionManager.class) { EditSession editSession = new EditSessionBuilder(BukkitAdapter.adapt(getWorld(world))).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); FlatRegionFunction replace = new BiomeReplace(editSession, biome); FlatRegionVisitor visitor = new FlatRegionVisitor(region, replace); @@ -221,15 +209,14 @@ public class FaweRegionManager extends RegionManager { }); } - @Override - public boolean copyRegion(final Location pos1, final Location pos2, final Location pos3, final Runnable whenDone) { - if (!com.boydti.fawe.config.Settings.IMP.PLOTSQUARED_INTEGRATION.COPY_AND_SWAP) { - return parent.copyRegion(pos1, pos2, pos3, whenDone); - } + public boolean copyRegion(final @NonNull Location pos1, + final @NonNull Location pos2, + final @NonNull Location pos3, + final @NonNull Runnable whenDone) { TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { - World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorld())); - World pos3World = BukkitAdapter.adapt(getWorld(pos3.getWorld())); + synchronized (FaweDelegateRegionManager.class) { + World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); + World pos3World = BukkitAdapter.adapt(getWorld(pos3.getWorldName())); EditSession from = new EditSessionBuilder(pos1World).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); EditSession to = new EditSessionBuilder(pos3World).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build(); CuboidRegion region = new CuboidRegion(BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ())); @@ -239,7 +226,7 @@ public class FaweRegionManager extends RegionManager { to.flushQueue(); FaweAPI.fixLighting(pos1World, new CuboidRegion(pos3.getBlockVector3(), pos3.getBlockVector3().add(pos2.getBlockVector3().subtract(pos1.getBlockVector3()))), - null, RelightMode.valueOf(com.boydti.fawe.config.Settings.IMP.LIGHTING.MODE)); + null, RelightMode.valueOf(com.fastasyncworldedit.core.configuration.Settings.IMP.LIGHTING.MODE)); } catch (MaxChangedBlocksException e) { e.printStackTrace(); } @@ -249,11 +236,10 @@ public class FaweRegionManager extends RegionManager { return true; } - @Override public boolean regenerateRegion(final Location pos1, final Location pos2, boolean ignore, final Runnable whenDone) { TaskManager.IMP.async(() -> { - synchronized (FaweRegionManager.class) { - World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorld())); + synchronized (FaweDelegateRegionManager.class) { + World pos1World = BukkitAdapter.adapt(getWorld(pos1.getWorldName())); try (EditSession editSession = new EditSessionBuilder(pos1World).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build()) { CuboidRegion region = new CuboidRegion(BlockVector3.at(pos1.getX(), pos1.getY(), pos1.getZ()), BlockVector3.at(pos2.getX(), pos2.getY(), pos2.getZ())); editSession.regenerate(region); diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java similarity index 53% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweSchematicHandler.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java index 0a9b9b4f1..c14032e58 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java @@ -1,18 +1,20 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; +package com.fastasyncworldedit.bukkit.regions.plotsquared; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.object.clipboard.ReadOnlyClipboard; -import com.boydti.fawe.object.io.PGZIPOutputStream; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.IOUtil; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.IOUtil; import com.plotsquared.core.PlotSquared; -import com.plotsquared.core.location.Location; +import com.plotsquared.core.generator.ClassicPlotWorld; +import com.plotsquared.core.plot.Plot; +import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.schematic.Schematic; -import com.plotsquared.core.queue.LocalBlockQueue; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.task.RunnableVal; +import com.plotsquared.core.util.task.TaskManager; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompressedCompoundTag; import com.sk89q.jnbt.NBTInputStream; @@ -20,18 +22,17 @@ import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; import com.sk89q.jnbt.fawe.CompressedSchematicTag; import com.sk89q.worldedit.EditSession; -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.extent.clipboard.io.FastSchematicReader; import com.sk89q.worldedit.extent.clipboard.io.FastSchematicWriter; import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; import com.sk89q.worldedit.extent.clipboard.io.SpongeSchematicReader; +import com.sk89q.worldedit.internal.util.LogManagerCompat; 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.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import java.io.BufferedInputStream; @@ -45,64 +46,109 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.Map; -import java.util.Set; import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.zip.GZIPInputStream; -import static org.bukkit.Bukkit.getWorld; +public class FaweDelegateSchematicHandler { -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; + private static final Logger LOGGER = LogManagerCompat.getLogger(); + + private static final AtomicBoolean exportingAll = new AtomicBoolean(); + + public void paste(final Schematic schematic, + final Plot plot, + final int xOffset, + final int yOffset, + final int zOffset, + final boolean autoHeight, + final RunnableVal whenDone) { + Runnable r = () -> { + if (whenDone != null) { + whenDone.value = false; + } + if (schematic == null) { + TaskManager.runTask(whenDone); + return; + } + BlockVector3 dimension = schematic.getClipboard().getDimensions(); + final int WIDTH = dimension.getX(); + final int LENGTH = dimension.getZ(); + final int HEIGHT = dimension.getY(); + // Validate dimensions + CuboidRegion region = plot.getLargestRegion(); + if (((region.getMaximumPoint().getX() - region.getMinimumPoint().getX() + xOffset + 1) < WIDTH) || ( + (region.getMaximumPoint().getZ() - region.getMinimumPoint().getZ() + zOffset + 1) < LENGTH) || (HEIGHT + > 256)) { + TaskManager.runTask(whenDone); + return; + } + // Calculate the optimal height to paste the schematic at + final int y_offset_actual; + if (autoHeight) { + if (HEIGHT >= 256) { + y_offset_actual = yOffset; + } else { + PlotArea pw = plot.getArea(); + if (pw instanceof ClassicPlotWorld) { + y_offset_actual = yOffset + ((ClassicPlotWorld) pw).PLOT_HEIGHT; + } else { + y_offset_actual = yOffset + 1 + PlotSquared.platform().worldUtil() + .getHighestBlockSynchronous(plot.getWorldName(), region.getMinimumPoint().getX() + 1, + region.getMinimumPoint().getZ() + 1); + } + } + } else { + y_offset_actual = yOffset; + } + + final BlockVector3 to = BlockVector3 + .at(region.getMinimumPoint().getX() + xOffset, y_offset_actual, region.getMinimumPoint().getZ() + zOffset); + + try (EditSession editSession = new EditSessionBuilder(FaweAPI.getWorld(plot.getWorldName())).checkMemory(false) + .fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).build()) { + final Clipboard clipboard = schematic.getClipboard(); + clipboard.paste(editSession, to, true, false, true); + if (whenDone != null) { + whenDone.value = true; + TaskManager.runTask(whenDone); + } + } + }; + if (Fawe.isMainThread()) { + com.fastasyncworldedit.core.util.TaskManager.IMP.async(r); + } else { + r.run(); } - 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 = new EditSessionBuilder(adaptedWorld).checkMemory(false).fastmode(true).limitUnlimited().changeSetNull().autoQueue(false).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"); + LOGGER.warn("Cannot save empty tag"); return false; } try { - File tmp = MainUtil.getFile(PlotSquared.get().IMP.getDirectory(), path); + File tmp = FileUtils.getFile(PlotSquared.platform().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 PGZIPOutputStream(stream)))) { + try (OutputStream stream = new FileOutputStream(tmp); + NBTOutputStream output = new NBTOutputStream( + new BufferedOutputStream(new PGZIPOutputStream(stream)))) { new FastSchematicWriter(output).write(clipboard); } } else { - try (OutputStream stream = new FileOutputStream(tmp); BufferedOutputStream output = new BufferedOutputStream(new PGZIPOutputStream(stream))) { + try (OutputStream stream = new FileOutputStream(tmp); + BufferedOutputStream output = new BufferedOutputStream(new PGZIPOutputStream(stream))) { LZ4BlockInputStream is = cTag.adapt(cTag.getSource()); - IOUtil.copy(is, stream); + IOUtil.copy(is, output); } } } else { - try (OutputStream stream = new FileOutputStream(tmp); NBTOutputStream output = new NBTOutputStream(new PGZIPOutputStream(stream))) { + try (OutputStream stream = new FileOutputStream(tmp); + NBTOutputStream output = new NBTOutputStream(new PGZIPOutputStream(stream))) { Map map = tag.getValue(); output.writeNamedTag("Schematic", map.getOrDefault("Schematic", tag)); } @@ -116,15 +162,14 @@ public class FaweSchematicHandler extends SchematicHandler { 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"); + LOGGER.warn("Cannot save empty tag"); com.plotsquared.core.util.task.TaskManager.runTask(whenDone); return; } final CompoundTag weTag = (CompoundTag) FaweCache.IMP.asTag(tag); - MainUtil.upload(uuid, file, "schem", new RunnableVal() { + SchematicHandler.upload(uuid, file, "schem", new RunnableVal<>() { @Override public void run(OutputStream output) { if (weTag instanceof CompressedSchematicTag) { @@ -145,7 +190,6 @@ public class FaweSchematicHandler extends SchematicHandler { }, whenDone); } - @Override public Schematic getSchematic(@NotNull InputStream is) { try { FastSchematicReader schematicReader = new FastSchematicReader( @@ -174,8 +218,8 @@ public class FaweSchematicHandler extends SchematicHandler { return new Schematic(clip); } catch (IOException e3) { e.printStackTrace(); - PlotSquared.debug( - is.toString() + " | " + is.getClass().getCanonicalName() + " is not in GZIP format : " + e + LOGGER.warn( + is + " | " + is.getClass().getCanonicalName() + " is not in GZIP format : " + e .getMessage()); } } 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 new file mode 100644 index 000000000..22802403d --- /dev/null +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java @@ -0,0 +1,205 @@ +package com.fastasyncworldedit.bukkit.regions.plotsquared; + +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.plotsquared.core.queue.LightingMode; +import com.plotsquared.core.queue.QueueCoordinator; +import com.plotsquared.core.queue.subscriber.ProgressSubscriber; +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.MutableBlockVector3; +import com.sk89q.worldedit.regions.CuboidRegion; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; + +public class FaweQueueCoordinator extends QueueCoordinator { + + public final IQueueExtent instance; + private final World world; + private BlockVector3 mutable = new MutableBlockVector3(); + private boolean setbiome = false; + + public FaweQueueCoordinator(World world) { + super(world); + this.world = world; + instance = Fawe.get().getQueueHandler().getQueue(world); + Fawe.get().getQueueHandler().unCache(); + } + + @Override + public int size() { + return instance.isEmpty() ? 0 : 1; + } + + @Override + public void setModified(long l) { + } + + @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) { + setbiome = true; + return instance.setBiome(x, 0, z, biomeType); + } + + @Override + public boolean setBiome(int x, int y, int z, @NotNull BiomeType biome) { + return false; + } + + @Override + public boolean isSettingBiomes() { + return false; + } + + @Override + public boolean setEntity(@NotNull Entity entity) { + return false; + } + + @NotNull + @Override + public List getReadChunks() { + return null; + } + + @Override + public void addReadChunks(@NotNull Set readChunks) { + + } + + @Override + public void addReadChunk(@NotNull BlockVector2 chunk) { + + } + + @Override + public boolean isUnloadAfter() { + return false; + } + + @Override + public void setUnloadAfter(boolean unloadAfter) { + + } + + @Nullable + @Override + public CuboidRegion getRegenRegion() { + return null; + } + + @Override + public void setRegenRegion(@NotNull CuboidRegion regenRegion) { + + } + + @Override + public boolean enqueue() { + boolean val = super.enqueue(); + instance.enableQueue(); + return val; + } + + @Override + public void start() { + + } + + @Override + public void cancel() { + + } + + @Override + public Runnable getCompleteTask() { + return null; + } + + @Override + public void setCompleteTask(@Nullable Runnable whenDone) { + + } + + @Nullable + @Override + public Consumer getChunkConsumer() { + return null; + } + + @Override + public void setChunkConsumer(@NotNull Consumer consumer) { + + } + + @Override + public void addProgressSubscriber(@NotNull ProgressSubscriber progressSubscriber) { + + } + + @NotNull + @Override + public LightingMode getLightingMode() { + return null; + } + + @Override + public void setLightingMode(@Nullable LightingMode mode) { + + } + + @Override + public void regenChunk(int x, int z) { + instance.regenerateChunk(x, z, null, null); + } + + @Nullable + @Override + public World getWorld() { + return world; + } + + @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; + } + + @Override + public boolean isSettingTiles() { + return false; + } +} 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 new file mode 100644 index 000000000..83d1074d1 --- /dev/null +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java @@ -0,0 +1,55 @@ +package com.fastasyncworldedit.bukkit.regions.plotsquared; + +import com.fastasyncworldedit.core.util.TaskManager; +import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.command.CommandCategory; +import com.plotsquared.core.command.CommandDeclaration; +import com.plotsquared.core.command.RequiredType; +import com.plotsquared.core.command.SubCommand; +import com.plotsquared.core.configuration.caption.StaticCaption; +import com.plotsquared.core.configuration.caption.Templates; +import com.plotsquared.core.configuration.caption.TranslatableCaption; +import com.plotsquared.core.player.PlotPlayer; + +@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(TranslatableCaption.of("error.task_in_process")); + return false; + } + if (strings.length != 2) { + plotPlayer.sendMessage(StaticCaption + .of("First make a backup of your world called then stand in the middle of an empty plot")); + plotPlayer.sendMessage(StaticCaption.of("use /plot trimall ")); + return false; + } + if (!PlotSquared.platform().worldUtil().isWorld(strings[0])) { + plotPlayer.sendMessage(TranslatableCaption.of("errors.not_valid_plot_world"), Templates.of("value", strings[0])); + return false; + } + ran = true; + TaskManager.IMP.async(() -> { + 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/boydti/fawe/bukkit/regions/plotsquared/MoveTo512.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/MoveTo512.java similarity index 99% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/MoveTo512.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/MoveTo512.java index 437e0c58a..3f25b8f8d 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/MoveTo512.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/MoveTo512.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; +package com.fastasyncworldedit.bukkit.regions.plotsquared; import com.plotsquared.core.command.CommandCategory; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotRegionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java similarity index 86% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotRegionFilter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java index 4c6be8306..f343401a4 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotRegionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotRegionFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; +package com.fastasyncworldedit.bukkit.regions.plotsquared; -import com.boydti.fawe.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; 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 new file mode 100644 index 000000000..67f8cb1b1 --- /dev/null +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java @@ -0,0 +1,108 @@ +package com.fastasyncworldedit.bukkit.regions.plotsquared; + +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.TaskManager; +import com.plotsquared.core.command.Command; +import com.plotsquared.core.command.CommandCategory; +import com.plotsquared.core.command.CommandDeclaration; +import com.plotsquared.core.command.MainCommand; +import com.plotsquared.core.command.RequiredType; +import com.plotsquared.core.configuration.caption.Templates; +import com.plotsquared.core.configuration.caption.TranslatableCaption; +import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.plot.Plot; +import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.StringMan; +import com.plotsquared.core.util.task.RunnableVal2; +import com.plotsquared.core.util.task.RunnableVal3; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.command.util.SuggestionHelper; +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.Locale; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +@CommandDeclaration(command = "generatebiome", + permission = "plots.generatebiome", + category = CommandCategory.APPEARANCE, + requiredType = RequiredType.PLAYER, + 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(), TranslatableCaption.of("errors.not_in_plot")); + checkTrue(plot.isOwner(player.getUUID()) || Permissions.hasPermission(player, "plots.admin.command.generatebiome"), + TranslatableCaption.of("permission.no_plot_perms")); + if (plot.getRunning() != 0) { + player.sendMessage(TranslatableCaption.of("errors.wait_for_timer")); + return null; + } + checkTrue(args.length == 1, TranslatableCaption.of("commandconfig.command_syntax"), + Templates.of("value", 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(), + TranslatableCaption.of("blocklist.block_list_separator").getComponent(player)); + player.sendMessage(TranslatableCaption.of("biome.need_biome")); + player.sendMessage(TranslatableCaption.of("commandconfig.subcommand_set_options_header"), + Templates.of("values", biomes)); + return CompletableFuture.completedFuture(false); + } + confirm.run(this, () -> { + if (plot.getRunning() != 0) { + player.sendMessage(TranslatableCaption.of("errors.wait_for_timer")); + return; + } + plot.addRunning(); + TaskManager.IMP.async(() -> { + EditSession session = + new EditSessionBuilder(BukkitAdapter.adapt(Bukkit.getWorld(plot.getArea().getWorldName()))) + .autoQueue(false).checkMemory(false).allowedRegionsEverywhere() + .player(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); + } + + @Override + public Collection tab(final PlotPlayer player, final String[] args, final boolean space) { + return SuggestionHelper.getNamespacedRegistrySuggestions(BiomeType.REGISTRY, args[0]) + .map(value -> value.toLowerCase(Locale.ENGLISH).replace("minecraft:", "")) + .filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH))) + .map(value -> new Command(null, false, value, "", RequiredType.PLAYER, null) { + }).collect(Collectors.toList()); + } +} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java similarity index 68% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSquaredFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java index 8f9ec5071..0f35e54ee 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSquaredFeature.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.bukkit.regions.plotsquared; +package com.fastasyncworldedit.bukkit.regions.plotsquared; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.github.intellectualsites.plotsquared.plot.util.UUIDHandler; import com.plotsquared.core.PlotSquared; import com.plotsquared.core.command.MainCommand; @@ -14,9 +14,8 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.NoWorldeditFlag; -import com.plotsquared.core.util.RegionManager; -import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.WEManager; +import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; @@ -39,15 +38,8 @@ public class PlotSquaredFeature extends FaweMaskManager { public PlotSquaredFeature() { super("PlotSquared"); LOGGER.debug("Optimizing PlotSquared"); - if (com.boydti.fawe.config.Settings.IMP.ENABLED_COMPONENTS.PLOTSQUARED_HOOK) { + if (Settings.FAWE_Components.FAWE_HOOK) { Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false; - try { - setupBlockQueue(); - setupSchematicHandler(); - setupRegionManager(); - } catch (Throwable ignored) { - LOGGER.debug("Please update PlotSquared: https://www.spigotmc.org/resources/77506/"); - } if (Settings.PLATFORM.toLowerCase(Locale.ROOT).startsWith("bukkit")) { new FaweTrim(); } @@ -71,38 +63,20 @@ public class PlotSquaredFeature extends FaweMaskManager { 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 setupRegionManager() throws RuntimeException { - RegionManager.manager = new FaweRegionManager(RegionManager.manager); - LOGGER.debug(" - RegionManager: " + RegionManager.manager); - } - - private void setupSchematicHandler() throws RuntimeException { - SchematicHandler.manager = new FaweSchematicHandler(); - LOGGER.debug(" - SchematicHandler: " + SchematicHandler.manager); - } - public boolean isAllowed(Player player, Plot plot, MaskType type) { if (plot == null) { return false; } UUID uid = player.getUniqueId(); - return !plot.getFlag(NoWorldeditFlag.class) && (plot.isOwner(uid) || type == MaskType.MEMBER && (plot.getTrusted().contains(uid) || plot - .getTrusted().contains(DBFunc.EVERYONE) || (plot.getMembers().contains(uid) || plot.getMembers().contains(DBFunc.EVERYONE)) && player - .hasPermission("fawe.plotsquared.member")) || player.hasPermission("fawe.plotsquared.admin")); + return !plot.getFlag(NoWorldeditFlag.class) && (plot.isOwner(uid) || type == MaskType.MEMBER && ( + plot.getTrusted().contains(uid) || plot.getTrusted().contains(DBFunc.EVERYONE) + || (plot.getMembers().contains(uid) || plot.getMembers().contains(DBFunc.EVERYONE)) && player + .hasPermission("fawe.plotsquared.member")) || player.hasPermission("fawe.plotsquared.admin")); } @Override public FaweMask getMask(Player player, MaskType type) { - final PlotPlayer pp = PlotPlayer.wrap(player.getUniqueId()); + final PlotPlayer pp = PlotPlayer.from(BukkitAdapter.adapt(player)); if (pp == null) { return null; } @@ -115,7 +89,8 @@ public class PlotSquaredFeature extends FaweMaskManager { 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) { + if (region.getMinimumPoint().getX() == Integer.MIN_VALUE + && region.getMaximumPoint().getX() == Integer.MAX_VALUE) { regions.clear(); } } @@ -159,7 +134,7 @@ public class PlotSquaredFeature extends FaweMaskManager { @Override public RegionFilter getFilter(String world) { - PlotArea area = PlotSquared.get().getPlotArea(world, null); + PlotArea area = PlotSquared.get().getPlotAreaManager().getPlotArea(world, null); if (area != null) { return new PlotRegionFilter(area); } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/ReplaceAll.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java similarity index 100% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/ReplaceAll.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/ReplaceAll.java diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweChunkManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java similarity index 96% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweChunkManager.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java index 999a2224f..9e382905a 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweChunkManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweChunkManager.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +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; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java similarity index 91% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java index 3a1edb0b0..62e63f214 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; import com.github.intellectualsites.plotsquared.plot.util.block.LocalBlockQueue; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java similarity index 93% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java index 2a2199b60..f67b62009 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java @@ -1,12 +1,12 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.object.clipboard.ReadOnlyClipboard; -import com.boydti.fawe.object.io.PGZIPOutputStream; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.IOUtil; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; +import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +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; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweTrim.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java similarity index 95% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweTrim.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java index 6a5ba286b..439bbd746 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/FaweTrim.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/FaweTrim.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.util.TaskManager; +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; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotRegionFilter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java similarity index 87% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotRegionFilter.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java index 91ca83c74..403f28fc4 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotRegionFilter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotRegionFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.regions.general.CuboidRegionFilter; +import com.fastasyncworldedit.core.regions.general.CuboidRegionFilter; import com.github.intellectualsites.plotsquared.plot.object.Location; import com.github.intellectualsites.plotsquared.plot.object.Plot; import com.github.intellectualsites.plotsquared.plot.object.PlotArea; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSetBiome.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java similarity index 96% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSetBiome.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java index c822700fe..c0d467e24 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSetBiome.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSetBiome.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +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; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java index e85f89c8a..9b31c0c3b 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.bukkit.regions.plotsquaredv4; +package com.fastasyncworldedit.bukkit.regions.plotsquaredv4; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.github.intellectualsites.plotsquared.plot.PlotSquared; import com.github.intellectualsites.plotsquared.plot.commands.MainCommand; import com.github.intellectualsites.plotsquared.plot.config.Settings; @@ -40,7 +40,7 @@ public class PlotSquaredFeature extends FaweMaskManager { public PlotSquaredFeature() { super("PlotSquared"); LOGGER.debug("Optimizing PlotSquared"); - if (com.boydti.fawe.config.Settings.IMP.ENABLED_COMPONENTS.PLOTSQUARED_HOOK) { + if (com.fastasyncworldedit.core.configuration.Settings.IMP.ENABLED_COMPONENTS.PLOTSQUARED_v4_HOOK) { Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS = false; try { setupBlockQueue(); diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitReflectionUtils.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitReflectionUtils.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitReflectionUtils.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitReflectionUtils.java index dd2be9725..1d31f3f07 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitReflectionUtils.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitReflectionUtils.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.util; +package com.fastasyncworldedit.bukkit.util; -import com.boydti.fawe.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.ReflectionUtils; import org.bukkit.Bukkit; import org.bukkit.Server; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitTaskManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitTaskManager.java similarity index 94% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitTaskManager.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitTaskManager.java index 37fff8475..95c4213ec 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/BukkitTaskManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/BukkitTaskManager.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.util; +package com.fastasyncworldedit.bukkit.util; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.util.TaskManager; import org.apache.commons.lang.mutable.MutableInt; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/ItemUtil.java similarity index 97% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/ItemUtil.java index e79d06ec4..175e12b34 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/ItemUtil.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.bukkit.util; +package com.fastasyncworldedit.bukkit.util; -import com.boydti.fawe.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.ReflectionUtils; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/MinecraftVersion.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java similarity index 99% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/MinecraftVersion.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java index 64bc7d485..a382a2147 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/MinecraftVersion.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/MinecraftVersion.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.bukkit.util; +package com.fastasyncworldedit.bukkit.util; import com.google.common.collect.ComparisonChain; import org.bukkit.Bukkit; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/VaultUtil.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/VaultUtil.java similarity index 92% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/VaultUtil.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/VaultUtil.java index 4d0751c94..2a6c7b70e 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/VaultUtil.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/VaultUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.bukkit.util; +package com.fastasyncworldedit.bukkit.util; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/image/BukkitImageViewer.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/image/BukkitImageViewer.java similarity index 97% rename from worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/image/BukkitImageViewer.java rename to worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/image/BukkitImageViewer.java index d582e924f..b78149721 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/image/BukkitImageViewer.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/util/image/BukkitImageViewer.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.bukkit.util.image; +package com.fastasyncworldedit.bukkit.util.image; -import com.boydti.fawe.util.image.Drawable; -import com.boydti.fawe.util.image.ImageUtil; -import com.boydti.fawe.util.image.ImageViewer; +import com.fastasyncworldedit.core.util.image.Drawable; +import com.fastasyncworldedit.core.util.image.ImageUtil; +import com.fastasyncworldedit.core.util.image.ImageViewer; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java index 37064fc05..a1086705d 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitAdapter.java @@ -22,8 +22,8 @@ package com.sk89q.worldedit.bukkit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.IBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.SimpleBukkitAdapter; +import com.fastasyncworldedit.bukkit.adapter.IBukkitAdapter; +import com.fastasyncworldedit.bukkit.adapter.SimpleBukkitAdapter; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitItemStack.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitItemStack.java index 0964dbd52..84d72880c 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitItemStack.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitItemStack.java @@ -1,8 +1,8 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.bukkit.FaweBukkit; -import com.boydti.fawe.bukkit.util.ItemUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.bukkit.FaweBukkit; +import com.fastasyncworldedit.bukkit.util.ItemUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.world.item.ItemType; 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 2b895c5a8..cdbc6dc07 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 @@ -19,10 +19,10 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.util.StringUtil; import com.sk89q.wepif.VaultResolver; import com.sk89q.worldedit.WorldEdit; @@ -46,6 +46,7 @@ import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.format.TextColor; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -392,11 +393,12 @@ public class BukkitPlayer extends AbstractPlayerActor { player.sendBlockChange(loc, player.getWorld().getBlockAt(loc).getBlockData()); } else { player.sendBlockChange(loc, BukkitAdapter.adapt(block)); - if (block instanceof BaseBlock && ((BaseBlock) block).hasNbtData()) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - if (adapter != null) { - if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK) { - adapter.sendFakeNBT(player, pos, ((BaseBlock) block).getNbtData()); + BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); + if (adapter != null) { + if (block.getBlockType() == BlockTypes.STRUCTURE_BLOCK && block instanceof BaseBlock) { + CompoundBinaryTag nbt = ((BaseBlock) block).getNbt(); + if (nbt != null) { + adapter.sendFakeNBT(player, pos, nbt); adapter.sendFakeOP(player); } } 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 0704fa221..1b34f67e5 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,9 +19,7 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.beta.implementation.lighting.RelighterFactory; -import com.boydti.fawe.bukkit.NMSRelighterFactory; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.TuinityRelighterFactory_1_16_5; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; import com.google.common.collect.Sets; import com.sk89q.bukkit.util.CommandInfo; import com.sk89q.bukkit.util.CommandRegistration; @@ -38,7 +36,6 @@ import com.sk89q.worldedit.extension.platform.Preference; import com.sk89q.worldedit.extension.platform.Watchdog; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.util.SideEffect; -import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.lifecycle.Lifecycled; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.registry.Registries; @@ -70,7 +67,7 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser public final WorldEditPlugin plugin; private final CommandRegistration dynamicCommands; private final Lifecycled watchdog; - private final RelighterFactory relighterFactory; + private RelighterFactory relighterFactory; private boolean hookingEvents; public BukkitServerInterface(WorldEditPlugin plugin, Server server) { @@ -80,16 +77,6 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser this.watchdog = plugin.getLifecycledBukkitImplAdapter() .filter(BukkitImplAdapter::supportsWatchdog) .map(BukkitWatchdog::new); - RelighterFactory tempFactory; - try { - Class.forName("com.tuinity.tuinity.config.TuinityConfig"); - tempFactory = new TuinityRelighterFactory_1_16_5(); - LOGGER.info("Using Tuinity internals for relighting"); - } catch (ClassNotFoundException e) { - tempFactory = new NMSRelighterFactory(); - LOGGER.info("Using FAWE for relighting"); - } - this.relighterFactory = tempFactory; } CommandRegistration getDynamicCommands() { @@ -144,7 +131,7 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser @Override public Watchdog getWatchdog() { - return watchdog.valueOrThrow(); + return watchdog.value().orElse(null); } @Override @@ -262,6 +249,10 @@ public class BukkitServerInterface extends AbstractPlatform implements MultiUser @Override public @NotNull RelighterFactory getRelighterFactory() { + if (this.relighterFactory == null) { + this.relighterFactory = this.plugin.getBukkitImplAdapter().getRelighterFactory(); + LOGGER.info("Using " + this.relighterFactory.getClass().getCanonicalName() + " as relighter factory."); + } 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 14d703213..fc3218adf 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 @@ -19,9 +19,9 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.sk89q.jnbt.CompoundTag; @@ -80,6 +80,7 @@ public class BukkitWorld extends AbstractWorld { private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final boolean HAS_3D_BIOMES; + private static final boolean HAS_MIN_Y; private static final Map effects = new HashMap<>(); @@ -98,6 +99,13 @@ public class BukkitWorld extends AbstractWorld { temp = false; } HAS_3D_BIOMES = temp; + try { + World.class.getMethod("getMinHeight"); + temp = true; + } catch (NoSuchMethodException e) { + temp = false; + } + HAS_MIN_Y = temp; } private WeakReference worldRef; @@ -143,7 +151,7 @@ public class BukkitWorld extends AbstractWorld { return list; } - //createEntity was moved to IChunkExtent to prevent issues with Async Entitiy Add. + //createEntity was moved to IChunkExtent to prevent issues with Async Entity Add. /** * Get the world handle. @@ -252,6 +260,7 @@ public class BukkitWorld extends AbstractWorld { if (!getBlock(pt).getBlockType().getMaterial().hasContainer()) { return false; } + Block block = getWorld().getBlockAt(pt.getBlockX(), pt.getBlockY(), pt.getBlockZ()); BlockState state = PaperLib.getBlockState(block, false).getState(); if (!(state instanceof InventoryHolder)) { @@ -360,6 +369,14 @@ public class BukkitWorld extends AbstractWorld { return getWorld().getMaxHeight() - 1; } + @Override + public int getMinY() { + if (HAS_MIN_Y) { + return getWorld().getMinHeight(); + } + return super.getMinY(); + } + @SuppressWarnings("deprecation") @Override public void fixAfterFastMode(Iterable chunks) { @@ -463,9 +480,9 @@ public class BukkitWorld extends AbstractWorld { try { return worldNativeAccess.setBlock(position, block, sideEffects); } catch (Exception e) { - if (block instanceof BaseBlock && ((BaseBlock) block).getNbtData() != null) { + if (block instanceof BaseBlock && ((BaseBlock) block).getNbt() != null) { LOGGER.warn("Tried to set a corrupt tile entity at " + position.toString() - + ": " + ((BaseBlock) block).getNbtData(), e); + + ": " + ((BaseBlock) block).getNbt(), e); } else { LOGGER.warn("Failed to set block via adapter, falling back to generic", e); } 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 bfde6d3ad..483f846bf 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 @@ -19,8 +19,9 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.bukkit.FaweBukkit; +import com.fastasyncworldedit.bukkit.BukkitPermissionAttachmentManager; +import com.fastasyncworldedit.bukkit.FaweBukkit; +import com.fastasyncworldedit.core.Fawe; import com.google.common.base.Joiner; import com.sk89q.util.yaml.YAMLProcessor; import com.sk89q.wepif.PermissionsResolverManager; @@ -30,10 +31,6 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.adapter.AdapterLoadException; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; import com.sk89q.worldedit.bukkit.adapter.BukkitImplLoader; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_15_R2; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R1; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R2; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_16_R3; import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; @@ -72,7 +69,6 @@ import org.bukkit.event.world.WorldInitEvent; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.incendo.serverlib.ServerLib; @@ -299,15 +295,6 @@ public class WorldEditPlugin extends JavaPlugin { //implements TabCompleter // Attempt to load a Bukkit adapter BukkitImplLoader adapterLoader = new BukkitImplLoader(); - try { - adapterLoader.addClass(FAWE_Spigot_v1_15_R2.class); - adapterLoader.addClass(FAWE_Spigot_v1_16_R1.class); - adapterLoader.addClass(FAWE_Spigot_v1_16_R2.class); - adapterLoader.addClass(FAWE_Spigot_v1_16_R3.class); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - try { adapterLoader.addFromPath(getClass().getClassLoader()); } catch (IOException e) { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldUnloadedException.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldUnloadedException.java index e8ba56d38..2e1a4cae4 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldUnloadedException.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldUnloadedException.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.bukkit; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEditException; /** 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 52286440a..8f9a0653b 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 @@ -19,11 +19,14 @@ package com.sk89q.worldedit.bukkit.adapter; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.bukkit.FaweBukkit; -import com.sk89q.jnbt.CompoundTag; +import com.fastasyncworldedit.bukkit.FaweBukkit; +import com.fastasyncworldedit.bukkit.adapter.IBukkitAdapter; +import com.fastasyncworldedit.bukkit.adapter.NMSRelighterFactory; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; @@ -37,6 +40,8 @@ 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.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.RegenOptions; import com.sk89q.worldedit.world.biome.BiomeType; @@ -54,23 +59,16 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import javax.annotation.Nullable; import java.util.Map; import java.util.OptionalInt; import java.util.Set; +import javax.annotation.Nullable; /** * An interface for adapters of various Bukkit implementations. */ public interface BukkitImplAdapter extends IBukkitAdapter { - /** - * Get the Minecraft data version for the current world data. - * - * @return the data version - */ - int getDataVersion(); - /** * Get a data fixer, or null if not supported. * @@ -168,7 +166,7 @@ public interface BukkitImplAdapter extends IBukkitAdapter { * @param pos The position * @param nbtData The NBT Data */ - void sendFakeNBT(Player player, BlockVector3 pos, CompoundTag nbtData); + void sendFakeNBT(Player player, BlockVector3 pos, CompoundBinaryTag nbtData); /** * Make the client think it has operator status. @@ -239,11 +237,24 @@ public interface BukkitImplAdapter extends IBukkitAdapter { return null; } + @Deprecated default Tag toNative(T foreign) { + return AdventureNBTConverter.fromAdventure(toNativeBinary(foreign)); + } + + default BinaryTag toNativeBinary(T foreign) { return null; } + @Deprecated default T fromNative(Tag foreign) { + if (foreign == null) { + return null; + } + return fromNativeBinary(foreign.asBinaryTag()); + } + + default T fromNativeBinary(BinaryTag foreign) { return null; } @@ -278,4 +289,8 @@ public interface BukkitImplAdapter extends IBukkitAdapter { default int getInternalBiomeId(BiomeType biome) { return Biome.BADLANDS.ordinal(); } + + default RelighterFactory getRelighterFactory() { + return new NMSRelighterFactory(); // TODO implement in adapters instead + } } 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 7be04b391..fffe1bbb6 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 @@ -41,7 +41,7 @@ public class BukkitImplLoader { private final List adapterCandidates = new ArrayList<>(); private String customCandidate; - private static final String SEARCH_PACKAGE = "com.sk89q.worldedit.bukkit.adapter.impl"; + private static final String SEARCH_PACKAGE = "com.sk89q.worldedit.bukkit.adapter.impl.fawe"; private static final String SEARCH_PACKAGE_DOT = SEARCH_PACKAGE + "."; private static final String SEARCH_PATH = SEARCH_PACKAGE.replace(".", "/"); private static final String CLASS_SUFFIX = ".class"; @@ -76,10 +76,6 @@ public class BukkitImplLoader { } } - public void addClass(Class cls) { - adapterCandidates.add(0, cls.getName()); - } - /** * Search the given JAR for candidate implementations. * diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_15_R2.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_15_R2.java deleted file mode 100644 index 76ab6bf1b..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_15_R2.java +++ /dev/null @@ -1,450 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.bukkit.adapter.impl; - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.BlockMaterial_1_15_2; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.BukkitAdapter_1_15_2; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.BukkitGetBlocks_1_15_2; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.FAWEWorldNativeAccess_1_15_2; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.MapChunkUtil_1_15_2; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.nbt.LazyCompoundTag_1_15_2; -import com.google.common.base.Preconditions; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.CachedBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.IDelegateBukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.regen.Regen_v1_15_R2; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.LazyBaseEntity; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.internal.wna.WorldNativeAccess; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.util.SideEffect; -import com.sk89q.worldedit.util.SideEffectSet; -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.server.v1_15_R1.BiomeBase; -import net.minecraft.server.v1_15_R1.Block; -import net.minecraft.server.v1_15_R1.BlockPosition; -import net.minecraft.server.v1_15_R1.Chunk; -import net.minecraft.server.v1_15_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_15_R1.ChunkSection; -import net.minecraft.server.v1_15_R1.Entity; -import net.minecraft.server.v1_15_R1.EntityPlayer; -import net.minecraft.server.v1_15_R1.EntityTypes; -import net.minecraft.server.v1_15_R1.IBlockData; -import net.minecraft.server.v1_15_R1.IRegistry; -import net.minecraft.server.v1_15_R1.ItemStack; -import net.minecraft.server.v1_15_R1.MinecraftKey; -import net.minecraft.server.v1_15_R1.NBTBase; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.NBTTagInt; -import net.minecraft.server.v1_15_R1.PacketPlayOutMapChunk; -import net.minecraft.server.v1_15_R1.PlayerChunk; -import net.minecraft.server.v1_15_R1.TileEntity; -import net.minecraft.server.v1_15_R1.World; -import net.minecraft.server.v1_15_R1.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_15_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_15_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack; -import org.bukkit.entity.Player; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; -import java.util.OptionalInt; -import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Stream; - -public final class FAWE_Spigot_v1_15_R2 extends CachedBukkitAdapter implements IDelegateBukkitImplAdapter { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private final Spigot_v1_15_R2 parent; - private char[] ibdToStateOrdinal; - private int[] ordinalToIbdID; - // ------------------------------------------------------------------------ - // Code that may break between versions of Minecraft - // ------------------------------------------------------------------------ - - public FAWE_Spigot_v1_15_R2() throws NoSuchFieldException, NoSuchMethodException { - this.parent = new Spigot_v1_15_R2(); - } - - @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 state = BlockTypesCache.states[i]; - BlockMaterial_1_15_2 material = (BlockMaterial_1_15_2) state.getMaterial(); - int id = Block.REGISTRY_ID.getId(material.getState()); - char ordinal = state.getOrdinalChar(); - ibdToStateOrdinal[id] = ordinal; - ordinalToIbdID[ordinal] = id; - } - return true; - } - - @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = getBlock(blockType); - return new BlockMaterial_1_15_2(block); - } - - @Override - public synchronized BlockMaterial getMaterial(BlockState state) { - IBlockData bs = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); - return new BlockMaterial_1_15_2(bs.getBlock(), bs); - } - - public Block getBlock(BlockType blockType) { - return IRegistry.BLOCK.get(new MinecraftKey(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 WorldServer handle = craftWorld.getHandle(); - Chunk chunk = handle.getChunkAt(x >> 4, z >> 4); - final BlockPosition blockPos = new BlockPosition(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 - TileEntity te = chunk.a(blockPos, Chunk.EnumTileEntityState.CHECK); - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.save(tag); // readTileEntityIntoTag - load data - return state.toBaseBlock((CompoundTag) toNative(tag)); - } - } - - return state.toBaseBlock(); - } - - @Override - public Set getSupportedSideEffects() { - return SideEffectSet.defaults().getSideEffectsToApply(); - } - - public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { - CraftChunk craftChunk = (CraftChunk) chunk; - Chunk nmsChunk = craftChunk.getHandle(); - World nmsWorld = nmsChunk.getWorld(); - - BlockPosition blockPos = new BlockPosition(x, y, z); - IBlockData blockData = ((BlockMaterial_1_15_2) state.getMaterial()).getState(); - ChunkSection[] sections = nmsChunk.getSections(); - int y4 = y >> 4; - ChunkSection section = sections[y4]; - - IBlockData existing; - if (section == null) { - existing = ((BlockMaterial_1_15_2) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); - } else { - existing = section.getType(x & 15, y & 15, z & 15); - } - - - nmsChunk.removeTileEntity(blockPos); // Force delete the old tile entity - - CompoundTag nativeTag = state instanceof BaseBlock ? ((BaseBlock)state).getNbtData() : null; - if (nativeTag != null || existing instanceof TileEntityBlock) { - nmsWorld.setTypeAndData(blockPos, blockData, 0); - // remove tile - if (nativeTag != null) { - // We will assume that the tile entity was created for us, - // though we do not do this on the Forge version - TileEntity tileEntity = nmsWorld.getTileEntity(blockPos); - if (tileEntity != null) { - NBTTagCompound tag = (NBTTagCompound) fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tag); // readTagIntoTileEntity - load data - } - } - } else { - if (existing == blockData) { - return true; - } - if (section == null) { - if (blockData.isAir()) { - return true; - } - sections[y4] = section = new ChunkSection(y4 << 4); - } - nmsChunk.setType(blockPos, blockData, false); - } - if (update) { - nmsWorld.getMinecraftWorld().notify(blockPos, existing, blockData, 0); - } - return true; - } - - @Override - public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { - return new FAWEWorldNativeAccess_1_15_2(this, - new WeakReference<>(((CraftWorld) world).getHandle())); - } - - @Nullable - private static String getEntityId(Entity entity) { - MinecraftKey minecraftkey = EntityTypes.getName(entity.getEntityType()); - return minecraftkey == null ? null : minecraftkey.toString(); - } - - private static void readEntityIntoTag(Entity entity, NBTTagCompound tag) { - entity.save(tag); - } - - @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); - Supplier saveTag = () -> { - final NBTTagCompound minecraftTag = new NBTTagCompound(); - 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) { - BlockMaterial_1_15_2 material = (BlockMaterial_1_15_2) state.getMaterial(); - IBlockData mcState = material.getCraftBlockData().getState(); - return OptionalInt.of(Block.REGISTRY_ID.getId(mcState)); - } - - @Override - public BlockState adapt(BlockData blockData) { - CraftBlockData cbd = ((CraftBlockData) blockData); - IBlockData ibd = cbd.getState(); - return adapt(ibd); - } - - public BlockState adapt(IBlockData ibd) { - return BlockTypesCache.states[adaptToChar(ibd)]; - } - - /** - * @deprecated - * Method unused. Use #adaptToChar(IBlockData). - */ - @Deprecated - public int adaptToInt(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToInt(ibd); - } - } - } - - public char adaptToChar(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToChar(ibd); - } catch (ArrayIndexOutOfBoundsException e1) { - LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", - ibd.getBlock(), Block.REGISTRY_ID.getId(ibd), ibdToStateOrdinal.length, e1); - return 0; - } - } - } - public int ordinalToIbdID(char ordinal) { - synchronized (this) { - try { - return ordinalToIbdID[ordinal]; - } catch (NullPointerException e) { - init(); - return ordinalToIbdID(ordinal); - } - } - } - - @Override - public > BlockData adapt(B state) { - BlockMaterial_1_15_2 material = (BlockMaterial_1_15_2) state.getMaterial(); - return material.getCraftBlockData(); - } - - private MapChunkUtil_1_15_2 mapUtil = new MapChunkUtil_1_15_2(); - - @Override - public void sendFakeChunk(org.bukkit.World world, Player player, ChunkPacket packet) { - WorldServer nmsWorld = ((CraftWorld) world).getHandle(); - PlayerChunk map = BukkitAdapter_1_15_2.getPlayerChunk(nmsWorld, packet.getChunkX(), packet.getChunkZ()); - if (map != null && map.hasBeenLoaded()) { - boolean flag = false; - PlayerChunk.d players = map.players; - Stream stream = players.a(new ChunkCoordIntPair(packet.getChunkX(), packet.getChunkZ()), flag); - - EntityPlayer checkPlayer = player == null ? null : ((CraftPlayer) player).getHandle(); - stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) - .forEach(entityPlayer -> { - synchronized (packet) { - PacketPlayOutMapChunk nmsPacket = (PacketPlayOutMapChunk) packet.getNativePacket(); - if (nmsPacket == null) { - nmsPacket = mapUtil.create( this, packet); - packet.setNativePacket(nmsPacket); - } - try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); - entityPlayer.playerConnection.sendPacket(nmsPacket); - } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); - } - } - }); - } - } - - @Override - public Map> getProperties(BlockType blockType) { - return getParent().getProperties(blockType); - } - - @Override - public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { - ItemStack stack = new ItemStack(IRegistry.ITEM.get(MinecraftKey.a(item.getType().getId())), item.getAmount()); - stack.setTag(((NBTTagCompound) 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; - } - - @Override - public Tag toNative(NBTBase foreign) { - return parent.toNative(foreign); - } - - @Override - public NBTBase fromNative(Tag foreign) { - if (foreign instanceof LazyCompoundTag_1_15_2) { - return ((LazyCompoundTag_1_15_2) foreign).get(); - } - return parent.fromNative(foreign); - } - @Override - public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { - return new Regen_v1_15_R2(bukkitWorld, region, target, options).regenerate(); - } - - @Override - public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { - return new BukkitGetBlocks_1_15_2(world, chunkX, chunkZ); - } - - @Override - public int getInternalBiomeId(BiomeType biome) { - BiomeBase base = CraftBlock.biomeToBiomeBase(BukkitAdapter.adapt(biome)); - return IRegistry.BIOME.a(base); - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R1.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R1.java deleted file mode 100644 index 9a1a96a56..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R1.java +++ /dev/null @@ -1,452 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser 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 Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.bukkit.adapter.impl; - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.BlockMaterial_1_16_1; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.BukkitAdapter_1_16_1; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.BukkitGetBlocks_1_16_1; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.FAWEWorldNativeAccess_1_16_R1; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.MapChunkUtil_1_16_1; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.nbt.LazyCompoundTag_1_16_1; -import com.google.common.base.Preconditions; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.CachedBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.IDelegateBukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.regen.Regen_v1_16_R1; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.LazyBaseEntity; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.internal.wna.WorldNativeAccess; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.util.SideEffect; -import com.sk89q.worldedit.util.SideEffectSet; -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.server.v1_16_R1.BiomeBase; -import net.minecraft.server.v1_16_R1.Block; -import net.minecraft.server.v1_16_R1.BlockPosition; -import net.minecraft.server.v1_16_R1.Chunk; -import net.minecraft.server.v1_16_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R1.ChunkSection; -import net.minecraft.server.v1_16_R1.Entity; -import net.minecraft.server.v1_16_R1.EntityPlayer; -import net.minecraft.server.v1_16_R1.EntityTypes; -import net.minecraft.server.v1_16_R1.IBlockData; -import net.minecraft.server.v1_16_R1.IRegistry; -import net.minecraft.server.v1_16_R1.ItemStack; -import net.minecraft.server.v1_16_R1.MinecraftKey; -import net.minecraft.server.v1_16_R1.NBTBase; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.NBTTagInt; -import net.minecraft.server.v1_16_R1.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R1.PlayerChunk; -import net.minecraft.server.v1_16_R1.TileEntity; -import net.minecraft.server.v1_16_R1.World; -import net.minecraft.server.v1_16_R1.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_16_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_16_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_16_R1.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_16_R1.inventory.CraftItemStack; -import org.bukkit.entity.Player; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; -import java.util.OptionalInt; -import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Stream; - -public final class FAWE_Spigot_v1_16_R1 extends CachedBukkitAdapter implements IDelegateBukkitImplAdapter { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private final Spigot_v1_16_R1 parent; - private char[] ibdToStateOrdinal; - private int[] ordinalToIbdID; - // ------------------------------------------------------------------------ - // Code that may break between versions of Minecraft - // ------------------------------------------------------------------------ - - public FAWE_Spigot_v1_16_R1() throws NoSuchFieldException, NoSuchMethodException { - this.parent = new Spigot_v1_16_R1(); - } - - @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 state = BlockTypesCache.states[i]; - BlockMaterial_1_16_1 material = (BlockMaterial_1_16_1) state.getMaterial(); - int id = Block.REGISTRY_ID.getId(material.getState()); - char ordinal = state.getOrdinalChar(); - ibdToStateOrdinal[id] = ordinal; - ordinalToIbdID[ordinal] = id; - } - return true; - } - - @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = getBlock(blockType); - return new BlockMaterial_1_16_1(block); - } - - @Override - public synchronized BlockMaterial getMaterial(BlockState state) { - IBlockData bs = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); - return new BlockMaterial_1_16_1(bs.getBlock(), bs); - } - - public Block getBlock(BlockType blockType) { - return IRegistry.BLOCK.get(new MinecraftKey(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 WorldServer handle = craftWorld.getHandle(); - Chunk chunk = handle.getChunkAt(x >> 4, z >> 4); - final BlockPosition blockPos = new BlockPosition(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 - TileEntity te = chunk.a(blockPos, Chunk.EnumTileEntityState.CHECK); - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.save(tag); // readTileEntityIntoTag - load data - return state.toBaseBlock((CompoundTag) toNative(tag)); - } - } - - return state.toBaseBlock(); - } - - @Override - public Set getSupportedSideEffects() { - return SideEffectSet.defaults().getSideEffectsToApply(); - } - - public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { - CraftChunk craftChunk = (CraftChunk) chunk; - Chunk nmsChunk = craftChunk.getHandle(); - World nmsWorld = nmsChunk.getWorld(); - - BlockPosition blockPos = new BlockPosition(x, y, z); - IBlockData blockData = ((BlockMaterial_1_16_1) state.getMaterial()).getState(); - ChunkSection[] sections = nmsChunk.getSections(); - int y4 = y >> 4; - ChunkSection section = sections[y4]; - - IBlockData existing; - if (section == null) { - existing = ((BlockMaterial_1_16_1) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); - } else { - existing = section.getType(x & 15, y & 15, z & 15); - } - - - nmsChunk.removeTileEntity(blockPos); // Force delete the old tile entity - - CompoundTag nativeTag = state instanceof BaseBlock ? ((BaseBlock)state).getNbtData() : null; - if (nativeTag != null || existing instanceof TileEntityBlock) { - nmsWorld.setTypeAndData(blockPos, blockData, 0); - // remove tile - if (nativeTag != null) { - // We will assume that the tile entity was created for us, - // though we do not do this on the Forge version - TileEntity tileEntity = nmsWorld.getTileEntity(blockPos); - if (tileEntity != null) { - NBTTagCompound tag = (NBTTagCompound) fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), tag); // readTagIntoTileEntity - load data - } - } - } else { - if (existing == blockData) { - return true; - } - if (section == null) { - if (blockData.isAir()) { - return true; - } - sections[y4] = section = new ChunkSection(y4 << 4); - } - nmsChunk.setType(blockPos, blockData, false); - } - if (update) { - nmsWorld.getMinecraftWorld().notify(blockPos, existing, blockData, 0); - } - return true; - } - - @Override - public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { - return new FAWEWorldNativeAccess_1_16_R1(this, - new WeakReference<>(((CraftWorld)world).getHandle())); - } - - @Nullable - private static String getEntityId(Entity entity) { - MinecraftKey minecraftkey = EntityTypes.getName(entity.getEntityType()); - return minecraftkey == null ? null : minecraftkey.toString(); - } - - private static void readEntityIntoTag(Entity entity, NBTTagCompound tag) { - entity.save(tag); - } - - @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); - Supplier saveTag = () -> { - final NBTTagCompound minecraftTag = new NBTTagCompound(); - 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) { - BlockMaterial_1_16_1 material = (BlockMaterial_1_16_1) state.getMaterial(); - IBlockData mcState = material.getCraftBlockData().getState(); - return OptionalInt.of(Block.REGISTRY_ID.getId(mcState)); - } - - @Override - public BlockState adapt(BlockData blockData) { - CraftBlockData cbd = ((CraftBlockData) blockData); - IBlockData ibd = cbd.getState(); - return adapt(ibd); - } - - public BlockState adapt(IBlockData ibd) { - return BlockTypesCache.states[adaptToChar(ibd)]; - } - - /** - * @deprecated - * Method unused. Use #adaptToChar(IBlockData). - */ - @Deprecated - public int adaptToInt(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToInt(ibd); - } - } - } - - public char adaptToChar(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToChar(ibd); - } catch (ArrayIndexOutOfBoundsException e1) { - LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", - ibd.getBlock(), Block.REGISTRY_ID.getId(ibd), ibdToStateOrdinal.length, e1); - return 0; - } - } - } - - public int ordinalToIbdID(char ordinal) { - synchronized (this) { - try { - return ordinalToIbdID[ordinal]; - } catch (NullPointerException e) { - init(); - return ordinalToIbdID(ordinal); - } - } - } - - @Override - public > BlockData adapt(B state) { - BlockMaterial_1_16_1 material = (BlockMaterial_1_16_1) state.getMaterial(); - return material.getCraftBlockData(); - } - - private MapChunkUtil_1_16_1 mapUtil = new MapChunkUtil_1_16_1(); - - @Override - public void sendFakeChunk(org.bukkit.World world, Player player, ChunkPacket packet) { - WorldServer nmsWorld = ((CraftWorld) world).getHandle(); - PlayerChunk map = BukkitAdapter_1_16_1.getPlayerChunk(nmsWorld, packet.getChunkX(), packet.getChunkZ()); - if (map != null && map.hasBeenLoaded()) { - boolean flag = false; - PlayerChunk.d players = map.players; - Stream stream = players.a(new ChunkCoordIntPair(packet.getChunkX(), packet.getChunkZ()), flag); - - EntityPlayer checkPlayer = player == null ? null : ((CraftPlayer) player).getHandle(); - stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) - .forEach(entityPlayer -> { - synchronized (packet) { - PacketPlayOutMapChunk nmsPacket = (PacketPlayOutMapChunk) packet.getNativePacket(); - if (nmsPacket == null) { - nmsPacket = mapUtil.create( this, packet); - packet.setNativePacket(nmsPacket); - } - try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); - entityPlayer.playerConnection.sendPacket(nmsPacket); - } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); - } - } - }); - } - } - - @Override - public Map> getProperties(BlockType blockType) { - return getParent().getProperties(blockType); - } - - @Override - public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { - ItemStack stack = new ItemStack(IRegistry.ITEM.get(MinecraftKey.a(item.getType().getId())), item.getAmount()); - stack.setTag(((NBTTagCompound) 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; - } - - @Override - public Tag toNative(NBTBase foreign) { - return parent.toNative(foreign); - } - - @Override - public NBTBase fromNative(Tag foreign) { - if (foreign instanceof LazyCompoundTag_1_16_1) { - return ((LazyCompoundTag_1_16_1) foreign).get(); - } - return parent.fromNative(foreign); - } - - @Override - public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { - return new Regen_v1_16_R1(bukkitWorld, region, target, options).regenerate(); - } - - @Override - public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { - return new BukkitGetBlocks_1_16_1(world, chunkX, chunkZ); - } - - @Override - public int getInternalBiomeId(BiomeType biome) { - BiomeBase base = CraftBlock.biomeToBiomeBase(BukkitAdapter.adapt(biome)); - return IRegistry.BIOME.a(base); - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R2.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R2.java deleted file mode 100644 index ab32a7091..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R2.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.bukkit.adapter.impl; - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.BlockMaterial_1_16_2; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.BukkitAdapter_1_16_2; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.BukkitGetBlocks_1_16_2; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.FAWEWorldNativeAccess_1_16_R2; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.MapChunkUtil_1_16_2; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.nbt.LazyCompoundTag_1_16_2; -import com.google.common.base.Preconditions; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.CachedBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.IDelegateBukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.regen.Regen_v1_16_R2; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.LazyBaseEntity; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.internal.wna.WorldNativeAccess; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.util.SideEffect; -import com.sk89q.worldedit.util.SideEffectSet; -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.server.v1_16_R2.BiomeBase; -import net.minecraft.server.v1_16_R2.Block; -import net.minecraft.server.v1_16_R2.BlockPosition; -import net.minecraft.server.v1_16_R2.Chunk; -import net.minecraft.server.v1_16_R2.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R2.ChunkSection; -import net.minecraft.server.v1_16_R2.Entity; -import net.minecraft.server.v1_16_R2.EntityPlayer; -import net.minecraft.server.v1_16_R2.EntityTypes; -import net.minecraft.server.v1_16_R2.IBlockData; -import net.minecraft.server.v1_16_R2.IRegistry; -import net.minecraft.server.v1_16_R2.ItemStack; -import net.minecraft.server.v1_16_R2.MinecraftKey; -import net.minecraft.server.v1_16_R2.MinecraftServer; -import net.minecraft.server.v1_16_R2.NBTBase; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.NBTTagInt; -import net.minecraft.server.v1_16_R2.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R2.PlayerChunk; -import net.minecraft.server.v1_16_R2.TileEntity; -import net.minecraft.server.v1_16_R2.World; -import net.minecraft.server.v1_16_R2.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_16_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock; -import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; -import org.bukkit.entity.Player; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; -import java.util.OptionalInt; -import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Stream; - -public final class FAWE_Spigot_v1_16_R2 extends CachedBukkitAdapter implements IDelegateBukkitImplAdapter { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private final Spigot_v1_16_R2 parent; - private char[] ibdToStateOrdinal; - private int[] ordinalToIbdID; - - // ------------------------------------------------------------------------ - // Code that may break between versions of Minecraft - // ------------------------------------------------------------------------ - - public FAWE_Spigot_v1_16_R2() throws NoSuchFieldException, NoSuchMethodException { - this.parent = new Spigot_v1_16_R2(); - } - - @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 state = BlockTypesCache.states[i]; - BlockMaterial_1_16_2 material = (BlockMaterial_1_16_2) state.getMaterial(); - int id = Block.REGISTRY_ID.getId(material.getState()); - char ordinal = state.getOrdinalChar(); - ibdToStateOrdinal[id] = ordinal; - ordinalToIbdID[ordinal] = id; - } - return true; - } - - @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = getBlock(blockType); - return new BlockMaterial_1_16_2(block); - } - - @Override - public synchronized BlockMaterial getMaterial(BlockState state) { - IBlockData bs = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); - return new BlockMaterial_1_16_2(bs.getBlock(), bs); - } - - public Block getBlock(BlockType blockType) { - return IRegistry.BLOCK.get(new MinecraftKey(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 WorldServer handle = craftWorld.getHandle(); - Chunk chunk = handle.getChunkAt(x >> 4, z >> 4); - final BlockPosition blockPos = new BlockPosition(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 - TileEntity te = chunk.a(blockPos, Chunk.EnumTileEntityState.CHECK); - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.save(tag); // readTileEntityIntoTag - load data - return state.toBaseBlock((CompoundTag) toNative(tag)); - } - } - - return state.toBaseBlock(); - } - - @Override - public Set getSupportedSideEffects() { - return SideEffectSet.defaults().getSideEffectsToApply(); - } - - public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { - CraftChunk craftChunk = (CraftChunk) chunk; - Chunk nmsChunk = craftChunk.getHandle(); - World nmsWorld = nmsChunk.getWorld(); - - BlockPosition blockPos = new BlockPosition(x, y, z); - IBlockData blockData = ((BlockMaterial_1_16_2) state.getMaterial()).getState(); - ChunkSection[] sections = nmsChunk.getSections(); - int y4 = y >> 4; - ChunkSection section = sections[y4]; - - IBlockData existing; - if (section == null) { - existing = ((BlockMaterial_1_16_2) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); - } else { - existing = section.getType(x & 15, y & 15, z & 15); - } - - - nmsChunk.removeTileEntity(blockPos); // Force delete the old tile entity - - CompoundTag nativeTag = state instanceof BaseBlock ? ((BaseBlock)state).getNbtData() : null; - if (nativeTag != null || existing instanceof TileEntityBlock) { - nmsWorld.setTypeAndData(blockPos, blockData, 0); - // remove tile - if (nativeTag != null) { - // We will assume that the tile entity was created for us, - // though we do not do this on the Forge version - TileEntity tileEntity = nmsWorld.getTileEntity(blockPos); - if (tileEntity != null) { - NBTTagCompound tag = (NBTTagCompound) fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), tag); // readTagIntoTileEntity - load data - } - } - } else { - if (existing == blockData) { - return true; - } - if (section == null) { - if (blockData.isAir()) { - return true; - } - sections[y4] = section = new ChunkSection(y4 << 4); - } - nmsChunk.setType(blockPos, blockData, false); - } - if (update) { - nmsWorld.getMinecraftWorld().notify(blockPos, existing, blockData, 0); - } - return true; - } - - @Override - public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { - return new FAWEWorldNativeAccess_1_16_R2(this, - new WeakReference<>(((CraftWorld)world).getHandle())); - } - - @Nullable - private static String getEntityId(Entity entity) { - MinecraftKey minecraftkey = EntityTypes.getName(entity.getEntityType()); - return minecraftkey == null ? null : minecraftkey.toString(); - } - - private static void readEntityIntoTag(Entity entity, NBTTagCompound tag) { - entity.save(tag); - } - - @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); - Supplier saveTag = () -> { - final NBTTagCompound minecraftTag = new NBTTagCompound(); - 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) { - BlockMaterial_1_16_2 material = (BlockMaterial_1_16_2) state.getMaterial(); - IBlockData mcState = material.getCraftBlockData().getState(); - return OptionalInt.of(Block.REGISTRY_ID.getId(mcState)); - } - - @Override - public BlockState adapt(BlockData blockData) { - CraftBlockData cbd = ((CraftBlockData) blockData); - IBlockData ibd = cbd.getState(); - return adapt(ibd); - } - - public BlockState adapt(IBlockData ibd) { - return BlockTypesCache.states[adaptToChar(ibd)]; - } - - /** - * @deprecated - * Method unused. Use #adaptToChar(IBlockData). - */ - @Deprecated - public int adaptToInt(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToInt(ibd); - } - } - } - - public char adaptToChar(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToChar(ibd); - } catch (ArrayIndexOutOfBoundsException e1) { - LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", - ibd.getBlock(), Block.REGISTRY_ID.getId(ibd), ibdToStateOrdinal.length, e1); - return 0; - } - } - } - public int ordinalToIbdID(char ordinal) { - synchronized (this) { - try { - return ordinalToIbdID[ordinal]; - } catch (NullPointerException e) { - init(); - return ordinalToIbdID(ordinal); - } - } - } - - @Override - public > BlockData adapt(B state) { - BlockMaterial_1_16_2 material = (BlockMaterial_1_16_2) state.getMaterial(); - return material.getCraftBlockData(); - } - - private MapChunkUtil_1_16_2 mapUtil = new MapChunkUtil_1_16_2(); - - @Override - public void sendFakeChunk(org.bukkit.World world, Player player, ChunkPacket packet) { - WorldServer nmsWorld = ((CraftWorld) world).getHandle(); - PlayerChunk map = BukkitAdapter_1_16_2.getPlayerChunk(nmsWorld, packet.getChunkX(), packet.getChunkZ()); - if (map != null && map.hasBeenLoaded()) { - boolean flag = false; - PlayerChunk.d players = map.players; - Stream stream = players.a(new ChunkCoordIntPair(packet.getChunkX(), packet.getChunkZ()), flag); - - EntityPlayer checkPlayer = player == null ? null : ((CraftPlayer) player).getHandle(); - stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) - .forEach(entityPlayer -> { - synchronized (packet) { - PacketPlayOutMapChunk nmsPacket = (PacketPlayOutMapChunk) packet.getNativePacket(); - if (nmsPacket == null) { - nmsPacket = mapUtil.create( this, packet); - packet.setNativePacket(nmsPacket); - } - try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); - entityPlayer.playerConnection.sendPacket(nmsPacket); - } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); - } - } - }); - } - } - - @Override - public Map> getProperties(BlockType blockType) { - return getParent().getProperties(blockType); - } - - @Override - public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { - ItemStack stack = new ItemStack(IRegistry.ITEM.get(MinecraftKey.a(item.getType().getId())), item.getAmount()); - stack.setTag(((NBTTagCompound) 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; - } - - @Override - public Tag toNative(NBTBase foreign) { - return parent.toNative(foreign); - } - - @Override - public NBTBase fromNative(Tag foreign) { - if (foreign instanceof LazyCompoundTag_1_16_2) { - return ((LazyCompoundTag_1_16_2) foreign).get(); - } - return parent.fromNative(foreign); - } - - @Override - public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { - return new Regen_v1_16_R2(bukkitWorld, region, target, options).regenerate(); - } - - @Override - public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { - return new BukkitGetBlocks_1_16_2(world, chunkX, chunkZ); - } - - @Override - public int getInternalBiomeId(BiomeType biome) { - BiomeBase base = CraftBlock.biomeToBiomeBase(MinecraftServer.getServer().getCustomRegistry().b(IRegistry.ay), BukkitAdapter.adapt(biome)); - return MinecraftServer.getServer().getCustomRegistry().b(IRegistry.ay).a(base); - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R3.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R3.java deleted file mode 100644 index 776af597d..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R3.java +++ /dev/null @@ -1,454 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.bukkit.adapter.impl; - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.BlockMaterial_1_16_5; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.BukkitAdapter_1_16_5; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.BukkitGetBlocks_1_16_5; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.FAWEWorldNativeAccess_1_16_R3; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.MapChunkUtil_1_16_5; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.nbt.LazyCompoundTag_1_16_5; -import com.google.common.base.Preconditions; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.CachedBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.IDelegateBukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.regen.Regen_v1_16_R3; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.LazyBaseEntity; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.internal.util.LogManagerCompat; -import com.sk89q.worldedit.internal.wna.WorldNativeAccess; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.util.SideEffect; -import com.sk89q.worldedit.util.SideEffectSet; -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.server.v1_16_R3.BiomeBase; -import net.minecraft.server.v1_16_R3.Block; -import net.minecraft.server.v1_16_R3.BlockPosition; -import net.minecraft.server.v1_16_R3.Chunk; -import net.minecraft.server.v1_16_R3.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R3.ChunkSection; -import net.minecraft.server.v1_16_R3.Entity; -import net.minecraft.server.v1_16_R3.EntityPlayer; -import net.minecraft.server.v1_16_R3.EntityTypes; -import net.minecraft.server.v1_16_R3.IBlockData; -import net.minecraft.server.v1_16_R3.IRegistry; -import net.minecraft.server.v1_16_R3.ItemStack; -import net.minecraft.server.v1_16_R3.MinecraftKey; -import net.minecraft.server.v1_16_R3.MinecraftServer; -import net.minecraft.server.v1_16_R3.NBTBase; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagInt; -import net.minecraft.server.v1_16_R3.PacketPlayOutMapChunk; -import net.minecraft.server.v1_16_R3.PlayerChunk; -import net.minecraft.server.v1_16_R3.TileEntity; -import net.minecraft.server.v1_16_R3.World; -import net.minecraft.server.v1_16_R3.WorldServer; -import org.apache.logging.log4j.Logger; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_16_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_16_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; -import org.bukkit.entity.Player; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; -import java.util.OptionalInt; -import java.util.Set; -import java.util.function.Supplier; -import java.util.stream.Stream; - -public final class FAWE_Spigot_v1_16_R3 extends CachedBukkitAdapter implements IDelegateBukkitImplAdapter { - - private static final Logger LOGGER = LogManagerCompat.getLogger(); - - private final Spigot_v1_16_R3 parent; - private char[] ibdToStateOrdinal; - private int[] ordinalToIbdID; - - // ------------------------------------------------------------------------ - // Code that may break between versions of Minecraft - // ------------------------------------------------------------------------ - - public FAWE_Spigot_v1_16_R3() throws NoSuchFieldException, NoSuchMethodException { - this.parent = new Spigot_v1_16_R3(); - } - - @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 state = BlockTypesCache.states[i]; - BlockMaterial_1_16_5 material = (BlockMaterial_1_16_5) state.getMaterial(); - int id = Block.REGISTRY_ID.getId(material.getState()); - char ordinal = state.getOrdinalChar(); - ibdToStateOrdinal[id] = ordinal; - ordinalToIbdID[ordinal] = id; - } - return true; - } - - @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = getBlock(blockType); - return new BlockMaterial_1_16_5(block); - } - - @Override - public synchronized BlockMaterial getMaterial(BlockState state) { - IBlockData bs = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); - return new BlockMaterial_1_16_5(bs.getBlock(), bs); - } - - public Block getBlock(BlockType blockType) { - return IRegistry.BLOCK.get(new MinecraftKey(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 WorldServer handle = craftWorld.getHandle(); - Chunk chunk = handle.getChunkAt(x >> 4, z >> 4); - final BlockPosition blockPos = new BlockPosition(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 - TileEntity te = chunk.a(blockPos, Chunk.EnumTileEntityState.CHECK); - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.save(tag); // readTileEntityIntoTag - load data - return state.toBaseBlock((CompoundTag) toNative(tag)); - } - } - - return state.toBaseBlock(); - } - - @Override - public Set getSupportedSideEffects() { - return SideEffectSet.defaults().getSideEffectsToApply(); - } - - public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { - CraftChunk craftChunk = (CraftChunk) chunk; - Chunk nmsChunk = craftChunk.getHandle(); - World nmsWorld = nmsChunk.getWorld(); - - BlockPosition blockPos = new BlockPosition(x, y, z); - IBlockData blockData = ((BlockMaterial_1_16_5) state.getMaterial()).getState(); - ChunkSection[] sections = nmsChunk.getSections(); - int y4 = y >> 4; - ChunkSection section = sections[y4]; - - IBlockData existing; - if (section == null) { - existing = ((BlockMaterial_1_16_5) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); - } else { - existing = section.getType(x & 15, y & 15, z & 15); - } - - - nmsChunk.removeTileEntity(blockPos); // Force delete the old tile entity - - CompoundTag nativeTag = state instanceof BaseBlock ? ((BaseBlock)state).getNbtData() : null; - if (nativeTag != null || existing instanceof TileEntityBlock) { - nmsWorld.setTypeAndData(blockPos, blockData, 0); - // remove tile - if (nativeTag != null) { - // We will assume that the tile entity was created for us, - // though we do not do this on the Forge version - TileEntity tileEntity = nmsWorld.getTileEntity(blockPos); - if (tileEntity != null) { - NBTTagCompound tag = (NBTTagCompound) fromNative(nativeTag); - tag.set("x", NBTTagInt.a(x)); - tag.set("y", NBTTagInt.a(y)); - tag.set("z", NBTTagInt.a(z)); - tileEntity.load(tileEntity.getBlock(), tag); // readTagIntoTileEntity - load data - } - } - } else { - if (existing == blockData) { - return true; - } - if (section == null) { - if (blockData.isAir()) { - return true; - } - sections[y4] = section = new ChunkSection(y4 << 4); - } - nmsChunk.setType(blockPos, blockData, false); - } - if (update) { - nmsWorld.getMinecraftWorld().notify(blockPos, existing, blockData, 0); - } - return true; - } - - @Override - public WorldNativeAccess createWorldNativeAccess(org.bukkit.World world) { - return new FAWEWorldNativeAccess_1_16_R3(this, - new WeakReference<>(((CraftWorld)world).getHandle())); - } - - @Nullable - private static String getEntityId(Entity entity) { - MinecraftKey minecraftkey = EntityTypes.getName(entity.getEntityType()); - return minecraftkey == null ? null : minecraftkey.toString(); - } - - private static void readEntityIntoTag(Entity entity, NBTTagCompound tag) { - entity.save(tag); - } - - @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); - Supplier saveTag = () -> { - final NBTTagCompound minecraftTag = new NBTTagCompound(); - 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) { - BlockMaterial_1_16_5 material = (BlockMaterial_1_16_5) state.getMaterial(); - IBlockData mcState = material.getCraftBlockData().getState(); - return OptionalInt.of(Block.REGISTRY_ID.getId(mcState)); - } - - @Override - public BlockState adapt(BlockData blockData) { - CraftBlockData cbd = ((CraftBlockData) blockData); - IBlockData ibd = cbd.getState(); - return adapt(ibd); - } - - public BlockState adapt(IBlockData ibd) { - return BlockTypesCache.states[adaptToChar(ibd)]; - } - - /** - * @deprecated - * Method unused. Use #adaptToChar(IBlockData). - */ - @Deprecated - public int adaptToInt(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToInt(ibd); - } - } - } - - public char adaptToChar(IBlockData ibd) { - synchronized (this) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return ibdToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToChar(ibd); - } catch (ArrayIndexOutOfBoundsException e1) { - LOGGER.error("Attempted to convert {} with ID {} to char. ibdToStateOrdinal length: {}. Defaulting to air!", - ibd.getBlock(), Block.REGISTRY_ID.getId(ibd), ibdToStateOrdinal.length, e1); - return 0; - } - } - } - - public int ordinalToIbdID(char ordinal) { - synchronized (this) { - try { - return ordinalToIbdID[ordinal]; - } catch (NullPointerException e) { - init(); - return ordinalToIbdID(ordinal); - } - } - } - - @Override - public > BlockData adapt(B state) { - BlockMaterial_1_16_5 material = (BlockMaterial_1_16_5) state.getMaterial(); - return material.getCraftBlockData(); - } - - private MapChunkUtil_1_16_5 mapUtil = new MapChunkUtil_1_16_5(); - - @Override - public void sendFakeChunk(org.bukkit.World world, Player player, ChunkPacket packet) { - WorldServer nmsWorld = ((CraftWorld) world).getHandle(); - PlayerChunk map = BukkitAdapter_1_16_5.getPlayerChunk(nmsWorld, packet.getChunkX(), packet.getChunkZ()); - if (map != null && map.hasBeenLoaded()) { - boolean flag = false; - PlayerChunk.d players = map.players; - Stream stream = players.a(new ChunkCoordIntPair(packet.getChunkX(), packet.getChunkZ()), flag); - - EntityPlayer checkPlayer = player == null ? null : ((CraftPlayer) player).getHandle(); - stream.filter(entityPlayer -> checkPlayer == null || entityPlayer == checkPlayer) - .forEach(entityPlayer -> { - synchronized (packet) { - PacketPlayOutMapChunk nmsPacket = (PacketPlayOutMapChunk) packet.getNativePacket(); - if (nmsPacket == null) { - nmsPacket = mapUtil.create( this, packet); - packet.setNativePacket(nmsPacket); - } - try { - FaweCache.IMP.CHUNK_FLAG.get().set(true); - entityPlayer.playerConnection.sendPacket(nmsPacket); - } finally { - FaweCache.IMP.CHUNK_FLAG.get().set(false); - } - } - }); - } - } - - @Override - public Map> getProperties(BlockType blockType) { - return getParent().getProperties(blockType); - } - - @Override - public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { - ItemStack stack = new ItemStack(IRegistry.ITEM.get(MinecraftKey.a(item.getType().getId())), item.getAmount()); - stack.setTag(((NBTTagCompound) 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; - } - - @Override - public Tag toNative(NBTBase foreign) { - return parent.toNative(foreign); - } - - @Override - public NBTBase fromNative(Tag foreign) { - if (foreign instanceof LazyCompoundTag_1_16_5) { - return ((LazyCompoundTag_1_16_5) foreign).get(); - } - return parent.fromNative(foreign); - } - - @Override - public boolean regenerate(org.bukkit.World bukkitWorld, Region region, Extent target, RegenOptions options) throws Exception { - return new Regen_v1_16_R3(bukkitWorld, region, target, options).regenerate(); - } - - @Override - public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { - return new BukkitGetBlocks_1_16_5(world, chunkX, chunkZ); - } - - @Override - public int getInternalBiomeId(BiomeType biome) { - BiomeBase base = CraftBlock.biomeToBiomeBase(MinecraftServer.getServer().getCustomRegistry().b(IRegistry.ay), BukkitAdapter.adapt(biome)); - return MinecraftServer.getServer().getCustomRegistry().b(IRegistry.ay).a(base); - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_15_R2.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_15_R2.java deleted file mode 100644 index 14edd27a8..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_15_R2.java +++ /dev/null @@ -1,513 +0,0 @@ -package com.sk89q.worldedit.bukkit.adapter.impl.regen; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.bukkit.adapter.mc1_15_2.BukkitGetBlocks_1_15_2; -import com.google.common.collect.ImmutableSet; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.bukkit.adapter.Regenerator; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.io.file.SafeFiles; -import com.sk89q.worldedit.world.RegenOptions; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -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 javax.annotation.Nullable; -import net.minecraft.server.v1_15_R1.Area; -import net.minecraft.server.v1_15_R1.AreaContextTransformed; -import net.minecraft.server.v1_15_R1.AreaFactory; -import net.minecraft.server.v1_15_R1.AreaTransformer8; -import net.minecraft.server.v1_15_R1.BiomeBase; -import net.minecraft.server.v1_15_R1.BiomeLayoutOverworldConfiguration; -import net.minecraft.server.v1_15_R1.Biomes; -import net.minecraft.server.v1_15_R1.Chunk; -import net.minecraft.server.v1_15_R1.ChunkConverter; -import net.minecraft.server.v1_15_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_15_R1.ChunkGenerator; -import net.minecraft.server.v1_15_R1.ChunkProviderFlat; -import net.minecraft.server.v1_15_R1.ChunkProviderGenerate; -import net.minecraft.server.v1_15_R1.ChunkProviderHell; -import net.minecraft.server.v1_15_R1.ChunkProviderServer; -import net.minecraft.server.v1_15_R1.ChunkProviderTheEnd; -import net.minecraft.server.v1_15_R1.ChunkStatus; -import net.minecraft.server.v1_15_R1.DefinedStructureManager; -import net.minecraft.server.v1_15_R1.GenLayer; -import net.minecraft.server.v1_15_R1.GenLayers; -import net.minecraft.server.v1_15_R1.GeneratorSettingsEnd; -import net.minecraft.server.v1_15_R1.GeneratorSettingsFlat; -import net.minecraft.server.v1_15_R1.GeneratorSettingsNether; -import net.minecraft.server.v1_15_R1.GeneratorSettingsOverworld; -import net.minecraft.server.v1_15_R1.IChunkAccess; -import net.minecraft.server.v1_15_R1.IRegistry; -import net.minecraft.server.v1_15_R1.LightEngineThreaded; -import net.minecraft.server.v1_15_R1.LinearCongruentialGenerator; -import net.minecraft.server.v1_15_R1.MinecraftKey; -import net.minecraft.server.v1_15_R1.MinecraftServer; -import net.minecraft.server.v1_15_R1.NBTTagCompound; -import net.minecraft.server.v1_15_R1.NoiseGeneratorPerlin; -import net.minecraft.server.v1_15_R1.ProtoChunk; -import net.minecraft.server.v1_15_R1.World; -import net.minecraft.server.v1_15_R1.WorldChunkManager; -import net.minecraft.server.v1_15_R1.WorldChunkManagerOverworld; -import net.minecraft.server.v1_15_R1.WorldData; -import net.minecraft.server.v1_15_R1.WorldLoadListener; -import net.minecraft.server.v1_15_R1.WorldNBTStorage; -import net.minecraft.server.v1_15_R1.WorldServer; -import net.minecraft.server.v1_15_R1.WorldType; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_15_R1.CraftServer; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.generator.CustomChunkGenerator; -import org.bukkit.craftbukkit.v1_15_R1.util.CraftMagicNumbers; -import org.bukkit.generator.BlockPopulator; - -public class Regen_v1_15_R2 extends Regenerator { - - private static final Field serverWorldsField; - private static final Field worldPaperConfigField; - private static final Field flatBedrockField; - 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, Regenerator.Concurrency.FULL); // radius -1, does nothing - chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.STRUCTURE_REFERENCES, Regenerator.Concurrency.FULL); // radius 8, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.BIOMES, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.NOISE, Regenerator.Concurrency.RADIUS); // radius 8 - chunkStati.put(ChunkStatus.SURFACE, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.LIQUID_CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.FEATURES, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.LIGHT, Regenerator.Concurrency.FULL); // radius 1, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.SPAWN, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.HEIGHTMAPS, Regenerator.Concurrency.FULL); // radius 0 - - try { - serverWorldsField = CraftServer.class.getDeclaredField("worlds"); - serverWorldsField.setAccessible(true); - - Field tmpPaperConfigField = null; - Field tmpFlatBedrockField = null; - try { //only present on paper - tmpPaperConfigField = World.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; - - delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); - delegateField.setAccessible(true); - - chunkProviderField = World.class.getDeclaredField("chunkProvider"); - chunkProviderField.setAccessible(true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - //runtime - private WorldServer originalNMSWorld; - private ChunkProviderServer originalChunkProvider; - private WorldServer freshNMSWorld; - private ChunkProviderServer freshChunkProvider; - private DefinedStructureManager structureManager; - private LightEngineThreaded lightEngine; - private ChunkGenerator generator; - - private Path tempDir; - - private boolean generateFlatBedrock = false; - - public Regen_v1_15_R2(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { - super(originalBukkitWorld, region, target, options); - } - - @Override - protected boolean prepare() { - this.originalNMSWorld = ((CraftWorld) originalBukkitWorld).getHandle(); - originalChunkProvider = originalNMSWorld.getChunkProvider(); - if (!(originalChunkProvider instanceof ChunkProviderServer)) { - return false; - } - - //flat bedrock? (only on paper) - try { - generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalNMSWorld)); - } catch (Exception ignored) { - } - - seed = options.getSeed().orElse(originalNMSWorld.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("WorldEditWorldGen"); - - //prepare for world init (see upstream implementation for reference) - org.bukkit.World.Environment env = originalBukkitWorld.getEnvironment(); - org.bukkit.generator.ChunkGenerator gen = originalBukkitWorld.getGenerator(); - - MinecraftServer server = originalNMSWorld.getServer().getServer(); - WorldData newWorldData = new WorldData(originalNMSWorld.worldData.a((NBTTagCompound) null), server.dataConverterManager, CraftMagicNumbers.INSTANCE.getDataVersion(), (NBTTagCompound) null); - newWorldData.setName("worldeditregentempworld"); - WorldNBTStorage saveHandler = new WorldNBTStorage(new File(tempDir.toUri()), originalNMSWorld.getDataManager().getDirectory().getName(), server, server.dataConverterManager); - - //init world - freshNMSWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new WorldServer(server, server.executorService, saveHandler, newWorldData, originalNMSWorld.worldProvider.getDimensionManager(), originalNMSWorld.getMethodProfiler(), new RegenNoOpWorldLoadListener(), env, gen) { - @Override - public void doTick(BooleanSupplier booleansupplier) { //no ticking - } - - private final BiomeBase singleBiome = options.hasBiomeType() ? IRegistry.BIOME.get(MinecraftKey.a(options.getBiomeType().getId())) : null; - - @Override - public BiomeBase a(int i, int k, int j) { - if (options.hasBiomeType()) { - return singleBiome; - } - return this.getChunkProvider().getChunkGenerator().getWorldChunkManager().getBiome(i, j, k); - } - }).get(); - freshNMSWorld.savingDisabled = true; - removeWorldFromWorldsMap(); - newWorldData.checkName(originalNMSWorld.getWorldData().getName()); //rename to original world name - - try { //flat bedrock (paper only) - Object paperconf = worldPaperConfigField.get(freshNMSWorld); - flatBedrockField.setBoolean(paperconf, generateFlatBedrock); - } catch (Exception e) { - } - - DefinedStructureManager tmpStructureManager = saveHandler.f(); - freshChunkProvider = new ChunkProviderServer(freshNMSWorld, saveHandler.getDirectory(), server.aC(), tmpStructureManager, server.executorService, originalChunkProvider.chunkGenerator, freshNMSWorld.spigotConfig.viewDistance, new RegenNoOpWorldLoadListener(), () -> freshNMSWorld.getWorldPersistentData()) { - // redirect to our protoChunks list - @Override - public IChunkAccess getChunkAt(int x, int z, ChunkStatus chunkstatus, boolean flag) { - return getProtoChunkAt(x, z); - } - }; - chunkProviderField.set(freshNMSWorld, freshChunkProvider); - - //generator - if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderFlat) { - GeneratorSettingsFlat generatorSettingFlat = (GeneratorSettingsFlat) originalChunkProvider.getChunkGenerator().getSettings(); - generator = new ChunkProviderFlat(freshNMSWorld, originalChunkProvider.getChunkGenerator().getWorldChunkManager(), generatorSettingFlat); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderGenerate) { //overworld - GeneratorSettingsOverworld settings = (GeneratorSettingsOverworld) originalChunkProvider.getChunkGenerator().getSettings(); - WorldChunkManager chunkManager = originalChunkProvider.getChunkGenerator().getWorldChunkManager(); - if (chunkManager instanceof WorldChunkManagerOverworld) { //should always be true - chunkManager = fastOverWorldChunkManager(chunkManager); - } - generator = new ChunkProviderGenerate(freshNMSWorld, chunkManager, settings); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderHell) { //nether - GeneratorSettingsNether settings = (GeneratorSettingsNether) originalChunkProvider.getChunkGenerator().getSettings(); - generator = new ChunkProviderHell(freshNMSWorld, originalChunkProvider.getChunkGenerator().getWorldChunkManager(), settings); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderTheEnd) { //end - GeneratorSettingsEnd settings = (GeneratorSettingsEnd) originalChunkProvider.getChunkGenerator().getSettings(); - generator = new ChunkProviderTheEnd(freshNMSWorld, originalChunkProvider.getChunkGenerator().getWorldChunkManager(), settings); - } else if (originalChunkProvider.getChunkGenerator() instanceof CustomChunkGenerator) { - ChunkGenerator delegate = (ChunkGenerator) delegateField.get(originalChunkProvider.getChunkGenerator()); - generator = delegate; - } else { - System.out.println("Unsupported generator type " + originalChunkProvider.getChunkGenerator().getClass().getName()); - return false; - } - if (originalNMSWorld.generator != null) { - // wrap custom world generator - generator = new CustomChunkGenerator(freshNMSWorld, originalNMSWorld.generator); - generateConcurrent = originalNMSWorld.generator.isParallelCapable(); - } - - //lets start then - structureManager = tmpStructureManager; - lightEngine = freshChunkProvider.getLightEngine(); - - return true; - } - - @Override - protected void cleanup() { - //shutdown chunk provider - try { - Fawe.get().getQueueHandler().sync(() -> { - try { - freshChunkProvider.close(false); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception e) { - } - - //remove world from server - try { - removeWorldFromWorldsMap(); - } catch (Exception e) { - } - - //delete directory - try { - SafeFiles.tryHardToDeleteDir(tempDir); - } catch (Exception e) { - } - } - - @Override - protected ProtoChunk createProtoChunk(int x, int z) { - return new ProtoChunk(new ChunkCoordIntPair(x, z), ChunkConverter.a) { - public boolean generateFlatBedrock() { - return generateFlatBedrock; - } - }; - } - - @Override - protected Chunk createChunk(ProtoChunk protoChunk) { - return new Chunk(freshNMSWorld, protoChunk); - } - - @Override - protected ChunkStatusWrap getFullChunkStatus() { - return new ChunkStatusWrap(ChunkStatus.FULL); - } - - @Override - protected List getBlockPopulators() { - return originalNMSWorld.getWorld().getPopulators(); - } - - @Override - protected void populate(Chunk chunk, Random random, BlockPopulator pop) { - pop.populate(freshNMSWorld.getWorld(), random, chunk.bukkitChunk); - } - - @Override - protected IChunkCache initSourceQueueCache() { - return (chunkX, chunkZ) -> new BukkitGetBlocks_1_15_2(freshNMSWorld, chunkX, chunkZ) { - @Override - public Chunk ensureLoaded(World nmsWorld, int x, int z) { - return getChunkAt(x, z); - } - }; - } - - protected class ChunkStatusWrap extends Regenerator.ChunkStatusWrapper { - - private final ChunkStatus chunkStatus; - - public ChunkStatusWrap(ChunkStatus chunkStatus) { - this.chunkStatus = chunkStatus; - } - - @Override - public int requiredNeigborChunkRadius() { - return chunkStatus.f(); - } - - @Override - public String name() { - return chunkStatus.d(); - } - - @Override - public void processChunk(Long xz, List accessibleChunks) { - chunkStatus.a(freshNMSWorld, - generator, - structureManager, - lightEngine, - c -> CompletableFuture.completedFuture(Either.left(c)), - accessibleChunks); - } - } - - //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 WorldChunkManager fastOverWorldChunkManager(WorldChunkManager chunkManager) throws Exception { - Field genLayerField = WorldChunkManagerOverworld.class.getDeclaredField("d"); - genLayerField.setAccessible(true); - Field areaLazyField = GenLayer.class.getDeclaredField("b"); - areaLazyField.setAccessible(true); - Method initAreaFactoryMethod = GenLayers.class.getDeclaredMethod("a", WorldType.class, GeneratorSettingsOverworld.class, LongFunction.class); - initAreaFactoryMethod.setAccessible(true); - - //init new WorldChunkManagerOverworld - BiomeLayoutOverworldConfiguration biomeconfig = new BiomeLayoutOverworldConfiguration(freshNMSWorld.getWorldData()) - .a((GeneratorSettingsOverworld) originalChunkProvider.getChunkGenerator().getSettings()); - AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke(null, biomeconfig.b(), biomeconfig.c(), (LongFunction) (l -> new FastWorldGenContextArea(seed, l))); - if (options.hasBiomeType()) { - BiomeBase biome = IRegistry.BIOME.get(MinecraftKey.a(options.getBiomeType().getId())); - chunkManager = new SingleBiomeWorldChunkManagerOverworld(biome); - } else { - chunkManager = new WorldChunkManagerOverworld(biomeconfig); - //replace genlayer - genLayerField.set(chunkManager, new FastGenLayer(factory)); - } - - return chunkManager; - } - - private static class SingleBiomeWorldChunkManagerOverworld extends WorldChunkManager { - - private final BiomeBase biome; - - public SingleBiomeWorldChunkManagerOverworld(BiomeBase biome) { - super(ImmutableSet.of(biome)); - this.biome = biome; - } - - @Override - public BiomeBase getBiome(int i, int i1, int i2) { - return biome; - } - } - - private static class FastWorldGenContextArea implements AreaContextTransformed { - - private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); - private final NoiseGeneratorPerlin perlinNoise; - 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.perlinNoise = new NoiseGeneratorPerlin(new Random(seed)); - } - - @Override - public FastAreaLazy a(AreaTransformer8 var0) { - return new FastAreaLazy(sharedAreaMap, var0); - } - - @Override - public void a(long x, long z) { - long l = this.magicrandom; - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - this.map.put(Thread.currentThread().getId(), l); - } - - @Override - public int a(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.a(e, this.magicrandom)); - return mod; - } - - @Override - public NoiseGeneratorPerlin b() { - return this.perlinNoise; - } - - private static long mix(long seed, long lconst) { - long l1 = lconst; - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - long l2 = seed; - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - return l2; - } - } - - private static class FastGenLayer extends GenLayer { - - private final FastAreaLazy areaLazy; - - public FastGenLayer(AreaFactory factory) throws Exception { - super(() -> null); - this.areaLazy = factory.make(); - } - - @Override - public BiomeBase a(int x, int z) { - BiomeBase biome = IRegistry.BIOME.fromId(this.areaLazy.a(x, z)); - if (biome == null) - return Biomes.b; - return biome; - } - } - - private static class FastAreaLazy implements Area { - - private final AreaTransformer8 transformer; - //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a syncronized 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, AreaTransformer8 transformer) { - this.sharedMap = sharedMap; - this.transformer = transformer; - } - - @Override - public int a(int x, int z) { - long zx = ChunkCoordIntPair.pair(x, z); - return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); - } - } - - private static class RegenNoOpWorldLoadListener implements WorldLoadListener { - - private RegenNoOpWorldLoadListener() { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair) { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair, @Nullable ChunkStatus chunkStatus) { - } - - @Override - public void b() { - } - - @Override - public void setChunkRadius(int i) { - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R1.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R1.java deleted file mode 100644 index 2cf59f857..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R1.java +++ /dev/null @@ -1,559 +0,0 @@ -package com.sk89q.worldedit.bukkit.adapter.impl.regen; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.bukkit.adapter.mc1_16_1.BukkitGetBlocks_1_16_1; -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.Regenerator; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.io.file.SafeFiles; -import com.sk89q.worldedit.world.RegenOptions; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.file.Path; -import java.util.Arrays; -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 javax.annotation.Nullable; -import net.minecraft.server.v1_16_R1.Area; -import net.minecraft.server.v1_16_R1.AreaContextTransformed; -import net.minecraft.server.v1_16_R1.AreaFactory; -import net.minecraft.server.v1_16_R1.AreaTransformer8; -import net.minecraft.server.v1_16_R1.BiomeBase; -import net.minecraft.server.v1_16_R1.Biomes; -import net.minecraft.server.v1_16_R1.Chunk; -import net.minecraft.server.v1_16_R1.ChunkConverter; -import net.minecraft.server.v1_16_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R1.ChunkGenerator; -import net.minecraft.server.v1_16_R1.ChunkGeneratorAbstract; -import net.minecraft.server.v1_16_R1.ChunkProviderFlat; -import net.minecraft.server.v1_16_R1.ChunkProviderServer; -import net.minecraft.server.v1_16_R1.ChunkStatus; -import net.minecraft.server.v1_16_R1.Convertable; -import net.minecraft.server.v1_16_R1.DefinedStructureManager; -import net.minecraft.server.v1_16_R1.DynamicOpsNBT; -import net.minecraft.server.v1_16_R1.GenLayer; -import net.minecraft.server.v1_16_R1.GenLayers; -import net.minecraft.server.v1_16_R1.GeneratorSettingBase; -import net.minecraft.server.v1_16_R1.GeneratorSettings; -import net.minecraft.server.v1_16_R1.GeneratorSettingsFlat; -import net.minecraft.server.v1_16_R1.IChunkAccess; -import net.minecraft.server.v1_16_R1.IRegistry; -import net.minecraft.server.v1_16_R1.LightEngineThreaded; -import net.minecraft.server.v1_16_R1.LinearCongruentialGenerator; -import net.minecraft.server.v1_16_R1.MinecraftKey; -import net.minecraft.server.v1_16_R1.MinecraftServer; -import net.minecraft.server.v1_16_R1.NBTBase; -import net.minecraft.server.v1_16_R1.NBTTagCompound; -import net.minecraft.server.v1_16_R1.NoiseGeneratorPerlin; -import net.minecraft.server.v1_16_R1.ProtoChunk; -import net.minecraft.server.v1_16_R1.ResourceKey; -import net.minecraft.server.v1_16_R1.World; -import net.minecraft.server.v1_16_R1.WorldChunkManager; -import net.minecraft.server.v1_16_R1.WorldChunkManagerOverworld; -import net.minecraft.server.v1_16_R1.WorldDataServer; -import net.minecraft.server.v1_16_R1.WorldDimension; -import net.minecraft.server.v1_16_R1.WorldLoadListener; -import net.minecraft.server.v1_16_R1.WorldServer; -import net.minecraft.server.v1_16_R1.WorldSettings; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_16_R1.CraftServer; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.generator.CustomChunkGenerator; -import org.bukkit.generator.BlockPopulator; - -public class Regen_v1_16_R1 extends Regenerator { - - private static final Field serverWorldsField; - private static final Field worldPaperConfigField; - private static final Field flatBedrockField; - private static final Field generatorSettingBaseField; - private static final Field generatorSettingFlatField; - 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, Regenerator.Concurrency.FULL); // radius -1, does nothing - chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.STRUCTURE_REFERENCES, Regenerator.Concurrency.FULL); // radius 8, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.BIOMES, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.NOISE, Regenerator.Concurrency.RADIUS); // radius 8 - chunkStati.put(ChunkStatus.SURFACE, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.LIQUID_CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.FEATURES, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.LIGHT, Regenerator.Concurrency.FULL); // radius 1, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.SPAWN, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.HEIGHTMAPS, Regenerator.Concurrency.FULL); // radius 0 - - try { - serverWorldsField = CraftServer.class.getDeclaredField("worlds"); - serverWorldsField.setAccessible(true); - - Field tmpPaperConfigField = null; - Field tmpFlatBedrockField = null; - try { //only present on paper - tmpPaperConfigField = World.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; - - generatorSettingBaseField = ChunkGeneratorAbstract.class.getDeclaredField("h"); - generatorSettingBaseField.setAccessible(true); - - generatorSettingFlatField = ChunkProviderFlat.class.getDeclaredField("e"); - generatorSettingFlatField.setAccessible(true); - - delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); - delegateField.setAccessible(true); - - chunkProviderField = WorldServer.class.getDeclaredField("chunkProvider"); - chunkProviderField.setAccessible(true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - //runtime - private WorldServer originalNMSWorld; - private ChunkProviderServer originalChunkProvider; - private WorldServer freshNMSWorld; - private ChunkProviderServer freshChunkProvider; - private Convertable.ConversionSession session; - private DefinedStructureManager structureManager; - private LightEngineThreaded lightEngine; - private ChunkGenerator generator; - - private Path tempDir; - - private boolean generateFlatBedrock = false; - - public Regen_v1_16_R1(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { - super(originalBukkitWorld, region, target, options); - } - - @Override - protected boolean prepare() { - this.originalNMSWorld = ((CraftWorld) originalBukkitWorld).getHandle(); - originalChunkProvider = originalNMSWorld.getChunkProvider(); - if (!(originalChunkProvider instanceof ChunkProviderServer)) { - return false; - } - - //flat bedrock? (only on paper) - try { - generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalNMSWorld)); - } catch (Exception ignored) { - } - - seed = options.getSeed().orElse(originalNMSWorld.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("WorldEditWorldGen"); - - //prepare for world init (see upstream implementation for reference) - org.bukkit.World.Environment env = originalBukkitWorld.getEnvironment(); - org.bukkit.generator.ChunkGenerator gen = originalBukkitWorld.getGenerator(); - Convertable convertable = Convertable.a(tempDir); - ResourceKey worldDimKey = getWorldDimKey(env); - session = convertable.c("worldeditregentempworld", worldDimKey); - WorldDataServer originalWorldData = originalNMSWorld.worldDataServer; - - MinecraftServer server = originalNMSWorld.getServer().getServer(); - WorldDataServer levelProperties = (WorldDataServer) server.getSaveData(); - GeneratorSettings newOpts = GeneratorSettings.a.encodeStart(DynamicOpsNBT.a, levelProperties.getGeneratorSettings()).flatMap(tag -> GeneratorSettings.a.parse(this.recursivelySetSeed(new Dynamic<>(DynamicOpsNBT.a, tag), seed, new HashSet<>()))).result().orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); - WorldSettings newWorldSettings = new WorldSettings("worldeditregentempworld", originalWorldData.b.getGameType(), originalWorldData.b.hardcore, originalWorldData.b.getDifficulty(), originalWorldData.b.e(), originalWorldData.b.getGameRules(), originalWorldData.b.g()); - WorldDataServer newWorldData = new WorldDataServer(newWorldSettings, newOpts, Lifecycle.stable()); - - //init world - freshNMSWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new WorldServer(server, server.executorService, session, newWorldData, originalNMSWorld.getDimensionKey(), originalNMSWorld.getTypeKey(), originalNMSWorld.getDimensionManager(), new RegenNoOpWorldLoadListener(), ((WorldDimension) newOpts.e().a(worldDimKey)).c(), originalNMSWorld.isDebugWorld(), seed, ImmutableList.of(), false, env, gen) { - @Override - public void doTick(BooleanSupplier booleansupplier) { //no ticking - } - - private final BiomeBase singleBiome = options.hasBiomeType() ? IRegistry.BIOME.get(MinecraftKey.a(options.getBiomeType().getId())) : null; - - @Override - public BiomeBase a(int i, int j, int k) { - if (options.hasBiomeType()) { - return singleBiome; - } - return this.getChunkProvider().getChunkGenerator().getWorldChunkManager().getBiome(i, j, k); - } - }).get(); - freshNMSWorld.savingDisabled = true; - removeWorldFromWorldsMap(); - newWorldData.checkName(originalNMSWorld.worldDataServer.getName()); //rename to original world name - - freshChunkProvider = new ChunkProviderServer(freshNMSWorld, session, server.getDataFixer(), server.getDefinedStructureManager(), server.executorService, originalChunkProvider.chunkGenerator, freshNMSWorld.spigotConfig.viewDistance, server.isSyncChunkWrites(), new RegenNoOpWorldLoadListener(), () -> server.D().getWorldPersistentData()) { - // redirect to our protoChunks list - @Override - public IChunkAccess getChunkAt(int x, int z, ChunkStatus chunkstatus, boolean flag) { - return getProtoChunkAt(x, z); - } - }; - chunkProviderField.set(freshNMSWorld, freshChunkProvider); - - //generator - if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderFlat) { - GeneratorSettingsFlat generatorSettingFlat = (GeneratorSettingsFlat) generatorSettingFlatField.get(originalChunkProvider.getChunkGenerator()); - generator = new ChunkProviderFlat(generatorSettingFlat); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkGeneratorAbstract) { - GeneratorSettingBase generatorSettingBase = (GeneratorSettingBase) generatorSettingBaseField.get(originalChunkProvider.getChunkGenerator()); - WorldChunkManager chunkManager = originalChunkProvider.getChunkGenerator().getWorldChunkManager(); - if (chunkManager instanceof WorldChunkManagerOverworld) { - chunkManager = fastOverWorldChunkManager(chunkManager); - } - generator = new ChunkGeneratorAbstract(chunkManager, seed, generatorSettingBase); - } else if (originalChunkProvider.getChunkGenerator() instanceof CustomChunkGenerator) { - ChunkGenerator delegate = (ChunkGenerator) delegateField.get(originalChunkProvider.getChunkGenerator()); - generator = delegate; - } else { - System.out.println("Unsupported generator type " + originalChunkProvider.getChunkGenerator().getClass().getName()); - return false; - } - if (originalNMSWorld.generator != null) { - // wrap custom world generator - generator = new CustomChunkGenerator(freshNMSWorld, generator, originalNMSWorld.generator); - generateConcurrent = originalNMSWorld.generator.isParallelCapable(); - } - - //lets start then - structureManager = server.getDefinedStructureManager(); - lightEngine = freshChunkProvider.getLightEngine(); - - return true; - } - - @Override - protected void cleanup() { - try { - session.close(); - } catch (Exception e) { - } - - //shutdown chunk provider - try { - Fawe.get().getQueueHandler().sync(() -> { - try { - freshChunkProvider.close(false); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception e) { - } - - //remove world from server - try { - removeWorldFromWorldsMap(); - } catch (Exception e) { - } - - //delete directory - try { - SafeFiles.tryHardToDeleteDir(tempDir); - } catch (Exception e) { - } - } - - @Override - protected ProtoChunk createProtoChunk(int x, int z) { - return new ProtoChunk(new ChunkCoordIntPair(x, z), ChunkConverter.a) { - public boolean generateFlatBedrock() { - return generateFlatBedrock; - } - }; - } - - @Override - protected Chunk createChunk(ProtoChunk protoChunk) { - return new Chunk(freshNMSWorld, protoChunk); - } - - @Override - protected ChunkStatusWrap getFullChunkStatus() { - return new ChunkStatusWrap(ChunkStatus.FULL); - } - - @Override - protected List getBlockPopulators() { - return originalNMSWorld.getWorld().getPopulators(); - } - - @Override - protected void populate(Chunk chunk, Random random, BlockPopulator pop) { - pop.populate(freshNMSWorld.getWorld(), random, chunk.bukkitChunk); - } - - @Override - protected IChunkCache initSourceQueueCache() { - return (chunkX, chunkZ) -> new BukkitGetBlocks_1_16_1(freshNMSWorld, chunkX, chunkZ) { - @Override - public Chunk ensureLoaded(World nmsWorld, int x, int z) { - return getChunkAt(x, z); - } - }; - } - - protected class ChunkStatusWrap extends Regenerator.ChunkStatusWrapper { - - private final ChunkStatus chunkStatus; - - public ChunkStatusWrap(ChunkStatus chunkStatus) { - this.chunkStatus = chunkStatus; - } - - @Override - public int requiredNeigborChunkRadius() { - return chunkStatus.f(); - } - - @Override - public String name() { - return chunkStatus.d(); - } - - @Override - public void processChunk(Long xz, List accessibleChunks) { - chunkStatus.a(freshNMSWorld, - generator, - structureManager, - lightEngine, - c -> CompletableFuture.completedFuture(Either.left(c)), - accessibleChunks); - } - } - - //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 WorldDimension.THE_NETHER; - case THE_END: - return WorldDimension.THE_END; - case NORMAL: - default: - return WorldDimension.OVERWORLD; - } - } - - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - return !seen.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { - if (((Dynamic) pair.getFirst()).asString("").equals("seed")) { - return pair.mapSecond((v) -> { - return v.createLong(seed); - }); - } else { - return ((Dynamic) pair.getSecond()).getValue() instanceof NBTTagCompound ? pair.mapSecond((v) -> { - return this.recursivelySetSeed((Dynamic) v, seed, seen); - }) : pair; - } - }); - } - - private WorldChunkManager fastOverWorldChunkManager(WorldChunkManager chunkManager) throws Exception { - Field legacyBiomeInitLayerField = WorldChunkManagerOverworld.class.getDeclaredField("i"); - legacyBiomeInitLayerField.setAccessible(true); - Field largeBiomesField = WorldChunkManagerOverworld.class.getDeclaredField("j"); - largeBiomesField.setAccessible(true); - Field genLayerField = WorldChunkManagerOverworld.class.getDeclaredField("f"); - genLayerField.setAccessible(true); - Field areaLazyField = GenLayer.class.getDeclaredField("b"); - areaLazyField.setAccessible(true); - Method initAreaFactoryMethod = GenLayers.class.getDeclaredMethod("a", boolean.class, int.class, int.class, LongFunction.class); - initAreaFactoryMethod.setAccessible(true); - - //init new WorldChunkManagerOverworld - boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(chunkManager); - boolean largeBiomes = largeBiomesField.getBoolean(chunkManager); - - AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke(null, legacyBiomeInitLayer, largeBiomes ? 6 : 4, 4, (LongFunction) (l -> new FastWorldGenContextArea(seed, l))); - if (options.hasBiomeType()) { - BiomeBase biome = IRegistry.BIOME.get(MinecraftKey.a(options.getBiomeType().getId())); - chunkManager = new SingleBiomeWorldChunkManagerOverworld(biome); - } else { - chunkManager = new WorldChunkManagerOverworld(seed, legacyBiomeInitLayer, largeBiomes); - //replace genLayer - genLayerField.set(chunkManager, new FastGenLayer(factory)); - } - - return chunkManager; - } - - private static class SingleBiomeWorldChunkManagerOverworld extends WorldChunkManager { - - private final BiomeBase biome; - - public SingleBiomeWorldChunkManagerOverworld(BiomeBase biome) { - super(Arrays.asList(biome)); - this.biome = biome; - } - - @Override - protected Codec a() { - return WorldChunkManagerOverworld.e; - } - - @Override - public BiomeBase getBiome(int i, int i1, int i2) { - return biome; - } - } - - private static class FastWorldGenContextArea implements AreaContextTransformed { - - private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); - private final NoiseGeneratorPerlin perlinNoise; - 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.perlinNoise = new NoiseGeneratorPerlin(new Random(seed)); - } - - @Override - public FastAreaLazy a(AreaTransformer8 var0) { - return new FastAreaLazy(sharedAreaMap, var0); - } - - @Override - public void a(long x, long z) { - long l = this.magicrandom; - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - this.map.put(Thread.currentThread().getId(), l); - } - - @Override - public int a(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.a(e, this.magicrandom)); - return mod; - } - - @Override - public NoiseGeneratorPerlin b() { - return this.perlinNoise; - } - - private static long mix(long seed, long lconst) { - long l1 = lconst; - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - long l2 = seed; - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - return l2; - } - } - - private static class FastGenLayer extends GenLayer { - - private final FastAreaLazy areaLazy; - - public FastGenLayer(AreaFactory factory) throws Exception { - super(() -> null); - this.areaLazy = factory.make(); - } - - @Override - public BiomeBase a(int x, int z) { - BiomeBase biome = IRegistry.BIOME.fromId(this.areaLazy.a(x, z)); - if (biome == null) - return Biomes.b; - return biome; - } - } - - private static class FastAreaLazy implements Area { - - private final AreaTransformer8 transformer; - //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a syncronized 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, AreaTransformer8 transformer) { - this.sharedMap = sharedMap; - this.transformer = transformer; - } - - @Override - public int a(int x, int z) { - long zx = ChunkCoordIntPair.pair(x, z); - return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); - } - } - - private static class RegenNoOpWorldLoadListener implements WorldLoadListener { - - private RegenNoOpWorldLoadListener() { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair) { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair, @Nullable ChunkStatus chunkStatus) { - } - - @Override - public void b() { - } - - @Override - public void setChunkRadius(int i) { - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R2.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R2.java deleted file mode 100644 index f450059c5..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R2.java +++ /dev/null @@ -1,582 +0,0 @@ -package com.sk89q.worldedit.bukkit.adapter.impl.regen; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.bukkit.adapter.mc1_16_2.BukkitGetBlocks_1_16_2; -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.Regenerator; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.io.file.SafeFiles; -import com.sk89q.worldedit.world.RegenOptions; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.nio.file.Path; -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; -import javax.annotation.Nullable; -import net.minecraft.server.v1_16_R2.Area; -import net.minecraft.server.v1_16_R2.AreaContextTransformed; -import net.minecraft.server.v1_16_R2.AreaFactory; -import net.minecraft.server.v1_16_R2.AreaTransformer8; -import net.minecraft.server.v1_16_R2.BiomeBase; -import net.minecraft.server.v1_16_R2.BiomeRegistry; -import net.minecraft.server.v1_16_R2.Chunk; -import net.minecraft.server.v1_16_R2.ChunkConverter; -import net.minecraft.server.v1_16_R2.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R2.ChunkGenerator; -import net.minecraft.server.v1_16_R2.ChunkGeneratorAbstract; -import net.minecraft.server.v1_16_R2.ChunkProviderFlat; -import net.minecraft.server.v1_16_R2.ChunkProviderServer; -import net.minecraft.server.v1_16_R2.ChunkStatus; -import net.minecraft.server.v1_16_R2.Convertable; -import net.minecraft.server.v1_16_R2.DefinedStructureManager; -import net.minecraft.server.v1_16_R2.DynamicOpsNBT; -import net.minecraft.server.v1_16_R2.GenLayer; -import net.minecraft.server.v1_16_R2.GenLayers; -import net.minecraft.server.v1_16_R2.GeneratorSettingBase; -import net.minecraft.server.v1_16_R2.GeneratorSettings; -import net.minecraft.server.v1_16_R2.GeneratorSettingsFlat; -import net.minecraft.server.v1_16_R2.IChunkAccess; -import net.minecraft.server.v1_16_R2.IRegistry; -import net.minecraft.server.v1_16_R2.IRegistryCustom; -import net.minecraft.server.v1_16_R2.LightEngineThreaded; -import net.minecraft.server.v1_16_R2.LinearCongruentialGenerator; -import net.minecraft.server.v1_16_R2.MinecraftKey; -import net.minecraft.server.v1_16_R2.MinecraftServer; -import net.minecraft.server.v1_16_R2.NBTBase; -import net.minecraft.server.v1_16_R2.NBTTagCompound; -import net.minecraft.server.v1_16_R2.NoiseGeneratorPerlin; -import net.minecraft.server.v1_16_R2.ProtoChunk; -import net.minecraft.server.v1_16_R2.RegistryGeneration; -import net.minecraft.server.v1_16_R2.RegistryMaterials; -import net.minecraft.server.v1_16_R2.RegistryReadOps; -import net.minecraft.server.v1_16_R2.ResourceKey; -import net.minecraft.server.v1_16_R2.World; -import net.minecraft.server.v1_16_R2.WorldChunkManager; -import net.minecraft.server.v1_16_R2.WorldChunkManagerOverworld; -import net.minecraft.server.v1_16_R2.WorldDataServer; -import net.minecraft.server.v1_16_R2.WorldDimension; -import net.minecraft.server.v1_16_R2.WorldLoadListener; -import net.minecraft.server.v1_16_R2.WorldServer; -import net.minecraft.server.v1_16_R2.WorldSettings; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_16_R2.CraftServer; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R2.generator.CustomChunkGenerator; -import org.bukkit.generator.BlockPopulator; - -public class Regen_v1_16_R2 extends Regenerator { - - private static final Field serverWorldsField; - private static final Field worldPaperConfigField; - private static final Field flatBedrockField; - private static final Field generatorSettingBaseSupplierField; - private static final Field generatorSettingFlatField; - 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, Regenerator.Concurrency.FULL); // radius -1, does nothing - chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.STRUCTURE_REFERENCES, Regenerator.Concurrency.FULL); // radius 8, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.BIOMES, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.NOISE, Regenerator.Concurrency.RADIUS); // radius 8 - chunkStati.put(ChunkStatus.SURFACE, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.LIQUID_CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.FEATURES, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.LIGHT, Regenerator.Concurrency.FULL); // radius 1, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.SPAWN, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.HEIGHTMAPS, Regenerator.Concurrency.FULL); // radius 0 - - try { - serverWorldsField = CraftServer.class.getDeclaredField("worlds"); - serverWorldsField.setAccessible(true); - - Field tmpPaperConfigField = null; - Field tmpFlatBedrockField = null; - try { //only present on paper - tmpPaperConfigField = World.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 = ChunkGeneratorAbstract.class.getDeclaredField("h"); - generatorSettingBaseSupplierField.setAccessible(true); - - generatorSettingFlatField = ChunkProviderFlat.class.getDeclaredField("e"); - generatorSettingFlatField.setAccessible(true); - - delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); - delegateField.setAccessible(true); - - chunkProviderField = WorldServer.class.getDeclaredField("chunkProvider"); - chunkProviderField.setAccessible(true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - //runtime - private WorldServer originalNMSWorld; - private ChunkProviderServer originalChunkProvider; - private WorldServer freshNMSWorld; - private ChunkProviderServer freshChunkProvider; - private Convertable.ConversionSession session; - private DefinedStructureManager structureManager; - private LightEngineThreaded lightEngine; - private ChunkGenerator generator; - - private Path tempDir; - - private boolean generateFlatBedrock = false; - - public Regen_v1_16_R2(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { - super(originalBukkitWorld, region, target, options); - } - - @Override - protected boolean prepare() { - this.originalNMSWorld = ((CraftWorld) originalBukkitWorld).getHandle(); - originalChunkProvider = originalNMSWorld.getChunkProvider(); - if (!(originalChunkProvider instanceof ChunkProviderServer)) { - return false; - } - - //flat bedrock? (only on paper) - try { - generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalNMSWorld)); - } catch (Exception ignored) { - } - - seed = options.getSeed().orElse(originalNMSWorld.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("WorldEditWorldGen"); - - //prepare for world init (see upstream implementation for reference) - org.bukkit.World.Environment env = originalBukkitWorld.getEnvironment(); - org.bukkit.generator.ChunkGenerator gen = originalBukkitWorld.getGenerator(); - Convertable convertable = Convertable.a(tempDir); - ResourceKey worldDimKey = getWorldDimKey(env); - session = convertable.c("worldeditregentempworld", worldDimKey); - WorldDataServer originalWorldData = originalNMSWorld.worldDataServer; - - MinecraftServer server = originalNMSWorld.getServer().getServer(); - WorldDataServer levelProperties = (WorldDataServer) server.getSaveData(); - RegistryReadOps nbtRegOps = RegistryReadOps.a(DynamicOpsNBT.a, server.dataPackResources.h(), IRegistryCustom.b()); - GeneratorSettings newOpts = GeneratorSettings.a.encodeStart(nbtRegOps, levelProperties.getGeneratorSettings()).flatMap(tag -> GeneratorSettings.a.parse(this.recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()))).result().orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); - WorldSettings newWorldSettings = new WorldSettings("worldeditregentempworld", originalWorldData.b.getGameType(), originalWorldData.b.hardcore, originalWorldData.b.getDifficulty(), originalWorldData.b.e(), originalWorldData.b.getGameRules(), originalWorldData.b.g()); - WorldDataServer newWorldData = new WorldDataServer(newWorldSettings, newOpts, Lifecycle.stable()); - - //init world - freshNMSWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new WorldServer(server, server.executorService, session, newWorldData, originalNMSWorld.getDimensionKey(), originalNMSWorld.getDimensionManager(), new RegenNoOpWorldLoadListener(), ((WorldDimension) newOpts.d().a(worldDimKey)).c(), originalNMSWorld.isDebugWorld(), seed, ImmutableList.of(), false, env, gen) { - @Override - public void doTick(BooleanSupplier booleansupplier) { //no ticking - } - - private final BiomeBase singleBiome = options.hasBiomeType() ? RegistryGeneration.WORLDGEN_BIOME.get(MinecraftKey.a(options.getBiomeType().getId())) : null; - - @Override - public BiomeBase a(int i, int j, int k) { - if (options.hasBiomeType()) { - return singleBiome; - } - return this.getChunkProvider().getChunkGenerator().getWorldChunkManager().getBiome(i, j, k); - } - }).get(); - freshNMSWorld.savingDisabled = true; - removeWorldFromWorldsMap(); - newWorldData.checkName(originalNMSWorld.worldDataServer.getName()); //rename to original world name - - freshChunkProvider = new ChunkProviderServer(freshNMSWorld, session, server.getDataFixer(), server.getDefinedStructureManager(), server.executorService, originalChunkProvider.chunkGenerator, freshNMSWorld.spigotConfig.viewDistance, server.isSyncChunkWrites(), new RegenNoOpWorldLoadListener(), () -> server.E().getWorldPersistentData()) { - // redirect to our protoChunks list - @Override - public IChunkAccess getChunkAt(int x, int z, ChunkStatus chunkstatus, boolean flag) { - return getProtoChunkAt(x, z); - } - }; - chunkProviderField.set(freshNMSWorld, freshChunkProvider); - - //generator - if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderFlat) { - GeneratorSettingsFlat generatorSettingFlat = (GeneratorSettingsFlat) generatorSettingFlatField.get(originalChunkProvider.getChunkGenerator()); - generator = new ChunkProviderFlat(generatorSettingFlat); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkGeneratorAbstract) { - Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField.get(originalChunkProvider.getChunkGenerator()); - WorldChunkManager chunkManager = originalChunkProvider.getChunkGenerator().getWorldChunkManager(); - if (chunkManager instanceof WorldChunkManagerOverworld) { - chunkManager = fastOverWorldChunkManager(chunkManager); - } - generator = new ChunkGeneratorAbstract(chunkManager, seed, generatorSettingBaseSupplier); - } else if (originalChunkProvider.getChunkGenerator() instanceof CustomChunkGenerator) { - ChunkGenerator delegate = (ChunkGenerator) delegateField.get(originalChunkProvider.getChunkGenerator()); - generator = delegate; - } else { - System.out.println("Unsupported generator type " + originalChunkProvider.getChunkGenerator().getClass().getName()); - return false; - } - if (originalNMSWorld.generator != null) { - // wrap custom world generator - generator = new CustomChunkGenerator(freshNMSWorld, generator, originalNMSWorld.generator); - generateConcurrent = originalNMSWorld.generator.isParallelCapable(); - } - - //lets start then - structureManager = server.getDefinedStructureManager(); - lightEngine = freshChunkProvider.getLightEngine(); - - return true; - } - - @Override - protected void cleanup() { - try { - session.close(); - } catch (Exception e) { - } - - //shutdown chunk provider - try { - Fawe.get().getQueueHandler().sync(() -> { - try { - freshChunkProvider.close(false); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception e) { - } - - //remove world from server - try { - Fawe.get().getQueueHandler().sync(() -> { - removeWorldFromWorldsMap(); - }); - } catch (Exception e) { - } - - //delete directory - try { - SafeFiles.tryHardToDeleteDir(tempDir); - } catch (Exception e) { - } - } - - @Override - protected ProtoChunk createProtoChunk(int x, int z) { - return new ProtoChunk(new ChunkCoordIntPair(x, z), ChunkConverter.a) { - public boolean generateFlatBedrock() { - return generateFlatBedrock; - } - }; - } - - @Override - protected Chunk createChunk(ProtoChunk protoChunk) { - return new Chunk(freshNMSWorld, protoChunk); - } - - @Override - protected ChunkStatusWrap getFullChunkStatus() { - return new ChunkStatusWrap(ChunkStatus.FULL); - } - - @Override - protected List getBlockPopulators() { - return originalNMSWorld.getWorld().getPopulators(); - } - - @Override - protected void populate(Chunk chunk, Random random, BlockPopulator pop) { - pop.populate(freshNMSWorld.getWorld(), random, chunk.bukkitChunk); - } - - @Override - protected IChunkCache initSourceQueueCache() { - return (chunkX, chunkZ) -> new BukkitGetBlocks_1_16_2(freshNMSWorld, chunkX, chunkZ) { - @Override - public Chunk ensureLoaded(World nmsWorld, int x, int z) { - return getChunkAt(x, z); - } - }; - } - - protected class ChunkStatusWrap extends Regenerator.ChunkStatusWrapper { - - private final ChunkStatus chunkStatus; - - public ChunkStatusWrap(ChunkStatus chunkStatus) { - this.chunkStatus = chunkStatus; - } - - @Override - public int requiredNeigborChunkRadius() { - return chunkStatus.f(); - } - - @Override - public String name() { - return chunkStatus.d(); - } - - @Override - public void processChunk(Long xz, List accessibleChunks) { - chunkStatus.a(freshNMSWorld, - generator, - structureManager, - lightEngine, - c -> CompletableFuture.completedFuture(Either.left(c)), - accessibleChunks); - } - } - - //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 WorldDimension.THE_NETHER; - case THE_END: - return WorldDimension.THE_END; - case NORMAL: - default: - return WorldDimension.OVERWORLD; - } - } - - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - return !seen.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { - if (((Dynamic) pair.getFirst()).asString("").equals("seed")) { - return pair.mapSecond((v) -> { - return v.createLong(seed); - }); - } else { - return ((Dynamic) pair.getSecond()).getValue() instanceof NBTTagCompound ? pair.mapSecond((v) -> { - return this.recursivelySetSeed((Dynamic) v, seed, seen); - }) : pair; - - } - }); - } - - private WorldChunkManager fastOverWorldChunkManager(WorldChunkManager chunkManager) throws Exception { - Field legacyBiomeInitLayerField = WorldChunkManagerOverworld.class.getDeclaredField("i"); - legacyBiomeInitLayerField.setAccessible(true); - Field largeBiomesField = WorldChunkManagerOverworld.class.getDeclaredField("j"); - largeBiomesField.setAccessible(true); - Field biomeRegistryField = WorldChunkManagerOverworld.class.getDeclaredField("k"); - biomeRegistryField.setAccessible(true); - Field areaLazyField = GenLayer.class.getDeclaredField("b"); - areaLazyField.setAccessible(true); - Method initAreaFactoryMethod = GenLayers.class.getDeclaredMethod("a", boolean.class, int.class, int.class, LongFunction.class); - initAreaFactoryMethod.setAccessible(true); - - //init new WorldChunkManagerOverworld - boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(chunkManager); - boolean largebiomes = largeBiomesField.getBoolean(chunkManager); - IRegistry biomeRegistrynms = (IRegistry) biomeRegistryField.get(chunkManager); - IRegistry biomeRegistry; - if (options.hasBiomeType()) { - BiomeBase biome = RegistryGeneration.WORLDGEN_BIOME.get(MinecraftKey.a(options.getBiomeType().getId())); - biomeRegistry = new RegistryMaterials<>(ResourceKey.a(new MinecraftKey("fawe_biomes")), Lifecycle.experimental()); - ((RegistryMaterials) biomeRegistry).a(0, RegistryGeneration.WORLDGEN_BIOME.c(biome).get(), biome, Lifecycle.experimental()); - } else { - biomeRegistry = biomeRegistrynms; - } - chunkManager = new FastWorldChunkManagerOverworld(seed, legacyBiomeInitLayer, largebiomes, biomeRegistry); - - //replace genLayer - AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke(null, legacyBiomeInitLayer, largebiomes ? 6 : 4, 4, (LongFunction) (l -> new FastWorldGenContextArea(seed, l))); - ((FastWorldChunkManagerOverworld) chunkManager).genLayer = new FastGenLayer(factory); - - return chunkManager; - } - - private static class FastWorldChunkManagerOverworld extends WorldChunkManager { - - private GenLayer genLayer; - private final IRegistry k; - private final boolean isSingleRegistry; - - public FastWorldChunkManagerOverworld(long seed, boolean legacyBiomeInitLayer, boolean largeBiomes, IRegistry biomeRegistry) { - super(biomeRegistry.g().collect(Collectors.toList())); - this.k = biomeRegistry; - this.isSingleRegistry = biomeRegistry.d().size() == 1; - this.genLayer = GenLayers.a(seed, legacyBiomeInitLayer, largeBiomes ? 6 : 4, 4); - } - - @Override - protected Codec a() { - return WorldChunkManagerOverworld.e; - } - - @Override - public BiomeBase getBiome(int i, int i1, int i2) { - if (this.isSingleRegistry) { - return this.k.fromId(0); - } - return this.genLayer.a(this.k, i, i2); - } - } - - - private static class FastWorldGenContextArea implements AreaContextTransformed { - - private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); - private final NoiseGeneratorPerlin perlinNoise; - 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.perlinNoise = new NoiseGeneratorPerlin(new Random(seed)); - } - - @Override - public FastAreaLazy a(AreaTransformer8 var0) { - return new FastAreaLazy(sharedAreaMap, var0); - } - - @Override - public void a(long x, long z) { - long l = this.magicrandom; - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - this.map.put(Thread.currentThread().getId(), l); - } - - @Override - public int a(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.a(e, this.magicrandom)); - return mod; - } - - @Override - public NoiseGeneratorPerlin b() { - return this.perlinNoise; - } - - private static long mix(long seed, long lconst) { - long l1 = lconst; - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - long l2 = seed; - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - return l2; - } - } - - private static class FastGenLayer extends GenLayer { - - private final FastAreaLazy areaLazy; - - public FastGenLayer(AreaFactory factory) throws Exception { - super(() -> null); - this.areaLazy = factory.make(); - } - - @Override - public BiomeBase a(IRegistry registry, int x, int z) { - ResourceKey key = BiomeRegistry.a(this.areaLazy.a(x, z)); - if (key == null) - return registry.a(BiomeRegistry.a(0)); - BiomeBase biome = registry.a(key); - if (biome == null) - return registry.a(BiomeRegistry.a(0)); - return biome; - } - } - - private static class FastAreaLazy implements Area { - - private final AreaTransformer8 transformer; - //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a syncronized 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, AreaTransformer8 transformer) { - this.sharedMap = sharedMap; - this.transformer = transformer; - } - - @Override - public int a(int x, int z) { - long zx = ChunkCoordIntPair.pair(x, z); - return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); - } - } - - private static class RegenNoOpWorldLoadListener implements WorldLoadListener { - - private RegenNoOpWorldLoadListener() { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair) { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair, @Nullable ChunkStatus chunkStatus) { - } - - @Override - public void b() { - } - - @Override - public void setChunkRadius(int i) { - } - } -} diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R3.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R3.java deleted file mode 100644 index a66e15bce..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R3.java +++ /dev/null @@ -1,590 +0,0 @@ -package com.sk89q.worldedit.bukkit.adapter.impl.regen; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.bukkit.adapter.mc1_16_5.BukkitGetBlocks_1_16_5; -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.Regenerator; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.io.file.SafeFiles; -import com.sk89q.worldedit.world.RegenOptions; -import net.minecraft.server.v1_16_R3.Area; -import net.minecraft.server.v1_16_R3.AreaContextTransformed; -import net.minecraft.server.v1_16_R3.AreaFactory; -import net.minecraft.server.v1_16_R3.AreaTransformer8; -import net.minecraft.server.v1_16_R3.BiomeBase; -import net.minecraft.server.v1_16_R3.BiomeRegistry; -import net.minecraft.server.v1_16_R3.Chunk; -import net.minecraft.server.v1_16_R3.ChunkConverter; -import net.minecraft.server.v1_16_R3.ChunkCoordIntPair; -import net.minecraft.server.v1_16_R3.ChunkGenerator; -import net.minecraft.server.v1_16_R3.ChunkGeneratorAbstract; -import net.minecraft.server.v1_16_R3.ChunkProviderFlat; -import net.minecraft.server.v1_16_R3.ChunkProviderServer; -import net.minecraft.server.v1_16_R3.ChunkStatus; -import net.minecraft.server.v1_16_R3.Convertable; -import net.minecraft.server.v1_16_R3.DefinedStructureManager; -import net.minecraft.server.v1_16_R3.DynamicOpsNBT; -import net.minecraft.server.v1_16_R3.GenLayer; -import net.minecraft.server.v1_16_R3.GenLayers; -import net.minecraft.server.v1_16_R3.GeneratorSettingBase; -import net.minecraft.server.v1_16_R3.GeneratorSettings; -import net.minecraft.server.v1_16_R3.GeneratorSettingsFlat; -import net.minecraft.server.v1_16_R3.IChunkAccess; -import net.minecraft.server.v1_16_R3.IRegistry; -import net.minecraft.server.v1_16_R3.IRegistryCustom; -import net.minecraft.server.v1_16_R3.LightEngineThreaded; -import net.minecraft.server.v1_16_R3.LinearCongruentialGenerator; -import net.minecraft.server.v1_16_R3.MinecraftKey; -import net.minecraft.server.v1_16_R3.MinecraftServer; -import net.minecraft.server.v1_16_R3.NBTBase; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NoiseGeneratorPerlin; -import net.minecraft.server.v1_16_R3.ProtoChunk; -import net.minecraft.server.v1_16_R3.RegistryGeneration; -import net.minecraft.server.v1_16_R3.RegistryMaterials; -import net.minecraft.server.v1_16_R3.RegistryReadOps; -import net.minecraft.server.v1_16_R3.ResourceKey; -import net.minecraft.server.v1_16_R3.World; -import net.minecraft.server.v1_16_R3.WorldChunkManager; -import net.minecraft.server.v1_16_R3.WorldChunkManagerOverworld; -import net.minecraft.server.v1_16_R3.WorldDataServer; -import net.minecraft.server.v1_16_R3.WorldDimension; -import net.minecraft.server.v1_16_R3.WorldLoadListener; -import net.minecraft.server.v1_16_R3.WorldServer; -import net.minecraft.server.v1_16_R3.WorldSettings; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_16_R3.CraftServer; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R3.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 Regen_v1_16_R3 extends Regenerator { - - private static final Field serverWorldsField; - private static final Field worldPaperConfigField; - private static final Field flatBedrockField; - private static final Field generatorSettingBaseSupplierField; - private static final Field generatorSettingFlatField; - 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, Regenerator.Concurrency.FULL); // radius -1, does nothing - chunkStati.put(ChunkStatus.STRUCTURE_STARTS, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.STRUCTURE_REFERENCES, Regenerator.Concurrency.FULL); // radius 8, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.BIOMES, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.NOISE, Regenerator.Concurrency.RADIUS); // radius 8 - chunkStati.put(ChunkStatus.SURFACE, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.LIQUID_CARVERS, Regenerator.Concurrency.NONE); // radius 0, but RADIUS and FULL change results - chunkStati.put(ChunkStatus.FEATURES, Regenerator.Concurrency.NONE); // uses unsynchronized maps - chunkStati.put(ChunkStatus.LIGHT, Regenerator.Concurrency.FULL); // radius 1, but no writes to other chunks, only current chunk - chunkStati.put(ChunkStatus.SPAWN, Regenerator.Concurrency.FULL); // radius 0 - chunkStati.put(ChunkStatus.HEIGHTMAPS, Regenerator.Concurrency.FULL); // radius 0 - - try { - serverWorldsField = CraftServer.class.getDeclaredField("worlds"); - serverWorldsField.setAccessible(true); - - Field tmpPaperConfigField = null; - Field tmpFlatBedrockField = null; - try { //only present on paper - tmpPaperConfigField = World.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 = ChunkGeneratorAbstract.class.getDeclaredField("h"); - generatorSettingBaseSupplierField.setAccessible(true); - - generatorSettingFlatField = ChunkProviderFlat.class.getDeclaredField("e"); - generatorSettingFlatField.setAccessible(true); - - delegateField = CustomChunkGenerator.class.getDeclaredField("delegate"); - delegateField.setAccessible(true); - - chunkProviderField = WorldServer.class.getDeclaredField("chunkProvider"); - chunkProviderField.setAccessible(true); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - //runtime - private WorldServer originalNMSWorld; - private ChunkProviderServer originalChunkProvider; - private WorldServer freshNMSWorld; - private ChunkProviderServer freshChunkProvider; - private Convertable.ConversionSession session; - private DefinedStructureManager structureManager; - private LightEngineThreaded lightEngine; - private ChunkGenerator generator; - - private Path tempDir; - - private boolean generateFlatBedrock = false; - - public Regen_v1_16_R3(org.bukkit.World originalBukkitWorld, Region region, Extent target, RegenOptions options) { - super(originalBukkitWorld, region, target, options); - } - - @Override - protected boolean prepare() { - this.originalNMSWorld = ((CraftWorld) originalBukkitWorld).getHandle(); - originalChunkProvider = originalNMSWorld.getChunkProvider(); - if (!(originalChunkProvider instanceof ChunkProviderServer)) { - return false; - } - - //flat bedrock? (only on paper) - try { - generateFlatBedrock = flatBedrockField.getBoolean(worldPaperConfigField.get(originalNMSWorld)); - } catch (Exception ignored) { - } - - seed = options.getSeed().orElse(originalNMSWorld.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("WorldEditWorldGen"); - - //prepare for world init (see upstream implementation for reference) - org.bukkit.World.Environment env = originalBukkitWorld.getEnvironment(); - org.bukkit.generator.ChunkGenerator gen = originalBukkitWorld.getGenerator(); - Convertable convertable = Convertable.a(tempDir); - ResourceKey worldDimKey = getWorldDimKey(env); - session = convertable.c("worldeditregentempworld", worldDimKey); - WorldDataServer originalWorldData = originalNMSWorld.worldDataServer; - - MinecraftServer server = originalNMSWorld.getServer().getServer(); - WorldDataServer levelProperties = (WorldDataServer) server.getSaveData(); - RegistryReadOps nbtRegOps = RegistryReadOps.a(DynamicOpsNBT.a, server.dataPackResources.h(), IRegistryCustom.b()); - GeneratorSettings newOpts = GeneratorSettings.a.encodeStart(nbtRegOps, levelProperties.getGeneratorSettings()).flatMap(tag -> GeneratorSettings.a.parse(this.recursivelySetSeed(new Dynamic<>(nbtRegOps, tag), seed, new HashSet<>()))).result().orElseThrow(() -> new IllegalStateException("Unable to map GeneratorOptions")); - WorldSettings newWorldSettings = new WorldSettings("worldeditregentempworld", originalWorldData.b.getGameType(), originalWorldData.b.hardcore, originalWorldData.b.getDifficulty(), originalWorldData.b.e(), originalWorldData.b.getGameRules(), originalWorldData.b.g()); - WorldDataServer newWorldData = new WorldDataServer(newWorldSettings, newOpts, Lifecycle.stable()); - - //init world - freshNMSWorld = Fawe.get().getQueueHandler().sync((Supplier) () -> new WorldServer(server, server.executorService, session, newWorldData, originalNMSWorld.getDimensionKey(), originalNMSWorld.getDimensionManager(), new RegenNoOpWorldLoadListener(), ((WorldDimension) newOpts.d().a(worldDimKey)).c(), originalNMSWorld.isDebugWorld(), seed, ImmutableList.of(), false, env, gen) { - @Override - public void doTick(BooleanSupplier booleansupplier) { //no ticking - } - - private final BiomeBase singleBiome = options.hasBiomeType() ? RegistryGeneration.WORLDGEN_BIOME.get(MinecraftKey.a(options.getBiomeType().getId())) : null; - - @Override - public BiomeBase a(int i, int j, int k) { - if (options.hasBiomeType()) { - return singleBiome; - } - return this.getChunkProvider().getChunkGenerator().getWorldChunkManager().getBiome(i, j, k); - } - }).get(); - freshNMSWorld.savingDisabled = true; - removeWorldFromWorldsMap(); - newWorldData.checkName(originalNMSWorld.worldDataServer.getName()); //rename to original world name - - freshChunkProvider = new ChunkProviderServer(freshNMSWorld, session, server.getDataFixer(), server.getDefinedStructureManager(), server.executorService, originalChunkProvider.chunkGenerator, freshNMSWorld.spigotConfig.viewDistance, server.isSyncChunkWrites(), new RegenNoOpWorldLoadListener(), () -> server.E().getWorldPersistentData()) { - // redirect to our protoChunks list - @Override - public IChunkAccess getChunkAt(int x, int z, ChunkStatus chunkstatus, boolean flag) { - return getProtoChunkAt(x, z); - } - }; - chunkProviderField.set(freshNMSWorld, freshChunkProvider); - - //generator - if (originalChunkProvider.getChunkGenerator() instanceof ChunkProviderFlat) { - GeneratorSettingsFlat generatorSettingFlat = (GeneratorSettingsFlat) generatorSettingFlatField.get(originalChunkProvider.getChunkGenerator()); - generator = new ChunkProviderFlat(generatorSettingFlat); - } else if (originalChunkProvider.getChunkGenerator() instanceof ChunkGeneratorAbstract) { - Supplier generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField.get(originalChunkProvider.getChunkGenerator()); - WorldChunkManager chunkManager = originalChunkProvider.getChunkGenerator().getWorldChunkManager(); - if (chunkManager instanceof WorldChunkManagerOverworld) { - chunkManager = fastOverWorldChunkManager(chunkManager); - } - generator = new ChunkGeneratorAbstract(chunkManager, seed, generatorSettingBaseSupplier); - } else if (originalChunkProvider.getChunkGenerator() instanceof CustomChunkGenerator) { - ChunkGenerator delegate = (ChunkGenerator) delegateField.get(originalChunkProvider.getChunkGenerator()); - generator = delegate; - } else { - System.out.println("Unsupported generator type " + originalChunkProvider.getChunkGenerator().getClass().getName()); - return false; - } - if (originalNMSWorld.generator != null) { - // wrap custom world generator - generator = new CustomChunkGenerator(freshNMSWorld, generator, originalNMSWorld.generator); - generateConcurrent = originalNMSWorld.generator.isParallelCapable(); - } - - //lets start then - structureManager = server.getDefinedStructureManager(); - lightEngine = freshChunkProvider.getLightEngine(); - - return true; - } - - @Override - protected void cleanup() { - try { - session.close(); - } catch (Exception e) { - } - - //shutdown chunk provider - try { - Fawe.get().getQueueHandler().sync(() -> { - try { - freshChunkProvider.close(false); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } catch (Exception e) { - } - - //remove world from server - try { - Fawe.get().getQueueHandler().sync(() -> { - removeWorldFromWorldsMap(); - }); - } catch (Exception e) { - } - - //delete directory - try { - SafeFiles.tryHardToDeleteDir(tempDir); - } catch (Exception e) { - } - } - - @Override - protected ProtoChunk createProtoChunk(int x, int z) { - return new ProtoChunk(new ChunkCoordIntPair(x, z), ChunkConverter.a) { - public boolean generateFlatBedrock() { - return generateFlatBedrock; - } - - // no one will ever see the entities! - @Override - public List y() { - return Collections.emptyList(); - } - }; - } - - @Override - protected Chunk createChunk(ProtoChunk protoChunk) { - return new Chunk(freshNMSWorld, protoChunk); - } - - @Override - protected ChunkStatusWrap getFullChunkStatus() { - return new ChunkStatusWrap(ChunkStatus.FULL); - } - - @Override - protected List getBlockPopulators() { - return originalNMSWorld.getWorld().getPopulators(); - } - - @Override - protected void populate(Chunk chunk, Random random, BlockPopulator pop) { - pop.populate(freshNMSWorld.getWorld(), random, chunk.bukkitChunk); - } - - @Override - protected IChunkCache initSourceQueueCache() { - return (chunkX, chunkZ) -> new BukkitGetBlocks_1_16_5(freshNMSWorld, chunkX, chunkZ) { - @Override - public Chunk ensureLoaded(World nmsWorld, int x, int z) { - return getChunkAt(x, z); - } - }; - } - - protected class ChunkStatusWrap extends Regenerator.ChunkStatusWrapper { - - private final ChunkStatus chunkStatus; - - public ChunkStatusWrap(ChunkStatus chunkStatus) { - this.chunkStatus = chunkStatus; - } - - @Override - public int requiredNeigborChunkRadius() { - return chunkStatus.f(); - } - - @Override - public String name() { - return chunkStatus.d(); - } - - @Override - public void processChunk(Long xz, List accessibleChunks) { - chunkStatus.a(freshNMSWorld, - generator, - structureManager, - lightEngine, - c -> CompletableFuture.completedFuture(Either.left(c)), - accessibleChunks); - } - } - - //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 WorldDimension.THE_NETHER; - case THE_END: - return WorldDimension.THE_END; - case NORMAL: - default: - return WorldDimension.OVERWORLD; - } - } - - private Dynamic recursivelySetSeed(Dynamic dynamic, long seed, Set> seen) { - return !seen.add(dynamic) ? dynamic : dynamic.updateMapValues((pair) -> { - if (((Dynamic) pair.getFirst()).asString("").equals("seed")) { - return pair.mapSecond((v) -> { - return v.createLong(seed); - }); - } else { - return ((Dynamic) pair.getSecond()).getValue() instanceof NBTTagCompound ? pair.mapSecond((v) -> { - return this.recursivelySetSeed((Dynamic) v, seed, seen); - }) : pair; - - } - }); - } - - private WorldChunkManager fastOverWorldChunkManager(WorldChunkManager chunkManager) throws Exception { - Field legacyBiomeInitLayerField = WorldChunkManagerOverworld.class.getDeclaredField("i"); - legacyBiomeInitLayerField.setAccessible(true); - Field largeBiomesField = WorldChunkManagerOverworld.class.getDeclaredField("j"); - largeBiomesField.setAccessible(true); - Field biomeRegistryField = WorldChunkManagerOverworld.class.getDeclaredField("k"); - biomeRegistryField.setAccessible(true); - Field areaLazyField = GenLayer.class.getDeclaredField("b"); - areaLazyField.setAccessible(true); - Method initAreaFactoryMethod = GenLayers.class.getDeclaredMethod("a", boolean.class, int.class, int.class, LongFunction.class); - initAreaFactoryMethod.setAccessible(true); - - //init new WorldChunkManagerOverworld - boolean legacyBiomeInitLayer = legacyBiomeInitLayerField.getBoolean(chunkManager); - boolean largebiomes = largeBiomesField.getBoolean(chunkManager); - IRegistry biomeRegistrynms = (IRegistry) biomeRegistryField.get(chunkManager); - IRegistry biomeRegistry; - if (options.hasBiomeType()) { - BiomeBase biome = RegistryGeneration.WORLDGEN_BIOME.get(MinecraftKey.a(options.getBiomeType().getId())); - biomeRegistry = new RegistryMaterials<>(ResourceKey.a(new MinecraftKey("fawe_biomes")), Lifecycle.experimental()); - ((RegistryMaterials) biomeRegistry).a(0, RegistryGeneration.WORLDGEN_BIOME.c(biome).get(), biome, Lifecycle.experimental()); - } else { - biomeRegistry = biomeRegistrynms; - } - chunkManager = new FastWorldChunkManagerOverworld(seed, legacyBiomeInitLayer, largebiomes, biomeRegistry); - - //replace genLayer - AreaFactory factory = (AreaFactory) initAreaFactoryMethod.invoke(null, legacyBiomeInitLayer, largebiomes ? 6 : 4, 4, (LongFunction) (l -> new FastWorldGenContextArea(seed, l))); - ((FastWorldChunkManagerOverworld) chunkManager).genLayer = new FastGenLayer(factory); - - return chunkManager; - } - - private static class FastWorldChunkManagerOverworld extends WorldChunkManager { - - private GenLayer genLayer; - private final IRegistry k; - private final boolean isSingleRegistry; - - public FastWorldChunkManagerOverworld(long seed, boolean legacyBiomeInitLayer, boolean largeBiomes, IRegistry biomeRegistry) { - super(biomeRegistry.g().collect(Collectors.toList())); - this.k = biomeRegistry; - this.isSingleRegistry = biomeRegistry.d().size() == 1; - this.genLayer = GenLayers.a(seed, legacyBiomeInitLayer, largeBiomes ? 6 : 4, 4); - } - - @Override - protected Codec a() { - return WorldChunkManagerOverworld.e; - } - - @Override - public BiomeBase getBiome(int i, int i1, int i2) { - if (this.isSingleRegistry) { - return this.k.fromId(0); - } - return this.genLayer.a(this.k, i, i2); - } - } - - - private static class FastWorldGenContextArea implements AreaContextTransformed { - - private final ConcurrentHashMap sharedAreaMap = new ConcurrentHashMap<>(); - private final NoiseGeneratorPerlin perlinNoise; - 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.perlinNoise = new NoiseGeneratorPerlin(new Random(seed)); - } - - @Override - public FastAreaLazy a(AreaTransformer8 var0) { - return new FastAreaLazy(sharedAreaMap, var0); - } - - @Override - public void a(long x, long z) { - long l = this.magicrandom; - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - l = LinearCongruentialGenerator.a(l, x); - l = LinearCongruentialGenerator.a(l, z); - this.map.put(Thread.currentThread().getId(), l); - } - - @Override - public int a(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.a(e, this.magicrandom)); - return mod; - } - - @Override - public NoiseGeneratorPerlin b() { - return this.perlinNoise; - } - - private static long mix(long seed, long lconst) { - long l1 = lconst; - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - l1 = LinearCongruentialGenerator.a(l1, lconst); - long l2 = seed; - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - l2 = LinearCongruentialGenerator.a(l2, l1); - return l2; - } - } - - private static class FastGenLayer extends GenLayer { - - private final FastAreaLazy areaLazy; - - public FastGenLayer(AreaFactory factory) throws Exception { - super(() -> null); - this.areaLazy = factory.make(); - } - - @Override - public BiomeBase a(IRegistry registry, int x, int z) { - ResourceKey key = BiomeRegistry.a(this.areaLazy.a(x, z)); - if (key == null) - return registry.a(BiomeRegistry.a(0)); - BiomeBase biome = registry.a(key); - if (biome == null) - return registry.a(BiomeRegistry.a(0)); - return biome; - } - } - - private static class FastAreaLazy implements Area { - - private final AreaTransformer8 transformer; - //ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a syncronized 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, AreaTransformer8 transformer) { - this.sharedMap = sharedMap; - this.transformer = transformer; - } - - @Override - public int a(int x, int z) { - long zx = ChunkCoordIntPair.pair(x, z); - return this.sharedMap.computeIfAbsent(zx, i -> this.transformer.apply(x, z)); - } - } - - private static class RegenNoOpWorldLoadListener implements WorldLoadListener { - - private RegenNoOpWorldLoadListener() { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair) { - } - - @Override - public void a(ChunkCoordIntPair chunkCoordIntPair, @Nullable ChunkStatus chunkStatus) { - } - - @Override - public void b() { - } - - @Override - public void setChunkRadius(int i) { - } - } -} diff --git a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar index adaebde79..74856d816 100644 Binary files a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar and b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar differ diff --git a/worldedit-bukkit/src/test/java/com/sk89q/util/MinecraftVersionTest.java b/worldedit-bukkit/src/test/java/com/sk89q/util/MinecraftVersionTest.java index 996dbe02b..ac09344bb 100644 --- a/worldedit-bukkit/src/test/java/com/sk89q/util/MinecraftVersionTest.java +++ b/worldedit-bukkit/src/test/java/com/sk89q/util/MinecraftVersionTest.java @@ -1,6 +1,6 @@ package com.sk89q.util; -import com.boydti.fawe.bukkit.util.MinecraftVersion; +import com.fastasyncworldedit.bukkit.util.MinecraftVersion; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/worldedit-cli/build.gradle.kts b/worldedit-cli/build.gradle.kts index 8214f693b..fd57158a9 100644 --- a/worldedit-cli/build.gradle.kts +++ b/worldedit-cli/build.gradle.kts @@ -4,12 +4,17 @@ plugins { `java-library` } +project.description = "CLI" + applyPlatformAndCoreConfiguration() applyShadowConfiguration() addJarManifest(WorldEditKind.Standalone("com.sk89q.worldedit.cli.CLIWorldEdit")) dependencies { + compileOnly(project(":worldedit-libs:core:ap")) + annotationProcessor(project(":worldedit-libs:core:ap")) + annotationProcessor("com.google.guava:guava:${Versions.GUAVA}") api(project(":worldedit-core")) implementation(platform("org.apache.logging.log4j:log4j-bom:2.14.1") { because("We control Log4J on this platform") @@ -25,7 +30,7 @@ tasks.named("shadowJar") { dependencies { include { true } } - archiveFileName.set("FastAsyncWorldEdit-CLI-${project.version}.jar") + archiveFileName.set("${rootProject.name}-${project.description}-${project.version}.${archiveExtension.getOrElse("jar")}") minimize { exclude(dependency("org.apache.logging.log4j:log4j-core")) } diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIExtraCommands.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIExtraCommands.java new file mode 100644 index 000000000..16108c86b --- /dev/null +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIExtraCommands.java @@ -0,0 +1,62 @@ +/* + * 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.cli; + +import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; +import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.util.task.Task; +import com.sk89q.worldedit.world.World; +import org.enginehub.piston.annotation.Command; +import org.enginehub.piston.annotation.CommandContainer; + +import java.util.concurrent.ExecutionException; + +@CommandContainer +public class CLIExtraCommands { + @Command( + name = "selectworld", + desc = "Select the entire world" + ) + public void selectWorld(Actor actor, World world, LocalSession session) { + session.setRegionSelector(world, new CuboidRegionSelector( + world, world.getMinimumPoint(), world.getMaximumPoint() + )); + actor.printInfo(TextComponent.of("Selected the entire world.")); + } + + @Command( + name = "await", + desc = "Await all pending tasks" + ) + public void await() { + for (Task task : WorldEdit.getInstance().getSupervisor().getTasks()) { + try { + task.get(); + } catch (InterruptedException e) { + WorldEdit.logger.warn("Interrupted awaiting task", e); + } catch (ExecutionException e) { + WorldEdit.logger.warn("Error awaiting task", e); + } + } + } +} 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 530e58dbd..d343530ef 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 @@ -19,8 +19,8 @@ package com.sk89q.worldedit.cli; -import com.boydti.fawe.beta.implementation.lighting.NullRelighter; -import com.boydti.fawe.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.beta.implementation.lighting.NullRelighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.platform.AbstractPlatform; 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 2b1117058..0f38e566f 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 @@ -19,19 +19,24 @@ package com.sk89q.worldedit.cli; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; +import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.cli.data.FileRegistries; import com.sk89q.worldedit.cli.schematic.ClipboardWorld; import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.event.platform.PlatformReadyEvent; +import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extension.platform.PlatformCommandManager; +import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; +import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.biome.BiomeType; @@ -87,10 +92,29 @@ public class CLIWorldEdit { private void setupPlatform() { WorldEdit.getInstance().getPlatformManager().register(platform); + registerCommands(); + + config = new CLIConfiguration(this); + + // There's no other platforms, so fire this immediately + WorldEdit.getInstance().getEventBus().post(new PlatformsRegisteredEvent()); + this.fileRegistries = new FileRegistries(this); this.fileRegistries.loadDataFiles(); } + private void registerCommands() { + PlatformCommandManager pcm = WorldEdit.getInstance().getPlatformManager() + .getPlatformCommandManager(); + pcm.registerSubCommands( + "cli", + ImmutableList.of(), + "CLI-specific commands", + CLIExtraCommandsRegistration.builder(), + new CLIExtraCommands() + ); + } + public void setupRegistries() { // Blocks for (Map.Entry manifestEntry : fileRegistries.getDataFile().blocks.entrySet()) { @@ -172,7 +196,6 @@ public class CLIWorldEdit { setupRegistries(); WorldEdit.getInstance().loadMappings(); - config = new CLIConfiguration(this); config.load(); WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent(platform)); @@ -235,8 +258,15 @@ public class CLIWorldEdit { public void run(InputStream inputStream) { try (Scanner scanner = new Scanner(inputStream)) { - while (scanner.hasNextLine()) { + while (true) { + System.err.print("> "); + if (!scanner.hasNextLine()) { + break; + } String line = scanner.nextLine(); + if (line.isEmpty()) { + continue; + } if (line.equals("stop")) { commandSender.print(Caption.of("worldedit.cli.stopping")); break; @@ -280,31 +310,40 @@ public class CLIWorldEdit { if (file == null) { throw new IllegalArgumentException("A file must be provided!"); } + LOGGER.info(() -> "Loading '" + file + "'..."); if (file.getName().endsWith("level.dat")) { throw new IllegalArgumentException("level.dat file support is unfinished."); } else { ClipboardFormat format = ClipboardFormats.findByFile(file); if (format != null) { - ClipboardReader dataVersionReader = format - .getReader(Files.newInputStream(file.toPath(), StandardOpenOption.READ)); - int dataVersion = dataVersionReader.getDataVersion() - .orElseThrow(() -> new IllegalArgumentException("Failed to obtain data version from schematic.")); - dataVersionReader.close(); + int dataVersion; + if (format != BuiltInClipboardFormat.MCEDIT_SCHEMATIC) { + try (ClipboardReader dataVersionReader = format.getReader( + Files.newInputStream(file.toPath(), StandardOpenOption.READ) + )) { + dataVersion = dataVersionReader.getDataVersion() + .orElseThrow(() -> new IllegalArgumentException("Failed to obtain data version from schematic.")); + } + } else { + dataVersion = Constants.DATA_VERSION_MC_1_13_2; + } app.platform.setDataVersion(dataVersion); app.onStarted(); + ClipboardWorld world; try (ClipboardReader clipboardReader = format.getReader(Files.newInputStream(file.toPath(), StandardOpenOption.READ))) { - ClipboardWorld world = new ClipboardWorld( + world = new ClipboardWorld( file, clipboardReader.read(), file.getName() ); - app.platform.addWorld(world); - WorldEdit.getInstance().getSessionManager().get(app.commandSender).setWorldOverride(world); } + app.platform.addWorld(world); + WorldEdit.getInstance().getSessionManager().get(app.commandSender).setWorldOverride(world); } else { throw new IllegalArgumentException("Unknown file provided!"); } } + LOGGER.info(() -> "Loaded '" + file + "'"); String scriptFile = cmd.getOptionValue('s'); if (scriptFile != null) { diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java index 47ddca1f5..f751e377b 100644 --- a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/schematic/ClipboardWorld.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.cli.schematic; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.google.common.collect.ImmutableSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-cli/src/main/resources/com/sk89q/worldedit/cli/data/2724.json b/worldedit-cli/src/main/resources/com/sk89q/worldedit/cli/data/2724.json new file mode 100644 index 000000000..46b135ff1 --- /dev/null +++ b/worldedit-cli/src/main/resources/com/sk89q/worldedit/cli/data/2724.json @@ -0,0 +1 @@ +{"biomes":["minecraft:badlands","minecraft:badlands_plateau","minecraft:bamboo_jungle","minecraft:bamboo_jungle_hills","minecraft:basalt_deltas","minecraft:beach","minecraft:birch_forest","minecraft:birch_forest_hills","minecraft:cold_ocean","minecraft:crimson_forest","minecraft:dark_forest","minecraft:dark_forest_hills","minecraft:deep_cold_ocean","minecraft:deep_frozen_ocean","minecraft:deep_lukewarm_ocean","minecraft:deep_ocean","minecraft:deep_warm_ocean","minecraft:desert","minecraft:desert_hills","minecraft:desert_lakes","minecraft:dripstone_caves","minecraft:end_barrens","minecraft:end_highlands","minecraft:end_midlands","minecraft:eroded_badlands","minecraft:flower_forest","minecraft:forest","minecraft:frozen_ocean","minecraft:frozen_river","minecraft:giant_spruce_taiga","minecraft:giant_spruce_taiga_hills","minecraft:giant_tree_taiga","minecraft:giant_tree_taiga_hills","minecraft:gravelly_mountains","minecraft:ice_spikes","minecraft:jungle","minecraft:jungle_edge","minecraft:jungle_hills","minecraft:lukewarm_ocean","minecraft:lush_caves","minecraft:modified_badlands_plateau","minecraft:modified_gravelly_mountains","minecraft:modified_jungle","minecraft:modified_jungle_edge","minecraft:modified_wooded_badlands_plateau","minecraft:mountain_edge","minecraft:mountains","minecraft:mushroom_field_shore","minecraft:mushroom_fields","minecraft:nether_wastes","minecraft:ocean","minecraft:plains","minecraft:river","minecraft:savanna","minecraft:savanna_plateau","minecraft:shattered_savanna","minecraft:shattered_savanna_plateau","minecraft:small_end_islands","minecraft:snowy_beach","minecraft:snowy_mountains","minecraft:snowy_taiga","minecraft:snowy_taiga_hills","minecraft:snowy_taiga_mountains","minecraft:snowy_tundra","minecraft:soul_sand_valley","minecraft:stone_shore","minecraft:sunflower_plains","minecraft:swamp","minecraft:swamp_hills","minecraft:taiga","minecraft:taiga_hills","minecraft:taiga_mountains","minecraft:tall_birch_forest","minecraft:tall_birch_hills","minecraft:the_end","minecraft:the_void","minecraft:warm_ocean","minecraft:warped_forest","minecraft:wooded_badlands_plateau","minecraft:wooded_hills","minecraft:wooded_mountains"],"blocks":{"minecraft:acacia_button":{"defaultstate":"minecraft:acacia_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_door":{"defaultstate":"minecraft:acacia_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_fence":{"defaultstate":"minecraft:acacia_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_fence_gate":{"defaultstate":"minecraft:acacia_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_leaves":{"defaultstate":"minecraft:acacia_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_log":{"defaultstate":"minecraft:acacia_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:acacia_planks":{"defaultstate":"minecraft:acacia_planks","properties":{}},"minecraft:acacia_pressure_plate":{"defaultstate":"minecraft:acacia_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_sapling":{"defaultstate":"minecraft:acacia_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:acacia_sign":{"defaultstate":"minecraft:acacia_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_slab":{"defaultstate":"minecraft:acacia_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_stairs":{"defaultstate":"minecraft:acacia_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_trapdoor":{"defaultstate":"minecraft:acacia_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_wall_sign":{"defaultstate":"minecraft:acacia_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:acacia_wood":{"defaultstate":"minecraft:acacia_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:activator_rail":{"defaultstate":"minecraft:activator_rail[powered=false,shape=north_south,waterlogged=false]","properties":{"powered":{"type":"bool","values":["true","false"]},"shape":{"type":"enum","values":["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:air":{"defaultstate":"minecraft:air","properties":{}},"minecraft:allium":{"defaultstate":"minecraft:allium","properties":{}},"minecraft:amethyst_block":{"defaultstate":"minecraft:amethyst_block","properties":{}},"minecraft:amethyst_cluster":{"defaultstate":"minecraft:amethyst_cluster[facing=up,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:ancient_debris":{"defaultstate":"minecraft:ancient_debris","properties":{}},"minecraft:andesite":{"defaultstate":"minecraft:andesite","properties":{}},"minecraft:andesite_slab":{"defaultstate":"minecraft:andesite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:andesite_stairs":{"defaultstate":"minecraft:andesite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:andesite_wall":{"defaultstate":"minecraft:andesite_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:anvil":{"defaultstate":"minecraft:anvil[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:attached_melon_stem":{"defaultstate":"minecraft:attached_melon_stem[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:attached_pumpkin_stem":{"defaultstate":"minecraft:attached_pumpkin_stem[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:azalea":{"defaultstate":"minecraft:azalea","properties":{}},"minecraft:azalea_leaves":{"defaultstate":"minecraft:azalea_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:azure_bluet":{"defaultstate":"minecraft:azure_bluet","properties":{}},"minecraft:bamboo":{"defaultstate":"minecraft:bamboo[age=0,leaves=none,stage=0]","properties":{"age":{"type":"int","values":["0","1"]},"leaves":{"type":"enum","values":["none","small","large"]},"stage":{"type":"int","values":["0","1"]}}},"minecraft:bamboo_sapling":{"defaultstate":"minecraft:bamboo_sapling","properties":{}},"minecraft:barrel":{"defaultstate":"minecraft:barrel[facing=north,open=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"open":{"type":"bool","values":["true","false"]}}},"minecraft:barrier":{"defaultstate":"minecraft:barrier","properties":{}},"minecraft:basalt":{"defaultstate":"minecraft:basalt[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:beacon":{"defaultstate":"minecraft:beacon","properties":{}},"minecraft:bedrock":{"defaultstate":"minecraft:bedrock","properties":{}},"minecraft:bee_nest":{"defaultstate":"minecraft:bee_nest[facing=north,honey_level=0]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"honey_level":{"type":"int","values":["0","1","2","3","4","5"]}}},"minecraft:beehive":{"defaultstate":"minecraft:beehive[facing=north,honey_level=0]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"honey_level":{"type":"int","values":["0","1","2","3","4","5"]}}},"minecraft:beetroots":{"defaultstate":"minecraft:beetroots[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3"]}}},"minecraft:bell":{"defaultstate":"minecraft:bell[attachment=floor,facing=north,powered=false]","properties":{"attachment":{"type":"enum","values":["floor","ceiling","single_wall","double_wall"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:big_dripleaf":{"defaultstate":"minecraft:big_dripleaf[facing=north,tilt=none,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"tilt":{"type":"enum","values":["none","unstable","partial","full"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:big_dripleaf_stem":{"defaultstate":"minecraft:big_dripleaf_stem[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_button":{"defaultstate":"minecraft:birch_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:birch_door":{"defaultstate":"minecraft:birch_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:birch_fence":{"defaultstate":"minecraft:birch_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:birch_fence_gate":{"defaultstate":"minecraft:birch_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:birch_leaves":{"defaultstate":"minecraft:birch_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:birch_log":{"defaultstate":"minecraft:birch_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:birch_planks":{"defaultstate":"minecraft:birch_planks","properties":{}},"minecraft:birch_pressure_plate":{"defaultstate":"minecraft:birch_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:birch_sapling":{"defaultstate":"minecraft:birch_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:birch_sign":{"defaultstate":"minecraft:birch_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_slab":{"defaultstate":"minecraft:birch_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_stairs":{"defaultstate":"minecraft:birch_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_trapdoor":{"defaultstate":"minecraft:birch_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_wall_sign":{"defaultstate":"minecraft:birch_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:birch_wood":{"defaultstate":"minecraft:birch_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:black_banner":{"defaultstate":"minecraft:black_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:black_bed":{"defaultstate":"minecraft:black_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:black_candle":{"defaultstate":"minecraft:black_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:black_candle_cake":{"defaultstate":"minecraft:black_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:black_carpet":{"defaultstate":"minecraft:black_carpet","properties":{}},"minecraft:black_concrete":{"defaultstate":"minecraft:black_concrete","properties":{}},"minecraft:black_concrete_powder":{"defaultstate":"minecraft:black_concrete_powder","properties":{}},"minecraft:black_glazed_terracotta":{"defaultstate":"minecraft:black_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:black_shulker_box":{"defaultstate":"minecraft:black_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:black_stained_glass":{"defaultstate":"minecraft:black_stained_glass","properties":{}},"minecraft:black_stained_glass_pane":{"defaultstate":"minecraft:black_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:black_terracotta":{"defaultstate":"minecraft:black_terracotta","properties":{}},"minecraft:black_wall_banner":{"defaultstate":"minecraft:black_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:black_wool":{"defaultstate":"minecraft:black_wool","properties":{}},"minecraft:blackstone":{"defaultstate":"minecraft:blackstone","properties":{}},"minecraft:blackstone_slab":{"defaultstate":"minecraft:blackstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:blackstone_stairs":{"defaultstate":"minecraft:blackstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:blackstone_wall":{"defaultstate":"minecraft:blackstone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:blast_furnace":{"defaultstate":"minecraft:blast_furnace[facing=north,lit=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]}}},"minecraft:blue_banner":{"defaultstate":"minecraft:blue_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:blue_bed":{"defaultstate":"minecraft:blue_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:blue_candle":{"defaultstate":"minecraft:blue_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:blue_candle_cake":{"defaultstate":"minecraft:blue_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:blue_carpet":{"defaultstate":"minecraft:blue_carpet","properties":{}},"minecraft:blue_concrete":{"defaultstate":"minecraft:blue_concrete","properties":{}},"minecraft:blue_concrete_powder":{"defaultstate":"minecraft:blue_concrete_powder","properties":{}},"minecraft:blue_glazed_terracotta":{"defaultstate":"minecraft:blue_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:blue_ice":{"defaultstate":"minecraft:blue_ice","properties":{}},"minecraft:blue_orchid":{"defaultstate":"minecraft:blue_orchid","properties":{}},"minecraft:blue_shulker_box":{"defaultstate":"minecraft:blue_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:blue_stained_glass":{"defaultstate":"minecraft:blue_stained_glass","properties":{}},"minecraft:blue_stained_glass_pane":{"defaultstate":"minecraft:blue_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:blue_terracotta":{"defaultstate":"minecraft:blue_terracotta","properties":{}},"minecraft:blue_wall_banner":{"defaultstate":"minecraft:blue_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:blue_wool":{"defaultstate":"minecraft:blue_wool","properties":{}},"minecraft:bone_block":{"defaultstate":"minecraft:bone_block[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:bookshelf":{"defaultstate":"minecraft:bookshelf","properties":{}},"minecraft:brain_coral":{"defaultstate":"minecraft:brain_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brain_coral_block":{"defaultstate":"minecraft:brain_coral_block","properties":{}},"minecraft:brain_coral_fan":{"defaultstate":"minecraft:brain_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brain_coral_wall_fan":{"defaultstate":"minecraft:brain_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brewing_stand":{"defaultstate":"minecraft:brewing_stand[has_bottle_0=false,has_bottle_1=false,has_bottle_2=false]","properties":{"has_bottle_0":{"type":"bool","values":["true","false"]},"has_bottle_1":{"type":"bool","values":["true","false"]},"has_bottle_2":{"type":"bool","values":["true","false"]}}},"minecraft:brick_slab":{"defaultstate":"minecraft:brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brick_stairs":{"defaultstate":"minecraft:brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brick_wall":{"defaultstate":"minecraft:brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:bricks":{"defaultstate":"minecraft:bricks","properties":{}},"minecraft:brown_banner":{"defaultstate":"minecraft:brown_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:brown_bed":{"defaultstate":"minecraft:brown_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:brown_candle":{"defaultstate":"minecraft:brown_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:brown_candle_cake":{"defaultstate":"minecraft:brown_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:brown_carpet":{"defaultstate":"minecraft:brown_carpet","properties":{}},"minecraft:brown_concrete":{"defaultstate":"minecraft:brown_concrete","properties":{}},"minecraft:brown_concrete_powder":{"defaultstate":"minecraft:brown_concrete_powder","properties":{}},"minecraft:brown_glazed_terracotta":{"defaultstate":"minecraft:brown_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:brown_mushroom":{"defaultstate":"minecraft:brown_mushroom","properties":{}},"minecraft:brown_mushroom_block":{"defaultstate":"minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]","properties":{"down":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:brown_shulker_box":{"defaultstate":"minecraft:brown_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:brown_stained_glass":{"defaultstate":"minecraft:brown_stained_glass","properties":{}},"minecraft:brown_stained_glass_pane":{"defaultstate":"minecraft:brown_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:brown_terracotta":{"defaultstate":"minecraft:brown_terracotta","properties":{}},"minecraft:brown_wall_banner":{"defaultstate":"minecraft:brown_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:brown_wool":{"defaultstate":"minecraft:brown_wool","properties":{}},"minecraft:bubble_column":{"defaultstate":"minecraft:bubble_column[drag=true]","properties":{"drag":{"type":"bool","values":["true","false"]}}},"minecraft:bubble_coral":{"defaultstate":"minecraft:bubble_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:bubble_coral_block":{"defaultstate":"minecraft:bubble_coral_block","properties":{}},"minecraft:bubble_coral_fan":{"defaultstate":"minecraft:bubble_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:bubble_coral_wall_fan":{"defaultstate":"minecraft:bubble_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:budding_amethyst":{"defaultstate":"minecraft:budding_amethyst","properties":{}},"minecraft:cactus":{"defaultstate":"minecraft:cactus[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:cake":{"defaultstate":"minecraft:cake[bites=0]","properties":{"bites":{"type":"int","values":["0","1","2","3","4","5","6"]}}},"minecraft:calcite":{"defaultstate":"minecraft:calcite","properties":{}},"minecraft:campfire":{"defaultstate":"minecraft:campfire[facing=north,lit=true,signal_fire=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]},"signal_fire":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:candle":{"defaultstate":"minecraft:candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:candle_cake":{"defaultstate":"minecraft:candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:carrots":{"defaultstate":"minecraft:carrots[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:cartography_table":{"defaultstate":"minecraft:cartography_table","properties":{}},"minecraft:carved_pumpkin":{"defaultstate":"minecraft:carved_pumpkin[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:cauldron":{"defaultstate":"minecraft:cauldron","properties":{}},"minecraft:cave_air":{"defaultstate":"minecraft:cave_air","properties":{}},"minecraft:cave_vines":{"defaultstate":"minecraft:cave_vines[age=0,berries=false]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]},"berries":{"type":"bool","values":["true","false"]}}},"minecraft:cave_vines_plant":{"defaultstate":"minecraft:cave_vines_plant[berries=false]","properties":{"berries":{"type":"bool","values":["true","false"]}}},"minecraft:chain":{"defaultstate":"minecraft:chain[axis=y,waterlogged=false]","properties":{"axis":{"type":"enum","values":["x","y","z"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:chain_command_block":{"defaultstate":"minecraft:chain_command_block[conditional=false,facing=north]","properties":{"conditional":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:chest":{"defaultstate":"minecraft:chest[facing=north,type=single,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"type":{"type":"enum","values":["single","left","right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:chipped_anvil":{"defaultstate":"minecraft:chipped_anvil[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:chiseled_deepslate":{"defaultstate":"minecraft:chiseled_deepslate","properties":{}},"minecraft:chiseled_nether_bricks":{"defaultstate":"minecraft:chiseled_nether_bricks","properties":{}},"minecraft:chiseled_polished_blackstone":{"defaultstate":"minecraft:chiseled_polished_blackstone","properties":{}},"minecraft:chiseled_quartz_block":{"defaultstate":"minecraft:chiseled_quartz_block","properties":{}},"minecraft:chiseled_red_sandstone":{"defaultstate":"minecraft:chiseled_red_sandstone","properties":{}},"minecraft:chiseled_sandstone":{"defaultstate":"minecraft:chiseled_sandstone","properties":{}},"minecraft:chiseled_stone_bricks":{"defaultstate":"minecraft:chiseled_stone_bricks","properties":{}},"minecraft:chorus_flower":{"defaultstate":"minecraft:chorus_flower[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5"]}}},"minecraft:chorus_plant":{"defaultstate":"minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=false]","properties":{"down":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:clay":{"defaultstate":"minecraft:clay","properties":{}},"minecraft:coal_block":{"defaultstate":"minecraft:coal_block","properties":{}},"minecraft:coal_ore":{"defaultstate":"minecraft:coal_ore","properties":{}},"minecraft:coarse_dirt":{"defaultstate":"minecraft:coarse_dirt","properties":{}},"minecraft:cobbled_deepslate":{"defaultstate":"minecraft:cobbled_deepslate","properties":{}},"minecraft:cobbled_deepslate_slab":{"defaultstate":"minecraft:cobbled_deepslate_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cobbled_deepslate_stairs":{"defaultstate":"minecraft:cobbled_deepslate_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cobbled_deepslate_wall":{"defaultstate":"minecraft:cobbled_deepslate_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:cobblestone":{"defaultstate":"minecraft:cobblestone","properties":{}},"minecraft:cobblestone_slab":{"defaultstate":"minecraft:cobblestone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cobblestone_stairs":{"defaultstate":"minecraft:cobblestone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cobblestone_wall":{"defaultstate":"minecraft:cobblestone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:cobweb":{"defaultstate":"minecraft:cobweb","properties":{}},"minecraft:cocoa":{"defaultstate":"minecraft:cocoa[age=0,facing=north]","properties":{"age":{"type":"int","values":["0","1","2"]},"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:command_block":{"defaultstate":"minecraft:command_block[conditional=false,facing=north]","properties":{"conditional":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:comparator":{"defaultstate":"minecraft:comparator[facing=north,mode=compare,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"mode":{"type":"enum","values":["compare","subtract"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:composter":{"defaultstate":"minecraft:composter[level=0]","properties":{"level":{"type":"int","values":["0","1","2","3","4","5","6","7","8"]}}},"minecraft:conduit":{"defaultstate":"minecraft:conduit[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:copper_block":{"defaultstate":"minecraft:copper_block","properties":{}},"minecraft:copper_ore":{"defaultstate":"minecraft:copper_ore","properties":{}},"minecraft:cornflower":{"defaultstate":"minecraft:cornflower","properties":{}},"minecraft:cracked_deepslate_bricks":{"defaultstate":"minecraft:cracked_deepslate_bricks","properties":{}},"minecraft:cracked_deepslate_tiles":{"defaultstate":"minecraft:cracked_deepslate_tiles","properties":{}},"minecraft:cracked_nether_bricks":{"defaultstate":"minecraft:cracked_nether_bricks","properties":{}},"minecraft:cracked_polished_blackstone_bricks":{"defaultstate":"minecraft:cracked_polished_blackstone_bricks","properties":{}},"minecraft:cracked_stone_bricks":{"defaultstate":"minecraft:cracked_stone_bricks","properties":{}},"minecraft:crafting_table":{"defaultstate":"minecraft:crafting_table","properties":{}},"minecraft:creeper_head":{"defaultstate":"minecraft:creeper_head[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:creeper_wall_head":{"defaultstate":"minecraft:creeper_wall_head[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:crimson_button":{"defaultstate":"minecraft:crimson_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_door":{"defaultstate":"minecraft:crimson_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_fence":{"defaultstate":"minecraft:crimson_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_fence_gate":{"defaultstate":"minecraft:crimson_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_fungus":{"defaultstate":"minecraft:crimson_fungus","properties":{}},"minecraft:crimson_hyphae":{"defaultstate":"minecraft:crimson_hyphae[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:crimson_nylium":{"defaultstate":"minecraft:crimson_nylium","properties":{}},"minecraft:crimson_planks":{"defaultstate":"minecraft:crimson_planks","properties":{}},"minecraft:crimson_pressure_plate":{"defaultstate":"minecraft:crimson_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_roots":{"defaultstate":"minecraft:crimson_roots","properties":{}},"minecraft:crimson_sign":{"defaultstate":"minecraft:crimson_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_slab":{"defaultstate":"minecraft:crimson_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_stairs":{"defaultstate":"minecraft:crimson_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_stem":{"defaultstate":"minecraft:crimson_stem[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:crimson_trapdoor":{"defaultstate":"minecraft:crimson_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:crimson_wall_sign":{"defaultstate":"minecraft:crimson_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:crying_obsidian":{"defaultstate":"minecraft:crying_obsidian","properties":{}},"minecraft:cut_copper":{"defaultstate":"minecraft:cut_copper","properties":{}},"minecraft:cut_copper_slab":{"defaultstate":"minecraft:cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cut_copper_stairs":{"defaultstate":"minecraft:cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cut_red_sandstone":{"defaultstate":"minecraft:cut_red_sandstone","properties":{}},"minecraft:cut_red_sandstone_slab":{"defaultstate":"minecraft:cut_red_sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cut_sandstone":{"defaultstate":"minecraft:cut_sandstone","properties":{}},"minecraft:cut_sandstone_slab":{"defaultstate":"minecraft:cut_sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cyan_banner":{"defaultstate":"minecraft:cyan_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:cyan_bed":{"defaultstate":"minecraft:cyan_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:cyan_candle":{"defaultstate":"minecraft:cyan_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:cyan_candle_cake":{"defaultstate":"minecraft:cyan_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:cyan_carpet":{"defaultstate":"minecraft:cyan_carpet","properties":{}},"minecraft:cyan_concrete":{"defaultstate":"minecraft:cyan_concrete","properties":{}},"minecraft:cyan_concrete_powder":{"defaultstate":"minecraft:cyan_concrete_powder","properties":{}},"minecraft:cyan_glazed_terracotta":{"defaultstate":"minecraft:cyan_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:cyan_shulker_box":{"defaultstate":"minecraft:cyan_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:cyan_stained_glass":{"defaultstate":"minecraft:cyan_stained_glass","properties":{}},"minecraft:cyan_stained_glass_pane":{"defaultstate":"minecraft:cyan_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:cyan_terracotta":{"defaultstate":"minecraft:cyan_terracotta","properties":{}},"minecraft:cyan_wall_banner":{"defaultstate":"minecraft:cyan_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:cyan_wool":{"defaultstate":"minecraft:cyan_wool","properties":{}},"minecraft:damaged_anvil":{"defaultstate":"minecraft:damaged_anvil[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:dandelion":{"defaultstate":"minecraft:dandelion","properties":{}},"minecraft:dark_oak_button":{"defaultstate":"minecraft:dark_oak_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_door":{"defaultstate":"minecraft:dark_oak_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_fence":{"defaultstate":"minecraft:dark_oak_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_fence_gate":{"defaultstate":"minecraft:dark_oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_leaves":{"defaultstate":"minecraft:dark_oak_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_log":{"defaultstate":"minecraft:dark_oak_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:dark_oak_planks":{"defaultstate":"minecraft:dark_oak_planks","properties":{}},"minecraft:dark_oak_pressure_plate":{"defaultstate":"minecraft:dark_oak_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_sapling":{"defaultstate":"minecraft:dark_oak_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:dark_oak_sign":{"defaultstate":"minecraft:dark_oak_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_slab":{"defaultstate":"minecraft:dark_oak_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_stairs":{"defaultstate":"minecraft:dark_oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_trapdoor":{"defaultstate":"minecraft:dark_oak_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_wall_sign":{"defaultstate":"minecraft:dark_oak_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_oak_wood":{"defaultstate":"minecraft:dark_oak_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:dark_prismarine":{"defaultstate":"minecraft:dark_prismarine","properties":{}},"minecraft:dark_prismarine_slab":{"defaultstate":"minecraft:dark_prismarine_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dark_prismarine_stairs":{"defaultstate":"minecraft:dark_prismarine_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:daylight_detector":{"defaultstate":"minecraft:daylight_detector[inverted=false,power=0]","properties":{"inverted":{"type":"bool","values":["true","false"]},"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:dead_brain_coral":{"defaultstate":"minecraft:dead_brain_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_brain_coral_block":{"defaultstate":"minecraft:dead_brain_coral_block","properties":{}},"minecraft:dead_brain_coral_fan":{"defaultstate":"minecraft:dead_brain_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_brain_coral_wall_fan":{"defaultstate":"minecraft:dead_brain_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_bubble_coral":{"defaultstate":"minecraft:dead_bubble_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_bubble_coral_block":{"defaultstate":"minecraft:dead_bubble_coral_block","properties":{}},"minecraft:dead_bubble_coral_fan":{"defaultstate":"minecraft:dead_bubble_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_bubble_coral_wall_fan":{"defaultstate":"minecraft:dead_bubble_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_bush":{"defaultstate":"minecraft:dead_bush","properties":{}},"minecraft:dead_fire_coral":{"defaultstate":"minecraft:dead_fire_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_fire_coral_block":{"defaultstate":"minecraft:dead_fire_coral_block","properties":{}},"minecraft:dead_fire_coral_fan":{"defaultstate":"minecraft:dead_fire_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_fire_coral_wall_fan":{"defaultstate":"minecraft:dead_fire_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_horn_coral":{"defaultstate":"minecraft:dead_horn_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_horn_coral_block":{"defaultstate":"minecraft:dead_horn_coral_block","properties":{}},"minecraft:dead_horn_coral_fan":{"defaultstate":"minecraft:dead_horn_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_horn_coral_wall_fan":{"defaultstate":"minecraft:dead_horn_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_tube_coral":{"defaultstate":"minecraft:dead_tube_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_tube_coral_block":{"defaultstate":"minecraft:dead_tube_coral_block","properties":{}},"minecraft:dead_tube_coral_fan":{"defaultstate":"minecraft:dead_tube_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:dead_tube_coral_wall_fan":{"defaultstate":"minecraft:dead_tube_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate":{"defaultstate":"minecraft:deepslate[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:deepslate_brick_slab":{"defaultstate":"minecraft:deepslate_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate_brick_stairs":{"defaultstate":"minecraft:deepslate_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate_brick_wall":{"defaultstate":"minecraft:deepslate_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:deepslate_bricks":{"defaultstate":"minecraft:deepslate_bricks","properties":{}},"minecraft:deepslate_coal_ore":{"defaultstate":"minecraft:deepslate_coal_ore","properties":{}},"minecraft:deepslate_copper_ore":{"defaultstate":"minecraft:deepslate_copper_ore","properties":{}},"minecraft:deepslate_diamond_ore":{"defaultstate":"minecraft:deepslate_diamond_ore","properties":{}},"minecraft:deepslate_emerald_ore":{"defaultstate":"minecraft:deepslate_emerald_ore","properties":{}},"minecraft:deepslate_gold_ore":{"defaultstate":"minecraft:deepslate_gold_ore","properties":{}},"minecraft:deepslate_iron_ore":{"defaultstate":"minecraft:deepslate_iron_ore","properties":{}},"minecraft:deepslate_lapis_ore":{"defaultstate":"minecraft:deepslate_lapis_ore","properties":{}},"minecraft:deepslate_redstone_ore":{"defaultstate":"minecraft:deepslate_redstone_ore[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate_tile_slab":{"defaultstate":"minecraft:deepslate_tile_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate_tile_stairs":{"defaultstate":"minecraft:deepslate_tile_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:deepslate_tile_wall":{"defaultstate":"minecraft:deepslate_tile_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:deepslate_tiles":{"defaultstate":"minecraft:deepslate_tiles","properties":{}},"minecraft:detector_rail":{"defaultstate":"minecraft:detector_rail[powered=false,shape=north_south,waterlogged=false]","properties":{"powered":{"type":"bool","values":["true","false"]},"shape":{"type":"enum","values":["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:diamond_block":{"defaultstate":"minecraft:diamond_block","properties":{}},"minecraft:diamond_ore":{"defaultstate":"minecraft:diamond_ore","properties":{}},"minecraft:diorite":{"defaultstate":"minecraft:diorite","properties":{}},"minecraft:diorite_slab":{"defaultstate":"minecraft:diorite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:diorite_stairs":{"defaultstate":"minecraft:diorite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:diorite_wall":{"defaultstate":"minecraft:diorite_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:dirt":{"defaultstate":"minecraft:dirt","properties":{}},"minecraft:dirt_path":{"defaultstate":"minecraft:dirt_path","properties":{}},"minecraft:dispenser":{"defaultstate":"minecraft:dispenser[facing=north,triggered=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"triggered":{"type":"bool","values":["true","false"]}}},"minecraft:dragon_egg":{"defaultstate":"minecraft:dragon_egg","properties":{}},"minecraft:dragon_head":{"defaultstate":"minecraft:dragon_head[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:dragon_wall_head":{"defaultstate":"minecraft:dragon_wall_head[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:dried_kelp_block":{"defaultstate":"minecraft:dried_kelp_block","properties":{}},"minecraft:dripstone_block":{"defaultstate":"minecraft:dripstone_block","properties":{}},"minecraft:dropper":{"defaultstate":"minecraft:dropper[facing=north,triggered=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"triggered":{"type":"bool","values":["true","false"]}}},"minecraft:emerald_block":{"defaultstate":"minecraft:emerald_block","properties":{}},"minecraft:emerald_ore":{"defaultstate":"minecraft:emerald_ore","properties":{}},"minecraft:enchanting_table":{"defaultstate":"minecraft:enchanting_table","properties":{}},"minecraft:end_gateway":{"defaultstate":"minecraft:end_gateway","properties":{}},"minecraft:end_portal":{"defaultstate":"minecraft:end_portal","properties":{}},"minecraft:end_portal_frame":{"defaultstate":"minecraft:end_portal_frame[eye=false,facing=north]","properties":{"eye":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:end_rod":{"defaultstate":"minecraft:end_rod[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:end_stone":{"defaultstate":"minecraft:end_stone","properties":{}},"minecraft:end_stone_brick_slab":{"defaultstate":"minecraft:end_stone_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:end_stone_brick_stairs":{"defaultstate":"minecraft:end_stone_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:end_stone_brick_wall":{"defaultstate":"minecraft:end_stone_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:end_stone_bricks":{"defaultstate":"minecraft:end_stone_bricks","properties":{}},"minecraft:ender_chest":{"defaultstate":"minecraft:ender_chest[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:exposed_copper":{"defaultstate":"minecraft:exposed_copper","properties":{}},"minecraft:exposed_cut_copper":{"defaultstate":"minecraft:exposed_cut_copper","properties":{}},"minecraft:exposed_cut_copper_slab":{"defaultstate":"minecraft:exposed_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:exposed_cut_copper_stairs":{"defaultstate":"minecraft:exposed_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:farmland":{"defaultstate":"minecraft:farmland[moisture=0]","properties":{"moisture":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:fern":{"defaultstate":"minecraft:fern","properties":{}},"minecraft:fire":{"defaultstate":"minecraft:fire[age=0,east=false,north=false,south=false,up=false,west=false]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:fire_coral":{"defaultstate":"minecraft:fire_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:fire_coral_block":{"defaultstate":"minecraft:fire_coral_block","properties":{}},"minecraft:fire_coral_fan":{"defaultstate":"minecraft:fire_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:fire_coral_wall_fan":{"defaultstate":"minecraft:fire_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:fletching_table":{"defaultstate":"minecraft:fletching_table","properties":{}},"minecraft:flower_pot":{"defaultstate":"minecraft:flower_pot","properties":{}},"minecraft:flowering_azalea":{"defaultstate":"minecraft:flowering_azalea","properties":{}},"minecraft:flowering_azalea_leaves":{"defaultstate":"minecraft:flowering_azalea_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:frosted_ice":{"defaultstate":"minecraft:frosted_ice[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3"]}}},"minecraft:furnace":{"defaultstate":"minecraft:furnace[facing=north,lit=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]}}},"minecraft:gilded_blackstone":{"defaultstate":"minecraft:gilded_blackstone","properties":{}},"minecraft:glass":{"defaultstate":"minecraft:glass","properties":{}},"minecraft:glass_pane":{"defaultstate":"minecraft:glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:glow_lichen":{"defaultstate":"minecraft:glow_lichen[down=false,east=false,north=false,south=false,up=false,waterlogged=false,west=false]","properties":{"down":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:glowstone":{"defaultstate":"minecraft:glowstone","properties":{}},"minecraft:gold_block":{"defaultstate":"minecraft:gold_block","properties":{}},"minecraft:gold_ore":{"defaultstate":"minecraft:gold_ore","properties":{}},"minecraft:granite":{"defaultstate":"minecraft:granite","properties":{}},"minecraft:granite_slab":{"defaultstate":"minecraft:granite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:granite_stairs":{"defaultstate":"minecraft:granite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:granite_wall":{"defaultstate":"minecraft:granite_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:grass":{"defaultstate":"minecraft:grass","properties":{}},"minecraft:grass_block":{"defaultstate":"minecraft:grass_block[snowy=false]","properties":{"snowy":{"type":"bool","values":["true","false"]}}},"minecraft:gravel":{"defaultstate":"minecraft:gravel","properties":{}},"minecraft:gray_banner":{"defaultstate":"minecraft:gray_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:gray_bed":{"defaultstate":"minecraft:gray_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:gray_candle":{"defaultstate":"minecraft:gray_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:gray_candle_cake":{"defaultstate":"minecraft:gray_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:gray_carpet":{"defaultstate":"minecraft:gray_carpet","properties":{}},"minecraft:gray_concrete":{"defaultstate":"minecraft:gray_concrete","properties":{}},"minecraft:gray_concrete_powder":{"defaultstate":"minecraft:gray_concrete_powder","properties":{}},"minecraft:gray_glazed_terracotta":{"defaultstate":"minecraft:gray_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:gray_shulker_box":{"defaultstate":"minecraft:gray_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:gray_stained_glass":{"defaultstate":"minecraft:gray_stained_glass","properties":{}},"minecraft:gray_stained_glass_pane":{"defaultstate":"minecraft:gray_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:gray_terracotta":{"defaultstate":"minecraft:gray_terracotta","properties":{}},"minecraft:gray_wall_banner":{"defaultstate":"minecraft:gray_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:gray_wool":{"defaultstate":"minecraft:gray_wool","properties":{}},"minecraft:green_banner":{"defaultstate":"minecraft:green_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:green_bed":{"defaultstate":"minecraft:green_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:green_candle":{"defaultstate":"minecraft:green_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:green_candle_cake":{"defaultstate":"minecraft:green_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:green_carpet":{"defaultstate":"minecraft:green_carpet","properties":{}},"minecraft:green_concrete":{"defaultstate":"minecraft:green_concrete","properties":{}},"minecraft:green_concrete_powder":{"defaultstate":"minecraft:green_concrete_powder","properties":{}},"minecraft:green_glazed_terracotta":{"defaultstate":"minecraft:green_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:green_shulker_box":{"defaultstate":"minecraft:green_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:green_stained_glass":{"defaultstate":"minecraft:green_stained_glass","properties":{}},"minecraft:green_stained_glass_pane":{"defaultstate":"minecraft:green_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:green_terracotta":{"defaultstate":"minecraft:green_terracotta","properties":{}},"minecraft:green_wall_banner":{"defaultstate":"minecraft:green_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:green_wool":{"defaultstate":"minecraft:green_wool","properties":{}},"minecraft:grindstone":{"defaultstate":"minecraft:grindstone[face=wall,facing=north]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:hanging_roots":{"defaultstate":"minecraft:hanging_roots[waterlogged=false]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:hay_block":{"defaultstate":"minecraft:hay_block[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:heavy_weighted_pressure_plate":{"defaultstate":"minecraft:heavy_weighted_pressure_plate[power=0]","properties":{"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:honey_block":{"defaultstate":"minecraft:honey_block","properties":{}},"minecraft:honeycomb_block":{"defaultstate":"minecraft:honeycomb_block","properties":{}},"minecraft:hopper":{"defaultstate":"minecraft:hopper[enabled=true,facing=down]","properties":{"enabled":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["down","north","south","west","east"]}}},"minecraft:horn_coral":{"defaultstate":"minecraft:horn_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:horn_coral_block":{"defaultstate":"minecraft:horn_coral_block","properties":{}},"minecraft:horn_coral_fan":{"defaultstate":"minecraft:horn_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:horn_coral_wall_fan":{"defaultstate":"minecraft:horn_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:ice":{"defaultstate":"minecraft:ice","properties":{}},"minecraft:infested_chiseled_stone_bricks":{"defaultstate":"minecraft:infested_chiseled_stone_bricks","properties":{}},"minecraft:infested_cobblestone":{"defaultstate":"minecraft:infested_cobblestone","properties":{}},"minecraft:infested_cracked_stone_bricks":{"defaultstate":"minecraft:infested_cracked_stone_bricks","properties":{}},"minecraft:infested_deepslate":{"defaultstate":"minecraft:infested_deepslate[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:infested_mossy_stone_bricks":{"defaultstate":"minecraft:infested_mossy_stone_bricks","properties":{}},"minecraft:infested_stone":{"defaultstate":"minecraft:infested_stone","properties":{}},"minecraft:infested_stone_bricks":{"defaultstate":"minecraft:infested_stone_bricks","properties":{}},"minecraft:iron_bars":{"defaultstate":"minecraft:iron_bars[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:iron_block":{"defaultstate":"minecraft:iron_block","properties":{}},"minecraft:iron_door":{"defaultstate":"minecraft:iron_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:iron_ore":{"defaultstate":"minecraft:iron_ore","properties":{}},"minecraft:iron_trapdoor":{"defaultstate":"minecraft:iron_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jack_o_lantern":{"defaultstate":"minecraft:jack_o_lantern[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:jigsaw":{"defaultstate":"minecraft:jigsaw[orientation=north_up]","properties":{"orientation":{"type":"enum","values":["down_east","down_north","down_south","down_west","up_east","up_north","up_south","up_west","west_up","east_up","north_up","south_up"]}}},"minecraft:jukebox":{"defaultstate":"minecraft:jukebox[has_record=false]","properties":{"has_record":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_button":{"defaultstate":"minecraft:jungle_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_door":{"defaultstate":"minecraft:jungle_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_fence":{"defaultstate":"minecraft:jungle_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_fence_gate":{"defaultstate":"minecraft:jungle_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_leaves":{"defaultstate":"minecraft:jungle_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_log":{"defaultstate":"minecraft:jungle_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:jungle_planks":{"defaultstate":"minecraft:jungle_planks","properties":{}},"minecraft:jungle_pressure_plate":{"defaultstate":"minecraft:jungle_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_sapling":{"defaultstate":"minecraft:jungle_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:jungle_sign":{"defaultstate":"minecraft:jungle_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_slab":{"defaultstate":"minecraft:jungle_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_stairs":{"defaultstate":"minecraft:jungle_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_trapdoor":{"defaultstate":"minecraft:jungle_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_wall_sign":{"defaultstate":"minecraft:jungle_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:jungle_wood":{"defaultstate":"minecraft:jungle_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:kelp":{"defaultstate":"minecraft:kelp[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]}}},"minecraft:kelp_plant":{"defaultstate":"minecraft:kelp_plant","properties":{}},"minecraft:ladder":{"defaultstate":"minecraft:ladder[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:lantern":{"defaultstate":"minecraft:lantern[hanging=false,waterlogged=false]","properties":{"hanging":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:lapis_block":{"defaultstate":"minecraft:lapis_block","properties":{}},"minecraft:lapis_ore":{"defaultstate":"minecraft:lapis_ore","properties":{}},"minecraft:large_amethyst_bud":{"defaultstate":"minecraft:large_amethyst_bud[facing=up,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:large_fern":{"defaultstate":"minecraft:large_fern[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:lava":{"defaultstate":"minecraft:lava[level=0]","properties":{"level":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:lava_cauldron":{"defaultstate":"minecraft:lava_cauldron","properties":{}},"minecraft:lectern":{"defaultstate":"minecraft:lectern[facing=north,has_book=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"has_book":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:lever":{"defaultstate":"minecraft:lever[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:light":{"defaultstate":"minecraft:light[level=15,waterlogged=false]","properties":{"level":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:light_blue_banner":{"defaultstate":"minecraft:light_blue_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:light_blue_bed":{"defaultstate":"minecraft:light_blue_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:light_blue_candle":{"defaultstate":"minecraft:light_blue_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:light_blue_candle_cake":{"defaultstate":"minecraft:light_blue_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:light_blue_carpet":{"defaultstate":"minecraft:light_blue_carpet","properties":{}},"minecraft:light_blue_concrete":{"defaultstate":"minecraft:light_blue_concrete","properties":{}},"minecraft:light_blue_concrete_powder":{"defaultstate":"minecraft:light_blue_concrete_powder","properties":{}},"minecraft:light_blue_glazed_terracotta":{"defaultstate":"minecraft:light_blue_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:light_blue_shulker_box":{"defaultstate":"minecraft:light_blue_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:light_blue_stained_glass":{"defaultstate":"minecraft:light_blue_stained_glass","properties":{}},"minecraft:light_blue_stained_glass_pane":{"defaultstate":"minecraft:light_blue_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:light_blue_terracotta":{"defaultstate":"minecraft:light_blue_terracotta","properties":{}},"minecraft:light_blue_wall_banner":{"defaultstate":"minecraft:light_blue_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:light_blue_wool":{"defaultstate":"minecraft:light_blue_wool","properties":{}},"minecraft:light_gray_banner":{"defaultstate":"minecraft:light_gray_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:light_gray_bed":{"defaultstate":"minecraft:light_gray_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:light_gray_candle":{"defaultstate":"minecraft:light_gray_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:light_gray_candle_cake":{"defaultstate":"minecraft:light_gray_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:light_gray_carpet":{"defaultstate":"minecraft:light_gray_carpet","properties":{}},"minecraft:light_gray_concrete":{"defaultstate":"minecraft:light_gray_concrete","properties":{}},"minecraft:light_gray_concrete_powder":{"defaultstate":"minecraft:light_gray_concrete_powder","properties":{}},"minecraft:light_gray_glazed_terracotta":{"defaultstate":"minecraft:light_gray_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:light_gray_shulker_box":{"defaultstate":"minecraft:light_gray_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:light_gray_stained_glass":{"defaultstate":"minecraft:light_gray_stained_glass","properties":{}},"minecraft:light_gray_stained_glass_pane":{"defaultstate":"minecraft:light_gray_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:light_gray_terracotta":{"defaultstate":"minecraft:light_gray_terracotta","properties":{}},"minecraft:light_gray_wall_banner":{"defaultstate":"minecraft:light_gray_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:light_gray_wool":{"defaultstate":"minecraft:light_gray_wool","properties":{}},"minecraft:light_weighted_pressure_plate":{"defaultstate":"minecraft:light_weighted_pressure_plate[power=0]","properties":{"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:lightning_rod":{"defaultstate":"minecraft:lightning_rod[facing=up,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:lilac":{"defaultstate":"minecraft:lilac[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:lily_of_the_valley":{"defaultstate":"minecraft:lily_of_the_valley","properties":{}},"minecraft:lily_pad":{"defaultstate":"minecraft:lily_pad","properties":{}},"minecraft:lime_banner":{"defaultstate":"minecraft:lime_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:lime_bed":{"defaultstate":"minecraft:lime_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:lime_candle":{"defaultstate":"minecraft:lime_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:lime_candle_cake":{"defaultstate":"minecraft:lime_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:lime_carpet":{"defaultstate":"minecraft:lime_carpet","properties":{}},"minecraft:lime_concrete":{"defaultstate":"minecraft:lime_concrete","properties":{}},"minecraft:lime_concrete_powder":{"defaultstate":"minecraft:lime_concrete_powder","properties":{}},"minecraft:lime_glazed_terracotta":{"defaultstate":"minecraft:lime_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:lime_shulker_box":{"defaultstate":"minecraft:lime_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:lime_stained_glass":{"defaultstate":"minecraft:lime_stained_glass","properties":{}},"minecraft:lime_stained_glass_pane":{"defaultstate":"minecraft:lime_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:lime_terracotta":{"defaultstate":"minecraft:lime_terracotta","properties":{}},"minecraft:lime_wall_banner":{"defaultstate":"minecraft:lime_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:lime_wool":{"defaultstate":"minecraft:lime_wool","properties":{}},"minecraft:lodestone":{"defaultstate":"minecraft:lodestone","properties":{}},"minecraft:loom":{"defaultstate":"minecraft:loom[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:magenta_banner":{"defaultstate":"minecraft:magenta_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:magenta_bed":{"defaultstate":"minecraft:magenta_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:magenta_candle":{"defaultstate":"minecraft:magenta_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:magenta_candle_cake":{"defaultstate":"minecraft:magenta_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:magenta_carpet":{"defaultstate":"minecraft:magenta_carpet","properties":{}},"minecraft:magenta_concrete":{"defaultstate":"minecraft:magenta_concrete","properties":{}},"minecraft:magenta_concrete_powder":{"defaultstate":"minecraft:magenta_concrete_powder","properties":{}},"minecraft:magenta_glazed_terracotta":{"defaultstate":"minecraft:magenta_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:magenta_shulker_box":{"defaultstate":"minecraft:magenta_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:magenta_stained_glass":{"defaultstate":"minecraft:magenta_stained_glass","properties":{}},"minecraft:magenta_stained_glass_pane":{"defaultstate":"minecraft:magenta_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:magenta_terracotta":{"defaultstate":"minecraft:magenta_terracotta","properties":{}},"minecraft:magenta_wall_banner":{"defaultstate":"minecraft:magenta_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:magenta_wool":{"defaultstate":"minecraft:magenta_wool","properties":{}},"minecraft:magma_block":{"defaultstate":"minecraft:magma_block","properties":{}},"minecraft:medium_amethyst_bud":{"defaultstate":"minecraft:medium_amethyst_bud[facing=up,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:melon":{"defaultstate":"minecraft:melon","properties":{}},"minecraft:melon_stem":{"defaultstate":"minecraft:melon_stem[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:moss_block":{"defaultstate":"minecraft:moss_block","properties":{}},"minecraft:moss_carpet":{"defaultstate":"minecraft:moss_carpet","properties":{}},"minecraft:mossy_cobblestone":{"defaultstate":"minecraft:mossy_cobblestone","properties":{}},"minecraft:mossy_cobblestone_slab":{"defaultstate":"minecraft:mossy_cobblestone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:mossy_cobblestone_stairs":{"defaultstate":"minecraft:mossy_cobblestone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:mossy_cobblestone_wall":{"defaultstate":"minecraft:mossy_cobblestone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:mossy_stone_brick_slab":{"defaultstate":"minecraft:mossy_stone_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:mossy_stone_brick_stairs":{"defaultstate":"minecraft:mossy_stone_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:mossy_stone_brick_wall":{"defaultstate":"minecraft:mossy_stone_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:mossy_stone_bricks":{"defaultstate":"minecraft:mossy_stone_bricks","properties":{}},"minecraft:moving_piston":{"defaultstate":"minecraft:moving_piston[facing=north,type=normal]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"type":{"type":"enum","values":["normal","sticky"]}}},"minecraft:mushroom_stem":{"defaultstate":"minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true]","properties":{"down":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:mycelium":{"defaultstate":"minecraft:mycelium[snowy=false]","properties":{"snowy":{"type":"bool","values":["true","false"]}}},"minecraft:nether_brick_fence":{"defaultstate":"minecraft:nether_brick_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:nether_brick_slab":{"defaultstate":"minecraft:nether_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:nether_brick_stairs":{"defaultstate":"minecraft:nether_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:nether_brick_wall":{"defaultstate":"minecraft:nether_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:nether_bricks":{"defaultstate":"minecraft:nether_bricks","properties":{}},"minecraft:nether_gold_ore":{"defaultstate":"minecraft:nether_gold_ore","properties":{}},"minecraft:nether_portal":{"defaultstate":"minecraft:nether_portal[axis=x]","properties":{"axis":{"type":"enum","values":["x","z"]}}},"minecraft:nether_quartz_ore":{"defaultstate":"minecraft:nether_quartz_ore","properties":{}},"minecraft:nether_sprouts":{"defaultstate":"minecraft:nether_sprouts","properties":{}},"minecraft:nether_wart":{"defaultstate":"minecraft:nether_wart[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3"]}}},"minecraft:nether_wart_block":{"defaultstate":"minecraft:nether_wart_block","properties":{}},"minecraft:netherite_block":{"defaultstate":"minecraft:netherite_block","properties":{}},"minecraft:netherrack":{"defaultstate":"minecraft:netherrack","properties":{}},"minecraft:note_block":{"defaultstate":"minecraft:note_block[instrument=harp,note=0,powered=false]","properties":{"instrument":{"type":"enum","values":["harp","basedrum","snare","hat","bass","flute","bell","guitar","chime","xylophone","iron_xylophone","cow_bell","didgeridoo","bit","banjo","pling"]},"note":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:oak_button":{"defaultstate":"minecraft:oak_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:oak_door":{"defaultstate":"minecraft:oak_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:oak_fence":{"defaultstate":"minecraft:oak_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:oak_fence_gate":{"defaultstate":"minecraft:oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:oak_leaves":{"defaultstate":"minecraft:oak_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:oak_log":{"defaultstate":"minecraft:oak_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:oak_planks":{"defaultstate":"minecraft:oak_planks","properties":{}},"minecraft:oak_pressure_plate":{"defaultstate":"minecraft:oak_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:oak_sapling":{"defaultstate":"minecraft:oak_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:oak_sign":{"defaultstate":"minecraft:oak_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oak_slab":{"defaultstate":"minecraft:oak_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oak_stairs":{"defaultstate":"minecraft:oak_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oak_trapdoor":{"defaultstate":"minecraft:oak_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oak_wall_sign":{"defaultstate":"minecraft:oak_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oak_wood":{"defaultstate":"minecraft:oak_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:observer":{"defaultstate":"minecraft:observer[facing=south,powered=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:obsidian":{"defaultstate":"minecraft:obsidian","properties":{}},"minecraft:orange_banner":{"defaultstate":"minecraft:orange_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:orange_bed":{"defaultstate":"minecraft:orange_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:orange_candle":{"defaultstate":"minecraft:orange_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:orange_candle_cake":{"defaultstate":"minecraft:orange_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:orange_carpet":{"defaultstate":"minecraft:orange_carpet","properties":{}},"minecraft:orange_concrete":{"defaultstate":"minecraft:orange_concrete","properties":{}},"minecraft:orange_concrete_powder":{"defaultstate":"minecraft:orange_concrete_powder","properties":{}},"minecraft:orange_glazed_terracotta":{"defaultstate":"minecraft:orange_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:orange_shulker_box":{"defaultstate":"minecraft:orange_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:orange_stained_glass":{"defaultstate":"minecraft:orange_stained_glass","properties":{}},"minecraft:orange_stained_glass_pane":{"defaultstate":"minecraft:orange_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:orange_terracotta":{"defaultstate":"minecraft:orange_terracotta","properties":{}},"minecraft:orange_tulip":{"defaultstate":"minecraft:orange_tulip","properties":{}},"minecraft:orange_wall_banner":{"defaultstate":"minecraft:orange_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:orange_wool":{"defaultstate":"minecraft:orange_wool","properties":{}},"minecraft:oxeye_daisy":{"defaultstate":"minecraft:oxeye_daisy","properties":{}},"minecraft:oxidized_copper":{"defaultstate":"minecraft:oxidized_copper","properties":{}},"minecraft:oxidized_cut_copper":{"defaultstate":"minecraft:oxidized_cut_copper","properties":{}},"minecraft:oxidized_cut_copper_slab":{"defaultstate":"minecraft:oxidized_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:oxidized_cut_copper_stairs":{"defaultstate":"minecraft:oxidized_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:packed_ice":{"defaultstate":"minecraft:packed_ice","properties":{}},"minecraft:peony":{"defaultstate":"minecraft:peony[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:petrified_oak_slab":{"defaultstate":"minecraft:petrified_oak_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:pink_banner":{"defaultstate":"minecraft:pink_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:pink_bed":{"defaultstate":"minecraft:pink_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:pink_candle":{"defaultstate":"minecraft:pink_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:pink_candle_cake":{"defaultstate":"minecraft:pink_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:pink_carpet":{"defaultstate":"minecraft:pink_carpet","properties":{}},"minecraft:pink_concrete":{"defaultstate":"minecraft:pink_concrete","properties":{}},"minecraft:pink_concrete_powder":{"defaultstate":"minecraft:pink_concrete_powder","properties":{}},"minecraft:pink_glazed_terracotta":{"defaultstate":"minecraft:pink_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:pink_shulker_box":{"defaultstate":"minecraft:pink_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:pink_stained_glass":{"defaultstate":"minecraft:pink_stained_glass","properties":{}},"minecraft:pink_stained_glass_pane":{"defaultstate":"minecraft:pink_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:pink_terracotta":{"defaultstate":"minecraft:pink_terracotta","properties":{}},"minecraft:pink_tulip":{"defaultstate":"minecraft:pink_tulip","properties":{}},"minecraft:pink_wall_banner":{"defaultstate":"minecraft:pink_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:pink_wool":{"defaultstate":"minecraft:pink_wool","properties":{}},"minecraft:piston":{"defaultstate":"minecraft:piston[extended=false,facing=north]","properties":{"extended":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:piston_head":{"defaultstate":"minecraft:piston_head[facing=north,short=false,type=normal]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"short":{"type":"bool","values":["true","false"]},"type":{"type":"enum","values":["normal","sticky"]}}},"minecraft:player_head":{"defaultstate":"minecraft:player_head[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:player_wall_head":{"defaultstate":"minecraft:player_wall_head[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:podzol":{"defaultstate":"minecraft:podzol[snowy=false]","properties":{"snowy":{"type":"bool","values":["true","false"]}}},"minecraft:pointed_dripstone":{"defaultstate":"minecraft:pointed_dripstone[thickness=tip,vertical_direction=up,waterlogged=false]","properties":{"thickness":{"type":"enum","values":["tip_merge","tip","frustum","middle","base"]},"vertical_direction":{"type":"direction","values":["up","down"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_andesite":{"defaultstate":"minecraft:polished_andesite","properties":{}},"minecraft:polished_andesite_slab":{"defaultstate":"minecraft:polished_andesite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_andesite_stairs":{"defaultstate":"minecraft:polished_andesite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_basalt":{"defaultstate":"minecraft:polished_basalt[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:polished_blackstone":{"defaultstate":"minecraft:polished_blackstone","properties":{}},"minecraft:polished_blackstone_brick_slab":{"defaultstate":"minecraft:polished_blackstone_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_brick_stairs":{"defaultstate":"minecraft:polished_blackstone_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_brick_wall":{"defaultstate":"minecraft:polished_blackstone_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:polished_blackstone_bricks":{"defaultstate":"minecraft:polished_blackstone_bricks","properties":{}},"minecraft:polished_blackstone_button":{"defaultstate":"minecraft:polished_blackstone_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_pressure_plate":{"defaultstate":"minecraft:polished_blackstone_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_slab":{"defaultstate":"minecraft:polished_blackstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_stairs":{"defaultstate":"minecraft:polished_blackstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_blackstone_wall":{"defaultstate":"minecraft:polished_blackstone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:polished_deepslate":{"defaultstate":"minecraft:polished_deepslate","properties":{}},"minecraft:polished_deepslate_slab":{"defaultstate":"minecraft:polished_deepslate_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_deepslate_stairs":{"defaultstate":"minecraft:polished_deepslate_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_deepslate_wall":{"defaultstate":"minecraft:polished_deepslate_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:polished_diorite":{"defaultstate":"minecraft:polished_diorite","properties":{}},"minecraft:polished_diorite_slab":{"defaultstate":"minecraft:polished_diorite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_diorite_stairs":{"defaultstate":"minecraft:polished_diorite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_granite":{"defaultstate":"minecraft:polished_granite","properties":{}},"minecraft:polished_granite_slab":{"defaultstate":"minecraft:polished_granite_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:polished_granite_stairs":{"defaultstate":"minecraft:polished_granite_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:poppy":{"defaultstate":"minecraft:poppy","properties":{}},"minecraft:potatoes":{"defaultstate":"minecraft:potatoes[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:potted_acacia_sapling":{"defaultstate":"minecraft:potted_acacia_sapling","properties":{}},"minecraft:potted_allium":{"defaultstate":"minecraft:potted_allium","properties":{}},"minecraft:potted_azalea_bush":{"defaultstate":"minecraft:potted_azalea_bush","properties":{}},"minecraft:potted_azure_bluet":{"defaultstate":"minecraft:potted_azure_bluet","properties":{}},"minecraft:potted_bamboo":{"defaultstate":"minecraft:potted_bamboo","properties":{}},"minecraft:potted_birch_sapling":{"defaultstate":"minecraft:potted_birch_sapling","properties":{}},"minecraft:potted_blue_orchid":{"defaultstate":"minecraft:potted_blue_orchid","properties":{}},"minecraft:potted_brown_mushroom":{"defaultstate":"minecraft:potted_brown_mushroom","properties":{}},"minecraft:potted_cactus":{"defaultstate":"minecraft:potted_cactus","properties":{}},"minecraft:potted_cornflower":{"defaultstate":"minecraft:potted_cornflower","properties":{}},"minecraft:potted_crimson_fungus":{"defaultstate":"minecraft:potted_crimson_fungus","properties":{}},"minecraft:potted_crimson_roots":{"defaultstate":"minecraft:potted_crimson_roots","properties":{}},"minecraft:potted_dandelion":{"defaultstate":"minecraft:potted_dandelion","properties":{}},"minecraft:potted_dark_oak_sapling":{"defaultstate":"minecraft:potted_dark_oak_sapling","properties":{}},"minecraft:potted_dead_bush":{"defaultstate":"minecraft:potted_dead_bush","properties":{}},"minecraft:potted_fern":{"defaultstate":"minecraft:potted_fern","properties":{}},"minecraft:potted_flowering_azalea_bush":{"defaultstate":"minecraft:potted_flowering_azalea_bush","properties":{}},"minecraft:potted_jungle_sapling":{"defaultstate":"minecraft:potted_jungle_sapling","properties":{}},"minecraft:potted_lily_of_the_valley":{"defaultstate":"minecraft:potted_lily_of_the_valley","properties":{}},"minecraft:potted_oak_sapling":{"defaultstate":"minecraft:potted_oak_sapling","properties":{}},"minecraft:potted_orange_tulip":{"defaultstate":"minecraft:potted_orange_tulip","properties":{}},"minecraft:potted_oxeye_daisy":{"defaultstate":"minecraft:potted_oxeye_daisy","properties":{}},"minecraft:potted_pink_tulip":{"defaultstate":"minecraft:potted_pink_tulip","properties":{}},"minecraft:potted_poppy":{"defaultstate":"minecraft:potted_poppy","properties":{}},"minecraft:potted_red_mushroom":{"defaultstate":"minecraft:potted_red_mushroom","properties":{}},"minecraft:potted_red_tulip":{"defaultstate":"minecraft:potted_red_tulip","properties":{}},"minecraft:potted_spruce_sapling":{"defaultstate":"minecraft:potted_spruce_sapling","properties":{}},"minecraft:potted_warped_fungus":{"defaultstate":"minecraft:potted_warped_fungus","properties":{}},"minecraft:potted_warped_roots":{"defaultstate":"minecraft:potted_warped_roots","properties":{}},"minecraft:potted_white_tulip":{"defaultstate":"minecraft:potted_white_tulip","properties":{}},"minecraft:potted_wither_rose":{"defaultstate":"minecraft:potted_wither_rose","properties":{}},"minecraft:powder_snow":{"defaultstate":"minecraft:powder_snow","properties":{}},"minecraft:powder_snow_cauldron":{"defaultstate":"minecraft:powder_snow_cauldron[level=1]","properties":{"level":{"type":"int","values":["1","2","3"]}}},"minecraft:powered_rail":{"defaultstate":"minecraft:powered_rail[powered=false,shape=north_south,waterlogged=false]","properties":{"powered":{"type":"bool","values":["true","false"]},"shape":{"type":"enum","values":["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:prismarine":{"defaultstate":"minecraft:prismarine","properties":{}},"minecraft:prismarine_brick_slab":{"defaultstate":"minecraft:prismarine_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:prismarine_brick_stairs":{"defaultstate":"minecraft:prismarine_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:prismarine_bricks":{"defaultstate":"minecraft:prismarine_bricks","properties":{}},"minecraft:prismarine_slab":{"defaultstate":"minecraft:prismarine_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:prismarine_stairs":{"defaultstate":"minecraft:prismarine_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:prismarine_wall":{"defaultstate":"minecraft:prismarine_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:pumpkin":{"defaultstate":"minecraft:pumpkin","properties":{}},"minecraft:pumpkin_stem":{"defaultstate":"minecraft:pumpkin_stem[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:purple_banner":{"defaultstate":"minecraft:purple_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:purple_bed":{"defaultstate":"minecraft:purple_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:purple_candle":{"defaultstate":"minecraft:purple_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:purple_candle_cake":{"defaultstate":"minecraft:purple_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:purple_carpet":{"defaultstate":"minecraft:purple_carpet","properties":{}},"minecraft:purple_concrete":{"defaultstate":"minecraft:purple_concrete","properties":{}},"minecraft:purple_concrete_powder":{"defaultstate":"minecraft:purple_concrete_powder","properties":{}},"minecraft:purple_glazed_terracotta":{"defaultstate":"minecraft:purple_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:purple_shulker_box":{"defaultstate":"minecraft:purple_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:purple_stained_glass":{"defaultstate":"minecraft:purple_stained_glass","properties":{}},"minecraft:purple_stained_glass_pane":{"defaultstate":"minecraft:purple_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:purple_terracotta":{"defaultstate":"minecraft:purple_terracotta","properties":{}},"minecraft:purple_wall_banner":{"defaultstate":"minecraft:purple_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:purple_wool":{"defaultstate":"minecraft:purple_wool","properties":{}},"minecraft:purpur_block":{"defaultstate":"minecraft:purpur_block","properties":{}},"minecraft:purpur_pillar":{"defaultstate":"minecraft:purpur_pillar[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:purpur_slab":{"defaultstate":"minecraft:purpur_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:purpur_stairs":{"defaultstate":"minecraft:purpur_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:quartz_block":{"defaultstate":"minecraft:quartz_block","properties":{}},"minecraft:quartz_bricks":{"defaultstate":"minecraft:quartz_bricks","properties":{}},"minecraft:quartz_pillar":{"defaultstate":"minecraft:quartz_pillar[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:quartz_slab":{"defaultstate":"minecraft:quartz_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:quartz_stairs":{"defaultstate":"minecraft:quartz_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:rail":{"defaultstate":"minecraft:rail[shape=north_south,waterlogged=false]","properties":{"shape":{"type":"enum","values":["north_south","east_west","ascending_east","ascending_west","ascending_north","ascending_south","south_east","south_west","north_west","north_east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:raw_copper_block":{"defaultstate":"minecraft:raw_copper_block","properties":{}},"minecraft:raw_gold_block":{"defaultstate":"minecraft:raw_gold_block","properties":{}},"minecraft:raw_iron_block":{"defaultstate":"minecraft:raw_iron_block","properties":{}},"minecraft:red_banner":{"defaultstate":"minecraft:red_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:red_bed":{"defaultstate":"minecraft:red_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:red_candle":{"defaultstate":"minecraft:red_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:red_candle_cake":{"defaultstate":"minecraft:red_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:red_carpet":{"defaultstate":"minecraft:red_carpet","properties":{}},"minecraft:red_concrete":{"defaultstate":"minecraft:red_concrete","properties":{}},"minecraft:red_concrete_powder":{"defaultstate":"minecraft:red_concrete_powder","properties":{}},"minecraft:red_glazed_terracotta":{"defaultstate":"minecraft:red_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:red_mushroom":{"defaultstate":"minecraft:red_mushroom","properties":{}},"minecraft:red_mushroom_block":{"defaultstate":"minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]","properties":{"down":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:red_nether_brick_slab":{"defaultstate":"minecraft:red_nether_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:red_nether_brick_stairs":{"defaultstate":"minecraft:red_nether_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:red_nether_brick_wall":{"defaultstate":"minecraft:red_nether_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:red_nether_bricks":{"defaultstate":"minecraft:red_nether_bricks","properties":{}},"minecraft:red_sand":{"defaultstate":"minecraft:red_sand","properties":{}},"minecraft:red_sandstone":{"defaultstate":"minecraft:red_sandstone","properties":{}},"minecraft:red_sandstone_slab":{"defaultstate":"minecraft:red_sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:red_sandstone_stairs":{"defaultstate":"minecraft:red_sandstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:red_sandstone_wall":{"defaultstate":"minecraft:red_sandstone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:red_shulker_box":{"defaultstate":"minecraft:red_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:red_stained_glass":{"defaultstate":"minecraft:red_stained_glass","properties":{}},"minecraft:red_stained_glass_pane":{"defaultstate":"minecraft:red_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:red_terracotta":{"defaultstate":"minecraft:red_terracotta","properties":{}},"minecraft:red_tulip":{"defaultstate":"minecraft:red_tulip","properties":{}},"minecraft:red_wall_banner":{"defaultstate":"minecraft:red_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:red_wool":{"defaultstate":"minecraft:red_wool","properties":{}},"minecraft:redstone_block":{"defaultstate":"minecraft:redstone_block","properties":{}},"minecraft:redstone_lamp":{"defaultstate":"minecraft:redstone_lamp[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:redstone_ore":{"defaultstate":"minecraft:redstone_ore[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:redstone_torch":{"defaultstate":"minecraft:redstone_torch[lit=true]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:redstone_wall_torch":{"defaultstate":"minecraft:redstone_wall_torch[facing=north,lit=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]}}},"minecraft:redstone_wire":{"defaultstate":"minecraft:redstone_wire[east=none,north=none,power=0,south=none,west=none]","properties":{"east":{"type":"enum","values":["up","side","none"]},"north":{"type":"enum","values":["up","side","none"]},"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"south":{"type":"enum","values":["up","side","none"]},"west":{"type":"enum","values":["up","side","none"]}}},"minecraft:repeater":{"defaultstate":"minecraft:repeater[delay=1,facing=north,locked=false,powered=false]","properties":{"delay":{"type":"int","values":["1","2","3","4"]},"facing":{"type":"direction","values":["north","south","west","east"]},"locked":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:repeating_command_block":{"defaultstate":"minecraft:repeating_command_block[conditional=false,facing=north]","properties":{"conditional":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:respawn_anchor":{"defaultstate":"minecraft:respawn_anchor[charges=0]","properties":{"charges":{"type":"int","values":["0","1","2","3","4"]}}},"minecraft:rooted_dirt":{"defaultstate":"minecraft:rooted_dirt","properties":{}},"minecraft:rose_bush":{"defaultstate":"minecraft:rose_bush[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:sand":{"defaultstate":"minecraft:sand","properties":{}},"minecraft:sandstone":{"defaultstate":"minecraft:sandstone","properties":{}},"minecraft:sandstone_slab":{"defaultstate":"minecraft:sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:sandstone_stairs":{"defaultstate":"minecraft:sandstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:sandstone_wall":{"defaultstate":"minecraft:sandstone_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:scaffolding":{"defaultstate":"minecraft:scaffolding[bottom=false,distance=7,waterlogged=false]","properties":{"bottom":{"type":"bool","values":["true","false"]},"distance":{"type":"int","values":["0","1","2","3","4","5","6","7"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:sculk_sensor":{"defaultstate":"minecraft:sculk_sensor[power=0,sculk_sensor_phase=inactive,waterlogged=false]","properties":{"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"sculk_sensor_phase":{"type":"enum","values":["inactive","active","cooldown"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:sea_lantern":{"defaultstate":"minecraft:sea_lantern","properties":{}},"minecraft:sea_pickle":{"defaultstate":"minecraft:sea_pickle[pickles=1,waterlogged=true]","properties":{"pickles":{"type":"int","values":["1","2","3","4"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:seagrass":{"defaultstate":"minecraft:seagrass","properties":{}},"minecraft:shroomlight":{"defaultstate":"minecraft:shroomlight","properties":{}},"minecraft:shulker_box":{"defaultstate":"minecraft:shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:skeleton_skull":{"defaultstate":"minecraft:skeleton_skull[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:skeleton_wall_skull":{"defaultstate":"minecraft:skeleton_wall_skull[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:slime_block":{"defaultstate":"minecraft:slime_block","properties":{}},"minecraft:small_amethyst_bud":{"defaultstate":"minecraft:small_amethyst_bud[facing=up,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:small_dripleaf":{"defaultstate":"minecraft:small_dripleaf[facing=north,half=lower,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smithing_table":{"defaultstate":"minecraft:smithing_table","properties":{}},"minecraft:smoker":{"defaultstate":"minecraft:smoker[facing=north,lit=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_basalt":{"defaultstate":"minecraft:smooth_basalt","properties":{}},"minecraft:smooth_quartz":{"defaultstate":"minecraft:smooth_quartz","properties":{}},"minecraft:smooth_quartz_slab":{"defaultstate":"minecraft:smooth_quartz_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_quartz_stairs":{"defaultstate":"minecraft:smooth_quartz_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_red_sandstone":{"defaultstate":"minecraft:smooth_red_sandstone","properties":{}},"minecraft:smooth_red_sandstone_slab":{"defaultstate":"minecraft:smooth_red_sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_red_sandstone_stairs":{"defaultstate":"minecraft:smooth_red_sandstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_sandstone":{"defaultstate":"minecraft:smooth_sandstone","properties":{}},"minecraft:smooth_sandstone_slab":{"defaultstate":"minecraft:smooth_sandstone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_sandstone_stairs":{"defaultstate":"minecraft:smooth_sandstone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:smooth_stone":{"defaultstate":"minecraft:smooth_stone","properties":{}},"minecraft:smooth_stone_slab":{"defaultstate":"minecraft:smooth_stone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:snow":{"defaultstate":"minecraft:snow[layers=1]","properties":{"layers":{"type":"int","values":["1","2","3","4","5","6","7","8"]}}},"minecraft:snow_block":{"defaultstate":"minecraft:snow_block","properties":{}},"minecraft:soul_campfire":{"defaultstate":"minecraft:soul_campfire[facing=north,lit=true,signal_fire=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"lit":{"type":"bool","values":["true","false"]},"signal_fire":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:soul_fire":{"defaultstate":"minecraft:soul_fire","properties":{}},"minecraft:soul_lantern":{"defaultstate":"minecraft:soul_lantern[hanging=false,waterlogged=false]","properties":{"hanging":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:soul_sand":{"defaultstate":"minecraft:soul_sand","properties":{}},"minecraft:soul_soil":{"defaultstate":"minecraft:soul_soil","properties":{}},"minecraft:soul_torch":{"defaultstate":"minecraft:soul_torch","properties":{}},"minecraft:soul_wall_torch":{"defaultstate":"minecraft:soul_wall_torch[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:spawner":{"defaultstate":"minecraft:spawner","properties":{}},"minecraft:sponge":{"defaultstate":"minecraft:sponge","properties":{}},"minecraft:spore_blossom":{"defaultstate":"minecraft:spore_blossom","properties":{}},"minecraft:spruce_button":{"defaultstate":"minecraft:spruce_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_door":{"defaultstate":"minecraft:spruce_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_fence":{"defaultstate":"minecraft:spruce_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_fence_gate":{"defaultstate":"minecraft:spruce_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_leaves":{"defaultstate":"minecraft:spruce_leaves[distance=7,persistent=false]","properties":{"distance":{"type":"int","values":["1","2","3","4","5","6","7"]},"persistent":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_log":{"defaultstate":"minecraft:spruce_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:spruce_planks":{"defaultstate":"minecraft:spruce_planks","properties":{}},"minecraft:spruce_pressure_plate":{"defaultstate":"minecraft:spruce_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_sapling":{"defaultstate":"minecraft:spruce_sapling[stage=0]","properties":{"stage":{"type":"int","values":["0","1"]}}},"minecraft:spruce_sign":{"defaultstate":"minecraft:spruce_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_slab":{"defaultstate":"minecraft:spruce_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_stairs":{"defaultstate":"minecraft:spruce_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_trapdoor":{"defaultstate":"minecraft:spruce_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_wall_sign":{"defaultstate":"minecraft:spruce_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:spruce_wood":{"defaultstate":"minecraft:spruce_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:sticky_piston":{"defaultstate":"minecraft:sticky_piston[extended=false,facing=north]","properties":{"extended":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:stone":{"defaultstate":"minecraft:stone","properties":{}},"minecraft:stone_brick_slab":{"defaultstate":"minecraft:stone_brick_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:stone_brick_stairs":{"defaultstate":"minecraft:stone_brick_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:stone_brick_wall":{"defaultstate":"minecraft:stone_brick_wall[east=none,north=none,south=none,up=true,waterlogged=false,west=none]","properties":{"east":{"type":"enum","values":["none","low","tall"]},"north":{"type":"enum","values":["none","low","tall"]},"south":{"type":"enum","values":["none","low","tall"]},"up":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"enum","values":["none","low","tall"]}}},"minecraft:stone_bricks":{"defaultstate":"minecraft:stone_bricks","properties":{}},"minecraft:stone_button":{"defaultstate":"minecraft:stone_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:stone_pressure_plate":{"defaultstate":"minecraft:stone_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:stone_slab":{"defaultstate":"minecraft:stone_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:stone_stairs":{"defaultstate":"minecraft:stone_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:stonecutter":{"defaultstate":"minecraft:stonecutter[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:stripped_acacia_log":{"defaultstate":"minecraft:stripped_acacia_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_acacia_wood":{"defaultstate":"minecraft:stripped_acacia_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_birch_log":{"defaultstate":"minecraft:stripped_birch_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_birch_wood":{"defaultstate":"minecraft:stripped_birch_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_crimson_hyphae":{"defaultstate":"minecraft:stripped_crimson_hyphae[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_crimson_stem":{"defaultstate":"minecraft:stripped_crimson_stem[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_dark_oak_log":{"defaultstate":"minecraft:stripped_dark_oak_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_dark_oak_wood":{"defaultstate":"minecraft:stripped_dark_oak_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_jungle_log":{"defaultstate":"minecraft:stripped_jungle_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_jungle_wood":{"defaultstate":"minecraft:stripped_jungle_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_oak_log":{"defaultstate":"minecraft:stripped_oak_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_oak_wood":{"defaultstate":"minecraft:stripped_oak_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_spruce_log":{"defaultstate":"minecraft:stripped_spruce_log[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_spruce_wood":{"defaultstate":"minecraft:stripped_spruce_wood[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_warped_hyphae":{"defaultstate":"minecraft:stripped_warped_hyphae[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:stripped_warped_stem":{"defaultstate":"minecraft:stripped_warped_stem[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:structure_block":{"defaultstate":"minecraft:structure_block[mode=load]","properties":{"mode":{"type":"enum","values":["save","load","corner","data"]}}},"minecraft:structure_void":{"defaultstate":"minecraft:structure_void","properties":{}},"minecraft:sugar_cane":{"defaultstate":"minecraft:sugar_cane[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:sunflower":{"defaultstate":"minecraft:sunflower[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:sweet_berry_bush":{"defaultstate":"minecraft:sweet_berry_bush[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3"]}}},"minecraft:tall_grass":{"defaultstate":"minecraft:tall_grass[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:tall_seagrass":{"defaultstate":"minecraft:tall_seagrass[half=lower]","properties":{"half":{"type":"enum","values":["upper","lower"]}}},"minecraft:target":{"defaultstate":"minecraft:target[power=0]","properties":{"power":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:terracotta":{"defaultstate":"minecraft:terracotta","properties":{}},"minecraft:tinted_glass":{"defaultstate":"minecraft:tinted_glass","properties":{}},"minecraft:tnt":{"defaultstate":"minecraft:tnt[unstable=false]","properties":{"unstable":{"type":"bool","values":["true","false"]}}},"minecraft:torch":{"defaultstate":"minecraft:torch","properties":{}},"minecraft:trapped_chest":{"defaultstate":"minecraft:trapped_chest[facing=north,type=single,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"type":{"type":"enum","values":["single","left","right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:tripwire":{"defaultstate":"minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,powered=false,south=false,west=false]","properties":{"attached":{"type":"bool","values":["true","false"]},"disarmed":{"type":"bool","values":["true","false"]},"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:tripwire_hook":{"defaultstate":"minecraft:tripwire_hook[attached=false,facing=north,powered=false]","properties":{"attached":{"type":"bool","values":["true","false"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:tube_coral":{"defaultstate":"minecraft:tube_coral[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:tube_coral_block":{"defaultstate":"minecraft:tube_coral_block","properties":{}},"minecraft:tube_coral_fan":{"defaultstate":"minecraft:tube_coral_fan[waterlogged=true]","properties":{"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:tube_coral_wall_fan":{"defaultstate":"minecraft:tube_coral_wall_fan[facing=north,waterlogged=true]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:tuff":{"defaultstate":"minecraft:tuff","properties":{}},"minecraft:turtle_egg":{"defaultstate":"minecraft:turtle_egg[eggs=1,hatch=0]","properties":{"eggs":{"type":"int","values":["1","2","3","4"]},"hatch":{"type":"int","values":["0","1","2"]}}},"minecraft:twisting_vines":{"defaultstate":"minecraft:twisting_vines[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]}}},"minecraft:twisting_vines_plant":{"defaultstate":"minecraft:twisting_vines_plant","properties":{}},"minecraft:vine":{"defaultstate":"minecraft:vine[east=false,north=false,south=false,up=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"up":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:void_air":{"defaultstate":"minecraft:void_air","properties":{}},"minecraft:wall_torch":{"defaultstate":"minecraft:wall_torch[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:warped_button":{"defaultstate":"minecraft:warped_button[face=wall,facing=north,powered=false]","properties":{"face":{"type":"enum","values":["floor","wall","ceiling"]},"facing":{"type":"direction","values":["north","south","west","east"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:warped_door":{"defaultstate":"minecraft:warped_door[facing=north,half=lower,hinge=left,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["upper","lower"]},"hinge":{"type":"enum","values":["left","right"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:warped_fence":{"defaultstate":"minecraft:warped_fence[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:warped_fence_gate":{"defaultstate":"minecraft:warped_fence_gate[facing=north,in_wall=false,open=false,powered=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"in_wall":{"type":"bool","values":["true","false"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]}}},"minecraft:warped_fungus":{"defaultstate":"minecraft:warped_fungus","properties":{}},"minecraft:warped_hyphae":{"defaultstate":"minecraft:warped_hyphae[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:warped_nylium":{"defaultstate":"minecraft:warped_nylium","properties":{}},"minecraft:warped_planks":{"defaultstate":"minecraft:warped_planks","properties":{}},"minecraft:warped_pressure_plate":{"defaultstate":"minecraft:warped_pressure_plate[powered=false]","properties":{"powered":{"type":"bool","values":["true","false"]}}},"minecraft:warped_roots":{"defaultstate":"minecraft:warped_roots","properties":{}},"minecraft:warped_sign":{"defaultstate":"minecraft:warped_sign[rotation=0,waterlogged=false]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:warped_slab":{"defaultstate":"minecraft:warped_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:warped_stairs":{"defaultstate":"minecraft:warped_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:warped_stem":{"defaultstate":"minecraft:warped_stem[axis=y]","properties":{"axis":{"type":"enum","values":["x","y","z"]}}},"minecraft:warped_trapdoor":{"defaultstate":"minecraft:warped_trapdoor[facing=north,half=bottom,open=false,powered=false,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"open":{"type":"bool","values":["true","false"]},"powered":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:warped_wall_sign":{"defaultstate":"minecraft:warped_wall_sign[facing=north,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:warped_wart_block":{"defaultstate":"minecraft:warped_wart_block","properties":{}},"minecraft:water":{"defaultstate":"minecraft:water[level=0]","properties":{"level":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:water_cauldron":{"defaultstate":"minecraft:water_cauldron[level=1]","properties":{"level":{"type":"int","values":["1","2","3"]}}},"minecraft:waxed_copper_block":{"defaultstate":"minecraft:waxed_copper_block","properties":{}},"minecraft:waxed_cut_copper":{"defaultstate":"minecraft:waxed_cut_copper","properties":{}},"minecraft:waxed_cut_copper_slab":{"defaultstate":"minecraft:waxed_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_cut_copper_stairs":{"defaultstate":"minecraft:waxed_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_exposed_copper":{"defaultstate":"minecraft:waxed_exposed_copper","properties":{}},"minecraft:waxed_exposed_cut_copper":{"defaultstate":"minecraft:waxed_exposed_cut_copper","properties":{}},"minecraft:waxed_exposed_cut_copper_slab":{"defaultstate":"minecraft:waxed_exposed_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_exposed_cut_copper_stairs":{"defaultstate":"minecraft:waxed_exposed_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_oxidized_copper":{"defaultstate":"minecraft:waxed_oxidized_copper","properties":{}},"minecraft:waxed_oxidized_cut_copper":{"defaultstate":"minecraft:waxed_oxidized_cut_copper","properties":{}},"minecraft:waxed_oxidized_cut_copper_slab":{"defaultstate":"minecraft:waxed_oxidized_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_oxidized_cut_copper_stairs":{"defaultstate":"minecraft:waxed_oxidized_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_weathered_copper":{"defaultstate":"minecraft:waxed_weathered_copper","properties":{}},"minecraft:waxed_weathered_cut_copper":{"defaultstate":"minecraft:waxed_weathered_cut_copper","properties":{}},"minecraft:waxed_weathered_cut_copper_slab":{"defaultstate":"minecraft:waxed_weathered_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:waxed_weathered_cut_copper_stairs":{"defaultstate":"minecraft:waxed_weathered_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:weathered_copper":{"defaultstate":"minecraft:weathered_copper","properties":{}},"minecraft:weathered_cut_copper":{"defaultstate":"minecraft:weathered_cut_copper","properties":{}},"minecraft:weathered_cut_copper_slab":{"defaultstate":"minecraft:weathered_cut_copper_slab[type=bottom,waterlogged=false]","properties":{"type":{"type":"enum","values":["top","bottom","double"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:weathered_cut_copper_stairs":{"defaultstate":"minecraft:weathered_cut_copper_stairs[facing=north,half=bottom,shape=straight,waterlogged=false]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"half":{"type":"enum","values":["top","bottom"]},"shape":{"type":"enum","values":["straight","inner_left","inner_right","outer_left","outer_right"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:weeping_vines":{"defaultstate":"minecraft:weeping_vines[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"]}}},"minecraft:weeping_vines_plant":{"defaultstate":"minecraft:weeping_vines_plant","properties":{}},"minecraft:wet_sponge":{"defaultstate":"minecraft:wet_sponge","properties":{}},"minecraft:wheat":{"defaultstate":"minecraft:wheat[age=0]","properties":{"age":{"type":"int","values":["0","1","2","3","4","5","6","7"]}}},"minecraft:white_banner":{"defaultstate":"minecraft:white_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:white_bed":{"defaultstate":"minecraft:white_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:white_candle":{"defaultstate":"minecraft:white_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:white_candle_cake":{"defaultstate":"minecraft:white_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:white_carpet":{"defaultstate":"minecraft:white_carpet","properties":{}},"minecraft:white_concrete":{"defaultstate":"minecraft:white_concrete","properties":{}},"minecraft:white_concrete_powder":{"defaultstate":"minecraft:white_concrete_powder","properties":{}},"minecraft:white_glazed_terracotta":{"defaultstate":"minecraft:white_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:white_shulker_box":{"defaultstate":"minecraft:white_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:white_stained_glass":{"defaultstate":"minecraft:white_stained_glass","properties":{}},"minecraft:white_stained_glass_pane":{"defaultstate":"minecraft:white_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:white_terracotta":{"defaultstate":"minecraft:white_terracotta","properties":{}},"minecraft:white_tulip":{"defaultstate":"minecraft:white_tulip","properties":{}},"minecraft:white_wall_banner":{"defaultstate":"minecraft:white_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:white_wool":{"defaultstate":"minecraft:white_wool","properties":{}},"minecraft:wither_rose":{"defaultstate":"minecraft:wither_rose","properties":{}},"minecraft:wither_skeleton_skull":{"defaultstate":"minecraft:wither_skeleton_skull[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:wither_skeleton_wall_skull":{"defaultstate":"minecraft:wither_skeleton_wall_skull[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:yellow_banner":{"defaultstate":"minecraft:yellow_banner[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:yellow_bed":{"defaultstate":"minecraft:yellow_bed[facing=north,occupied=false,part=foot]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]},"occupied":{"type":"bool","values":["true","false"]},"part":{"type":"enum","values":["head","foot"]}}},"minecraft:yellow_candle":{"defaultstate":"minecraft:yellow_candle[candles=1,lit=false,waterlogged=false]","properties":{"candles":{"type":"int","values":["1","2","3","4"]},"lit":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]}}},"minecraft:yellow_candle_cake":{"defaultstate":"minecraft:yellow_candle_cake[lit=false]","properties":{"lit":{"type":"bool","values":["true","false"]}}},"minecraft:yellow_carpet":{"defaultstate":"minecraft:yellow_carpet","properties":{}},"minecraft:yellow_concrete":{"defaultstate":"minecraft:yellow_concrete","properties":{}},"minecraft:yellow_concrete_powder":{"defaultstate":"minecraft:yellow_concrete_powder","properties":{}},"minecraft:yellow_glazed_terracotta":{"defaultstate":"minecraft:yellow_glazed_terracotta[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:yellow_shulker_box":{"defaultstate":"minecraft:yellow_shulker_box[facing=up]","properties":{"facing":{"type":"direction","values":["north","east","south","west","up","down"]}}},"minecraft:yellow_stained_glass":{"defaultstate":"minecraft:yellow_stained_glass","properties":{}},"minecraft:yellow_stained_glass_pane":{"defaultstate":"minecraft:yellow_stained_glass_pane[east=false,north=false,south=false,waterlogged=false,west=false]","properties":{"east":{"type":"bool","values":["true","false"]},"north":{"type":"bool","values":["true","false"]},"south":{"type":"bool","values":["true","false"]},"waterlogged":{"type":"bool","values":["true","false"]},"west":{"type":"bool","values":["true","false"]}}},"minecraft:yellow_terracotta":{"defaultstate":"minecraft:yellow_terracotta","properties":{}},"minecraft:yellow_wall_banner":{"defaultstate":"minecraft:yellow_wall_banner[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}},"minecraft:yellow_wool":{"defaultstate":"minecraft:yellow_wool","properties":{}},"minecraft:zombie_head":{"defaultstate":"minecraft:zombie_head[rotation=0]","properties":{"rotation":{"type":"int","values":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"]}}},"minecraft:zombie_wall_head":{"defaultstate":"minecraft:zombie_wall_head[facing=north]","properties":{"facing":{"type":"direction","values":["north","south","west","east"]}}}},"blocktags":{"minecraft:acacia_logs":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood"],"minecraft:anvil":["minecraft:anvil","minecraft:chipped_anvil","minecraft:damaged_anvil"],"minecraft:bamboo_plantable_on":["minecraft:bamboo","minecraft:bamboo_sapling","minecraft:coarse_dirt","minecraft:dirt","minecraft:grass_block","minecraft:gravel","minecraft:moss_block","minecraft:mycelium","minecraft:podzol","minecraft:red_sand","minecraft:rooted_dirt","minecraft:sand"],"minecraft:banners":["minecraft:black_banner","minecraft:black_wall_banner","minecraft:blue_banner","minecraft:blue_wall_banner","minecraft:brown_banner","minecraft:brown_wall_banner","minecraft:cyan_banner","minecraft:cyan_wall_banner","minecraft:gray_banner","minecraft:gray_wall_banner","minecraft:green_banner","minecraft:green_wall_banner","minecraft:light_blue_banner","minecraft:light_blue_wall_banner","minecraft:light_gray_banner","minecraft:light_gray_wall_banner","minecraft:lime_banner","minecraft:lime_wall_banner","minecraft:magenta_banner","minecraft:magenta_wall_banner","minecraft:orange_banner","minecraft:orange_wall_banner","minecraft:pink_banner","minecraft:pink_wall_banner","minecraft:purple_banner","minecraft:purple_wall_banner","minecraft:red_banner","minecraft:red_wall_banner","minecraft:white_banner","minecraft:white_wall_banner","minecraft:yellow_banner","minecraft:yellow_wall_banner"],"minecraft:base_stone_nether":["minecraft:basalt","minecraft:blackstone","minecraft:netherrack"],"minecraft:base_stone_overworld":["minecraft:andesite","minecraft:deepslate","minecraft:diorite","minecraft:granite","minecraft:stone","minecraft:tuff"],"minecraft:beacon_base_blocks":["minecraft:diamond_block","minecraft:emerald_block","minecraft:gold_block","minecraft:iron_block","minecraft:netherite_block"],"minecraft:beds":["minecraft:black_bed","minecraft:blue_bed","minecraft:brown_bed","minecraft:cyan_bed","minecraft:gray_bed","minecraft:green_bed","minecraft:light_blue_bed","minecraft:light_gray_bed","minecraft:lime_bed","minecraft:magenta_bed","minecraft:orange_bed","minecraft:pink_bed","minecraft:purple_bed","minecraft:red_bed","minecraft:white_bed","minecraft:yellow_bed"],"minecraft:bee_growables":["minecraft:beetroots","minecraft:carrots","minecraft:cave_vines","minecraft:cave_vines_plant","minecraft:melon_stem","minecraft:potatoes","minecraft:pumpkin_stem","minecraft:sweet_berry_bush","minecraft:wheat"],"minecraft:beehives":["minecraft:bee_nest","minecraft:beehive"],"minecraft:birch_logs":["minecraft:birch_log","minecraft:birch_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood"],"minecraft:buttons":["minecraft:acacia_button","minecraft:birch_button","minecraft:crimson_button","minecraft:dark_oak_button","minecraft:jungle_button","minecraft:oak_button","minecraft:polished_blackstone_button","minecraft:spruce_button","minecraft:stone_button","minecraft:warped_button"],"minecraft:campfires":["minecraft:campfire","minecraft:soul_campfire"],"minecraft:candle_cakes":["minecraft:black_candle_cake","minecraft:blue_candle_cake","minecraft:brown_candle_cake","minecraft:candle_cake","minecraft:cyan_candle_cake","minecraft:gray_candle_cake","minecraft:green_candle_cake","minecraft:light_blue_candle_cake","minecraft:light_gray_candle_cake","minecraft:lime_candle_cake","minecraft:magenta_candle_cake","minecraft:orange_candle_cake","minecraft:pink_candle_cake","minecraft:purple_candle_cake","minecraft:red_candle_cake","minecraft:white_candle_cake","minecraft:yellow_candle_cake"],"minecraft:candles":["minecraft:black_candle","minecraft:blue_candle","minecraft:brown_candle","minecraft:candle","minecraft:cyan_candle","minecraft:gray_candle","minecraft:green_candle","minecraft:light_blue_candle","minecraft:light_gray_candle","minecraft:lime_candle","minecraft:magenta_candle","minecraft:orange_candle","minecraft:pink_candle","minecraft:purple_candle","minecraft:red_candle","minecraft:white_candle","minecraft:yellow_candle"],"minecraft:carpets":["minecraft:black_carpet","minecraft:blue_carpet","minecraft:brown_carpet","minecraft:cyan_carpet","minecraft:gray_carpet","minecraft:green_carpet","minecraft:light_blue_carpet","minecraft:light_gray_carpet","minecraft:lime_carpet","minecraft:magenta_carpet","minecraft:orange_carpet","minecraft:pink_carpet","minecraft:purple_carpet","minecraft:red_carpet","minecraft:white_carpet","minecraft:yellow_carpet"],"minecraft:cauldrons":["minecraft:cauldron","minecraft:lava_cauldron","minecraft:powder_snow_cauldron","minecraft:water_cauldron"],"minecraft:cave_vines":["minecraft:cave_vines","minecraft:cave_vines_plant"],"minecraft:climbable":["minecraft:cave_vines","minecraft:cave_vines_plant","minecraft:ladder","minecraft:scaffolding","minecraft:twisting_vines","minecraft:twisting_vines_plant","minecraft:vine","minecraft:weeping_vines","minecraft:weeping_vines_plant"],"minecraft:coal_ores":["minecraft:coal_ore","minecraft:deepslate_coal_ore"],"minecraft:copper_ores":["minecraft:copper_ore","minecraft:deepslate_copper_ore"],"minecraft:coral_blocks":["minecraft:brain_coral_block","minecraft:bubble_coral_block","minecraft:fire_coral_block","minecraft:horn_coral_block","minecraft:tube_coral_block"],"minecraft:coral_plants":["minecraft:brain_coral","minecraft:bubble_coral","minecraft:fire_coral","minecraft:horn_coral","minecraft:tube_coral"],"minecraft:corals":["minecraft:brain_coral","minecraft:brain_coral_fan","minecraft:bubble_coral","minecraft:bubble_coral_fan","minecraft:fire_coral","minecraft:fire_coral_fan","minecraft:horn_coral","minecraft:horn_coral_fan","minecraft:tube_coral","minecraft:tube_coral_fan"],"minecraft:crimson_stems":["minecraft:crimson_hyphae","minecraft:crimson_stem","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem"],"minecraft:crops":["minecraft:beetroots","minecraft:carrots","minecraft:melon_stem","minecraft:potatoes","minecraft:pumpkin_stem","minecraft:wheat"],"minecraft:crystal_sound_blocks":["minecraft:amethyst_block","minecraft:budding_amethyst"],"minecraft:dark_oak_logs":["minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood"],"minecraft:deepslate_ore_replaceables":["minecraft:deepslate","minecraft:tuff"],"minecraft:diamond_ores":["minecraft:deepslate_diamond_ore","minecraft:diamond_ore"],"minecraft:dirt":["minecraft:coarse_dirt","minecraft:dirt","minecraft:grass_block","minecraft:moss_block","minecraft:mycelium","minecraft:podzol","minecraft:rooted_dirt"],"minecraft:doors":["minecraft:acacia_door","minecraft:birch_door","minecraft:crimson_door","minecraft:dark_oak_door","minecraft:iron_door","minecraft:jungle_door","minecraft:oak_door","minecraft:spruce_door","minecraft:warped_door"],"minecraft:dragon_immune":["minecraft:barrier","minecraft:bedrock","minecraft:chain_command_block","minecraft:command_block","minecraft:crying_obsidian","minecraft:end_gateway","minecraft:end_portal","minecraft:end_portal_frame","minecraft:end_stone","minecraft:iron_bars","minecraft:jigsaw","minecraft:moving_piston","minecraft:obsidian","minecraft:repeating_command_block","minecraft:respawn_anchor","minecraft:structure_block"],"minecraft:dripstone_replaceable_blocks":["minecraft:andesite","minecraft:deepslate","minecraft:diorite","minecraft:dirt","minecraft:granite","minecraft:stone","minecraft:tuff"],"minecraft:emerald_ores":["minecraft:deepslate_emerald_ore","minecraft:emerald_ore"],"minecraft:enderman_holdable":["minecraft:allium","minecraft:azure_bluet","minecraft:blue_orchid","minecraft:brown_mushroom","minecraft:cactus","minecraft:carved_pumpkin","minecraft:clay","minecraft:coarse_dirt","minecraft:cornflower","minecraft:crimson_fungus","minecraft:crimson_nylium","minecraft:crimson_roots","minecraft:dandelion","minecraft:dirt","minecraft:grass_block","minecraft:gravel","minecraft:lily_of_the_valley","minecraft:melon","minecraft:moss_block","minecraft:mycelium","minecraft:orange_tulip","minecraft:oxeye_daisy","minecraft:pink_tulip","minecraft:podzol","minecraft:poppy","minecraft:pumpkin","minecraft:red_mushroom","minecraft:red_sand","minecraft:red_tulip","minecraft:rooted_dirt","minecraft:sand","minecraft:tnt","minecraft:warped_fungus","minecraft:warped_nylium","minecraft:warped_roots","minecraft:white_tulip","minecraft:wither_rose"],"minecraft:features_cannot_replace":["minecraft:bedrock","minecraft:chest","minecraft:end_portal_frame","minecraft:spawner"],"minecraft:fence_gates":["minecraft:acacia_fence_gate","minecraft:birch_fence_gate","minecraft:crimson_fence_gate","minecraft:dark_oak_fence_gate","minecraft:jungle_fence_gate","minecraft:oak_fence_gate","minecraft:spruce_fence_gate","minecraft:warped_fence_gate"],"minecraft:fences":["minecraft:acacia_fence","minecraft:birch_fence","minecraft:crimson_fence","minecraft:dark_oak_fence","minecraft:jungle_fence","minecraft:nether_brick_fence","minecraft:oak_fence","minecraft:spruce_fence","minecraft:warped_fence"],"minecraft:fire":["minecraft:fire","minecraft:soul_fire"],"minecraft:flower_pots":["minecraft:flower_pot","minecraft:potted_acacia_sapling","minecraft:potted_allium","minecraft:potted_azalea_bush","minecraft:potted_azure_bluet","minecraft:potted_bamboo","minecraft:potted_birch_sapling","minecraft:potted_blue_orchid","minecraft:potted_brown_mushroom","minecraft:potted_cactus","minecraft:potted_cornflower","minecraft:potted_crimson_fungus","minecraft:potted_crimson_roots","minecraft:potted_dandelion","minecraft:potted_dark_oak_sapling","minecraft:potted_dead_bush","minecraft:potted_fern","minecraft:potted_flowering_azalea_bush","minecraft:potted_jungle_sapling","minecraft:potted_lily_of_the_valley","minecraft:potted_oak_sapling","minecraft:potted_orange_tulip","minecraft:potted_oxeye_daisy","minecraft:potted_pink_tulip","minecraft:potted_poppy","minecraft:potted_red_mushroom","minecraft:potted_red_tulip","minecraft:potted_spruce_sapling","minecraft:potted_warped_fungus","minecraft:potted_warped_roots","minecraft:potted_white_tulip","minecraft:potted_wither_rose"],"minecraft:flowers":["minecraft:allium","minecraft:azure_bluet","minecraft:blue_orchid","minecraft:cornflower","minecraft:dandelion","minecraft:flowering_azalea","minecraft:flowering_azalea_leaves","minecraft:lilac","minecraft:lily_of_the_valley","minecraft:orange_tulip","minecraft:oxeye_daisy","minecraft:peony","minecraft:pink_tulip","minecraft:poppy","minecraft:red_tulip","minecraft:rose_bush","minecraft:sunflower","minecraft:white_tulip","minecraft:wither_rose"],"minecraft:geode_invalid_blocks":["minecraft:bedrock","minecraft:blue_ice","minecraft:ice","minecraft:lava","minecraft:packed_ice","minecraft:water"],"minecraft:gold_ores":["minecraft:deepslate_gold_ore","minecraft:gold_ore","minecraft:nether_gold_ore"],"minecraft:guarded_by_piglins":["minecraft:barrel","minecraft:black_shulker_box","minecraft:blue_shulker_box","minecraft:brown_shulker_box","minecraft:chest","minecraft:cyan_shulker_box","minecraft:deepslate_gold_ore","minecraft:ender_chest","minecraft:gilded_blackstone","minecraft:gold_block","minecraft:gold_ore","minecraft:gray_shulker_box","minecraft:green_shulker_box","minecraft:light_blue_shulker_box","minecraft:light_gray_shulker_box","minecraft:lime_shulker_box","minecraft:magenta_shulker_box","minecraft:nether_gold_ore","minecraft:orange_shulker_box","minecraft:pink_shulker_box","minecraft:purple_shulker_box","minecraft:raw_gold_block","minecraft:red_shulker_box","minecraft:shulker_box","minecraft:trapped_chest","minecraft:white_shulker_box","minecraft:yellow_shulker_box"],"minecraft:hoglin_repellents":["minecraft:nether_portal","minecraft:potted_warped_fungus","minecraft:respawn_anchor","minecraft:warped_fungus"],"minecraft:ice":["minecraft:blue_ice","minecraft:frosted_ice","minecraft:ice","minecraft:packed_ice"],"minecraft:impermeable":["minecraft:black_stained_glass","minecraft:blue_stained_glass","minecraft:brown_stained_glass","minecraft:cyan_stained_glass","minecraft:glass","minecraft:gray_stained_glass","minecraft:green_stained_glass","minecraft:light_blue_stained_glass","minecraft:light_gray_stained_glass","minecraft:lime_stained_glass","minecraft:magenta_stained_glass","minecraft:orange_stained_glass","minecraft:pink_stained_glass","minecraft:purple_stained_glass","minecraft:red_stained_glass","minecraft:tinted_glass","minecraft:white_stained_glass","minecraft:yellow_stained_glass"],"minecraft:infiniburn_end":["minecraft:bedrock","minecraft:magma_block","minecraft:netherrack"],"minecraft:infiniburn_nether":["minecraft:magma_block","minecraft:netherrack"],"minecraft:infiniburn_overworld":["minecraft:magma_block","minecraft:netherrack"],"minecraft:inside_step_sound_blocks":["minecraft:powder_snow","minecraft:snow"],"minecraft:iron_ores":["minecraft:deepslate_iron_ore","minecraft:iron_ore"],"minecraft:jungle_logs":["minecraft:jungle_log","minecraft:jungle_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood"],"minecraft:lapis_ores":["minecraft:deepslate_lapis_ore","minecraft:lapis_ore"],"minecraft:lava_pool_stone_replaceables":["minecraft:acacia_leaves","minecraft:azalea_leaves","minecraft:bedrock","minecraft:birch_leaves","minecraft:chest","minecraft:dark_oak_leaves","minecraft:end_portal_frame","minecraft:flowering_azalea_leaves","minecraft:jungle_leaves","minecraft:oak_leaves","minecraft:spawner","minecraft:spruce_leaves"],"minecraft:leaves":["minecraft:acacia_leaves","minecraft:azalea_leaves","minecraft:birch_leaves","minecraft:dark_oak_leaves","minecraft:flowering_azalea_leaves","minecraft:jungle_leaves","minecraft:oak_leaves","minecraft:spruce_leaves"],"minecraft:logs":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:birch_log","minecraft:birch_wood","minecraft:crimson_hyphae","minecraft:crimson_stem","minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:jungle_log","minecraft:jungle_wood","minecraft:oak_log","minecraft:oak_wood","minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_hyphae","minecraft:warped_stem"],"minecraft:logs_that_burn":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:birch_log","minecraft:birch_wood","minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:jungle_log","minecraft:jungle_wood","minecraft:oak_log","minecraft:oak_wood","minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood"],"minecraft:lush_ground_replaceable":["minecraft:andesite","minecraft:cave_vines","minecraft:cave_vines_plant","minecraft:clay","minecraft:coarse_dirt","minecraft:deepslate","minecraft:diorite","minecraft:dirt","minecraft:granite","minecraft:grass_block","minecraft:gravel","minecraft:moss_block","minecraft:mycelium","minecraft:podzol","minecraft:rooted_dirt","minecraft:sand","minecraft:stone","minecraft:tuff"],"minecraft:mineable/axe":["minecraft:acacia_button","minecraft:acacia_door","minecraft:acacia_fence","minecraft:acacia_fence_gate","minecraft:acacia_log","minecraft:acacia_planks","minecraft:acacia_pressure_plate","minecraft:acacia_sapling","minecraft:acacia_sign","minecraft:acacia_slab","minecraft:acacia_stairs","minecraft:acacia_trapdoor","minecraft:acacia_wall_sign","minecraft:acacia_wood","minecraft:allium","minecraft:attached_melon_stem","minecraft:attached_pumpkin_stem","minecraft:azalea","minecraft:azure_bluet","minecraft:bamboo","minecraft:barrel","minecraft:bee_nest","minecraft:beehive","minecraft:beetroots","minecraft:big_dripleaf","minecraft:big_dripleaf_stem","minecraft:birch_button","minecraft:birch_door","minecraft:birch_fence","minecraft:birch_fence_gate","minecraft:birch_log","minecraft:birch_planks","minecraft:birch_pressure_plate","minecraft:birch_sapling","minecraft:birch_sign","minecraft:birch_slab","minecraft:birch_stairs","minecraft:birch_trapdoor","minecraft:birch_wall_sign","minecraft:birch_wood","minecraft:black_banner","minecraft:black_wall_banner","minecraft:blue_banner","minecraft:blue_orchid","minecraft:blue_wall_banner","minecraft:bookshelf","minecraft:brown_banner","minecraft:brown_mushroom","minecraft:brown_mushroom_block","minecraft:brown_wall_banner","minecraft:campfire","minecraft:carrots","minecraft:cartography_table","minecraft:carved_pumpkin","minecraft:cave_vines","minecraft:cave_vines_plant","minecraft:chest","minecraft:chorus_flower","minecraft:chorus_plant","minecraft:cocoa","minecraft:composter","minecraft:cornflower","minecraft:crafting_table","minecraft:crimson_button","minecraft:crimson_door","minecraft:crimson_fence","minecraft:crimson_fence_gate","minecraft:crimson_fungus","minecraft:crimson_hyphae","minecraft:crimson_planks","minecraft:crimson_pressure_plate","minecraft:crimson_sign","minecraft:crimson_slab","minecraft:crimson_stairs","minecraft:crimson_stem","minecraft:crimson_trapdoor","minecraft:crimson_wall_sign","minecraft:cyan_banner","minecraft:cyan_wall_banner","minecraft:dandelion","minecraft:dark_oak_button","minecraft:dark_oak_door","minecraft:dark_oak_fence","minecraft:dark_oak_fence_gate","minecraft:dark_oak_log","minecraft:dark_oak_planks","minecraft:dark_oak_pressure_plate","minecraft:dark_oak_sapling","minecraft:dark_oak_sign","minecraft:dark_oak_slab","minecraft:dark_oak_stairs","minecraft:dark_oak_trapdoor","minecraft:dark_oak_wall_sign","minecraft:dark_oak_wood","minecraft:daylight_detector","minecraft:dead_bush","minecraft:fern","minecraft:fletching_table","minecraft:flowering_azalea","minecraft:flowering_azalea_leaves","minecraft:glow_lichen","minecraft:grass","minecraft:gray_banner","minecraft:gray_wall_banner","minecraft:green_banner","minecraft:green_wall_banner","minecraft:hanging_roots","minecraft:jack_o_lantern","minecraft:jukebox","minecraft:jungle_button","minecraft:jungle_door","minecraft:jungle_fence","minecraft:jungle_fence_gate","minecraft:jungle_log","minecraft:jungle_planks","minecraft:jungle_pressure_plate","minecraft:jungle_sapling","minecraft:jungle_sign","minecraft:jungle_slab","minecraft:jungle_stairs","minecraft:jungle_trapdoor","minecraft:jungle_wall_sign","minecraft:jungle_wood","minecraft:ladder","minecraft:large_fern","minecraft:lectern","minecraft:light_blue_banner","minecraft:light_blue_wall_banner","minecraft:light_gray_banner","minecraft:light_gray_wall_banner","minecraft:lilac","minecraft:lily_of_the_valley","minecraft:lily_pad","minecraft:lime_banner","minecraft:lime_wall_banner","minecraft:loom","minecraft:magenta_banner","minecraft:magenta_wall_banner","minecraft:melon","minecraft:melon_stem","minecraft:mushroom_stem","minecraft:nether_wart","minecraft:note_block","minecraft:oak_button","minecraft:oak_door","minecraft:oak_fence","minecraft:oak_fence_gate","minecraft:oak_log","minecraft:oak_planks","minecraft:oak_pressure_plate","minecraft:oak_sapling","minecraft:oak_sign","minecraft:oak_slab","minecraft:oak_stairs","minecraft:oak_trapdoor","minecraft:oak_wall_sign","minecraft:oak_wood","minecraft:orange_banner","minecraft:orange_tulip","minecraft:orange_wall_banner","minecraft:oxeye_daisy","minecraft:peony","minecraft:pink_banner","minecraft:pink_tulip","minecraft:pink_wall_banner","minecraft:poppy","minecraft:potatoes","minecraft:pumpkin","minecraft:pumpkin_stem","minecraft:purple_banner","minecraft:purple_wall_banner","minecraft:red_banner","minecraft:red_mushroom","minecraft:red_mushroom_block","minecraft:red_tulip","minecraft:red_wall_banner","minecraft:rose_bush","minecraft:scaffolding","minecraft:small_dripleaf","minecraft:smithing_table","minecraft:soul_campfire","minecraft:spore_blossom","minecraft:spruce_button","minecraft:spruce_door","minecraft:spruce_fence","minecraft:spruce_fence_gate","minecraft:spruce_log","minecraft:spruce_planks","minecraft:spruce_pressure_plate","minecraft:spruce_sapling","minecraft:spruce_sign","minecraft:spruce_slab","minecraft:spruce_stairs","minecraft:spruce_trapdoor","minecraft:spruce_wall_sign","minecraft:spruce_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:sugar_cane","minecraft:sunflower","minecraft:sweet_berry_bush","minecraft:tall_grass","minecraft:trapped_chest","minecraft:twisting_vines","minecraft:twisting_vines_plant","minecraft:vine","minecraft:warped_button","minecraft:warped_door","minecraft:warped_fence","minecraft:warped_fence_gate","minecraft:warped_fungus","minecraft:warped_hyphae","minecraft:warped_planks","minecraft:warped_pressure_plate","minecraft:warped_sign","minecraft:warped_slab","minecraft:warped_stairs","minecraft:warped_stem","minecraft:warped_trapdoor","minecraft:warped_wall_sign","minecraft:weeping_vines","minecraft:weeping_vines_plant","minecraft:wheat","minecraft:white_banner","minecraft:white_tulip","minecraft:white_wall_banner","minecraft:wither_rose","minecraft:yellow_banner","minecraft:yellow_wall_banner"],"minecraft:mineable/hoe":["minecraft:acacia_leaves","minecraft:azalea_leaves","minecraft:birch_leaves","minecraft:dark_oak_leaves","minecraft:dried_kelp_block","minecraft:flowering_azalea_leaves","minecraft:hay_block","minecraft:jungle_leaves","minecraft:moss_block","minecraft:moss_carpet","minecraft:nether_wart_block","minecraft:oak_leaves","minecraft:sculk_sensor","minecraft:shroomlight","minecraft:sponge","minecraft:spruce_leaves","minecraft:target","minecraft:warped_wart_block","minecraft:wet_sponge"],"minecraft:mineable/pickaxe":["minecraft:activator_rail","minecraft:amethyst_block","minecraft:amethyst_cluster","minecraft:ancient_debris","minecraft:andesite","minecraft:andesite_slab","minecraft:andesite_stairs","minecraft:andesite_wall","minecraft:anvil","minecraft:basalt","minecraft:bell","minecraft:black_concrete","minecraft:black_glazed_terracotta","minecraft:black_shulker_box","minecraft:black_terracotta","minecraft:blackstone","minecraft:blackstone_slab","minecraft:blackstone_stairs","minecraft:blackstone_wall","minecraft:blast_furnace","minecraft:blue_concrete","minecraft:blue_glazed_terracotta","minecraft:blue_ice","minecraft:blue_shulker_box","minecraft:blue_terracotta","minecraft:bone_block","minecraft:brain_coral_block","minecraft:brewing_stand","minecraft:brick_slab","minecraft:brick_stairs","minecraft:brick_wall","minecraft:bricks","minecraft:brown_concrete","minecraft:brown_glazed_terracotta","minecraft:brown_shulker_box","minecraft:brown_terracotta","minecraft:bubble_coral_block","minecraft:budding_amethyst","minecraft:calcite","minecraft:cauldron","minecraft:chain","minecraft:chipped_anvil","minecraft:chiseled_deepslate","minecraft:chiseled_nether_bricks","minecraft:chiseled_polished_blackstone","minecraft:chiseled_quartz_block","minecraft:chiseled_red_sandstone","minecraft:chiseled_sandstone","minecraft:chiseled_stone_bricks","minecraft:coal_block","minecraft:coal_ore","minecraft:cobbled_deepslate","minecraft:cobbled_deepslate_slab","minecraft:cobbled_deepslate_stairs","minecraft:cobbled_deepslate_wall","minecraft:cobblestone","minecraft:cobblestone_slab","minecraft:cobblestone_stairs","minecraft:cobblestone_wall","minecraft:copper_block","minecraft:copper_ore","minecraft:cracked_deepslate_bricks","minecraft:cracked_deepslate_tiles","minecraft:cracked_nether_bricks","minecraft:cracked_polished_blackstone_bricks","minecraft:cracked_stone_bricks","minecraft:crimson_nylium","minecraft:crying_obsidian","minecraft:cut_copper","minecraft:cut_copper_slab","minecraft:cut_copper_stairs","minecraft:cut_red_sandstone","minecraft:cut_red_sandstone_slab","minecraft:cut_sandstone","minecraft:cut_sandstone_slab","minecraft:cyan_concrete","minecraft:cyan_glazed_terracotta","minecraft:cyan_shulker_box","minecraft:cyan_terracotta","minecraft:damaged_anvil","minecraft:dark_prismarine","minecraft:dark_prismarine_slab","minecraft:dark_prismarine_stairs","minecraft:dead_brain_coral","minecraft:dead_brain_coral_block","minecraft:dead_brain_coral_fan","minecraft:dead_brain_coral_wall_fan","minecraft:dead_bubble_coral","minecraft:dead_bubble_coral_block","minecraft:dead_bubble_coral_fan","minecraft:dead_bubble_coral_wall_fan","minecraft:dead_fire_coral","minecraft:dead_fire_coral_block","minecraft:dead_fire_coral_fan","minecraft:dead_fire_coral_wall_fan","minecraft:dead_horn_coral","minecraft:dead_horn_coral_block","minecraft:dead_horn_coral_fan","minecraft:dead_horn_coral_wall_fan","minecraft:dead_tube_coral","minecraft:dead_tube_coral_block","minecraft:dead_tube_coral_fan","minecraft:dead_tube_coral_wall_fan","minecraft:deepslate","minecraft:deepslate_brick_slab","minecraft:deepslate_brick_stairs","minecraft:deepslate_brick_wall","minecraft:deepslate_bricks","minecraft:deepslate_coal_ore","minecraft:deepslate_copper_ore","minecraft:deepslate_diamond_ore","minecraft:deepslate_emerald_ore","minecraft:deepslate_gold_ore","minecraft:deepslate_iron_ore","minecraft:deepslate_lapis_ore","minecraft:deepslate_redstone_ore","minecraft:deepslate_tile_slab","minecraft:deepslate_tile_stairs","minecraft:deepslate_tile_wall","minecraft:deepslate_tiles","minecraft:detector_rail","minecraft:diamond_block","minecraft:diamond_ore","minecraft:diorite","minecraft:diorite_slab","minecraft:diorite_stairs","minecraft:diorite_wall","minecraft:dispenser","minecraft:dripstone_block","minecraft:dropper","minecraft:emerald_block","minecraft:emerald_ore","minecraft:enchanting_table","minecraft:end_stone","minecraft:end_stone_brick_slab","minecraft:end_stone_brick_stairs","minecraft:end_stone_brick_wall","minecraft:end_stone_bricks","minecraft:ender_chest","minecraft:exposed_copper","minecraft:exposed_cut_copper","minecraft:exposed_cut_copper_slab","minecraft:exposed_cut_copper_stairs","minecraft:fire_coral_block","minecraft:furnace","minecraft:gilded_blackstone","minecraft:gold_block","minecraft:gold_ore","minecraft:granite","minecraft:granite_slab","minecraft:granite_stairs","minecraft:granite_wall","minecraft:gray_concrete","minecraft:gray_glazed_terracotta","minecraft:gray_shulker_box","minecraft:gray_terracotta","minecraft:green_concrete","minecraft:green_glazed_terracotta","minecraft:green_shulker_box","minecraft:green_terracotta","minecraft:grindstone","minecraft:heavy_weighted_pressure_plate","minecraft:hopper","minecraft:horn_coral_block","minecraft:ice","minecraft:infested_chiseled_stone_bricks","minecraft:infested_cobblestone","minecraft:infested_cracked_stone_bricks","minecraft:infested_deepslate","minecraft:infested_mossy_stone_bricks","minecraft:infested_stone","minecraft:infested_stone_bricks","minecraft:iron_bars","minecraft:iron_block","minecraft:iron_door","minecraft:iron_ore","minecraft:iron_trapdoor","minecraft:lantern","minecraft:lapis_block","minecraft:lapis_ore","minecraft:large_amethyst_bud","minecraft:lava_cauldron","minecraft:light_blue_concrete","minecraft:light_blue_glazed_terracotta","minecraft:light_blue_shulker_box","minecraft:light_blue_terracotta","minecraft:light_gray_concrete","minecraft:light_gray_glazed_terracotta","minecraft:light_gray_shulker_box","minecraft:light_gray_terracotta","minecraft:light_weighted_pressure_plate","minecraft:lightning_rod","minecraft:lime_concrete","minecraft:lime_glazed_terracotta","minecraft:lime_shulker_box","minecraft:lime_terracotta","minecraft:lodestone","minecraft:magenta_concrete","minecraft:magenta_glazed_terracotta","minecraft:magenta_shulker_box","minecraft:magenta_terracotta","minecraft:magma_block","minecraft:medium_amethyst_bud","minecraft:mossy_cobblestone","minecraft:mossy_cobblestone_slab","minecraft:mossy_cobblestone_stairs","minecraft:mossy_cobblestone_wall","minecraft:mossy_stone_brick_slab","minecraft:mossy_stone_brick_stairs","minecraft:mossy_stone_brick_wall","minecraft:mossy_stone_bricks","minecraft:nether_brick_fence","minecraft:nether_brick_slab","minecraft:nether_brick_stairs","minecraft:nether_brick_wall","minecraft:nether_bricks","minecraft:nether_gold_ore","minecraft:nether_quartz_ore","minecraft:netherite_block","minecraft:netherrack","minecraft:observer","minecraft:obsidian","minecraft:orange_concrete","minecraft:orange_glazed_terracotta","minecraft:orange_shulker_box","minecraft:orange_terracotta","minecraft:oxidized_copper","minecraft:oxidized_cut_copper","minecraft:oxidized_cut_copper_slab","minecraft:oxidized_cut_copper_stairs","minecraft:packed_ice","minecraft:petrified_oak_slab","minecraft:pink_concrete","minecraft:pink_glazed_terracotta","minecraft:pink_shulker_box","minecraft:pink_terracotta","minecraft:piston","minecraft:piston_head","minecraft:pointed_dripstone","minecraft:polished_andesite","minecraft:polished_andesite_slab","minecraft:polished_andesite_stairs","minecraft:polished_basalt","minecraft:polished_blackstone","minecraft:polished_blackstone_brick_slab","minecraft:polished_blackstone_brick_stairs","minecraft:polished_blackstone_brick_wall","minecraft:polished_blackstone_bricks","minecraft:polished_blackstone_pressure_plate","minecraft:polished_blackstone_slab","minecraft:polished_blackstone_stairs","minecraft:polished_blackstone_wall","minecraft:polished_deepslate","minecraft:polished_deepslate_slab","minecraft:polished_deepslate_stairs","minecraft:polished_deepslate_wall","minecraft:polished_diorite","minecraft:polished_diorite_slab","minecraft:polished_diorite_stairs","minecraft:polished_granite","minecraft:polished_granite_slab","minecraft:polished_granite_stairs","minecraft:powder_snow_cauldron","minecraft:powered_rail","minecraft:prismarine","minecraft:prismarine_brick_slab","minecraft:prismarine_brick_stairs","minecraft:prismarine_bricks","minecraft:prismarine_slab","minecraft:prismarine_stairs","minecraft:prismarine_wall","minecraft:purple_concrete","minecraft:purple_glazed_terracotta","minecraft:purple_shulker_box","minecraft:purple_terracotta","minecraft:purpur_block","minecraft:purpur_pillar","minecraft:purpur_slab","minecraft:purpur_stairs","minecraft:quartz_block","minecraft:quartz_bricks","minecraft:quartz_pillar","minecraft:quartz_slab","minecraft:quartz_stairs","minecraft:rail","minecraft:raw_copper_block","minecraft:raw_gold_block","minecraft:raw_iron_block","minecraft:red_concrete","minecraft:red_glazed_terracotta","minecraft:red_nether_brick_slab","minecraft:red_nether_brick_stairs","minecraft:red_nether_brick_wall","minecraft:red_nether_bricks","minecraft:red_sandstone","minecraft:red_sandstone_slab","minecraft:red_sandstone_stairs","minecraft:red_sandstone_wall","minecraft:red_shulker_box","minecraft:red_terracotta","minecraft:redstone_block","minecraft:redstone_ore","minecraft:respawn_anchor","minecraft:sandstone","minecraft:sandstone_slab","minecraft:sandstone_stairs","minecraft:sandstone_wall","minecraft:shulker_box","minecraft:small_amethyst_bud","minecraft:smoker","minecraft:smooth_basalt","minecraft:smooth_quartz","minecraft:smooth_quartz_slab","minecraft:smooth_quartz_stairs","minecraft:smooth_red_sandstone","minecraft:smooth_red_sandstone_slab","minecraft:smooth_red_sandstone_stairs","minecraft:smooth_sandstone","minecraft:smooth_sandstone_slab","minecraft:smooth_sandstone_stairs","minecraft:smooth_stone","minecraft:smooth_stone_slab","minecraft:soul_lantern","minecraft:spawner","minecraft:sticky_piston","minecraft:stone","minecraft:stone_brick_slab","minecraft:stone_brick_stairs","minecraft:stone_brick_wall","minecraft:stone_bricks","minecraft:stone_button","minecraft:stone_pressure_plate","minecraft:stone_slab","minecraft:stone_stairs","minecraft:stonecutter","minecraft:terracotta","minecraft:tube_coral_block","minecraft:tuff","minecraft:warped_nylium","minecraft:water_cauldron","minecraft:waxed_copper_block","minecraft:waxed_cut_copper","minecraft:waxed_cut_copper_slab","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_copper","minecraft:waxed_exposed_cut_copper","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_oxidized_copper","minecraft:waxed_oxidized_cut_copper","minecraft:waxed_oxidized_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_weathered_copper","minecraft:waxed_weathered_cut_copper","minecraft:waxed_weathered_cut_copper_slab","minecraft:waxed_weathered_cut_copper_stairs","minecraft:weathered_copper","minecraft:weathered_cut_copper","minecraft:weathered_cut_copper_slab","minecraft:weathered_cut_copper_stairs","minecraft:white_concrete","minecraft:white_glazed_terracotta","minecraft:white_shulker_box","minecraft:white_terracotta","minecraft:yellow_concrete","minecraft:yellow_glazed_terracotta","minecraft:yellow_shulker_box","minecraft:yellow_terracotta"],"minecraft:mineable/shovel":["minecraft:black_concrete_powder","minecraft:blue_concrete_powder","minecraft:brown_concrete_powder","minecraft:clay","minecraft:coarse_dirt","minecraft:cyan_concrete_powder","minecraft:dirt","minecraft:dirt_path","minecraft:farmland","minecraft:grass_block","minecraft:gravel","minecraft:gray_concrete_powder","minecraft:green_concrete_powder","minecraft:light_blue_concrete_powder","minecraft:light_gray_concrete_powder","minecraft:lime_concrete_powder","minecraft:magenta_concrete_powder","minecraft:mycelium","minecraft:orange_concrete_powder","minecraft:pink_concrete_powder","minecraft:podzol","minecraft:purple_concrete_powder","minecraft:red_concrete_powder","minecraft:red_sand","minecraft:rooted_dirt","minecraft:sand","minecraft:snow","minecraft:snow_block","minecraft:soul_sand","minecraft:soul_soil","minecraft:white_concrete_powder","minecraft:yellow_concrete_powder"],"minecraft:moss_replaceable":["minecraft:andesite","minecraft:cave_vines","minecraft:cave_vines_plant","minecraft:coarse_dirt","minecraft:deepslate","minecraft:diorite","minecraft:dirt","minecraft:granite","minecraft:grass_block","minecraft:moss_block","minecraft:mycelium","minecraft:podzol","minecraft:rooted_dirt","minecraft:stone","minecraft:tuff"],"minecraft:mushroom_grow_block":["minecraft:crimson_nylium","minecraft:mycelium","minecraft:podzol","minecraft:warped_nylium"],"minecraft:needs_diamond_tool":["minecraft:ancient_debris","minecraft:crying_obsidian","minecraft:netherite_block","minecraft:obsidian","minecraft:respawn_anchor"],"minecraft:needs_iron_tool":["minecraft:deepslate_diamond_ore","minecraft:deepslate_emerald_ore","minecraft:deepslate_gold_ore","minecraft:deepslate_redstone_ore","minecraft:diamond_block","minecraft:diamond_ore","minecraft:emerald_block","minecraft:emerald_ore","minecraft:gold_block","minecraft:gold_ore","minecraft:raw_gold_block","minecraft:redstone_ore"],"minecraft:needs_stone_tool":["minecraft:copper_block","minecraft:copper_ore","minecraft:cut_copper","minecraft:cut_copper_slab","minecraft:cut_copper_stairs","minecraft:deepslate_copper_ore","minecraft:deepslate_iron_ore","minecraft:deepslate_lapis_ore","minecraft:exposed_copper","minecraft:exposed_cut_copper","minecraft:exposed_cut_copper_slab","minecraft:exposed_cut_copper_stairs","minecraft:iron_block","minecraft:iron_ore","minecraft:lapis_block","minecraft:lapis_ore","minecraft:lightning_rod","minecraft:oxidized_copper","minecraft:oxidized_cut_copper","minecraft:oxidized_cut_copper_slab","minecraft:oxidized_cut_copper_stairs","minecraft:raw_copper_block","minecraft:raw_iron_block","minecraft:waxed_copper_block","minecraft:waxed_cut_copper","minecraft:waxed_cut_copper_slab","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_copper","minecraft:waxed_exposed_cut_copper","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_oxidized_copper","minecraft:waxed_oxidized_cut_copper","minecraft:waxed_oxidized_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_weathered_copper","minecraft:waxed_weathered_cut_copper","minecraft:waxed_weathered_cut_copper_slab","minecraft:waxed_weathered_cut_copper_stairs","minecraft:weathered_copper","minecraft:weathered_cut_copper","minecraft:weathered_cut_copper_slab","minecraft:weathered_cut_copper_stairs"],"minecraft:non_flammable_wood":["minecraft:crimson_button","minecraft:crimson_door","minecraft:crimson_fence","minecraft:crimson_fence_gate","minecraft:crimson_hyphae","minecraft:crimson_planks","minecraft:crimson_pressure_plate","minecraft:crimson_sign","minecraft:crimson_slab","minecraft:crimson_stairs","minecraft:crimson_stem","minecraft:crimson_trapdoor","minecraft:crimson_wall_sign","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_button","minecraft:warped_door","minecraft:warped_fence","minecraft:warped_fence_gate","minecraft:warped_hyphae","minecraft:warped_planks","minecraft:warped_pressure_plate","minecraft:warped_sign","minecraft:warped_slab","minecraft:warped_stairs","minecraft:warped_stem","minecraft:warped_trapdoor","minecraft:warped_wall_sign"],"minecraft:nylium":["minecraft:crimson_nylium","minecraft:warped_nylium"],"minecraft:oak_logs":["minecraft:oak_log","minecraft:oak_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood"],"minecraft:occludes_vibration_signals":["minecraft:black_wool","minecraft:blue_wool","minecraft:brown_wool","minecraft:cyan_wool","minecraft:gray_wool","minecraft:green_wool","minecraft:light_blue_wool","minecraft:light_gray_wool","minecraft:lime_wool","minecraft:magenta_wool","minecraft:orange_wool","minecraft:pink_wool","minecraft:purple_wool","minecraft:red_wool","minecraft:white_wool","minecraft:yellow_wool"],"minecraft:piglin_repellents":["minecraft:soul_campfire","minecraft:soul_fire","minecraft:soul_lantern","minecraft:soul_torch","minecraft:soul_wall_torch"],"minecraft:planks":["minecraft:acacia_planks","minecraft:birch_planks","minecraft:crimson_planks","minecraft:dark_oak_planks","minecraft:jungle_planks","minecraft:oak_planks","minecraft:spruce_planks","minecraft:warped_planks"],"minecraft:portals":["minecraft:end_gateway","minecraft:end_portal","minecraft:nether_portal"],"minecraft:pressure_plates":["minecraft:acacia_pressure_plate","minecraft:birch_pressure_plate","minecraft:crimson_pressure_plate","minecraft:dark_oak_pressure_plate","minecraft:heavy_weighted_pressure_plate","minecraft:jungle_pressure_plate","minecraft:light_weighted_pressure_plate","minecraft:oak_pressure_plate","minecraft:polished_blackstone_pressure_plate","minecraft:spruce_pressure_plate","minecraft:stone_pressure_plate","minecraft:warped_pressure_plate"],"minecraft:prevent_mob_spawning_inside":["minecraft:activator_rail","minecraft:detector_rail","minecraft:powered_rail","minecraft:rail"],"minecraft:rails":["minecraft:activator_rail","minecraft:detector_rail","minecraft:powered_rail","minecraft:rail"],"minecraft:redstone_ores":["minecraft:deepslate_redstone_ore","minecraft:redstone_ore"],"minecraft:sand":["minecraft:red_sand","minecraft:sand"],"minecraft:saplings":["minecraft:acacia_sapling","minecraft:azalea","minecraft:birch_sapling","minecraft:dark_oak_sapling","minecraft:flowering_azalea","minecraft:jungle_sapling","minecraft:oak_sapling","minecraft:spruce_sapling"],"minecraft:shulker_boxes":["minecraft:black_shulker_box","minecraft:blue_shulker_box","minecraft:brown_shulker_box","minecraft:cyan_shulker_box","minecraft:gray_shulker_box","minecraft:green_shulker_box","minecraft:light_blue_shulker_box","minecraft:light_gray_shulker_box","minecraft:lime_shulker_box","minecraft:magenta_shulker_box","minecraft:orange_shulker_box","minecraft:pink_shulker_box","minecraft:purple_shulker_box","minecraft:red_shulker_box","minecraft:shulker_box","minecraft:white_shulker_box","minecraft:yellow_shulker_box"],"minecraft:signs":["minecraft:acacia_sign","minecraft:acacia_wall_sign","minecraft:birch_sign","minecraft:birch_wall_sign","minecraft:crimson_sign","minecraft:crimson_wall_sign","minecraft:dark_oak_sign","minecraft:dark_oak_wall_sign","minecraft:jungle_sign","minecraft:jungle_wall_sign","minecraft:oak_sign","minecraft:oak_wall_sign","minecraft:spruce_sign","minecraft:spruce_wall_sign","minecraft:warped_sign","minecraft:warped_wall_sign"],"minecraft:slabs":["minecraft:acacia_slab","minecraft:andesite_slab","minecraft:birch_slab","minecraft:blackstone_slab","minecraft:brick_slab","minecraft:cobbled_deepslate_slab","minecraft:cobblestone_slab","minecraft:crimson_slab","minecraft:cut_copper_slab","minecraft:cut_red_sandstone_slab","minecraft:cut_sandstone_slab","minecraft:dark_oak_slab","minecraft:dark_prismarine_slab","minecraft:deepslate_brick_slab","minecraft:deepslate_tile_slab","minecraft:diorite_slab","minecraft:end_stone_brick_slab","minecraft:exposed_cut_copper_slab","minecraft:granite_slab","minecraft:jungle_slab","minecraft:mossy_cobblestone_slab","minecraft:mossy_stone_brick_slab","minecraft:nether_brick_slab","minecraft:oak_slab","minecraft:oxidized_cut_copper_slab","minecraft:petrified_oak_slab","minecraft:polished_andesite_slab","minecraft:polished_blackstone_brick_slab","minecraft:polished_blackstone_slab","minecraft:polished_deepslate_slab","minecraft:polished_diorite_slab","minecraft:polished_granite_slab","minecraft:prismarine_brick_slab","minecraft:prismarine_slab","minecraft:purpur_slab","minecraft:quartz_slab","minecraft:red_nether_brick_slab","minecraft:red_sandstone_slab","minecraft:sandstone_slab","minecraft:smooth_quartz_slab","minecraft:smooth_red_sandstone_slab","minecraft:smooth_sandstone_slab","minecraft:smooth_stone_slab","minecraft:spruce_slab","minecraft:stone_brick_slab","minecraft:stone_slab","minecraft:warped_slab","minecraft:waxed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_slab","minecraft:waxed_weathered_cut_copper_slab","minecraft:weathered_cut_copper_slab"],"minecraft:small_dripleaf_placeable":["minecraft:clay","minecraft:moss_block"],"minecraft:small_flowers":["minecraft:allium","minecraft:azure_bluet","minecraft:blue_orchid","minecraft:cornflower","minecraft:dandelion","minecraft:lily_of_the_valley","minecraft:orange_tulip","minecraft:oxeye_daisy","minecraft:pink_tulip","minecraft:poppy","minecraft:red_tulip","minecraft:white_tulip","minecraft:wither_rose"],"minecraft:snow":["minecraft:powder_snow","minecraft:snow","minecraft:snow_block"],"minecraft:soul_fire_base_blocks":["minecraft:soul_sand","minecraft:soul_soil"],"minecraft:soul_speed_blocks":["minecraft:soul_sand","minecraft:soul_soil"],"minecraft:spruce_logs":["minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood"],"minecraft:stairs":["minecraft:acacia_stairs","minecraft:andesite_stairs","minecraft:birch_stairs","minecraft:blackstone_stairs","minecraft:brick_stairs","minecraft:cobbled_deepslate_stairs","minecraft:cobblestone_stairs","minecraft:crimson_stairs","minecraft:cut_copper_stairs","minecraft:dark_oak_stairs","minecraft:dark_prismarine_stairs","minecraft:deepslate_brick_stairs","minecraft:deepslate_tile_stairs","minecraft:diorite_stairs","minecraft:end_stone_brick_stairs","minecraft:exposed_cut_copper_stairs","minecraft:granite_stairs","minecraft:jungle_stairs","minecraft:mossy_cobblestone_stairs","minecraft:mossy_stone_brick_stairs","minecraft:nether_brick_stairs","minecraft:oak_stairs","minecraft:oxidized_cut_copper_stairs","minecraft:polished_andesite_stairs","minecraft:polished_blackstone_brick_stairs","minecraft:polished_blackstone_stairs","minecraft:polished_deepslate_stairs","minecraft:polished_diorite_stairs","minecraft:polished_granite_stairs","minecraft:prismarine_brick_stairs","minecraft:prismarine_stairs","minecraft:purpur_stairs","minecraft:quartz_stairs","minecraft:red_nether_brick_stairs","minecraft:red_sandstone_stairs","minecraft:sandstone_stairs","minecraft:smooth_quartz_stairs","minecraft:smooth_red_sandstone_stairs","minecraft:smooth_sandstone_stairs","minecraft:spruce_stairs","minecraft:stone_brick_stairs","minecraft:stone_stairs","minecraft:warped_stairs","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_weathered_cut_copper_stairs","minecraft:weathered_cut_copper_stairs"],"minecraft:standing_signs":["minecraft:acacia_sign","minecraft:birch_sign","minecraft:crimson_sign","minecraft:dark_oak_sign","minecraft:jungle_sign","minecraft:oak_sign","minecraft:spruce_sign","minecraft:warped_sign"],"minecraft:stone_bricks":["minecraft:chiseled_stone_bricks","minecraft:cracked_stone_bricks","minecraft:mossy_stone_bricks","minecraft:stone_bricks"],"minecraft:stone_ore_replaceables":["minecraft:andesite","minecraft:diorite","minecraft:granite","minecraft:stone"],"minecraft:stone_pressure_plates":["minecraft:polished_blackstone_pressure_plate","minecraft:stone_pressure_plate"],"minecraft:strider_warm_blocks":["minecraft:lava"],"minecraft:tall_flowers":["minecraft:lilac","minecraft:peony","minecraft:rose_bush","minecraft:sunflower"],"minecraft:trapdoors":["minecraft:acacia_trapdoor","minecraft:birch_trapdoor","minecraft:crimson_trapdoor","minecraft:dark_oak_trapdoor","minecraft:iron_trapdoor","minecraft:jungle_trapdoor","minecraft:oak_trapdoor","minecraft:spruce_trapdoor","minecraft:warped_trapdoor"],"minecraft:underwater_bonemeals":["minecraft:brain_coral","minecraft:brain_coral_fan","minecraft:brain_coral_wall_fan","minecraft:bubble_coral","minecraft:bubble_coral_fan","minecraft:bubble_coral_wall_fan","minecraft:fire_coral","minecraft:fire_coral_fan","minecraft:fire_coral_wall_fan","minecraft:horn_coral","minecraft:horn_coral_fan","minecraft:horn_coral_wall_fan","minecraft:seagrass","minecraft:tube_coral","minecraft:tube_coral_fan","minecraft:tube_coral_wall_fan"],"minecraft:unstable_bottom_center":["minecraft:acacia_fence_gate","minecraft:birch_fence_gate","minecraft:crimson_fence_gate","minecraft:dark_oak_fence_gate","minecraft:jungle_fence_gate","minecraft:oak_fence_gate","minecraft:spruce_fence_gate","minecraft:warped_fence_gate"],"minecraft:valid_spawn":["minecraft:grass_block","minecraft:podzol"],"minecraft:wall_corals":["minecraft:brain_coral_wall_fan","minecraft:bubble_coral_wall_fan","minecraft:fire_coral_wall_fan","minecraft:horn_coral_wall_fan","minecraft:tube_coral_wall_fan"],"minecraft:wall_post_override":["minecraft:acacia_pressure_plate","minecraft:acacia_sign","minecraft:acacia_wall_sign","minecraft:birch_pressure_plate","minecraft:birch_sign","minecraft:birch_wall_sign","minecraft:black_banner","minecraft:black_wall_banner","minecraft:blue_banner","minecraft:blue_wall_banner","minecraft:brown_banner","minecraft:brown_wall_banner","minecraft:crimson_pressure_plate","minecraft:crimson_sign","minecraft:crimson_wall_sign","minecraft:cyan_banner","minecraft:cyan_wall_banner","minecraft:dark_oak_pressure_plate","minecraft:dark_oak_sign","minecraft:dark_oak_wall_sign","minecraft:gray_banner","minecraft:gray_wall_banner","minecraft:green_banner","minecraft:green_wall_banner","minecraft:heavy_weighted_pressure_plate","minecraft:jungle_pressure_plate","minecraft:jungle_sign","minecraft:jungle_wall_sign","minecraft:light_blue_banner","minecraft:light_blue_wall_banner","minecraft:light_gray_banner","minecraft:light_gray_wall_banner","minecraft:light_weighted_pressure_plate","minecraft:lime_banner","minecraft:lime_wall_banner","minecraft:magenta_banner","minecraft:magenta_wall_banner","minecraft:oak_pressure_plate","minecraft:oak_sign","minecraft:oak_wall_sign","minecraft:orange_banner","minecraft:orange_wall_banner","minecraft:pink_banner","minecraft:pink_wall_banner","minecraft:polished_blackstone_pressure_plate","minecraft:purple_banner","minecraft:purple_wall_banner","minecraft:red_banner","minecraft:red_wall_banner","minecraft:redstone_torch","minecraft:soul_torch","minecraft:spruce_pressure_plate","minecraft:spruce_sign","minecraft:spruce_wall_sign","minecraft:stone_pressure_plate","minecraft:torch","minecraft:tripwire","minecraft:warped_pressure_plate","minecraft:warped_sign","minecraft:warped_wall_sign","minecraft:white_banner","minecraft:white_wall_banner","minecraft:yellow_banner","minecraft:yellow_wall_banner"],"minecraft:wall_signs":["minecraft:acacia_wall_sign","minecraft:birch_wall_sign","minecraft:crimson_wall_sign","minecraft:dark_oak_wall_sign","minecraft:jungle_wall_sign","minecraft:oak_wall_sign","minecraft:spruce_wall_sign","minecraft:warped_wall_sign"],"minecraft:walls":["minecraft:andesite_wall","minecraft:blackstone_wall","minecraft:brick_wall","minecraft:cobbled_deepslate_wall","minecraft:cobblestone_wall","minecraft:deepslate_brick_wall","minecraft:deepslate_tile_wall","minecraft:diorite_wall","minecraft:end_stone_brick_wall","minecraft:granite_wall","minecraft:mossy_cobblestone_wall","minecraft:mossy_stone_brick_wall","minecraft:nether_brick_wall","minecraft:polished_blackstone_brick_wall","minecraft:polished_blackstone_wall","minecraft:polished_deepslate_wall","minecraft:prismarine_wall","minecraft:red_nether_brick_wall","minecraft:red_sandstone_wall","minecraft:sandstone_wall","minecraft:stone_brick_wall"],"minecraft:warped_stems":["minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_hyphae","minecraft:warped_stem"],"minecraft:wart_blocks":["minecraft:nether_wart_block","minecraft:warped_wart_block"],"minecraft:wither_immune":["minecraft:barrier","minecraft:bedrock","minecraft:chain_command_block","minecraft:command_block","minecraft:end_gateway","minecraft:end_portal","minecraft:end_portal_frame","minecraft:jigsaw","minecraft:moving_piston","minecraft:repeating_command_block","minecraft:structure_block"],"minecraft:wither_summon_base_blocks":["minecraft:soul_sand","minecraft:soul_soil"],"minecraft:wooden_buttons":["minecraft:acacia_button","minecraft:birch_button","minecraft:crimson_button","minecraft:dark_oak_button","minecraft:jungle_button","minecraft:oak_button","minecraft:spruce_button","minecraft:warped_button"],"minecraft:wooden_doors":["minecraft:acacia_door","minecraft:birch_door","minecraft:crimson_door","minecraft:dark_oak_door","minecraft:jungle_door","minecraft:oak_door","minecraft:spruce_door","minecraft:warped_door"],"minecraft:wooden_fences":["minecraft:acacia_fence","minecraft:birch_fence","minecraft:crimson_fence","minecraft:dark_oak_fence","minecraft:jungle_fence","minecraft:oak_fence","minecraft:spruce_fence","minecraft:warped_fence"],"minecraft:wooden_pressure_plates":["minecraft:acacia_pressure_plate","minecraft:birch_pressure_plate","minecraft:crimson_pressure_plate","minecraft:dark_oak_pressure_plate","minecraft:jungle_pressure_plate","minecraft:oak_pressure_plate","minecraft:spruce_pressure_plate","minecraft:warped_pressure_plate"],"minecraft:wooden_slabs":["minecraft:acacia_slab","minecraft:birch_slab","minecraft:crimson_slab","minecraft:dark_oak_slab","minecraft:jungle_slab","minecraft:oak_slab","minecraft:spruce_slab","minecraft:warped_slab"],"minecraft:wooden_stairs":["minecraft:acacia_stairs","minecraft:birch_stairs","minecraft:crimson_stairs","minecraft:dark_oak_stairs","minecraft:jungle_stairs","minecraft:oak_stairs","minecraft:spruce_stairs","minecraft:warped_stairs"],"minecraft:wooden_trapdoors":["minecraft:acacia_trapdoor","minecraft:birch_trapdoor","minecraft:crimson_trapdoor","minecraft:dark_oak_trapdoor","minecraft:jungle_trapdoor","minecraft:oak_trapdoor","minecraft:spruce_trapdoor","minecraft:warped_trapdoor"],"minecraft:wool":["minecraft:black_wool","minecraft:blue_wool","minecraft:brown_wool","minecraft:cyan_wool","minecraft:gray_wool","minecraft:green_wool","minecraft:light_blue_wool","minecraft:light_gray_wool","minecraft:lime_wool","minecraft:magenta_wool","minecraft:orange_wool","minecraft:pink_wool","minecraft:purple_wool","minecraft:red_wool","minecraft:white_wool","minecraft:yellow_wool"]},"entities":["minecraft:area_effect_cloud","minecraft:armor_stand","minecraft:arrow","minecraft:axolotl","minecraft:bat","minecraft:bee","minecraft:blaze","minecraft:boat","minecraft:cat","minecraft:cave_spider","minecraft:chest_minecart","minecraft:chicken","minecraft:cod","minecraft:command_block_minecart","minecraft:cow","minecraft:creeper","minecraft:dolphin","minecraft:donkey","minecraft:dragon_fireball","minecraft:drowned","minecraft:egg","minecraft:elder_guardian","minecraft:end_crystal","minecraft:ender_dragon","minecraft:ender_pearl","minecraft:enderman","minecraft:endermite","minecraft:evoker","minecraft:evoker_fangs","minecraft:experience_bottle","minecraft:experience_orb","minecraft:eye_of_ender","minecraft:falling_block","minecraft:fireball","minecraft:firework_rocket","minecraft:fishing_bobber","minecraft:fox","minecraft:furnace_minecart","minecraft:ghast","minecraft:giant","minecraft:glow_item_frame","minecraft:glow_squid","minecraft:goat","minecraft:guardian","minecraft:hoglin","minecraft:hopper_minecart","minecraft:horse","minecraft:husk","minecraft:illusioner","minecraft:iron_golem","minecraft:item","minecraft:item_frame","minecraft:leash_knot","minecraft:lightning_bolt","minecraft:llama","minecraft:llama_spit","minecraft:magma_cube","minecraft:marker","minecraft:minecart","minecraft:mooshroom","minecraft:mule","minecraft:ocelot","minecraft:painting","minecraft:panda","minecraft:parrot","minecraft:phantom","minecraft:pig","minecraft:piglin","minecraft:piglin_brute","minecraft:pillager","minecraft:player","minecraft:polar_bear","minecraft:potion","minecraft:pufferfish","minecraft:rabbit","minecraft:ravager","minecraft:salmon","minecraft:sheep","minecraft:shulker","minecraft:shulker_bullet","minecraft:silverfish","minecraft:skeleton","minecraft:skeleton_horse","minecraft:slime","minecraft:small_fireball","minecraft:snow_golem","minecraft:snowball","minecraft:spawner_minecart","minecraft:spectral_arrow","minecraft:spider","minecraft:squid","minecraft:stray","minecraft:strider","minecraft:tnt","minecraft:tnt_minecart","minecraft:trader_llama","minecraft:trident","minecraft:tropical_fish","minecraft:turtle","minecraft:vex","minecraft:villager","minecraft:vindicator","minecraft:wandering_trader","minecraft:witch","minecraft:wither","minecraft:wither_skeleton","minecraft:wither_skull","minecraft:wolf","minecraft:zoglin","minecraft:zombie","minecraft:zombie_horse","minecraft:zombie_villager","minecraft:zombified_piglin"],"entitytags":{"minecraft:arrows":["minecraft:arrow","minecraft:spectral_arrow"],"minecraft:axolotl_always_hostiles":["minecraft:drowned","minecraft:elder_guardian","minecraft:guardian"],"minecraft:axolotl_hunt_targets":["minecraft:cod","minecraft:glow_squid","minecraft:pufferfish","minecraft:salmon","minecraft:squid","minecraft:tropical_fish"],"minecraft:beehive_inhabitors":["minecraft:bee"],"minecraft:freeze_hurts_extra_types":["minecraft:blaze","minecraft:magma_cube","minecraft:strider"],"minecraft:freeze_immune_entity_types":["minecraft:polar_bear","minecraft:snow_golem","minecraft:stray","minecraft:wither"],"minecraft:impact_projectiles":["minecraft:arrow","minecraft:dragon_fireball","minecraft:egg","minecraft:fireball","minecraft:small_fireball","minecraft:snowball","minecraft:spectral_arrow","minecraft:trident","minecraft:wither_skull"],"minecraft:powder_snow_walkable_mobs":["minecraft:endermite","minecraft:fox","minecraft:rabbit","minecraft:silverfish"],"minecraft:raiders":["minecraft:evoker","minecraft:illusioner","minecraft:pillager","minecraft:ravager","minecraft:vindicator","minecraft:witch"],"minecraft:skeletons":["minecraft:skeleton","minecraft:stray","minecraft:wither_skeleton"]},"items":["minecraft:acacia_boat","minecraft:acacia_button","minecraft:acacia_door","minecraft:acacia_fence","minecraft:acacia_fence_gate","minecraft:acacia_leaves","minecraft:acacia_log","minecraft:acacia_planks","minecraft:acacia_pressure_plate","minecraft:acacia_sapling","minecraft:acacia_sign","minecraft:acacia_slab","minecraft:acacia_stairs","minecraft:acacia_trapdoor","minecraft:acacia_wood","minecraft:activator_rail","minecraft:air","minecraft:allium","minecraft:amethyst_block","minecraft:amethyst_cluster","minecraft:amethyst_shard","minecraft:ancient_debris","minecraft:andesite","minecraft:andesite_slab","minecraft:andesite_stairs","minecraft:andesite_wall","minecraft:anvil","minecraft:apple","minecraft:armor_stand","minecraft:arrow","minecraft:axolotl_bucket","minecraft:axolotl_spawn_egg","minecraft:azalea","minecraft:azalea_leaves","minecraft:azure_bluet","minecraft:baked_potato","minecraft:bamboo","minecraft:barrel","minecraft:barrier","minecraft:basalt","minecraft:bat_spawn_egg","minecraft:beacon","minecraft:bedrock","minecraft:bee_nest","minecraft:bee_spawn_egg","minecraft:beef","minecraft:beehive","minecraft:beetroot","minecraft:beetroot_seeds","minecraft:beetroot_soup","minecraft:bell","minecraft:big_dripleaf","minecraft:birch_boat","minecraft:birch_button","minecraft:birch_door","minecraft:birch_fence","minecraft:birch_fence_gate","minecraft:birch_leaves","minecraft:birch_log","minecraft:birch_planks","minecraft:birch_pressure_plate","minecraft:birch_sapling","minecraft:birch_sign","minecraft:birch_slab","minecraft:birch_stairs","minecraft:birch_trapdoor","minecraft:birch_wood","minecraft:black_banner","minecraft:black_bed","minecraft:black_candle","minecraft:black_carpet","minecraft:black_concrete","minecraft:black_concrete_powder","minecraft:black_dye","minecraft:black_glazed_terracotta","minecraft:black_shulker_box","minecraft:black_stained_glass","minecraft:black_stained_glass_pane","minecraft:black_terracotta","minecraft:black_wool","minecraft:blackstone","minecraft:blackstone_slab","minecraft:blackstone_stairs","minecraft:blackstone_wall","minecraft:blast_furnace","minecraft:blaze_powder","minecraft:blaze_rod","minecraft:blaze_spawn_egg","minecraft:blue_banner","minecraft:blue_bed","minecraft:blue_candle","minecraft:blue_carpet","minecraft:blue_concrete","minecraft:blue_concrete_powder","minecraft:blue_dye","minecraft:blue_glazed_terracotta","minecraft:blue_ice","minecraft:blue_orchid","minecraft:blue_shulker_box","minecraft:blue_stained_glass","minecraft:blue_stained_glass_pane","minecraft:blue_terracotta","minecraft:blue_wool","minecraft:bone","minecraft:bone_block","minecraft:bone_meal","minecraft:book","minecraft:bookshelf","minecraft:bow","minecraft:bowl","minecraft:brain_coral","minecraft:brain_coral_block","minecraft:brain_coral_fan","minecraft:bread","minecraft:brewing_stand","minecraft:brick","minecraft:brick_slab","minecraft:brick_stairs","minecraft:brick_wall","minecraft:bricks","minecraft:brown_banner","minecraft:brown_bed","minecraft:brown_candle","minecraft:brown_carpet","minecraft:brown_concrete","minecraft:brown_concrete_powder","minecraft:brown_dye","minecraft:brown_glazed_terracotta","minecraft:brown_mushroom","minecraft:brown_mushroom_block","minecraft:brown_shulker_box","minecraft:brown_stained_glass","minecraft:brown_stained_glass_pane","minecraft:brown_terracotta","minecraft:brown_wool","minecraft:bubble_coral","minecraft:bubble_coral_block","minecraft:bubble_coral_fan","minecraft:bucket","minecraft:budding_amethyst","minecraft:bundle","minecraft:cactus","minecraft:cake","minecraft:calcite","minecraft:campfire","minecraft:candle","minecraft:carrot","minecraft:carrot_on_a_stick","minecraft:cartography_table","minecraft:carved_pumpkin","minecraft:cat_spawn_egg","minecraft:cauldron","minecraft:cave_spider_spawn_egg","minecraft:chain","minecraft:chain_command_block","minecraft:chainmail_boots","minecraft:chainmail_chestplate","minecraft:chainmail_helmet","minecraft:chainmail_leggings","minecraft:charcoal","minecraft:chest","minecraft:chest_minecart","minecraft:chicken","minecraft:chicken_spawn_egg","minecraft:chipped_anvil","minecraft:chiseled_deepslate","minecraft:chiseled_nether_bricks","minecraft:chiseled_polished_blackstone","minecraft:chiseled_quartz_block","minecraft:chiseled_red_sandstone","minecraft:chiseled_sandstone","minecraft:chiseled_stone_bricks","minecraft:chorus_flower","minecraft:chorus_fruit","minecraft:chorus_plant","minecraft:clay","minecraft:clay_ball","minecraft:clock","minecraft:coal","minecraft:coal_block","minecraft:coal_ore","minecraft:coarse_dirt","minecraft:cobbled_deepslate","minecraft:cobbled_deepslate_slab","minecraft:cobbled_deepslate_stairs","minecraft:cobbled_deepslate_wall","minecraft:cobblestone","minecraft:cobblestone_slab","minecraft:cobblestone_stairs","minecraft:cobblestone_wall","minecraft:cobweb","minecraft:cocoa_beans","minecraft:cod","minecraft:cod_bucket","minecraft:cod_spawn_egg","minecraft:command_block","minecraft:command_block_minecart","minecraft:comparator","minecraft:compass","minecraft:composter","minecraft:conduit","minecraft:cooked_beef","minecraft:cooked_chicken","minecraft:cooked_cod","minecraft:cooked_mutton","minecraft:cooked_porkchop","minecraft:cooked_rabbit","minecraft:cooked_salmon","minecraft:cookie","minecraft:copper_block","minecraft:copper_ingot","minecraft:copper_ore","minecraft:cornflower","minecraft:cow_spawn_egg","minecraft:cracked_deepslate_bricks","minecraft:cracked_deepslate_tiles","minecraft:cracked_nether_bricks","minecraft:cracked_polished_blackstone_bricks","minecraft:cracked_stone_bricks","minecraft:crafting_table","minecraft:creeper_banner_pattern","minecraft:creeper_head","minecraft:creeper_spawn_egg","minecraft:crimson_button","minecraft:crimson_door","minecraft:crimson_fence","minecraft:crimson_fence_gate","minecraft:crimson_fungus","minecraft:crimson_hyphae","minecraft:crimson_nylium","minecraft:crimson_planks","minecraft:crimson_pressure_plate","minecraft:crimson_roots","minecraft:crimson_sign","minecraft:crimson_slab","minecraft:crimson_stairs","minecraft:crimson_stem","minecraft:crimson_trapdoor","minecraft:crossbow","minecraft:crying_obsidian","minecraft:cut_copper","minecraft:cut_copper_slab","minecraft:cut_copper_stairs","minecraft:cut_red_sandstone","minecraft:cut_red_sandstone_slab","minecraft:cut_sandstone","minecraft:cut_sandstone_slab","minecraft:cyan_banner","minecraft:cyan_bed","minecraft:cyan_candle","minecraft:cyan_carpet","minecraft:cyan_concrete","minecraft:cyan_concrete_powder","minecraft:cyan_dye","minecraft:cyan_glazed_terracotta","minecraft:cyan_shulker_box","minecraft:cyan_stained_glass","minecraft:cyan_stained_glass_pane","minecraft:cyan_terracotta","minecraft:cyan_wool","minecraft:damaged_anvil","minecraft:dandelion","minecraft:dark_oak_boat","minecraft:dark_oak_button","minecraft:dark_oak_door","minecraft:dark_oak_fence","minecraft:dark_oak_fence_gate","minecraft:dark_oak_leaves","minecraft:dark_oak_log","minecraft:dark_oak_planks","minecraft:dark_oak_pressure_plate","minecraft:dark_oak_sapling","minecraft:dark_oak_sign","minecraft:dark_oak_slab","minecraft:dark_oak_stairs","minecraft:dark_oak_trapdoor","minecraft:dark_oak_wood","minecraft:dark_prismarine","minecraft:dark_prismarine_slab","minecraft:dark_prismarine_stairs","minecraft:daylight_detector","minecraft:dead_brain_coral","minecraft:dead_brain_coral_block","minecraft:dead_brain_coral_fan","minecraft:dead_bubble_coral","minecraft:dead_bubble_coral_block","minecraft:dead_bubble_coral_fan","minecraft:dead_bush","minecraft:dead_fire_coral","minecraft:dead_fire_coral_block","minecraft:dead_fire_coral_fan","minecraft:dead_horn_coral","minecraft:dead_horn_coral_block","minecraft:dead_horn_coral_fan","minecraft:dead_tube_coral","minecraft:dead_tube_coral_block","minecraft:dead_tube_coral_fan","minecraft:debug_stick","minecraft:deepslate","minecraft:deepslate_brick_slab","minecraft:deepslate_brick_stairs","minecraft:deepslate_brick_wall","minecraft:deepslate_bricks","minecraft:deepslate_coal_ore","minecraft:deepslate_copper_ore","minecraft:deepslate_diamond_ore","minecraft:deepslate_emerald_ore","minecraft:deepslate_gold_ore","minecraft:deepslate_iron_ore","minecraft:deepslate_lapis_ore","minecraft:deepslate_redstone_ore","minecraft:deepslate_tile_slab","minecraft:deepslate_tile_stairs","minecraft:deepslate_tile_wall","minecraft:deepslate_tiles","minecraft:detector_rail","minecraft:diamond","minecraft:diamond_axe","minecraft:diamond_block","minecraft:diamond_boots","minecraft:diamond_chestplate","minecraft:diamond_helmet","minecraft:diamond_hoe","minecraft:diamond_horse_armor","minecraft:diamond_leggings","minecraft:diamond_ore","minecraft:diamond_pickaxe","minecraft:diamond_shovel","minecraft:diamond_sword","minecraft:diorite","minecraft:diorite_slab","minecraft:diorite_stairs","minecraft:diorite_wall","minecraft:dirt","minecraft:dirt_path","minecraft:dispenser","minecraft:dolphin_spawn_egg","minecraft:donkey_spawn_egg","minecraft:dragon_breath","minecraft:dragon_egg","minecraft:dragon_head","minecraft:dried_kelp","minecraft:dried_kelp_block","minecraft:dripstone_block","minecraft:dropper","minecraft:drowned_spawn_egg","minecraft:egg","minecraft:elder_guardian_spawn_egg","minecraft:elytra","minecraft:emerald","minecraft:emerald_block","minecraft:emerald_ore","minecraft:enchanted_book","minecraft:enchanted_golden_apple","minecraft:enchanting_table","minecraft:end_crystal","minecraft:end_portal_frame","minecraft:end_rod","minecraft:end_stone","minecraft:end_stone_brick_slab","minecraft:end_stone_brick_stairs","minecraft:end_stone_brick_wall","minecraft:end_stone_bricks","minecraft:ender_chest","minecraft:ender_eye","minecraft:ender_pearl","minecraft:enderman_spawn_egg","minecraft:endermite_spawn_egg","minecraft:evoker_spawn_egg","minecraft:experience_bottle","minecraft:exposed_copper","minecraft:exposed_cut_copper","minecraft:exposed_cut_copper_slab","minecraft:exposed_cut_copper_stairs","minecraft:farmland","minecraft:feather","minecraft:fermented_spider_eye","minecraft:fern","minecraft:filled_map","minecraft:fire_charge","minecraft:fire_coral","minecraft:fire_coral_block","minecraft:fire_coral_fan","minecraft:firework_rocket","minecraft:firework_star","minecraft:fishing_rod","minecraft:fletching_table","minecraft:flint","minecraft:flint_and_steel","minecraft:flower_banner_pattern","minecraft:flower_pot","minecraft:flowering_azalea","minecraft:flowering_azalea_leaves","minecraft:fox_spawn_egg","minecraft:furnace","minecraft:furnace_minecart","minecraft:ghast_spawn_egg","minecraft:ghast_tear","minecraft:gilded_blackstone","minecraft:glass","minecraft:glass_bottle","minecraft:glass_pane","minecraft:glistering_melon_slice","minecraft:globe_banner_pattern","minecraft:glow_berries","minecraft:glow_ink_sac","minecraft:glow_item_frame","minecraft:glow_lichen","minecraft:glow_squid_spawn_egg","minecraft:glowstone","minecraft:glowstone_dust","minecraft:goat_spawn_egg","minecraft:gold_block","minecraft:gold_ingot","minecraft:gold_nugget","minecraft:gold_ore","minecraft:golden_apple","minecraft:golden_axe","minecraft:golden_boots","minecraft:golden_carrot","minecraft:golden_chestplate","minecraft:golden_helmet","minecraft:golden_hoe","minecraft:golden_horse_armor","minecraft:golden_leggings","minecraft:golden_pickaxe","minecraft:golden_shovel","minecraft:golden_sword","minecraft:granite","minecraft:granite_slab","minecraft:granite_stairs","minecraft:granite_wall","minecraft:grass","minecraft:grass_block","minecraft:gravel","minecraft:gray_banner","minecraft:gray_bed","minecraft:gray_candle","minecraft:gray_carpet","minecraft:gray_concrete","minecraft:gray_concrete_powder","minecraft:gray_dye","minecraft:gray_glazed_terracotta","minecraft:gray_shulker_box","minecraft:gray_stained_glass","minecraft:gray_stained_glass_pane","minecraft:gray_terracotta","minecraft:gray_wool","minecraft:green_banner","minecraft:green_bed","minecraft:green_candle","minecraft:green_carpet","minecraft:green_concrete","minecraft:green_concrete_powder","minecraft:green_dye","minecraft:green_glazed_terracotta","minecraft:green_shulker_box","minecraft:green_stained_glass","minecraft:green_stained_glass_pane","minecraft:green_terracotta","minecraft:green_wool","minecraft:grindstone","minecraft:guardian_spawn_egg","minecraft:gunpowder","minecraft:hanging_roots","minecraft:hay_block","minecraft:heart_of_the_sea","minecraft:heavy_weighted_pressure_plate","minecraft:hoglin_spawn_egg","minecraft:honey_block","minecraft:honey_bottle","minecraft:honeycomb","minecraft:honeycomb_block","minecraft:hopper","minecraft:hopper_minecart","minecraft:horn_coral","minecraft:horn_coral_block","minecraft:horn_coral_fan","minecraft:horse_spawn_egg","minecraft:husk_spawn_egg","minecraft:ice","minecraft:infested_chiseled_stone_bricks","minecraft:infested_cobblestone","minecraft:infested_cracked_stone_bricks","minecraft:infested_deepslate","minecraft:infested_mossy_stone_bricks","minecraft:infested_stone","minecraft:infested_stone_bricks","minecraft:ink_sac","minecraft:iron_axe","minecraft:iron_bars","minecraft:iron_block","minecraft:iron_boots","minecraft:iron_chestplate","minecraft:iron_door","minecraft:iron_helmet","minecraft:iron_hoe","minecraft:iron_horse_armor","minecraft:iron_ingot","minecraft:iron_leggings","minecraft:iron_nugget","minecraft:iron_ore","minecraft:iron_pickaxe","minecraft:iron_shovel","minecraft:iron_sword","minecraft:iron_trapdoor","minecraft:item_frame","minecraft:jack_o_lantern","minecraft:jigsaw","minecraft:jukebox","minecraft:jungle_boat","minecraft:jungle_button","minecraft:jungle_door","minecraft:jungle_fence","minecraft:jungle_fence_gate","minecraft:jungle_leaves","minecraft:jungle_log","minecraft:jungle_planks","minecraft:jungle_pressure_plate","minecraft:jungle_sapling","minecraft:jungle_sign","minecraft:jungle_slab","minecraft:jungle_stairs","minecraft:jungle_trapdoor","minecraft:jungle_wood","minecraft:kelp","minecraft:knowledge_book","minecraft:ladder","minecraft:lantern","minecraft:lapis_block","minecraft:lapis_lazuli","minecraft:lapis_ore","minecraft:large_amethyst_bud","minecraft:large_fern","minecraft:lava_bucket","minecraft:lead","minecraft:leather","minecraft:leather_boots","minecraft:leather_chestplate","minecraft:leather_helmet","minecraft:leather_horse_armor","minecraft:leather_leggings","minecraft:lectern","minecraft:lever","minecraft:light","minecraft:light_blue_banner","minecraft:light_blue_bed","minecraft:light_blue_candle","minecraft:light_blue_carpet","minecraft:light_blue_concrete","minecraft:light_blue_concrete_powder","minecraft:light_blue_dye","minecraft:light_blue_glazed_terracotta","minecraft:light_blue_shulker_box","minecraft:light_blue_stained_glass","minecraft:light_blue_stained_glass_pane","minecraft:light_blue_terracotta","minecraft:light_blue_wool","minecraft:light_gray_banner","minecraft:light_gray_bed","minecraft:light_gray_candle","minecraft:light_gray_carpet","minecraft:light_gray_concrete","minecraft:light_gray_concrete_powder","minecraft:light_gray_dye","minecraft:light_gray_glazed_terracotta","minecraft:light_gray_shulker_box","minecraft:light_gray_stained_glass","minecraft:light_gray_stained_glass_pane","minecraft:light_gray_terracotta","minecraft:light_gray_wool","minecraft:light_weighted_pressure_plate","minecraft:lightning_rod","minecraft:lilac","minecraft:lily_of_the_valley","minecraft:lily_pad","minecraft:lime_banner","minecraft:lime_bed","minecraft:lime_candle","minecraft:lime_carpet","minecraft:lime_concrete","minecraft:lime_concrete_powder","minecraft:lime_dye","minecraft:lime_glazed_terracotta","minecraft:lime_shulker_box","minecraft:lime_stained_glass","minecraft:lime_stained_glass_pane","minecraft:lime_terracotta","minecraft:lime_wool","minecraft:lingering_potion","minecraft:llama_spawn_egg","minecraft:lodestone","minecraft:loom","minecraft:magenta_banner","minecraft:magenta_bed","minecraft:magenta_candle","minecraft:magenta_carpet","minecraft:magenta_concrete","minecraft:magenta_concrete_powder","minecraft:magenta_dye","minecraft:magenta_glazed_terracotta","minecraft:magenta_shulker_box","minecraft:magenta_stained_glass","minecraft:magenta_stained_glass_pane","minecraft:magenta_terracotta","minecraft:magenta_wool","minecraft:magma_block","minecraft:magma_cream","minecraft:magma_cube_spawn_egg","minecraft:map","minecraft:medium_amethyst_bud","minecraft:melon","minecraft:melon_seeds","minecraft:melon_slice","minecraft:milk_bucket","minecraft:minecart","minecraft:mojang_banner_pattern","minecraft:mooshroom_spawn_egg","minecraft:moss_block","minecraft:moss_carpet","minecraft:mossy_cobblestone","minecraft:mossy_cobblestone_slab","minecraft:mossy_cobblestone_stairs","minecraft:mossy_cobblestone_wall","minecraft:mossy_stone_brick_slab","minecraft:mossy_stone_brick_stairs","minecraft:mossy_stone_brick_wall","minecraft:mossy_stone_bricks","minecraft:mule_spawn_egg","minecraft:mushroom_stem","minecraft:mushroom_stew","minecraft:music_disc_11","minecraft:music_disc_13","minecraft:music_disc_blocks","minecraft:music_disc_cat","minecraft:music_disc_chirp","minecraft:music_disc_far","minecraft:music_disc_mall","minecraft:music_disc_mellohi","minecraft:music_disc_pigstep","minecraft:music_disc_stal","minecraft:music_disc_strad","minecraft:music_disc_wait","minecraft:music_disc_ward","minecraft:mutton","minecraft:mycelium","minecraft:name_tag","minecraft:nautilus_shell","minecraft:nether_brick","minecraft:nether_brick_fence","minecraft:nether_brick_slab","minecraft:nether_brick_stairs","minecraft:nether_brick_wall","minecraft:nether_bricks","minecraft:nether_gold_ore","minecraft:nether_quartz_ore","minecraft:nether_sprouts","minecraft:nether_star","minecraft:nether_wart","minecraft:nether_wart_block","minecraft:netherite_axe","minecraft:netherite_block","minecraft:netherite_boots","minecraft:netherite_chestplate","minecraft:netherite_helmet","minecraft:netherite_hoe","minecraft:netherite_ingot","minecraft:netherite_leggings","minecraft:netherite_pickaxe","minecraft:netherite_scrap","minecraft:netherite_shovel","minecraft:netherite_sword","minecraft:netherrack","minecraft:note_block","minecraft:oak_boat","minecraft:oak_button","minecraft:oak_door","minecraft:oak_fence","minecraft:oak_fence_gate","minecraft:oak_leaves","minecraft:oak_log","minecraft:oak_planks","minecraft:oak_pressure_plate","minecraft:oak_sapling","minecraft:oak_sign","minecraft:oak_slab","minecraft:oak_stairs","minecraft:oak_trapdoor","minecraft:oak_wood","minecraft:observer","minecraft:obsidian","minecraft:ocelot_spawn_egg","minecraft:orange_banner","minecraft:orange_bed","minecraft:orange_candle","minecraft:orange_carpet","minecraft:orange_concrete","minecraft:orange_concrete_powder","minecraft:orange_dye","minecraft:orange_glazed_terracotta","minecraft:orange_shulker_box","minecraft:orange_stained_glass","minecraft:orange_stained_glass_pane","minecraft:orange_terracotta","minecraft:orange_tulip","minecraft:orange_wool","minecraft:oxeye_daisy","minecraft:oxidized_copper","minecraft:oxidized_cut_copper","minecraft:oxidized_cut_copper_slab","minecraft:oxidized_cut_copper_stairs","minecraft:packed_ice","minecraft:painting","minecraft:panda_spawn_egg","minecraft:paper","minecraft:parrot_spawn_egg","minecraft:peony","minecraft:petrified_oak_slab","minecraft:phantom_membrane","minecraft:phantom_spawn_egg","minecraft:pig_spawn_egg","minecraft:piglin_banner_pattern","minecraft:piglin_brute_spawn_egg","minecraft:piglin_spawn_egg","minecraft:pillager_spawn_egg","minecraft:pink_banner","minecraft:pink_bed","minecraft:pink_candle","minecraft:pink_carpet","minecraft:pink_concrete","minecraft:pink_concrete_powder","minecraft:pink_dye","minecraft:pink_glazed_terracotta","minecraft:pink_shulker_box","minecraft:pink_stained_glass","minecraft:pink_stained_glass_pane","minecraft:pink_terracotta","minecraft:pink_tulip","minecraft:pink_wool","minecraft:piston","minecraft:player_head","minecraft:podzol","minecraft:pointed_dripstone","minecraft:poisonous_potato","minecraft:polar_bear_spawn_egg","minecraft:polished_andesite","minecraft:polished_andesite_slab","minecraft:polished_andesite_stairs","minecraft:polished_basalt","minecraft:polished_blackstone","minecraft:polished_blackstone_brick_slab","minecraft:polished_blackstone_brick_stairs","minecraft:polished_blackstone_brick_wall","minecraft:polished_blackstone_bricks","minecraft:polished_blackstone_button","minecraft:polished_blackstone_pressure_plate","minecraft:polished_blackstone_slab","minecraft:polished_blackstone_stairs","minecraft:polished_blackstone_wall","minecraft:polished_deepslate","minecraft:polished_deepslate_slab","minecraft:polished_deepslate_stairs","minecraft:polished_deepslate_wall","minecraft:polished_diorite","minecraft:polished_diorite_slab","minecraft:polished_diorite_stairs","minecraft:polished_granite","minecraft:polished_granite_slab","minecraft:polished_granite_stairs","minecraft:popped_chorus_fruit","minecraft:poppy","minecraft:porkchop","minecraft:potato","minecraft:potion","minecraft:powder_snow_bucket","minecraft:powered_rail","minecraft:prismarine","minecraft:prismarine_brick_slab","minecraft:prismarine_brick_stairs","minecraft:prismarine_bricks","minecraft:prismarine_crystals","minecraft:prismarine_shard","minecraft:prismarine_slab","minecraft:prismarine_stairs","minecraft:prismarine_wall","minecraft:pufferfish","minecraft:pufferfish_bucket","minecraft:pufferfish_spawn_egg","minecraft:pumpkin","minecraft:pumpkin_pie","minecraft:pumpkin_seeds","minecraft:purple_banner","minecraft:purple_bed","minecraft:purple_candle","minecraft:purple_carpet","minecraft:purple_concrete","minecraft:purple_concrete_powder","minecraft:purple_dye","minecraft:purple_glazed_terracotta","minecraft:purple_shulker_box","minecraft:purple_stained_glass","minecraft:purple_stained_glass_pane","minecraft:purple_terracotta","minecraft:purple_wool","minecraft:purpur_block","minecraft:purpur_pillar","minecraft:purpur_slab","minecraft:purpur_stairs","minecraft:quartz","minecraft:quartz_block","minecraft:quartz_bricks","minecraft:quartz_pillar","minecraft:quartz_slab","minecraft:quartz_stairs","minecraft:rabbit","minecraft:rabbit_foot","minecraft:rabbit_hide","minecraft:rabbit_spawn_egg","minecraft:rabbit_stew","minecraft:rail","minecraft:ravager_spawn_egg","minecraft:raw_copper","minecraft:raw_copper_block","minecraft:raw_gold","minecraft:raw_gold_block","minecraft:raw_iron","minecraft:raw_iron_block","minecraft:red_banner","minecraft:red_bed","minecraft:red_candle","minecraft:red_carpet","minecraft:red_concrete","minecraft:red_concrete_powder","minecraft:red_dye","minecraft:red_glazed_terracotta","minecraft:red_mushroom","minecraft:red_mushroom_block","minecraft:red_nether_brick_slab","minecraft:red_nether_brick_stairs","minecraft:red_nether_brick_wall","minecraft:red_nether_bricks","minecraft:red_sand","minecraft:red_sandstone","minecraft:red_sandstone_slab","minecraft:red_sandstone_stairs","minecraft:red_sandstone_wall","minecraft:red_shulker_box","minecraft:red_stained_glass","minecraft:red_stained_glass_pane","minecraft:red_terracotta","minecraft:red_tulip","minecraft:red_wool","minecraft:redstone","minecraft:redstone_block","minecraft:redstone_lamp","minecraft:redstone_ore","minecraft:redstone_torch","minecraft:repeater","minecraft:repeating_command_block","minecraft:respawn_anchor","minecraft:rooted_dirt","minecraft:rose_bush","minecraft:rotten_flesh","minecraft:saddle","minecraft:salmon","minecraft:salmon_bucket","minecraft:salmon_spawn_egg","minecraft:sand","minecraft:sandstone","minecraft:sandstone_slab","minecraft:sandstone_stairs","minecraft:sandstone_wall","minecraft:scaffolding","minecraft:sculk_sensor","minecraft:scute","minecraft:sea_lantern","minecraft:sea_pickle","minecraft:seagrass","minecraft:shears","minecraft:sheep_spawn_egg","minecraft:shield","minecraft:shroomlight","minecraft:shulker_box","minecraft:shulker_shell","minecraft:shulker_spawn_egg","minecraft:silverfish_spawn_egg","minecraft:skeleton_horse_spawn_egg","minecraft:skeleton_skull","minecraft:skeleton_spawn_egg","minecraft:skull_banner_pattern","minecraft:slime_ball","minecraft:slime_block","minecraft:slime_spawn_egg","minecraft:small_amethyst_bud","minecraft:small_dripleaf","minecraft:smithing_table","minecraft:smoker","minecraft:smooth_basalt","minecraft:smooth_quartz","minecraft:smooth_quartz_slab","minecraft:smooth_quartz_stairs","minecraft:smooth_red_sandstone","minecraft:smooth_red_sandstone_slab","minecraft:smooth_red_sandstone_stairs","minecraft:smooth_sandstone","minecraft:smooth_sandstone_slab","minecraft:smooth_sandstone_stairs","minecraft:smooth_stone","minecraft:smooth_stone_slab","minecraft:snow","minecraft:snow_block","minecraft:snowball","minecraft:soul_campfire","minecraft:soul_lantern","minecraft:soul_sand","minecraft:soul_soil","minecraft:soul_torch","minecraft:spawner","minecraft:spectral_arrow","minecraft:spider_eye","minecraft:spider_spawn_egg","minecraft:splash_potion","minecraft:sponge","minecraft:spore_blossom","minecraft:spruce_boat","minecraft:spruce_button","minecraft:spruce_door","minecraft:spruce_fence","minecraft:spruce_fence_gate","minecraft:spruce_leaves","minecraft:spruce_log","minecraft:spruce_planks","minecraft:spruce_pressure_plate","minecraft:spruce_sapling","minecraft:spruce_sign","minecraft:spruce_slab","minecraft:spruce_stairs","minecraft:spruce_trapdoor","minecraft:spruce_wood","minecraft:spyglass","minecraft:squid_spawn_egg","minecraft:stick","minecraft:sticky_piston","minecraft:stone","minecraft:stone_axe","minecraft:stone_brick_slab","minecraft:stone_brick_stairs","minecraft:stone_brick_wall","minecraft:stone_bricks","minecraft:stone_button","minecraft:stone_hoe","minecraft:stone_pickaxe","minecraft:stone_pressure_plate","minecraft:stone_shovel","minecraft:stone_slab","minecraft:stone_stairs","minecraft:stone_sword","minecraft:stonecutter","minecraft:stray_spawn_egg","minecraft:strider_spawn_egg","minecraft:string","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:structure_block","minecraft:structure_void","minecraft:sugar","minecraft:sugar_cane","minecraft:sunflower","minecraft:suspicious_stew","minecraft:sweet_berries","minecraft:tall_grass","minecraft:target","minecraft:terracotta","minecraft:tinted_glass","minecraft:tipped_arrow","minecraft:tnt","minecraft:tnt_minecart","minecraft:torch","minecraft:totem_of_undying","minecraft:trader_llama_spawn_egg","minecraft:trapped_chest","minecraft:trident","minecraft:tripwire_hook","minecraft:tropical_fish","minecraft:tropical_fish_bucket","minecraft:tropical_fish_spawn_egg","minecraft:tube_coral","minecraft:tube_coral_block","minecraft:tube_coral_fan","minecraft:tuff","minecraft:turtle_egg","minecraft:turtle_helmet","minecraft:turtle_spawn_egg","minecraft:twisting_vines","minecraft:vex_spawn_egg","minecraft:villager_spawn_egg","minecraft:vindicator_spawn_egg","minecraft:vine","minecraft:wandering_trader_spawn_egg","minecraft:warped_button","minecraft:warped_door","minecraft:warped_fence","minecraft:warped_fence_gate","minecraft:warped_fungus","minecraft:warped_fungus_on_a_stick","minecraft:warped_hyphae","minecraft:warped_nylium","minecraft:warped_planks","minecraft:warped_pressure_plate","minecraft:warped_roots","minecraft:warped_sign","minecraft:warped_slab","minecraft:warped_stairs","minecraft:warped_stem","minecraft:warped_trapdoor","minecraft:warped_wart_block","minecraft:water_bucket","minecraft:waxed_copper_block","minecraft:waxed_cut_copper","minecraft:waxed_cut_copper_slab","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_copper","minecraft:waxed_exposed_cut_copper","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_oxidized_copper","minecraft:waxed_oxidized_cut_copper","minecraft:waxed_oxidized_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_weathered_copper","minecraft:waxed_weathered_cut_copper","minecraft:waxed_weathered_cut_copper_slab","minecraft:waxed_weathered_cut_copper_stairs","minecraft:weathered_copper","minecraft:weathered_cut_copper","minecraft:weathered_cut_copper_slab","minecraft:weathered_cut_copper_stairs","minecraft:weeping_vines","minecraft:wet_sponge","minecraft:wheat","minecraft:wheat_seeds","minecraft:white_banner","minecraft:white_bed","minecraft:white_candle","minecraft:white_carpet","minecraft:white_concrete","minecraft:white_concrete_powder","minecraft:white_dye","minecraft:white_glazed_terracotta","minecraft:white_shulker_box","minecraft:white_stained_glass","minecraft:white_stained_glass_pane","minecraft:white_terracotta","minecraft:white_tulip","minecraft:white_wool","minecraft:witch_spawn_egg","minecraft:wither_rose","minecraft:wither_skeleton_skull","minecraft:wither_skeleton_spawn_egg","minecraft:wolf_spawn_egg","minecraft:wooden_axe","minecraft:wooden_hoe","minecraft:wooden_pickaxe","minecraft:wooden_shovel","minecraft:wooden_sword","minecraft:writable_book","minecraft:written_book","minecraft:yellow_banner","minecraft:yellow_bed","minecraft:yellow_candle","minecraft:yellow_carpet","minecraft:yellow_concrete","minecraft:yellow_concrete_powder","minecraft:yellow_dye","minecraft:yellow_glazed_terracotta","minecraft:yellow_shulker_box","minecraft:yellow_stained_glass","minecraft:yellow_stained_glass_pane","minecraft:yellow_terracotta","minecraft:yellow_wool","minecraft:zoglin_spawn_egg","minecraft:zombie_head","minecraft:zombie_horse_spawn_egg","minecraft:zombie_spawn_egg","minecraft:zombie_villager_spawn_egg","minecraft:zombified_piglin_spawn_egg"],"itemtags":{"minecraft:acacia_logs":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood"],"minecraft:anvil":["minecraft:anvil","minecraft:chipped_anvil","minecraft:damaged_anvil"],"minecraft:arrows":["minecraft:arrow","minecraft:spectral_arrow","minecraft:tipped_arrow"],"minecraft:axolotl_tempt_items":["minecraft:tropical_fish_bucket"],"minecraft:banners":["minecraft:black_banner","minecraft:blue_banner","minecraft:brown_banner","minecraft:cyan_banner","minecraft:gray_banner","minecraft:green_banner","minecraft:light_blue_banner","minecraft:light_gray_banner","minecraft:lime_banner","minecraft:magenta_banner","minecraft:orange_banner","minecraft:pink_banner","minecraft:purple_banner","minecraft:red_banner","minecraft:white_banner","minecraft:yellow_banner"],"minecraft:beacon_payment_items":["minecraft:diamond","minecraft:emerald","minecraft:gold_ingot","minecraft:iron_ingot","minecraft:netherite_ingot"],"minecraft:beds":["minecraft:black_bed","minecraft:blue_bed","minecraft:brown_bed","minecraft:cyan_bed","minecraft:gray_bed","minecraft:green_bed","minecraft:light_blue_bed","minecraft:light_gray_bed","minecraft:lime_bed","minecraft:magenta_bed","minecraft:orange_bed","minecraft:pink_bed","minecraft:purple_bed","minecraft:red_bed","minecraft:white_bed","minecraft:yellow_bed"],"minecraft:birch_logs":["minecraft:birch_log","minecraft:birch_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood"],"minecraft:boats":["minecraft:acacia_boat","minecraft:birch_boat","minecraft:dark_oak_boat","minecraft:jungle_boat","minecraft:oak_boat","minecraft:spruce_boat"],"minecraft:buttons":["minecraft:acacia_button","minecraft:birch_button","minecraft:crimson_button","minecraft:dark_oak_button","minecraft:jungle_button","minecraft:oak_button","minecraft:polished_blackstone_button","minecraft:spruce_button","minecraft:stone_button","minecraft:warped_button"],"minecraft:candles":["minecraft:black_candle","minecraft:blue_candle","minecraft:brown_candle","minecraft:candle","minecraft:cyan_candle","minecraft:gray_candle","minecraft:green_candle","minecraft:light_blue_candle","minecraft:light_gray_candle","minecraft:lime_candle","minecraft:magenta_candle","minecraft:orange_candle","minecraft:pink_candle","minecraft:purple_candle","minecraft:red_candle","minecraft:white_candle","minecraft:yellow_candle"],"minecraft:carpets":["minecraft:black_carpet","minecraft:blue_carpet","minecraft:brown_carpet","minecraft:cyan_carpet","minecraft:gray_carpet","minecraft:green_carpet","minecraft:light_blue_carpet","minecraft:light_gray_carpet","minecraft:lime_carpet","minecraft:magenta_carpet","minecraft:orange_carpet","minecraft:pink_carpet","minecraft:purple_carpet","minecraft:red_carpet","minecraft:white_carpet","minecraft:yellow_carpet"],"minecraft:cluster_max_harvestables":["minecraft:diamond_pickaxe","minecraft:golden_pickaxe","minecraft:iron_pickaxe","minecraft:netherite_pickaxe","minecraft:stone_pickaxe","minecraft:wooden_pickaxe"],"minecraft:coal_ores":["minecraft:coal_ore","minecraft:deepslate_coal_ore"],"minecraft:coals":["minecraft:charcoal","minecraft:coal"],"minecraft:copper_ores":["minecraft:copper_ore","minecraft:deepslate_copper_ore"],"minecraft:creeper_drop_music_discs":["minecraft:music_disc_11","minecraft:music_disc_13","minecraft:music_disc_blocks","minecraft:music_disc_cat","minecraft:music_disc_chirp","minecraft:music_disc_far","minecraft:music_disc_mall","minecraft:music_disc_mellohi","minecraft:music_disc_stal","minecraft:music_disc_strad","minecraft:music_disc_wait","minecraft:music_disc_ward"],"minecraft:crimson_stems":["minecraft:crimson_hyphae","minecraft:crimson_stem","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem"],"minecraft:dark_oak_logs":["minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood"],"minecraft:diamond_ores":["minecraft:deepslate_diamond_ore","minecraft:diamond_ore"],"minecraft:doors":["minecraft:acacia_door","minecraft:birch_door","minecraft:crimson_door","minecraft:dark_oak_door","minecraft:iron_door","minecraft:jungle_door","minecraft:oak_door","minecraft:spruce_door","minecraft:warped_door"],"minecraft:emerald_ores":["minecraft:deepslate_emerald_ore","minecraft:emerald_ore"],"minecraft:fences":["minecraft:acacia_fence","minecraft:birch_fence","minecraft:crimson_fence","minecraft:dark_oak_fence","minecraft:jungle_fence","minecraft:nether_brick_fence","minecraft:oak_fence","minecraft:spruce_fence","minecraft:warped_fence"],"minecraft:fishes":["minecraft:cod","minecraft:cooked_cod","minecraft:cooked_salmon","minecraft:pufferfish","minecraft:salmon","minecraft:tropical_fish"],"minecraft:flowers":["minecraft:allium","minecraft:azure_bluet","minecraft:blue_orchid","minecraft:cornflower","minecraft:dandelion","minecraft:flowering_azalea","minecraft:flowering_azalea_leaves","minecraft:lilac","minecraft:lily_of_the_valley","minecraft:orange_tulip","minecraft:oxeye_daisy","minecraft:peony","minecraft:pink_tulip","minecraft:poppy","minecraft:red_tulip","minecraft:rose_bush","minecraft:sunflower","minecraft:white_tulip","minecraft:wither_rose"],"minecraft:fox_food":["minecraft:glow_berries","minecraft:sweet_berries"],"minecraft:freeze_immune_wearables":["minecraft:leather_boots","minecraft:leather_chestplate","minecraft:leather_helmet","minecraft:leather_horse_armor","minecraft:leather_leggings"],"minecraft:gold_ores":["minecraft:deepslate_gold_ore","minecraft:gold_ore","minecraft:nether_gold_ore"],"minecraft:ignored_by_piglin_babies":["minecraft:leather"],"minecraft:iron_ores":["minecraft:deepslate_iron_ore","minecraft:iron_ore"],"minecraft:jungle_logs":["minecraft:jungle_log","minecraft:jungle_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood"],"minecraft:lapis_ores":["minecraft:deepslate_lapis_ore","minecraft:lapis_ore"],"minecraft:leaves":["minecraft:acacia_leaves","minecraft:azalea_leaves","minecraft:birch_leaves","minecraft:dark_oak_leaves","minecraft:flowering_azalea_leaves","minecraft:jungle_leaves","minecraft:oak_leaves","minecraft:spruce_leaves"],"minecraft:lectern_books":["minecraft:writable_book","minecraft:written_book"],"minecraft:logs":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:birch_log","minecraft:birch_wood","minecraft:crimson_hyphae","minecraft:crimson_stem","minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:jungle_log","minecraft:jungle_wood","minecraft:oak_log","minecraft:oak_wood","minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_hyphae","minecraft:warped_stem"],"minecraft:logs_that_burn":["minecraft:acacia_log","minecraft:acacia_wood","minecraft:birch_log","minecraft:birch_wood","minecraft:dark_oak_log","minecraft:dark_oak_wood","minecraft:jungle_log","minecraft:jungle_wood","minecraft:oak_log","minecraft:oak_wood","minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_acacia_log","minecraft:stripped_acacia_wood","minecraft:stripped_birch_log","minecraft:stripped_birch_wood","minecraft:stripped_dark_oak_log","minecraft:stripped_dark_oak_wood","minecraft:stripped_jungle_log","minecraft:stripped_jungle_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood"],"minecraft:music_discs":["minecraft:music_disc_11","minecraft:music_disc_13","minecraft:music_disc_blocks","minecraft:music_disc_cat","minecraft:music_disc_chirp","minecraft:music_disc_far","minecraft:music_disc_mall","minecraft:music_disc_mellohi","minecraft:music_disc_pigstep","minecraft:music_disc_stal","minecraft:music_disc_strad","minecraft:music_disc_wait","minecraft:music_disc_ward"],"minecraft:non_flammable_wood":["minecraft:crimson_button","minecraft:crimson_door","minecraft:crimson_fence","minecraft:crimson_fence_gate","minecraft:crimson_hyphae","minecraft:crimson_planks","minecraft:crimson_pressure_plate","minecraft:crimson_sign","minecraft:crimson_slab","minecraft:crimson_stairs","minecraft:crimson_stem","minecraft:crimson_trapdoor","minecraft:stripped_crimson_hyphae","minecraft:stripped_crimson_stem","minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_button","minecraft:warped_door","minecraft:warped_fence","minecraft:warped_fence_gate","minecraft:warped_hyphae","minecraft:warped_planks","minecraft:warped_pressure_plate","minecraft:warped_sign","minecraft:warped_slab","minecraft:warped_stairs","minecraft:warped_stem","minecraft:warped_trapdoor"],"minecraft:oak_logs":["minecraft:oak_log","minecraft:oak_wood","minecraft:stripped_oak_log","minecraft:stripped_oak_wood"],"minecraft:occludes_vibration_signals":["minecraft:black_wool","minecraft:blue_wool","minecraft:brown_wool","minecraft:cyan_wool","minecraft:gray_wool","minecraft:green_wool","minecraft:light_blue_wool","minecraft:light_gray_wool","minecraft:lime_wool","minecraft:magenta_wool","minecraft:orange_wool","minecraft:pink_wool","minecraft:purple_wool","minecraft:red_wool","minecraft:white_wool","minecraft:yellow_wool"],"minecraft:piglin_food":["minecraft:cooked_porkchop","minecraft:porkchop"],"minecraft:piglin_loved":["minecraft:bell","minecraft:clock","minecraft:deepslate_gold_ore","minecraft:enchanted_golden_apple","minecraft:gilded_blackstone","minecraft:glistering_melon_slice","minecraft:gold_block","minecraft:gold_ingot","minecraft:gold_ore","minecraft:golden_apple","minecraft:golden_axe","minecraft:golden_boots","minecraft:golden_carrot","minecraft:golden_chestplate","minecraft:golden_helmet","minecraft:golden_hoe","minecraft:golden_horse_armor","minecraft:golden_leggings","minecraft:golden_pickaxe","minecraft:golden_shovel","minecraft:golden_sword","minecraft:light_weighted_pressure_plate","minecraft:nether_gold_ore","minecraft:raw_gold","minecraft:raw_gold_block"],"minecraft:piglin_repellents":["minecraft:soul_campfire","minecraft:soul_lantern","minecraft:soul_torch"],"minecraft:planks":["minecraft:acacia_planks","minecraft:birch_planks","minecraft:crimson_planks","minecraft:dark_oak_planks","minecraft:jungle_planks","minecraft:oak_planks","minecraft:spruce_planks","minecraft:warped_planks"],"minecraft:rails":["minecraft:activator_rail","minecraft:detector_rail","minecraft:powered_rail","minecraft:rail"],"minecraft:redstone_ores":["minecraft:deepslate_redstone_ore","minecraft:redstone_ore"],"minecraft:sand":["minecraft:red_sand","minecraft:sand"],"minecraft:saplings":["minecraft:acacia_sapling","minecraft:azalea","minecraft:birch_sapling","minecraft:dark_oak_sapling","minecraft:flowering_azalea","minecraft:jungle_sapling","minecraft:oak_sapling","minecraft:spruce_sapling"],"minecraft:signs":["minecraft:acacia_sign","minecraft:birch_sign","minecraft:crimson_sign","minecraft:dark_oak_sign","minecraft:jungle_sign","minecraft:oak_sign","minecraft:spruce_sign","minecraft:warped_sign"],"minecraft:slabs":["minecraft:acacia_slab","minecraft:andesite_slab","minecraft:birch_slab","minecraft:blackstone_slab","minecraft:brick_slab","minecraft:cobbled_deepslate_slab","minecraft:cobblestone_slab","minecraft:crimson_slab","minecraft:cut_copper_slab","minecraft:cut_red_sandstone_slab","minecraft:cut_sandstone_slab","minecraft:dark_oak_slab","minecraft:dark_prismarine_slab","minecraft:deepslate_brick_slab","minecraft:deepslate_tile_slab","minecraft:diorite_slab","minecraft:end_stone_brick_slab","minecraft:exposed_cut_copper_slab","minecraft:granite_slab","minecraft:jungle_slab","minecraft:mossy_cobblestone_slab","minecraft:mossy_stone_brick_slab","minecraft:nether_brick_slab","minecraft:oak_slab","minecraft:oxidized_cut_copper_slab","minecraft:petrified_oak_slab","minecraft:polished_andesite_slab","minecraft:polished_blackstone_brick_slab","minecraft:polished_blackstone_slab","minecraft:polished_deepslate_slab","minecraft:polished_diorite_slab","minecraft:polished_granite_slab","minecraft:prismarine_brick_slab","minecraft:prismarine_slab","minecraft:purpur_slab","minecraft:quartz_slab","minecraft:red_nether_brick_slab","minecraft:red_sandstone_slab","minecraft:sandstone_slab","minecraft:smooth_quartz_slab","minecraft:smooth_red_sandstone_slab","minecraft:smooth_sandstone_slab","minecraft:smooth_stone_slab","minecraft:spruce_slab","minecraft:stone_brick_slab","minecraft:stone_slab","minecraft:warped_slab","minecraft:waxed_cut_copper_slab","minecraft:waxed_exposed_cut_copper_slab","minecraft:waxed_oxidized_cut_copper_slab","minecraft:waxed_weathered_cut_copper_slab","minecraft:weathered_cut_copper_slab"],"minecraft:small_flowers":["minecraft:allium","minecraft:azure_bluet","minecraft:blue_orchid","minecraft:cornflower","minecraft:dandelion","minecraft:lily_of_the_valley","minecraft:orange_tulip","minecraft:oxeye_daisy","minecraft:pink_tulip","minecraft:poppy","minecraft:red_tulip","minecraft:white_tulip","minecraft:wither_rose"],"minecraft:soul_fire_base_blocks":["minecraft:soul_sand","minecraft:soul_soil"],"minecraft:spruce_logs":["minecraft:spruce_log","minecraft:spruce_wood","minecraft:stripped_spruce_log","minecraft:stripped_spruce_wood"],"minecraft:stairs":["minecraft:acacia_stairs","minecraft:andesite_stairs","minecraft:birch_stairs","minecraft:blackstone_stairs","minecraft:brick_stairs","minecraft:cobbled_deepslate_stairs","minecraft:cobblestone_stairs","minecraft:crimson_stairs","minecraft:cut_copper_stairs","minecraft:dark_oak_stairs","minecraft:dark_prismarine_stairs","minecraft:deepslate_brick_stairs","minecraft:deepslate_tile_stairs","minecraft:diorite_stairs","minecraft:end_stone_brick_stairs","minecraft:exposed_cut_copper_stairs","minecraft:granite_stairs","minecraft:jungle_stairs","minecraft:mossy_cobblestone_stairs","minecraft:mossy_stone_brick_stairs","minecraft:nether_brick_stairs","minecraft:oak_stairs","minecraft:oxidized_cut_copper_stairs","minecraft:polished_andesite_stairs","minecraft:polished_blackstone_brick_stairs","minecraft:polished_blackstone_stairs","minecraft:polished_deepslate_stairs","minecraft:polished_diorite_stairs","minecraft:polished_granite_stairs","minecraft:prismarine_brick_stairs","minecraft:prismarine_stairs","minecraft:purpur_stairs","minecraft:quartz_stairs","minecraft:red_nether_brick_stairs","minecraft:red_sandstone_stairs","minecraft:sandstone_stairs","minecraft:smooth_quartz_stairs","minecraft:smooth_red_sandstone_stairs","minecraft:smooth_sandstone_stairs","minecraft:spruce_stairs","minecraft:stone_brick_stairs","minecraft:stone_stairs","minecraft:warped_stairs","minecraft:waxed_cut_copper_stairs","minecraft:waxed_exposed_cut_copper_stairs","minecraft:waxed_oxidized_cut_copper_stairs","minecraft:waxed_weathered_cut_copper_stairs","minecraft:weathered_cut_copper_stairs"],"minecraft:stone_bricks":["minecraft:chiseled_stone_bricks","minecraft:cracked_stone_bricks","minecraft:mossy_stone_bricks","minecraft:stone_bricks"],"minecraft:stone_crafting_materials":["minecraft:blackstone","minecraft:cobbled_deepslate","minecraft:cobblestone"],"minecraft:stone_tool_materials":["minecraft:blackstone","minecraft:cobbled_deepslate","minecraft:cobblestone"],"minecraft:tall_flowers":["minecraft:lilac","minecraft:peony","minecraft:rose_bush","minecraft:sunflower"],"minecraft:trapdoors":["minecraft:acacia_trapdoor","minecraft:birch_trapdoor","minecraft:crimson_trapdoor","minecraft:dark_oak_trapdoor","minecraft:iron_trapdoor","minecraft:jungle_trapdoor","minecraft:oak_trapdoor","minecraft:spruce_trapdoor","minecraft:warped_trapdoor"],"minecraft:walls":["minecraft:andesite_wall","minecraft:blackstone_wall","minecraft:brick_wall","minecraft:cobbled_deepslate_wall","minecraft:cobblestone_wall","minecraft:deepslate_brick_wall","minecraft:deepslate_tile_wall","minecraft:diorite_wall","minecraft:end_stone_brick_wall","minecraft:granite_wall","minecraft:mossy_cobblestone_wall","minecraft:mossy_stone_brick_wall","minecraft:nether_brick_wall","minecraft:polished_blackstone_brick_wall","minecraft:polished_blackstone_wall","minecraft:polished_deepslate_wall","minecraft:prismarine_wall","minecraft:red_nether_brick_wall","minecraft:red_sandstone_wall","minecraft:sandstone_wall","minecraft:stone_brick_wall"],"minecraft:warped_stems":["minecraft:stripped_warped_hyphae","minecraft:stripped_warped_stem","minecraft:warped_hyphae","minecraft:warped_stem"],"minecraft:wooden_buttons":["minecraft:acacia_button","minecraft:birch_button","minecraft:crimson_button","minecraft:dark_oak_button","minecraft:jungle_button","minecraft:oak_button","minecraft:spruce_button","minecraft:warped_button"],"minecraft:wooden_doors":["minecraft:acacia_door","minecraft:birch_door","minecraft:crimson_door","minecraft:dark_oak_door","minecraft:jungle_door","minecraft:oak_door","minecraft:spruce_door","minecraft:warped_door"],"minecraft:wooden_fences":["minecraft:acacia_fence","minecraft:birch_fence","minecraft:crimson_fence","minecraft:dark_oak_fence","minecraft:jungle_fence","minecraft:oak_fence","minecraft:spruce_fence","minecraft:warped_fence"],"minecraft:wooden_pressure_plates":["minecraft:acacia_pressure_plate","minecraft:birch_pressure_plate","minecraft:crimson_pressure_plate","minecraft:dark_oak_pressure_plate","minecraft:jungle_pressure_plate","minecraft:oak_pressure_plate","minecraft:spruce_pressure_plate","minecraft:warped_pressure_plate"],"minecraft:wooden_slabs":["minecraft:acacia_slab","minecraft:birch_slab","minecraft:crimson_slab","minecraft:dark_oak_slab","minecraft:jungle_slab","minecraft:oak_slab","minecraft:spruce_slab","minecraft:warped_slab"],"minecraft:wooden_stairs":["minecraft:acacia_stairs","minecraft:birch_stairs","minecraft:crimson_stairs","minecraft:dark_oak_stairs","minecraft:jungle_stairs","minecraft:oak_stairs","minecraft:spruce_stairs","minecraft:warped_stairs"],"minecraft:wooden_trapdoors":["minecraft:acacia_trapdoor","minecraft:birch_trapdoor","minecraft:crimson_trapdoor","minecraft:dark_oak_trapdoor","minecraft:jungle_trapdoor","minecraft:oak_trapdoor","minecraft:spruce_trapdoor","minecraft:warped_trapdoor"],"minecraft:wool":["minecraft:black_wool","minecraft:blue_wool","minecraft:brown_wool","minecraft:cyan_wool","minecraft:gray_wool","minecraft:green_wool","minecraft:light_blue_wool","minecraft:light_gray_wool","minecraft:lime_wool","minecraft:magenta_wool","minecraft:orange_wool","minecraft:pink_wool","minecraft:purple_wool","minecraft:red_wool","minecraft:white_wool","minecraft:yellow_wool"]}} diff --git a/worldedit-core/build.gradle.kts b/worldedit-core/build.gradle.kts index 34bcdb64e..22ec1ddbc 100644 --- a/worldedit-core/build.gradle.kts +++ b/worldedit-core/build.gradle.kts @@ -5,11 +5,17 @@ plugins { antlr } +project.description = "Core" + repositories { maven { name = "IntellectualSites" url = uri("https://mvn.intellectualsites.com/content/groups/public/") } + maven { + name = "IntellectualSites-Snapshots" + url = uri("https://mvn.intellectualsites.com/content/groups/snapshots/") + } } applyPlatformAndCoreConfiguration() @@ -33,11 +39,12 @@ dependencies { because("Mojang provides Log4J 2.8.1") } implementation("it.unimi.dsi:fastutil") + compileOnly("net.kyori:adventure-nbt:4.7.0") + testImplementation("net.kyori:adventure-nbt:4.7.0") val antlrVersion = "4.9.1" antlr("org.antlr:antlr4:$antlrVersion") implementation("org.antlr:antlr4-runtime:$antlrVersion") - implementation("com.googlecode.json-simple:json-simple:1.1.1") { isTransitive = false } compileOnly(project(":worldedit-libs:core:ap")) annotationProcessor(project(":worldedit-libs:core:ap")) @@ -49,7 +56,9 @@ dependencies { implementation("com.github.luben:zstd-jni:1.5.0-2") compileOnly("net.fabiozumbi12:redprotect:1.9.6") api("com.github.intellectualsites.plotsquared:PlotSquared-API:4.514") { isTransitive = false } - api("com.plotsquared:PlotSquared-Core:5.13.11") { isTransitive = false } + api("com.plotsquared:PlotSquared-Core:6.0.6-SNAPSHOT") + compileOnlyApi("net.kyori:adventure-api:4.8.0") + compileOnlyApi("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") api("com.intellectualsites.paster:Paster:1.0.1-SNAPSHOT") compileOnly("net.jpountz:lz4-java-stream:1.0.0") { isTransitive = false } compileOnly("org.lz4:lz4-java:1.8.0") diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java index a43ef366d..82db080fe 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/MobSpawnerBlock.java @@ -37,7 +37,10 @@ import java.util.Map; /** * A mob spawner block. + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class MobSpawnerBlock extends BaseBlock { private String mobType; diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java index 0c018a587..184a673a6 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SignBlock.java @@ -31,7 +31,11 @@ import java.util.Map; /** * Represents a sign block. + * + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class SignBlock extends BaseBlock { private String[] text; diff --git a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java index e754fb453..88d0fe593 100644 --- a/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java +++ b/worldedit-core/src/legacy/java/com/sk89q/worldedit/blocks/SkullBlock.java @@ -31,7 +31,11 @@ import java.util.Map; /** * A skull block. + * + * @deprecated WorldEdit does not handle interpreting NBT, + * deprecated for removal without replacement */ +@Deprecated public class SkullBlock extends BaseBlock { private String owner = ""; // notchian diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/FilterBlockMask.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/FilterBlockMask.java deleted file mode 100644 index 7db8c83b8..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/FilterBlockMask.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.boydti.fawe.beta; - -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; - -public interface FilterBlockMask { - - boolean applyBlock(FilterBlock block); -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/FallbackChunkGet.java b/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/FallbackChunkGet.java deleted file mode 100644 index 686c2f1b6..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/FallbackChunkGet.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.boydti.fawe.beta.implementation.blocks; - -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.Entity; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockState; - -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Future; - -public class FallbackChunkGet implements IChunkGet { - private final int bx; - private final int bz; - private final Extent extent; - - public FallbackChunkGet(Extent extent, int chunkX, int chunkZ) { - this.extent = extent; - this.bx = chunkX << 4; - this.bz = chunkZ << 4; - } - - @Override - public BaseBlock getFullBlock(int x, int y, int z) { - return extent.getFullBlock(bx + x, y, bz + z); - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - return extent.getBiomeType(bx + x, y, bz + z); - } - - @Override - public void removeSectionLighting(int layer, boolean sky) { - // do nothing - } - - @Override - public BlockState getBlock(int x, int y, int z) { - return extent.getBlock(bx + x, y, bz + z); - } - - @Override public int getSkyLight(int x, int y, int z) { - return extent.getSkyLight(bx + x, y, bz + z); - } - - @Override public int[] getHeightMap(HeightMapType type) { - return extent.getHeightMap(type); - } - - @Override public int getEmmittedLight(int x, int y, int z) { - return extent.getEmmittedLight(bx + x, y, bz + z); - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - return extent.getFullBlock(bx + x, y, bz + z).getNbtData(); - } - - @Override - public Map getTiles() { - return null; - } - - @Override - public Set getEntities() { - List result = extent.getEntities(new CuboidRegion(BlockVector3.at(bx, 0, bz), BlockVector3.at(bx + 15, 255, bz + 15))); - if (result.isEmpty()) { - return Collections.emptySet(); - } - HashSet set = new HashSet<>(result.size()); - for (Entity entity : result) { - set.add(entity.getState().getNbtData()); - } - return set; - } - - @Override - public CompoundTag getEntity(UUID uuid) { - long checkMost = uuid.getMostSignificantBits(); - long checkLeast = uuid.getLeastSignificantBits(); - for (CompoundTag entityTag : getEntities()) { - long entMost = entityTag.getLong("UUIDMost"); - if (entMost == checkMost) { - long entLeast = entityTag.getLong("UUIDLeast"); - if (entLeast == checkLeast) { - return entityTag; - } - } - } - return null; - } - - @Override public void setCreateCopy(boolean createCopy) {} - - @Override public boolean isCreateCopy() { - return false; - } - - @Override - public void setLightingToGet(char[][] lighting) { - // do nothing - } - - @Override - public void setSkyLightingToGet(char[][] lighting) { - // do nothing - } - - @Override - public void setHeightmapToGet(HeightMapType type, int[] data) { - // do nothing - } - - @Override - public boolean trim(boolean aggressive) { - return true; - } - - @Override - public boolean trim(boolean aggressive, int layer) { - return true; - } - - @Override - public > T call(IChunkSet set, Runnable finalize) { - for (int layer = 0; layer < 16; layer++) { - if (set.hasSection(layer)) { - char[] arr = set.load(layer); - int by = layer << 4; - for (int y = 0, i = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++, i++) { - char ordinal = arr[i]; - if (ordinal != 0) { - BlockState block = BlockState.getFromOrdinal(ordinal); - extent.setBlock(bx + x, by + y, bz + z, block); - } - } - } - } - - } - } - Map tiles = set.getTiles(); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - BlockVector3 pos = entry.getKey(); - extent.setTile(bx + pos.getX(), pos.getY(), bz + pos.getZ(), entry.getValue()); - } - - } - Set spawns = set.getEntities(); - if (!spawns.isEmpty()) { - for (CompoundTag spawn : spawns) { - BaseEntity ent = new BaseEntity(spawn); - extent.createEntity(ent.getLocation(extent), ent); - } - } - Set kills = set.getEntityRemoves(); - if (!kills.isEmpty()) { - for (UUID kill : kills) { - extent.removeEntity(0, 0, 0, kill); - } - } - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - for (int y = 0, i = 0; y < 64; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++, i++) { - BiomeType biome = biomes[i]; - if (biome != null) { - extent.setBiome(bx + (x << 2), y << 2, bz + (z << 2), biome); - } - } - } - } - } - return null; - } - - @Override - public char[] load(int layer) { - char[] arr = FaweCache.IMP.SECTION_BITS_TO_CHAR.get(); - int by = layer << 4; - for (int y = 0, i = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++, i++) { - arr[i] = getBlock(bx + x, by + y, bz + z).getOrdinalChar(); - } - } - } - return arr; - } - - @Override - public boolean hasSection(int layer) { - return true; - } - - @Override - public IBlocks reset() { - return null; - } -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCollection.java b/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCollection.java deleted file mode 100644 index 21f9c80f6..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCollection.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.boydti.fawe.object.collection; - -import com.boydti.fawe.object.change.StreamChange; - -public interface DifferentialCollection extends StreamChange { - public T get(); -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ResettableMask.java b/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ResettableMask.java deleted file mode 100644 index 1ee0dd538..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ResettableMask.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.boydti.fawe.object.mask; - -import com.boydti.fawe.Resettable; - -public interface ResettableMask extends Resettable { - - @Override - void reset(); -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ResettablePattern.java b/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ResettablePattern.java deleted file mode 100644 index 17881717f..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ResettablePattern.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.boydti.fawe.object.pattern; - -import com.boydti.fawe.Resettable; - -public interface ResettablePattern extends Resettable { - - @Override - void reset(); -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/web/SchemSync.java b/worldedit-core/src/main/java/com/boydti/fawe/web/SchemSync.java deleted file mode 100644 index f87e8cd15..000000000 --- a/worldedit-core/src/main/java/com/boydti/fawe/web/SchemSync.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.boydti.fawe.web; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.util.MainUtil; -import com.sk89q.worldedit.LocalConfiguration; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.command.UtilityCommands; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.ServerSocket; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class SchemSync implements Runnable { - - private static final char PORT = 62522; - - private final File tokensFile; - private final WorldEdit worldEdit; - private final File working; - private Map tokens; - - private ServerSocket serverSocket; - private Socket clientSocket; - - private enum Error { - INVALID_HEADER_LENGTH, - TOKEN_REJECTED, - FILE_NOT_EXIST, - NO_FILE_PERMISSIONS; - - } - - public SchemSync() { - this.tokensFile = MainUtil - .getFile(Fawe.imp().getDirectory(), Settings.IMP.PATHS.TOKENS, "tokens.txt"); - this.worldEdit = WorldEdit.getInstance(); - LocalConfiguration config = worldEdit.getConfiguration(); - this.working = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); - } - - private void loadTokens() { - if (tokens == null) { - String tokensDir = Settings.IMP.PATHS.TOKENS; - tokens = new HashMap<>(); - } - } - - private void close(Error error) throws IOException { - this.clientSocket.getOutputStream().write(error.ordinal()); - throw FaweCache.MANUAL; - } - - @Override - public synchronized void run() { - try { - byte[] header = new byte[32]; - try (ServerSocket serverSocket = this.serverSocket = new ServerSocket(PORT)) { - while (!Thread.interrupted()) { - try (Socket clientSocket = this.clientSocket = serverSocket - .accept(); InputStream in = clientSocket.getInputStream()) { - int read = in.read(header); - if (read != header.length) { - close(Error.INVALID_HEADER_LENGTH); - } - - ByteBuffer buf = ByteBuffer.wrap(header); - UUID uuid = new UUID(buf.getLong(), buf.getLong()); - UUID expectedToken = tokens.get(uuid); - if (expectedToken == null) { - close(Error.TOKEN_REJECTED); - } - - UUID receivedToken = new UUID(buf.getLong(), buf.getLong()); - if (!receivedToken.equals(expectedToken)) { - continue; - } - - File dir = new File(working, uuid.toString()); - try (DataInputStream dis = new DataInputStream(in)) { - int data = dis.readByte() & 0xFF; - switch (data) { - case 0: // list - try (DataOutputStream out = new DataOutputStream( - clientSocket.getOutputStream())) { - out.write(1); - UtilityCommands.allFiles(dir.listFiles(), true, - file -> { - try { - String path = dir.toURI() - .relativize(file.toURI()).getPath(); - out.writeUTF(path); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - break; - case 1: // get - String input = dis.readUTF(); - File file = new File(dir, input); - if (!MainUtil.isInSubDirectory(dir, file)) { - close(Error.NO_FILE_PERMISSIONS); - } - if (!file.exists()) { - close(Error.FILE_NOT_EXIST); - } - break; - default: - break; - // todo send file - } - } - } catch (FaweException ignored) { - } - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/FAWEPlatformAdapterImpl.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java similarity index 56% rename from worldedit-core/src/main/java/com/boydti/fawe/FAWEPlatformAdapterImpl.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java index 068f03680..b1f09f1c4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/FAWEPlatformAdapterImpl.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FAWEPlatformAdapterImpl.java @@ -1,6 +1,6 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; -import com.boydti.fawe.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkGet; public interface FAWEPlatformAdapterImpl { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/Fawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/Fawe.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java index 53f5b26d3..04a30772b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/Fawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Fawe.java @@ -1,16 +1,16 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.CachedTextureUtil; -import com.boydti.fawe.util.CleanTextureUtil; -import com.boydti.fawe.util.FaweTimer; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MemUtil; -import com.boydti.fawe.util.RandomTextureUtil; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.TextureUtil; -import com.boydti.fawe.util.WEManager; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.CachedTextureUtil; +import com.fastasyncworldedit.core.util.CleanTextureUtil; +import com.fastasyncworldedit.core.util.FaweTimer; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MemUtil; +import com.fastasyncworldedit.core.util.RandomTextureUtil; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.TextureUtil; +import com.fastasyncworldedit.core.util.WEManager; import com.github.luben.zstd.util.Native; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.internal.util.LogManagerCompat; @@ -233,7 +233,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(); - Settings.IMP.BUILD = "https://ci.athion.net/job/FastAsyncWorldEdit-1.16/" + version.build; + 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/boydti/fawe/FaweAPI.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/FaweAPI.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java index 92b99d553..cc9bdc76b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/FaweAPI.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweAPI.java @@ -1,22 +1,22 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.beta.implementation.queue.ParallelQueueExtent; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.RelightMode; -import com.boydti.fawe.object.changeset.DiskStorageHistory; -import com.boydti.fawe.object.changeset.SimpleChangeSetSummary; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MemUtil; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.WEManager; -import com.boydti.fawe.wrappers.WorldWrapper; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.beta.implementation.queue.ParallelQueueExtent; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; +import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MemUtil; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.WEManager; +import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.google.common.collect.Sets; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/FaweCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/FaweCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java index d711cd72b..507519dff 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/FaweCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java @@ -1,18 +1,18 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.Trimable; -import com.boydti.fawe.beta.implementation.queue.Pool; -import com.boydti.fawe.beta.implementation.queue.QueuePool; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArray; -import com.boydti.fawe.object.collection.BitArrayUnstretched; -import com.boydti.fawe.object.collection.CleanableThreadLocal; -import com.boydti.fawe.object.exception.FaweBlockBagException; -import com.boydti.fawe.object.exception.FaweChunkLoadException; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.Trimable; +import com.fastasyncworldedit.core.beta.implementation.queue.Pool; +import com.fastasyncworldedit.core.beta.implementation.queue.QueuePool; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.collection.BitArray; +import com.fastasyncworldedit.core.object.collection.BitArrayUnstretched; +import com.fastasyncworldedit.core.object.collection.CleanableThreadLocal; +import com.fastasyncworldedit.core.object.exception.FaweBlockBagException; +import com.fastasyncworldedit.core.object.exception.FaweChunkLoadException; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.util.MathMan; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/FaweVersion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java similarity index 81% rename from worldedit-core/src/main/java/com/boydti/fawe/FaweVersion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java index 97a44f701..604d1430e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/FaweVersion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweVersion.java @@ -1,4 +1,4 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; /** An internal FAWE class not meant for public use. **/ public class FaweVersion { @@ -18,7 +18,12 @@ public class FaweVersion { public FaweVersion(String version, String commit, String date) { String[] split = version.substring(version.indexOf('=') + 1).split("-"); - this.build = Integer.parseInt(split[1]); + int build = 0; + try { + build = Integer.parseInt(split[1]); + } catch (NumberFormatException ignored) { + } + this.build = build; this.hash = Integer.parseInt(commit.substring(commit.indexOf('=') + 1), 16); String[] split1 = date.substring(date.indexOf('=') + 1).split("\\."); this.year = Integer.parseInt(split1[0]); @@ -37,9 +42,9 @@ public class FaweVersion { @Override public String toString() { if (hash == 0 && build == 0) { - return "FastAsyncWorldEdit-1.16-NoVer-SNAPSHOT"; + return "FastAsyncWorldEdit-1.17-NoVer-SNAPSHOT"; } else { - return "FastAsyncWorldEdit-1.16" + build; + return "FastAsyncWorldEdit-1.17" + build; } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/IFawe.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java similarity index 65% rename from worldedit-core/src/main/java/com/boydti/fawe/IFawe.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java index cc4ebd733..b1f8d084c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/IFawe.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/IFawe.java @@ -1,10 +1,10 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; -import com.boydti.fawe.beta.implementation.cache.preloader.Preloader; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.image.ImageViewer; +import com.fastasyncworldedit.core.beta.implementation.preloader.Preloader; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.image.ImageViewer; import com.sk89q.worldedit.entity.Player; import java.io.File; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/Resettable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Resettable.java similarity index 58% rename from worldedit-core/src/main/java/com/boydti/fawe/Resettable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/Resettable.java index 09b986edd..6d24faa32 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/Resettable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/Resettable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe; +package com.fastasyncworldedit.core; public interface Resettable { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/DirectionMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java similarity index 73% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/DirectionMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java index a6ff0e687..844e7b324 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/DirectionMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/DirectionMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; public interface DirectionMask { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/Filter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/Filter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java index 3ab1008cb..f09d512ca 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/Filter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Filter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.regions.Region; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java new file mode 100644 index 000000000..ba5d84478 --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java @@ -0,0 +1,8 @@ +package com.fastasyncworldedit.core.beta; + +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; + +public interface FilterBlockMask { + + boolean applyBlock(FilterBlock block); +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/Flood.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/Flood.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java index cb5ea99a0..1665c310b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/Flood.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Flood.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.World; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java index 1c36d53a4..2c594aa53 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBatchProcessor.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor; -import com.boydti.fawe.beta.implementation.processors.MultiBatchProcessor; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.processors.MultiBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java index cf05147cf..c7b4cab42 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IBlocks.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java index c9660456f..68327fe8d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunk.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; import com.sk89q.worldedit.regions.Region; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java index 4abf96c75..853b38a99 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkCache.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; import org.jetbrains.annotations.Range; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkGet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java index fb7b25db9..7bab053a5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkGet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.InputExtent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java index c550a30c9..9f3daa079 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IChunkSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IChunkSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.function.operation.Operation; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IDelegateFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IDelegateFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java index 8655ab5dc..5cc29e1cc 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IDelegateFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IDelegateFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.regions.Region; import javax.annotation.Nullable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java index 574f25b0a..69530c3ff 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueChunk.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java index 37eb6bcc3..cc6d5b75d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueExtent.java @@ -1,9 +1,8 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.implementation.IChunkExtent; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.processors.IBatchProcessorHolder; +import com.fastasyncworldedit.core.beta.implementation.IChunkExtent; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.IBatchProcessorHolder; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.operation.Operation; import com.sk89q.worldedit.math.BlockVector2; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java similarity index 77% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java index 5bcc30f48..c3c5b3afa 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/IQueueWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/IQueueWrapper.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; public interface IQueueWrapper { default IQueueExtent wrapQueue(IQueueExtent queue) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/ITileInput.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java similarity index 73% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/ITileInput.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java index 4708fbd45..072f3b26c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/ITileInput.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/ITileInput.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/Trimable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/Trimable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java index 7ed498687..3ec305325 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/Trimable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/Trimable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta; +package com.fastasyncworldedit.core.beta; /** * Interface for objects that can be trimmed (memory related). Trimming will reduce its memory diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/IChunkExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/IChunkExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java index b9b79e062..cb59f2687 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/IChunkExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/IChunkExtent.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta.implementation; +package com.fastasyncworldedit.core.beta.implementation; -import com.boydti.fawe.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunk; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.DoubleTag; import com.sk89q.jnbt.IntArrayTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/BitSetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java index 10c5e78d9..3fe78b462 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/BitSetBlocks.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta.implementation.blocks; +package com.fastasyncworldedit.core.beta.implementation.blocks; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.object.collection.MemBlockSet; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.object.collection.MemBlockSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java index 57c1d90d7..8793a6e89 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharBlocks.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.blocks; +package com.fastasyncworldedit.core.beta.implementation.blocks; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.IBlocks; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java index 1219740cd..6647e6f3c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharGetBlocks.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.beta.implementation.blocks; +package com.fastasyncworldedit.core.beta.implementation.blocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharSetBlocks.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java index aed341a25..ed2d29776 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/CharSetBlocks.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.beta.implementation.blocks; +package com.fastasyncworldedit.core.beta.implementation.blocks; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.queue.Pool; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BlockVector3ChunkMap; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.queue.Pool; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.collection.BlockVector3ChunkMap; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/NullChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/NullChunkGet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java index 00f522c56..887cc0b50 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/NullChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/blocks/NullChunkGet.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.beta.implementation.blocks; +package com.fastasyncworldedit.core.beta.implementation.blocks; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBlocks; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/ChunkCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/ChunkCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java index e34114a0f..77278e482 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/ChunkCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkCache.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.cache; +package com.fastasyncworldedit.core.beta.implementation.chunk; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.Trimable; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.beta.IChunkCache; +import com.fastasyncworldedit.core.beta.Trimable; +import com.fastasyncworldedit.core.util.MathMan; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.objects.ObjectIterator; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/ChunkHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java index 4ee2f90b6..f1d231266 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/ChunkHolder.java @@ -1,17 +1,17 @@ -package com.boydti.fawe.beta.implementation.chunk; +package com.fastasyncworldedit.core.beta.implementation.chunk; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; -import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor; -import com.boydti.fawe.beta.implementation.queue.Pool; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.queue.Pool; +import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/NullChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/NullChunk.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java index 4bfce286a..0b33ed4bc 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/chunk/NullChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/chunk/NullChunk.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.beta.implementation.chunk; +package com.fastasyncworldedit.core.beta.implementation.chunk; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ArrayImageMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java similarity index 76% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ArrayImageMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java index 802f8ba62..bb1a01092 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ArrayImageMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ArrayImageMask.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.FilterBlockMask; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.FilterBlockMask; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import java.awt.image.BufferedImage; import java.util.concurrent.ThreadLocalRandom; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/CountFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java similarity index 79% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/CountFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java index fa16fee03..a0ee6f8a2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/CountFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/CountFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; public class CountFilter extends ForkedFilter { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/DistrFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/DistrFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java index 323ae3c5a..6e4429eb2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/DistrFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/DistrFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.function.mask.ABlockMask; import com.sk89q.worldedit.util.Countable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ForkedFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ForkedFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java index 08577b63c..acc00b8d9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/ForkedFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/ForkedFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.Filter; +import com.fastasyncworldedit.core.beta.Filter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/LinkedFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java similarity index 73% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/LinkedFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java index a1bb96611..8db003a6c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/LinkedFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/LinkedFilter.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.block.DelegateFilter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.DelegateFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; /** * Filter which links two Filters together for single-filter-input operations. diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/MaskFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/MaskFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java index ab274dee7..ea5eac268 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/MaskFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/MaskFilter.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.filter; +package com.fastasyncworldedit.core.beta.implementation.filter; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.block.DelegateFilter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.DelegateFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractExtentFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractExtentFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java index fb066b3b2..813888dc8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractExtentFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractExtentFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java index 414dc664d..b6aa81ffb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; @@ -66,12 +66,12 @@ public abstract class AbstractFilterBlock extends FilterBlock { @Override public BlockVector3 getMinimumPoint() { - return BlockVector3.at(getX(), getY(), getZ()); + return at(getX(), getY(), getZ()); } @Override public BlockVector3 getMaximumPoint() { - return BlockVector3.at(getX(), getY(), getZ()); + return at(getX(), getY(), getZ()); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractSingleFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractSingleFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java index f7e473897..01a6c259e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/AbstractSingleFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/AbstractSingleFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; @@ -67,12 +67,12 @@ public abstract class AbstractSingleFilterBlock extends FilterBlock { @Override public BlockVector3 getMinimumPoint() { - return BlockVector3.at(getX(), getY(), getZ()); + return at(getX(), getY(), getZ()); } @Override public BlockVector3 getMaximumPoint() { - return BlockVector3.at(getX(), getY(), getZ()); + return at(getX(), getY(), getZ()); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ArrayFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ArrayFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java index af0fc9bf2..9758c8bde 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ArrayFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ArrayFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/CharFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/CharFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java index b07db6013..1e873cec6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/CharFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/CharFilterBlock.java @@ -1,13 +1,13 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.FilterBlockMask; -import com.boydti.fawe.beta.Flood; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.FilterBlockMask; +import com.fastasyncworldedit.core.beta.Flood; +import com.fastasyncworldedit.core.beta.IBlocks; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.blocks.CharGetBlocks; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ChunkFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ChunkFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java index ec50201a7..6a059d960 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ChunkFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ChunkFilterBlock.java @@ -1,12 +1,12 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.FilterBlockMask; -import com.boydti.fawe.beta.Flood; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.FilterBlockMask; +import com.fastasyncworldedit.core.beta.Flood; +import com.fastasyncworldedit.core.beta.IBlocks; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/DelegateFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java similarity index 61% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/DelegateFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java index f51d85b3f..f9e033d38 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/DelegateFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/DelegateFilter.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IDelegateFilter; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IDelegateFilter; public abstract class DelegateFilter implements IDelegateFilter { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ExtentFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ExtentFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java index a2f86c3b0..326ac742b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/ExtentFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/ExtentFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/FilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/FilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java index 6acf6b43c..83f254432 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/FilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/FilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/SingleFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/SingleFilterBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java index c15f4ed74..65e8e764c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/filter/block/SingleFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/filter/block/SingleFilterBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.filter.block; +package com.fastasyncworldedit.core.beta.implementation.filter.block; import com.sk89q.worldedit.world.block.BaseBlock; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/HeightMapType.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/HeightMapType.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java index a0f91bff8..fba5155b6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/HeightMapType.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/HeightMapType.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java index 463737aa0..a98fde58e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NMSRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NMSRelighter.java @@ -1,15 +1,15 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.chunk.ChunkHolder; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RelightMode; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.object.collection.BlockVectorSet; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkHolder; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.registry.state.DirectionalProperty; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java index 8798e8023..2396fbbf0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/NullRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/NullRelighter.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; import java.util.concurrent.locks.ReentrantLock; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelightProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java similarity index 80% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelightProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java index d19b535ef..4f3bb2bc6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelightProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelightProcessor.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.extent.Extent; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java index bdf776c0f..cd9c9cdd8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/Relighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/Relighter.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; import java.util.concurrent.locks.ReentrantLock; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelighterFactory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java similarity index 81% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelighterFactory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java index dae58bcd4..48f03fab9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/lighting/RelighterFactory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/lighting/RelighterFactory.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.lighting; +package com.fastasyncworldedit.core.beta.implementation.lighting; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.object.RelightMode; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.object.RelightMode; import com.sk89q.worldedit.world.World; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/packet/ChunkPacket.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/packet/ChunkPacket.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java index 7914b880d..a93c43d6b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/packet/ChunkPacket.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/packet/ChunkPacket.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.beta.implementation.packet; +package com.fastasyncworldedit.core.beta.implementation.packet; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBlocks; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBlocks; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; import com.sk89q.jnbt.CompoundTag; import java.util.HashMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/AsyncPreloader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/AsyncPreloader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java index a489b739d..24a1a4007 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/AsyncPreloader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/AsyncPreloader.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.cache.preloader; +package com.fastasyncworldedit.core.beta.implementation.preloader; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.collection.MutablePair; -import com.boydti.fawe.util.FaweTimer; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.object.collection.MutablePair; +import com.fastasyncworldedit.core.util.FaweTimer; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/Preloader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java similarity index 67% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/Preloader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java index db32604be..7fbc4ab65 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/cache/preloader/Preloader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/preloader/Preloader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.cache.preloader; +package com.fastasyncworldedit.core.beta.implementation.preloader; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/BatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/BatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java index cf5c53473..12d018d0c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/BatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/BatchProcessorHolder.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import java.util.concurrent.Future; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/EmptyBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java similarity index 82% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/EmptyBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java index cccaa96a3..dae055df1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/EmptyBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/EmptyBatchProcessor.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.extent.Extent; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ExtentBatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java similarity index 75% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ExtentBatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java index 49bc3d722..77793a4f5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ExtentBatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ExtentBatchProcessorHolder.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; import com.sk89q.worldedit.extent.Extent; public abstract class ExtentBatchProcessorHolder extends BatchProcessorHolder implements Extent { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/HeightmapProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/HeightmapProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java index 29597037d..bac8f1a12 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/HeightmapProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/HeightmapProcessor.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/IBatchProcessorHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/IBatchProcessorHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java index cce1f7e0f..026027187 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/IBatchProcessorHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/IBatchProcessorHolder.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.extent.Extent; import java.util.concurrent.Future; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/LimitExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/LimitExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java index 32aa1ac8b..d4d90bc4b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/LimitExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/LimitExtent.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.block.ExtentFilterBlock; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.exception.FaweException; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ExtentFilterBlock; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.exception.FaweException; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/MultiBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/MultiBatchProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java index dd144b03c..793f246d7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/MultiBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/MultiBatchProcessor.java @@ -1,12 +1,12 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.cache.LoadingCache; import com.sk89q.worldedit.extent.Extent; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/NullProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java similarity index 78% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/NullProcessor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java index c5127feaa..776e482e5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/NullProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/NullProcessor.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ProcessorScope.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ProcessorScope.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java index cc8aae35e..93c97e91b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/processors/ProcessorScope.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/processors/ProcessorScope.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.processors; +package com.fastasyncworldedit.core.beta.implementation.processors; /** * The scope of a processor. diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/ParallelQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/ParallelQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java index 1e8bd2301..eacb72f81 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/ParallelQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/ParallelQueueExtent.java @@ -1,18 +1,18 @@ -package com.boydti.fawe.beta.implementation.queue; +package com.fastasyncworldedit.core.beta.implementation.queue; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.IQueueWrapper; -import com.boydti.fawe.beta.implementation.filter.CountFilter; -import com.boydti.fawe.beta.implementation.filter.DistrFilter; -import com.boydti.fawe.beta.implementation.filter.LinkedFilter; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.processors.BatchProcessorHolder; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.clipboard.WorldCopyClipboard; -import com.boydti.fawe.object.extent.NullExtent; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.IQueueWrapper; +import com.fastasyncworldedit.core.beta.implementation.filter.CountFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.DistrFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.LinkedFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.BatchProcessorHolder; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.clipboard.WorldCopyClipboard; +import com.fastasyncworldedit.core.object.extent.NullExtent; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.PassthroughExtent; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/Pool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java similarity index 71% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/Pool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java index bab5bbf63..54ac41e1b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/Pool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/Pool.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.queue; +package com.fastasyncworldedit.core.beta.implementation.queue; @FunctionalInterface public interface Pool { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueueHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueueHandler.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java index f70db2e0d..883c192f4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueueHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueueHandler.java @@ -1,20 +1,20 @@ -package com.boydti.fawe.beta.implementation.queue; +package com.fastasyncworldedit.core.beta.implementation.queue; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.Trimable; -import com.boydti.fawe.beta.implementation.cache.ChunkCache; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.CleanableThreadLocal; -import com.boydti.fawe.util.MemUtil; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.wrappers.WorldWrapper; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunkCache; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.Trimable; +import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkCache; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.collection.CleanableThreadLocal; +import com.fastasyncworldedit.core.util.MemUtil; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.google.common.util.concurrent.Futures; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueuePool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueuePool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java index 61f0ad007..dc8a8e137 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/QueuePool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/QueuePool.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.beta.implementation.queue; +package com.fastasyncworldedit.core.beta.implementation.queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Supplier; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/SingleThreadQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/SingleThreadQueueExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java index 95db06861..e29804433 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/queue/SingleThreadQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/implementation/queue/SingleThreadQueueExtent.java @@ -1,24 +1,24 @@ -package com.boydti.fawe.beta.implementation.queue; +package com.fastasyncworldedit.core.beta.implementation.queue; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks; -import com.boydti.fawe.beta.implementation.chunk.ChunkHolder; -import com.boydti.fawe.beta.implementation.chunk.NullChunk; -import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.processors.EmptyBatchProcessor; -import com.boydti.fawe.beta.implementation.processors.ExtentBatchProcessorHolder; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.MemUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkCache; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.blocks.CharSetBlocks; +import com.fastasyncworldedit.core.beta.implementation.chunk.ChunkHolder; +import com.fastasyncworldedit.core.beta.implementation.chunk.NullChunk; +import com.fastasyncworldedit.core.beta.implementation.filter.block.CharFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.EmptyBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.processors.ExtentBatchProcessorHolder; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.MemUtil; import com.google.common.util.concurrent.Futures; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.LogManagerCompat; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/AnvilCommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/command/AnvilCommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java index f5336744b..2bb9eb884 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/command/AnvilCommands.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/AnvilCommands.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.command; +package com.fastasyncworldedit.core.command; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/CFICommand.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommand.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/command/CFICommand.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommand.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/CFICommands.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/command/CFICommands.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/CFICommands.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/FaweParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/FaweParser.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/command/FaweParser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/FaweParser.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/PlotLoader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/command/PlotLoader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/PlotLoader.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/command/SuggestInputParseException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/SuggestInputParseException.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/command/SuggestInputParseException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/command/SuggestInputParseException.java index 1fbc65b5e..dae899ca1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/command/SuggestInputParseException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/SuggestInputParseException.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.command; +package com.fastasyncworldedit.core.command; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/config/Caption.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Caption.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/config/Caption.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Caption.java index 489facd14..63d89c99d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/config/Caption.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Caption.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.config; +package com.fastasyncworldedit.core.configuration; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.util.formatting.WorldEditText; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/config/Config.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/config/Config.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java index 20966fdd0..43b6c4dd0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/config/Config.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Config.java @@ -1,8 +1,7 @@ -package com.boydti.fawe.config; +package com.fastasyncworldedit.core.configuration; -import com.boydti.fawe.configuration.MemorySection; -import com.boydti.fawe.configuration.file.YamlConfiguration; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.configuration.file.YamlConfiguration; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/Configuration.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Configuration.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/Configuration.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Configuration.java index f3bdb400e..3518b2136 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/Configuration.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Configuration.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationOptions.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationOptions.java similarity index 57% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationOptions.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationOptions.java index 3a6b815a6..dd27b7ab4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationOptions.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationOptions.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; /** * Various settings for controlling the input and output of a {@link - * com.boydti.fawe.configuration.Configuration} + * Configuration} */ public class ConfigurationOptions { private char pathSeparator = '.'; @@ -14,7 +14,7 @@ public class ConfigurationOptions { } /** - * Returns the {@link com.boydti.fawe.configuration.Configuration} that this object is responsible for. + * Returns the {@link Configuration} that this object is responsible for. * * @return Parent configuration */ @@ -24,9 +24,9 @@ public class ConfigurationOptions { /** * Gets the char that will be used to separate {@link - * com.boydti.fawe.configuration.ConfigurationSection}s + * ConfigurationSection}s *

- * This value does not affect how the {@link com.boydti.fawe.configuration.Configuration} is stored, + * This value does not affect how the {@link Configuration} is stored, * only in how you access the data. The default value is '.'. * * @return Path separator @@ -37,29 +37,29 @@ public class ConfigurationOptions { /** * Sets the char that will be used to separate {@link - * com.boydti.fawe.configuration.ConfigurationSection}s + * ConfigurationSection}s *

- * This value does not affect how the {@link com.boydti.fawe.configuration.Configuration} is stored, + * This value does not affect how the {@link Configuration} is stored, * only in how you access the data. The default value is '.'. * * @param value Path separator * @return This object, for chaining */ - public com.boydti.fawe.configuration.ConfigurationOptions pathSeparator(final char value) { + public ConfigurationOptions pathSeparator(final char value) { pathSeparator = value; return this; } /** - * Checks if the {@link com.boydti.fawe.configuration.Configuration} should copy values from its default - * {@link com.boydti.fawe.configuration.Configuration} directly. + * Checks if the {@link Configuration} should copy values from its default + * {@link Configuration} directly. *

* If this is true, all values in the default Configuration will be * directly copied, making it impossible to distinguish between values * that were set and values that are provided by default. As a result, - * {@link com.boydti.fawe.configuration.ConfigurationSection#contains(String)} will always + * {@link ConfigurationSection#contains(String)} will always * return the same value as {@link - * com.boydti.fawe.configuration.ConfigurationSection#isSet(String)}. The default value is + * ConfigurationSection#isSet(String)}. The default value is * false. * * @return Whether or not defaults are directly copied @@ -69,21 +69,21 @@ public class ConfigurationOptions { } /** - * Sets if the {@link com.boydti.fawe.configuration.Configuration} should copy values from its default - * {@link com.boydti.fawe.configuration.Configuration} directly. + * Sets if the {@link Configuration} should copy values from its default + * {@link Configuration} directly. *

* If this is true, all values in the default Configuration will be * directly copied, making it impossible to distinguish between values * that were set and values that are provided by default. As a result, - * {@link com.boydti.fawe.configuration.ConfigurationSection#contains(String)} will always + * {@link ConfigurationSection#contains(String)} will always * return the same value as {@link - * com.boydti.fawe.configuration.ConfigurationSection#isSet(String)}. The default value is + * ConfigurationSection#isSet(String)}. The default value is * false. * * @param value Whether or not defaults are directly copied * @return This object, for chaining */ - public com.boydti.fawe.configuration.ConfigurationOptions copyDefaults(final boolean value) { + public ConfigurationOptions copyDefaults(final boolean value) { copyDefaults = value; return this; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationSection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationSection.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationSection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationSection.java index 35e5b8f9d..8b93dce44 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/ConfigurationSection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/ConfigurationSection.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; import java.util.List; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/InvalidConfigurationException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/InvalidConfigurationException.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/InvalidConfigurationException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/InvalidConfigurationException.java index a33e40231..10ab59ea7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/InvalidConfigurationException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/InvalidConfigurationException.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; /** - * Exception thrown when attempting to load an invalid {@link com.boydti.fawe.configuration.Configuration} + * Exception thrown when attempting to load an invalid {@link Configuration} */ @SuppressWarnings("serial") public class InvalidConfigurationException extends Exception { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfiguration.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfiguration.java similarity index 79% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfiguration.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfiguration.java index c58c3a0d8..258647f4c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfiguration.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfiguration.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; import java.util.Map; /** - * This is a {@link com.boydti.fawe.configuration.Configuration} implementation that does not save or load + * This is a {@link Configuration} implementation that does not save or load * from any source, and stores all values in memory only. * This is useful for temporary Configurations for providing defaults. */ @@ -12,14 +12,14 @@ public class MemoryConfiguration extends MemorySection implements Configuration protected MemoryConfigurationOptions options; /** - * Creates an empty {@link com.boydti.fawe.configuration.MemoryConfiguration} with no default values. + * Creates an empty {@link MemoryConfiguration} with no default values. */ public MemoryConfiguration() { } /** - * Creates an empty {@link com.boydti.fawe.configuration.MemoryConfiguration} using the specified {@link - * com.boydti.fawe.configuration.Configuration} as a source for all default values. + * Creates an empty {@link MemoryConfiguration} using the specified {@link + * Configuration} as a source for all default values. * * @param defaults Default value provider * @throws IllegalArgumentException Thrown if defaults is null @@ -34,7 +34,7 @@ public class MemoryConfiguration extends MemorySection implements Configuration throw new NullPointerException("Path may not be null"); } if (defaults == null) { - defaults = new com.boydti.fawe.configuration.MemoryConfiguration(); + defaults = new MemoryConfiguration(); } defaults.set(path, value); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfigurationOptions.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfigurationOptions.java similarity index 65% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfigurationOptions.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfigurationOptions.java index c30b8af78..1e7e59e5d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemoryConfigurationOptions.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemoryConfigurationOptions.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; /** * Various settings for controlling the input and output of a {@link - * com.boydti.fawe.configuration.MemoryConfiguration} + * MemoryConfiguration} */ public class MemoryConfigurationOptions extends ConfigurationOptions { protected MemoryConfigurationOptions(final MemoryConfiguration configuration) { @@ -15,13 +15,13 @@ public class MemoryConfigurationOptions extends ConfigurationOptions { } @Override - public com.boydti.fawe.configuration.MemoryConfigurationOptions copyDefaults(final boolean value) { + public MemoryConfigurationOptions copyDefaults(final boolean value) { super.copyDefaults(value); return this; } @Override - public com.boydti.fawe.configuration.MemoryConfigurationOptions pathSeparator(final char value) { + public MemoryConfigurationOptions pathSeparator(final char value) { super.pathSeparator(value); return this; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemorySection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemorySection.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/MemorySection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemorySection.java index d84eba71e..fb4e87fa4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/MemorySection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/MemorySection.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration; +package com.fastasyncworldedit.core.configuration; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -8,25 +8,25 @@ import java.util.Map; import java.util.Set; /** - * A type of {@link com.boydti.fawe.configuration.ConfigurationSection} that is stored in memory. + * A type of {@link ConfigurationSection} that is stored in memory. */ -public class MemorySection implements com.boydti.fawe.configuration.ConfigurationSection { +public class MemorySection implements ConfigurationSection { protected final Map map = new LinkedHashMap<>(); private final Configuration root; - private final com.boydti.fawe.configuration.ConfigurationSection parent; + private final ConfigurationSection parent; private final String path; private final String fullPath; /** - * Creates an empty MemorySection for use as a root {@link com.boydti.fawe.configuration.Configuration} + * Creates an empty MemorySection for use as a root {@link Configuration} * section. *

- * Note that calling this without being yourself a {@link com.boydti.fawe.configuration.Configuration} + * Note that calling this without being yourself a {@link Configuration} * will throw an exception! * * @throws IllegalStateException Thrown if this is not a {@link - * com.boydti.fawe.configuration.Configuration} root. + * Configuration} root. */ protected MemorySection() { if (!(this instanceof Configuration)) { @@ -44,11 +44,11 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio * * @param parent Parent section that contains this own section. * @param path Path that you may access this section from via the root - * {@link com.boydti.fawe.configuration.Configuration}. + * {@link Configuration}. * @throws IllegalArgumentException Thrown is parent or path is null, or * if parent contains no root Configuration. */ - protected MemorySection(com.boydti.fawe.configuration.ConfigurationSection parent, String path) { + protected MemorySection(ConfigurationSection parent, String path) { if (parent == null) { throw new NullPointerException("Parent may not be null"); } @@ -122,33 +122,33 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } /** - * Creates a full path to the given {@link com.boydti.fawe.configuration.ConfigurationSection} from its - * root {@link com.boydti.fawe.configuration.Configuration}. + * Creates a full path to the given {@link ConfigurationSection} from its + * root {@link Configuration}. *

- * You may use this method for any given {@link com.boydti.fawe.configuration.ConfigurationSection}, not - * only {@link com.boydti.fawe.configuration.MemorySection}. + * You may use this method for any given {@link ConfigurationSection}, not + * only {@link MemorySection}. * * @param section Section to create a path for. * @param key Name of the specified section. * @return Full path of the section from its root. */ - public static String createPath(com.boydti.fawe.configuration.ConfigurationSection section, String key) { + public static String createPath(ConfigurationSection section, String key) { return createPath(section, key, (section == null) ? null : section.getRoot()); } /** - * Creates a relative path to the given {@link com.boydti.fawe.configuration.ConfigurationSection} from + * Creates a relative path to the given {@link ConfigurationSection} from * the given relative section. *

- * You may use this method for any given {@link com.boydti.fawe.configuration.ConfigurationSection}, not - * only {@link com.boydti.fawe.configuration.MemorySection}. + * You may use this method for any given {@link ConfigurationSection}, not + * only {@link MemorySection}. * * @param section Section to create a path for. * @param key Name of the specified section. * @param relativeTo Section to create the path relative to. * @return Full path of the section from its root. */ - public static String createPath(com.boydti.fawe.configuration.ConfigurationSection section, String key, com.boydti.fawe.configuration.ConfigurationSection relativeTo) { + public static String createPath(ConfigurationSection section, String key, ConfigurationSection relativeTo) { if (section == null) { throw new NullPointerException("Cannot create path without a section"); } @@ -159,7 +159,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio char separator = root.options().pathSeparator(); StringBuilder builder = new StringBuilder(); - for (com.boydti.fawe.configuration.ConfigurationSection parent = section; (parent != null) && (parent != relativeTo); parent = parent.getParent()) { + for (ConfigurationSection parent = section; (parent != null) && (parent != relativeTo); parent = parent.getParent()) { if (builder.length() > 0) { builder.insert(0, separator); } @@ -184,7 +184,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio Configuration root = getRoot(); if ((root != null) && root.options().copyDefaults()) { - com.boydti.fawe.configuration.ConfigurationSection defaults = getDefaultSection(); + ConfigurationSection defaults = getDefaultSection(); if (defaults != null) { result.addAll(defaults.getKeys(deep)); @@ -202,7 +202,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio Configuration root = getRoot(); if ((root != null) && root.options().copyDefaults()) { - com.boydti.fawe.configuration.ConfigurationSection defaults = getDefaultSection(); + ConfigurationSection defaults = getDefaultSection(); if (defaults != null) { result.putAll(defaults.getValues(deep)); @@ -247,7 +247,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } @Override - public com.boydti.fawe.configuration.ConfigurationSection getParent() { + public ConfigurationSection getParent() { return this.parent; } @@ -268,7 +268,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } @Override - public com.boydti.fawe.configuration.ConfigurationSection getDefaultSection() { + public ConfigurationSection getDefaultSection() { Configuration root = getRoot(); Configuration defaults = root == null ? null : root.getDefaults(); @@ -297,10 +297,10 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio // i2 is the trailing (lower) index int i1 = -1; int i2; - com.boydti.fawe.configuration.ConfigurationSection section = this; + ConfigurationSection section = this; while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { String node = path.substring(i2, i1); - com.boydti.fawe.configuration.ConfigurationSection subSection = section.getConfigurationSection(node); + ConfigurationSection subSection = section.getConfigurationSection(node); if (subSection == null) { section = section.createSection(node); } else { @@ -345,7 +345,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio // i2 is the trailing (lower) index int i1 = -1; int i2; - com.boydti.fawe.configuration.ConfigurationSection section = this; + ConfigurationSection section = this; while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { section = section.getConfigurationSection(path.substring(i2, i1)); if (section == null) { @@ -366,7 +366,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } @Override - public com.boydti.fawe.configuration.ConfigurationSection createSection(String path) { + public ConfigurationSection createSection(String path) { if (path == null) { throw new NullPointerException("Cannot create section at empty path"); } @@ -380,10 +380,10 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio // i2 is the trailing (lower) index int i1 = -1; int i2; - com.boydti.fawe.configuration.ConfigurationSection section = this; + ConfigurationSection section = this; while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { String node = path.substring(i2, i1); - com.boydti.fawe.configuration.ConfigurationSection subSection = section.getConfigurationSection(node); + ConfigurationSection subSection = section.getConfigurationSection(node); if (subSection == null) { section = section.createSection(node); } else { @@ -393,7 +393,7 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio String key = path.substring(i2); if (section == this) { - com.boydti.fawe.configuration.ConfigurationSection result = new com.boydti.fawe.configuration.MemorySection(this, key); + ConfigurationSection result = new MemorySection(this, key); this.map.put(key, result); return result; } @@ -401,8 +401,8 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } @Override - public com.boydti.fawe.configuration.ConfigurationSection createSection(String path, Map map) { - com.boydti.fawe.configuration.ConfigurationSection section = createSection(path); + public ConfigurationSection createSection(String path, Map map) { + ConfigurationSection section = createSection(path); for (Map.Entry entry : map.entrySet()) { if (entry.getValue() instanceof Map) { @@ -759,20 +759,20 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } @Override - public com.boydti.fawe.configuration.ConfigurationSection getConfigurationSection(String path) { + public ConfigurationSection getConfigurationSection(String path) { Object val = get(path, null); if (val != null) { - return (val instanceof com.boydti.fawe.configuration.ConfigurationSection) ? (com.boydti.fawe.configuration.ConfigurationSection) val : null; + return (val instanceof ConfigurationSection) ? (ConfigurationSection) val : null; } val = get(path, getDefault(path)); - return (val instanceof com.boydti.fawe.configuration.ConfigurationSection) ? createSection(path) : null; + return (val instanceof ConfigurationSection) ? createSection(path) : null; } @Override public boolean isConfigurationSection(String path) { Object val = get(path); - return val instanceof com.boydti.fawe.configuration.ConfigurationSection; + return val instanceof ConfigurationSection; } protected boolean isPrimitiveWrapper(Object input) { @@ -796,15 +796,15 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio return (defaults == null) ? null : defaults.get(createPath(this, path)); } - protected void mapChildrenKeys(Set output, com.boydti.fawe.configuration.ConfigurationSection section, boolean deep) { - if (section instanceof com.boydti.fawe.configuration.MemorySection) { - com.boydti.fawe.configuration.MemorySection sec = (com.boydti.fawe.configuration.MemorySection) section; + protected void mapChildrenKeys(Set output, ConfigurationSection section, boolean deep) { + if (section instanceof MemorySection) { + MemorySection sec = (MemorySection) section; for (Map.Entry entry : sec.map.entrySet()) { output.add(createPath(section, entry.getKey(), this)); - if (deep && (entry.getValue() instanceof com.boydti.fawe.configuration.ConfigurationSection)) { - com.boydti.fawe.configuration.ConfigurationSection subsection = (com.boydti.fawe.configuration.ConfigurationSection) entry.getValue(); + if (deep && (entry.getValue() instanceof ConfigurationSection)) { + ConfigurationSection subsection = (ConfigurationSection) entry.getValue(); mapChildrenKeys(output, subsection, deep); } } @@ -817,14 +817,14 @@ public class MemorySection implements com.boydti.fawe.configuration.Configuratio } } - protected void mapChildrenValues(Map output, com.boydti.fawe.configuration.ConfigurationSection section, boolean deep) { - if (section instanceof com.boydti.fawe.configuration.MemorySection) { - com.boydti.fawe.configuration.MemorySection sec = (com.boydti.fawe.configuration.MemorySection) section; + protected void mapChildrenValues(Map output, ConfigurationSection section, boolean deep) { + if (section instanceof MemorySection) { + MemorySection sec = (MemorySection) section; for (Map.Entry entry : sec.map.entrySet()) { output.put(createPath(section, entry.getKey(), this), entry.getValue()); - if (entry.getValue() instanceof com.boydti.fawe.configuration.ConfigurationSection) { + if (entry.getValue() instanceof ConfigurationSection) { if (deep) { mapChildrenValues(output, (ConfigurationSection) entry.getValue(), deep); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/config/Settings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/config/Settings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java index 3127fad6a..7d9148465 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/config/Settings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Settings.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.config; +package com.fastasyncworldedit.core.configuration; -import com.boydti.fawe.object.FaweLimit; +import com.fastasyncworldedit.core.object.FaweLimit; import com.sk89q.worldedit.extension.platform.Actor; import java.io.File; @@ -75,14 +75,14 @@ public class Settings extends Config { 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" + "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_HOOK = true; + public boolean PLOTSQUARED_v4_HOOK = true; } @Comment("Paths for various directories") public static final class PATHS { - public String TOKENS = "tokens"; @Comment({ "Put any minecraft or mod jars for FAWE to be aware of block textures", }) @@ -96,7 +96,6 @@ public class Settings extends Config { public String CLIPBOARD = "clipboard"; @Comment("Each player has his or her own sub directory for schematics") public boolean PER_PLAYER_SCHEMATICS = true; - public String COMMANDS = "commands"; } @Comment("Region restriction settings") @@ -402,10 +401,12 @@ 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 CUBOIDS = true; public boolean COPY_AND_SWAP = true; - public boolean SET_BIOME = true; } public static class WEB { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/TypeDescription.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/TypeDescription.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/TypeDescription.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/TypeDescription.java index e621bf042..42d38ad44 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/TypeDescription.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/TypeDescription.java @@ -1,4 +1,4 @@ -package org.yaml.snakeyaml; +package com.fastasyncworldedit.core.configuration; import org.yaml.snakeyaml.nodes.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/Yaml.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Yaml.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/Yaml.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Yaml.java index 1b94c11d1..9bc0d5408 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/Yaml.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/Yaml.java @@ -1,5 +1,6 @@ -package org.yaml.snakeyaml; +package com.fastasyncworldedit.core.configuration; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.DumperOptions.FlowStyle; import org.yaml.snakeyaml.composer.Composer; import org.yaml.snakeyaml.constructor.BaseConstructor; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfiguration.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfiguration.java similarity index 77% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfiguration.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfiguration.java index 79a915b67..816060877 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfiguration.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfiguration.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; -import com.boydti.fawe.configuration.Configuration; -import com.boydti.fawe.configuration.InvalidConfigurationException; -import com.boydti.fawe.configuration.MemoryConfiguration; +import com.fastasyncworldedit.core.configuration.Configuration; +import com.fastasyncworldedit.core.configuration.InvalidConfigurationException; +import com.fastasyncworldedit.core.configuration.MemoryConfiguration; import java.io.BufferedReader; import java.io.File; @@ -17,19 +17,19 @@ import java.nio.charset.StandardCharsets; /** * This is a base class for all File based implementations of {@link - * com.boydti.fawe.configuration.Configuration} + * Configuration} */ public abstract class FileConfiguration extends MemoryConfiguration { /** - * Creates an empty {@link com.boydti.fawe.configuration.file.FileConfiguration} with no default values. + * Creates an empty {@link FileConfiguration} with no default values. */ public FileConfiguration() { } /** - * Creates an empty {@link com.boydti.fawe.configuration.file.FileConfiguration} using the specified {@link - * com.boydti.fawe.configuration.Configuration} as a source for all default values. + * Creates an empty {@link FileConfiguration} using the specified {@link + * Configuration} as a source for all default values. * * @param defaults Default value provider */ @@ -38,7 +38,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Saves this {@link com.boydti.fawe.configuration.file.FileConfiguration} to the specified location. + * Saves this {@link FileConfiguration} to the specified location. *

* If the file does not exist, it will be created. If already exists, it * will be overwritten. If it cannot be overwritten or created, an @@ -66,7 +66,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Saves this {@link com.boydti.fawe.configuration.file.FileConfiguration} to the specified location. + * Saves this {@link FileConfiguration} to the specified location. *

* If the file does not exist, it will be created. If already exists, it * will be overwritten. If it cannot be overwritten or created, an @@ -89,14 +89,14 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Saves this {@link com.boydti.fawe.configuration.file.FileConfiguration} to a string, and returns it. + * Saves this {@link FileConfiguration} to a string, and returns it. * * @return String containing this configuration. */ public abstract String saveToString(); /** - * Loads this {@link com.boydti.fawe.configuration.file.FileConfiguration} from the specified location. + * Loads this {@link FileConfiguration} from the specified location. *

* All the values contained within this configuration will be removed, * leaving only settings and defaults, and the new values will be loaded @@ -110,7 +110,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { * @throws java.io.FileNotFoundException Thrown when the given file cannot be * opened. * @throws java.io.IOException Thrown when the given file cannot be read. - * @throws com.boydti.fawe.configuration.InvalidConfigurationException Thrown when the given file is not + * @throws InvalidConfigurationException Thrown when the given file is not * a valid Configuration. * @throws IllegalArgumentException Thrown when file is null. */ @@ -125,7 +125,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Loads this {@link com.boydti.fawe.configuration.file.FileConfiguration} from the specified reader. + * Loads this {@link FileConfiguration} from the specified reader. *

* All the values contained within this configuration will be removed, * leaving only settings and defaults, and the new values will be loaded @@ -133,7 +133,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { * * @param reader the reader to load from * @throws java.io.IOException thrown when underlying reader throws an IOException - * @throws com.boydti.fawe.configuration.InvalidConfigurationException thrown when the reader does not + * @throws InvalidConfigurationException thrown when the reader does not * represent a valid Configuration * @throws IllegalArgumentException thrown when reader is null */ @@ -154,7 +154,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Loads this {@link com.boydti.fawe.configuration.file.FileConfiguration} from the specified location. + * Loads this {@link FileConfiguration} from the specified location. *

* All the values contained within this configuration will be removed, * leaving only settings and defaults, and the new values will be loaded @@ -167,7 +167,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { * @throws java.io.FileNotFoundException Thrown when the given file cannot be * opened. * @throws java.io.IOException Thrown when the given file cannot be read. - * @throws com.boydti.fawe.configuration.InvalidConfigurationException Thrown when the given file is not + * @throws InvalidConfigurationException Thrown when the given file is not * a valid Configuration. * @throws IllegalArgumentException Thrown when file is null. */ @@ -180,7 +180,7 @@ public abstract class FileConfiguration extends MemoryConfiguration { } /** - * Loads this {@link com.boydti.fawe.configuration.file.FileConfiguration} from the specified string, as + * Loads this {@link FileConfiguration} from the specified string, as * opposed to from file. *

* All the values contained within this configuration will be removed, @@ -190,19 +190,19 @@ public abstract class FileConfiguration extends MemoryConfiguration { * If the string is invalid in any way, an exception will be thrown. * * @param contents Contents of a Configuration to load. - * @throws com.boydti.fawe.configuration.InvalidConfigurationException Thrown if the specified string is + * @throws InvalidConfigurationException Thrown if the specified string is * invalid. * @throws IllegalArgumentException Thrown if contents is null. */ public abstract void loadFromString(String contents) throws InvalidConfigurationException; /** - * Compiles the header for this {@link com.boydti.fawe.configuration.file.FileConfiguration} and returns the + * Compiles the header for this {@link FileConfiguration} and returns the * result. *

* This will use the header from {@link #options()} -> {@link - * com.boydti.fawe.configuration.file.FileConfigurationOptions#header()}, respecting the rules of {@link - * com.boydti.fawe.configuration.file.FileConfigurationOptions#copyHeader()} if set. + * FileConfigurationOptions#header()}, respecting the rules of {@link + * FileConfigurationOptions#copyHeader()} if set. * * @return Compiled header */ diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfigurationOptions.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfigurationOptions.java similarity index 66% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfigurationOptions.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfigurationOptions.java index a6fa97bfc..8367abebd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/FileConfigurationOptions.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/FileConfigurationOptions.java @@ -1,11 +1,12 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; -import com.boydti.fawe.configuration.MemoryConfiguration; -import com.boydti.fawe.configuration.MemoryConfigurationOptions; +import com.fastasyncworldedit.core.configuration.MemoryConfiguration; +import com.fastasyncworldedit.core.configuration.MemoryConfigurationOptions; +import com.fastasyncworldedit.core.configuration.Configuration; /** * Various settings for controlling the input and output of a {@link - * com.boydti.fawe.configuration.file.FileConfiguration} + * FileConfiguration} */ public class FileConfigurationOptions extends MemoryConfigurationOptions { private String header = null; @@ -16,18 +17,18 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { } @Override - public com.boydti.fawe.configuration.file.FileConfiguration configuration() { - return (com.boydti.fawe.configuration.file.FileConfiguration) super.configuration(); + public FileConfiguration configuration() { + return (FileConfiguration) super.configuration(); } @Override - public com.boydti.fawe.configuration.file.FileConfigurationOptions copyDefaults(final boolean value) { + public FileConfigurationOptions copyDefaults(final boolean value) { super.copyDefaults(value); return this; } @Override - public com.boydti.fawe.configuration.file.FileConfigurationOptions pathSeparator(final char value) { + public FileConfigurationOptions pathSeparator(final char value) { super.pathSeparator(value); return this; } @@ -36,7 +37,7 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { * Gets the header that will be applied to the top of the saved output. *

* This header will be commented out and applied directly at the top of - * the generated output of the {@link com.boydti.fawe.configuration.file.FileConfiguration}. It is not + * the generated output of the {@link FileConfiguration}. It is not * required to include a newline at the end of the header as it will * automatically be applied, but you may include one if you wish for extra * spacing. @@ -54,7 +55,7 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { * Sets the header that will be applied to the top of the saved output. *

* This header will be commented out and applied directly at the top of - * the generated output of the {@link com.boydti.fawe.configuration.file.FileConfiguration}. It is not + * the generated output of the {@link FileConfiguration}. It is not * required to include a newline at the end of the header as it will * automatically be applied, but you may include one if you wish for extra * spacing. @@ -65,7 +66,7 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { * @param value New header * @return This object, for chaining */ - public com.boydti.fawe.configuration.file.FileConfigurationOptions header(final String value) { + public FileConfigurationOptions header(final String value) { header = value; return this; } @@ -73,9 +74,9 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { /** * Gets whether or not the header should be copied from a default source. *

- * If this is true, if a default {@link com.boydti.fawe.configuration.file.FileConfiguration} is passed to + * If this is true, if a default {@link FileConfiguration} is passed to * {@link - * com.boydti.fawe.configuration.file.FileConfiguration#setDefaults(com.boydti.fawe.configuration.Configuration)} + * FileConfiguration#setDefaults(Configuration)} * then upon saving it will use the header from that config, instead of * the one provided here. *

@@ -95,9 +96,9 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { /** * Sets whether or not the header should be copied from a default source. *

- * If this is true, if a default {@link com.boydti.fawe.configuration.file.FileConfiguration} is passed to + * If this is true, if a default {@link FileConfiguration} is passed to * {@link - * com.boydti.fawe.configuration.file.FileConfiguration#setDefaults(com.boydti.fawe.configuration.Configuration)} + * FileConfiguration#setDefaults(Configuration)} * then upon saving it will use the header from that config, instead of * the one provided here. *

@@ -111,7 +112,7 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions { * @param value Whether or not to copy the header * @return This object, for chaining */ - public com.boydti.fawe.configuration.file.FileConfigurationOptions copyHeader(final boolean value) { + public FileConfigurationOptions copyHeader(final boolean value) { copyHeader = value; return this; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfiguration.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfiguration.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfiguration.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfiguration.java index 970a7e46b..70c76c934 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfiguration.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfiguration.java @@ -1,12 +1,12 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; -import com.boydti.fawe.configuration.Configuration; -import com.boydti.fawe.configuration.ConfigurationSection; -import com.boydti.fawe.configuration.InvalidConfigurationException; +import com.fastasyncworldedit.core.configuration.Configuration; +import com.fastasyncworldedit.core.configuration.ConfigurationSection; +import com.fastasyncworldedit.core.configuration.InvalidConfigurationException; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; +import com.fastasyncworldedit.core.configuration.Yaml; import org.yaml.snakeyaml.error.YAMLException; import org.yaml.snakeyaml.representer.Representer; @@ -18,7 +18,7 @@ import java.nio.file.StandardCopyOption; import java.util.Map; /** - * An implementation of {@link com.boydti.fawe.configuration.Configuration} which saves all files in Yaml. + * An implementation of {@link Configuration} which saves all files in Yaml. * Note that this implementation is not synchronized. */ public class YamlConfiguration extends FileConfiguration { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfigurationOptions.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfigurationOptions.java similarity index 73% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfigurationOptions.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfigurationOptions.java index 5cf55ed18..1451d5d84 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConfigurationOptions.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConfigurationOptions.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; /** * Various settings for controlling the input and output of a {@link YamlConfiguration}. @@ -16,25 +16,25 @@ public class YamlConfigurationOptions extends FileConfigurationOptions { } @Override - public com.boydti.fawe.configuration.file.YamlConfigurationOptions copyDefaults(final boolean value) { + public YamlConfigurationOptions copyDefaults(final boolean value) { super.copyDefaults(value); return this; } @Override - public com.boydti.fawe.configuration.file.YamlConfigurationOptions pathSeparator(final char value) { + public YamlConfigurationOptions pathSeparator(final char value) { super.pathSeparator(value); return this; } @Override - public com.boydti.fawe.configuration.file.YamlConfigurationOptions header(final String value) { + public YamlConfigurationOptions header(final String value) { super.header(value); return this; } @Override - public com.boydti.fawe.configuration.file.YamlConfigurationOptions copyHeader(final boolean value) { + public YamlConfigurationOptions copyHeader(final boolean value) { super.copyHeader(value); return this; } @@ -61,7 +61,7 @@ public class YamlConfigurationOptions extends FileConfigurationOptions { * @param value New indent * @return This object, for chaining */ - public com.boydti.fawe.configuration.file.YamlConfigurationOptions indent(final int value) { + public YamlConfigurationOptions indent(final int value) { if (value < 2) { throw new IllegalArgumentException("Indent must be at least 2 characters"); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConstructor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConstructor.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConstructor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConstructor.java index 5d48addfb..92aa9c8ff 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlConstructor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlConstructor.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; -import com.boydti.fawe.configuration.serialization.ConfigurationSerialization; +import com.fastasyncworldedit.core.configuration.serialization.ConfigurationSerialization; import org.yaml.snakeyaml.constructor.SafeConstructor; import org.yaml.snakeyaml.error.YAMLException; import org.yaml.snakeyaml.nodes.Node; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlRepresenter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlRepresenter.java similarity index 80% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlRepresenter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlRepresenter.java index a891d5e29..26de3fb06 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/file/YamlRepresenter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/file/YamlRepresenter.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.configuration.file; +package com.fastasyncworldedit.core.configuration.file; -import com.boydti.fawe.configuration.ConfigurationSection; -import com.boydti.fawe.configuration.serialization.ConfigurationSerializable; -import com.boydti.fawe.configuration.serialization.ConfigurationSerialization; +import com.fastasyncworldedit.core.configuration.ConfigurationSection; +import com.fastasyncworldedit.core.configuration.serialization.ConfigurationSerializable; +import com.fastasyncworldedit.core.configuration.serialization.ConfigurationSerialization; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.representer.Representer; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerializable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerializable.java similarity index 70% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerializable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerializable.java index 2b1b42f8c..146d95cfd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerializable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerializable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration.serialization; +package com.fastasyncworldedit.core.configuration.serialization; import java.util.Map; @@ -16,10 +16,10 @@ import java.util.Map; * {@link Object}>. * * In addition to implementing this interface, you must register the class - * with {@link com.boydti.fawe.configuration.serialization.ConfigurationSerialization#registerClass(Class)}. + * with {@link ConfigurationSerialization#registerClass(Class)}. * - * @see com.boydti.fawe.configuration.serialization.DelegateDeserialization - * @see com.boydti.fawe.configuration.serialization.SerializableAs + * @see DelegateDeserialization + * @see SerializableAs */ public interface ConfigurationSerializable { @@ -27,7 +27,7 @@ public interface ConfigurationSerializable { * Creates a Map representation of this class. *

* This class must provide a method to restore this class, as defined in - * the {@link com.boydti.fawe.configuration.serialization.ConfigurationSerializable} interface javadoc. + * the {@link ConfigurationSerializable} interface javadoc. * * @return Map containing the current state of this class */ diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerialization.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerialization.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerialization.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerialization.java index 38f8559d0..b4b312d74 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/ConfigurationSerialization.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/ConfigurationSerialization.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.configuration.serialization; +package com.fastasyncworldedit.core.configuration.serialization; -import com.boydti.fawe.configuration.Configuration; +import com.fastasyncworldedit.core.configuration.Configuration; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/DelegateDeserialization.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/DelegateDeserialization.java similarity index 63% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/DelegateDeserialization.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/DelegateDeserialization.java index dfe31006a..863e95b78 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/DelegateDeserialization.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/DelegateDeserialization.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration.serialization; +package com.fastasyncworldedit.core.configuration.serialization; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,8 +6,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Applies to a {@link com.boydti.fawe.configuration.serialization.ConfigurationSerializable} that will delegate all - * deserialization to another {@link com.boydti.fawe.configuration.serialization.ConfigurationSerializable}. + * Applies to a {@link ConfigurationSerializable} that will delegate all + * deserialization to another {@link ConfigurationSerializable}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/SerializableAs.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/SerializableAs.java similarity index 62% rename from worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/SerializableAs.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/SerializableAs.java index a51c7d7eb..cfed0f477 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/configuration/serialization/SerializableAs.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/configuration/serialization/SerializableAs.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.configuration.serialization; +package com.fastasyncworldedit.core.configuration.serialization; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,18 +6,18 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Represents an "alias" that a {@link com.boydti.fawe.configuration.serialization.ConfigurationSerializable} may be + * Represents an "alias" that a {@link ConfigurationSerializable} may be * stored as. - * If this is not present on a {@link com.boydti.fawe.configuration.serialization.ConfigurationSerializable} class, it + * If this is not present on a {@link ConfigurationSerializable} class, it * will use the fully qualified name of the class. *

* This value will be stored in the configuration so that the configuration * deserialization can determine what type it is. *

* Using this annotation on any other class than a {@link - * com.boydti.fawe.configuration.serialization.ConfigurationSerializable} will have no effect. + * ConfigurationSerializable} will have no effect. * - * @see com.boydti.fawe.configuration.serialization.ConfigurationSerialization#registerClass(Class, String) + * @see ConfigurationSerialization#registerClass(Class, String) */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/worldedit-core/src/main/java/com/boydti/fawe/database/DBHandler.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/database/DBHandler.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java index fad5fde28..bbb39bfba 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/database/DBHandler.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/DBHandler.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.database; +package com.fastasyncworldedit.core.database; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/database/RollbackDatabase.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/database/RollbackDatabase.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java index 8543e434d..ed0b680f6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/database/RollbackDatabase.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/database/RollbackDatabase.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.database; +package com.fastasyncworldedit.core.database; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory; -import com.boydti.fawe.object.collection.YieldIterable; -import com.boydti.fawe.object.task.AsyncNotifyQueue; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.object.collection.YieldIterable; +import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/JSON2NBT.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/JSON2NBT.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/JSON2NBT.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/JSON2NBT.java index e5ff43e6e..e609bc9ac 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/JSON2NBT.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/JSON2NBT.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt; +package com.fastasyncworldedit.core.jnbt; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/NBTException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NBTException.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/NBTException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NBTException.java index 339e4b3bc..e8dbbfa90 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/NBTException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/NBTException.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt; +package com.fastasyncworldedit.core.jnbt; public class NBTException extends RuntimeException { public NBTException(String message) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/InfoReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/InfoReader.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/InfoReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/InfoReader.java index 1f8091686..6553c2df4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/InfoReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/InfoReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/IntValueReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/IntValueReader.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/IntValueReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/IntValueReader.java index fad915aad..501497320 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/IntValueReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/IntValueReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LazyReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LazyReader.java similarity index 82% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LazyReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LazyReader.java index 963daab54..d12685fae 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LazyReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LazyReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import com.sk89q.jnbt.NBTInputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LongValueReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LongValueReader.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LongValueReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LongValueReader.java index 944317a7a..2d9e022de 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/LongValueReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/LongValueReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamDelegate.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamDelegate.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamDelegate.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamDelegate.java index fe3f9dbdf..1e26e4d41 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamDelegate.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamDelegate.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import com.sk89q.jnbt.NBTConstants; import com.sk89q.jnbt.NBTInputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamReader.java similarity index 69% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamReader.java index dadcf005e..abea69930 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/StreamReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/StreamReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/ValueReader.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/ValueReader.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/ValueReader.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/ValueReader.java index 63107c0f4..a667051bd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/jnbt/streamer/ValueReader.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/jnbt/streamer/ValueReader.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.jnbt.streamer; +package com.fastasyncworldedit.core.jnbt.streamer; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/logging/rollback/RollbackOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/logging/rollback/RollbackOptimizedHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java index 7a8075852..fdb5b4656 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/logging/rollback/RollbackOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/logging/RollbackOptimizedHistory.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.logging.rollback; +package com.fastasyncworldedit.core.logging; -import com.boydti.fawe.database.DBHandler; -import com.boydti.fawe.database.RollbackDatabase; -import com.boydti.fawe.object.changeset.DiskStorageHistory; -import com.boydti.fawe.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.database.DBHandler; +import com.fastasyncworldedit.core.database.RollbackDatabase; +import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; +import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/DataAnglePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/DataAnglePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java index f873f9917..9d4636bb4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/DataAnglePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DataAnglePattern.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; -import com.boydti.fawe.object.extent.ExtentHeightCacher; +import com.fastasyncworldedit.core.object.extent.ExtentHeightCacher; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; @@ -39,7 +39,7 @@ public class DataAnglePattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockState block = extent.getBlock(position); int slope = getSlope(block, position, extent); if (slope == -1) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DelegateConsumer.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DelegateConsumer.java index f7f41de30..201b0109d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/DelegateConsumer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/DelegateConsumer.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import java.util.function.Consumer; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/FaweInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java index 004370113..b62525c5c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweInputStream.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; -import com.boydti.fawe.util.IOUtil; +import com.fastasyncworldedit.core.util.IOUtil; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NamedTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweLimit.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweLimit.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/FaweLimit.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweLimit.java index 77ecf68e1..9bd109421 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweLimit.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweLimit.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; import java.util.Set; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java index 53f8f229d..28768a07d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/FaweOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/FaweOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/HistoryExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/HistoryExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java index f05338fa1..87402445f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/HistoryExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/HistoryExtent.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; -import com.boydti.fawe.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/IntPair.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/IntPair.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java index e7746664a..5cfdf135a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/IntPair.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntPair.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; public final class IntPair { public int x; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/IntTriple.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/IntTriple.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java index 9c684ff17..d41ab9502 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/IntTriple.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/IntTriple.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; public final class IntTriple { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/Metadatable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/Metadatable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java index 8d86caaf5..a38da1435 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/Metadatable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/Metadatable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import com.sk89q.worldedit.entity.MapMetadatable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/NullChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/NullChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java index 5313dcf4a..adb22b731 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/NullChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/NullChangeSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; -import com.boydti.fawe.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.history.change.Change; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RegionWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RegionWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java index 13afbea38..5f17a8418 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RegionWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RegionWrapper.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RelightMode.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RelightMode.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java index a8d448e5a..8822526c8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RelightMode.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RelightMode.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import java.util.HashMap; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal.java index 45997dd0b..bfcd00636 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import java.util.function.Consumer; import java.util.function.Supplier; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal2.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal2.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal2.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal2.java index a8a43ab61..4afdbff22 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal2.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal2.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; import java.util.function.BiConsumer; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal3.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal3.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java index e3396f096..555df2f04 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal3.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal3.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; public abstract class RunnableVal3 implements Runnable { public T value1; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal4.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal4.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java index fc28d60d6..b734efba7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/RunnableVal4.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/RunnableVal4.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object; +package com.fastasyncworldedit.core.object; public abstract class RunnableVal4 implements Runnable { public T value1; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/AngleBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/AngleBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java index fdc04129a..a93027316 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/AngleBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/AngleBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.mask.RadiusMask; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlendBall.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlendBall.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java index c431f588d..a09066a58 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlendBall.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlendBall.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlobBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlobBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java index 79159cba3..c0b93707f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BlobBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BlobBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.random.SimplexNoise; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.object.random.SimplexNoise; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BrushSettings.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/BrushSettings.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java index c200a2cf3..e30642f87 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/BrushSettings.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/BrushSettings.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.scroll.Scroll; -import com.boydti.fawe.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.function.mask.Mask; @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import static com.boydti.fawe.object.brush.BrushSettings.SettingType.BRUSH; +import static com.fastasyncworldedit.core.object.brush.BrushSettings.SettingType.BRUSH; import static com.google.common.base.Preconditions.checkNotNull; public class BrushSettings { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java index d313ca968..343cd4bad 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CatenaryBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CatenaryBrush.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CircleBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/CircleBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java index f4c22a54d..718a12785 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CircleBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CircleBrush.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CommandBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/CommandBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java index 68908dc4b..d2002b941 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CommandBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CommandBrush.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.wrappers.AsyncPlayer; -import com.boydti.fawe.wrappers.LocationMaskedPlayerWrapper; -import com.boydti.fawe.wrappers.SilentPlayerWrapper; +import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.wrappers.AsyncPlayer; +import com.fastasyncworldedit.core.wrappers.LocationMaskedPlayerWrapper; +import com.fastasyncworldedit.core.wrappers.SilentPlayerWrapper; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CopyPastaBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/CopyPastaBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java index c5104129b..7ed301f49 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/CopyPastaBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/CopyPastaBrush.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.clipboard.ResizableClipboardBuilder; -import com.boydti.fawe.object.function.NullRegionFunction; -import com.boydti.fawe.object.function.mask.AbstractDelegateMask; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.clipboard.ResizableClipboardBuilder; +import com.fastasyncworldedit.core.object.function.NullRegionFunction; +import com.fastasyncworldedit.core.object.function.mask.AbstractDelegateMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java index b043ffc43..31929f721 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ErodeBrush.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.clipboard.CPUOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.CPUOptimizedClipboard; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/FallingSphere.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/FallingSphere.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java index 302a60841..6bea6a95f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/FallingSphere.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FallingSphere.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/FlattenBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/FlattenBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java index de2cbc45a..3740137dc 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/FlattenBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/FlattenBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.heightmap.HeightMap; -import com.boydti.fawe.object.brush.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; +import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/HeightBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/HeightBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java index 271e717cb..8400e0f7d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/HeightBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/HeightBrush.java @@ -1,20 +1,17 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.brush.heightmap.HeightMap; -import com.boydti.fawe.object.brush.heightmap.RotatableHeightMap; -import com.boydti.fawe.object.brush.heightmap.ScalableHeightMap; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; +import com.fastasyncworldedit.core.object.brush.heightmap.RotatableHeightMap; +import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.object.exception.FaweException; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; -import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.Masks; import com.sk89q.worldedit.function.pattern.Pattern; -import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ImageBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ImageBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java index d13f83bbe..5216f04a7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ImageBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ImageBrush.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.mask.ImageBrushMask; -import com.boydti.fawe.object.collection.SummedColorTable; -import com.boydti.fawe.object.mask.SurfaceMask; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.object.brush.mask.ImageBrushMask; +import com.fastasyncworldedit.core.object.collection.SummedColorTable; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/InspectBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/InspectBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java index 0898724d2..a34069696 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/InspectBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/InspectBrush.java @@ -1,13 +1,13 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.database.DBHandler; -import com.boydti.fawe.database.RollbackDatabase; -import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory; -import com.boydti.fawe.object.change.MutableFullBlockChange; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.database.DBHandler; +import com.fastasyncworldedit.core.database.RollbackDatabase; +import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.object.change.MutableFullBlockChange; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/LayerBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/LayerBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java index 15903a174..f71d93941 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/LayerBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LayerBrush.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.mask.LayerBrushMask; -import com.boydti.fawe.object.collection.BlockVectorSet; -import com.boydti.fawe.object.mask.AdjacentAnyMask; -import com.boydti.fawe.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.brush.mask.LayerBrushMask; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.object.mask.RadiusMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java index 01d3ccad1..6e2658b76 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/LineBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/LineBrush.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/MovableTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java similarity index 68% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/MovableTool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java index 6bbd1f71e..2e7eed451 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/MovableTool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/MovableTool.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/PopulateSchem.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/PopulateSchem.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java index a3a337aac..766dbb91d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/PopulateSchem.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/PopulateSchem.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.util.MaskTraverser; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MaskTraverser; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RaiseBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/RaiseBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java index be85c9da6..0852e76ab 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RaiseBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RaiseBrush.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; public class RaiseBrush extends ErodeBrush { public RaiseBrush() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RecurseBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/RecurseBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java index 2f5f60e59..f046321a7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RecurseBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RecurseBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.mask.RadiusMask; -import com.boydti.fawe.object.visitor.DFSRecursiveVisitor; +import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.visitor.DFSRecursiveVisitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ResettableTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java similarity index 53% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ResettableTool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java index 53d5859eb..b8f7655b5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ResettableTool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ResettableTool.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; public interface ResettableTool { boolean reset(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RockBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/RockBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java index 9b6016f94..6c8ac2ac7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/RockBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/RockBrush.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.random.SimplexNoise; +import com.fastasyncworldedit.core.object.random.SimplexNoise; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java index 8fe6680fc..54e8ca37f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterBrush.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.collection.BlockVectorSet; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.object.mask.AdjacentAnyMask; -import com.boydti.fawe.object.mask.RadiusMask; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterCommand.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterCommand.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java index ee45169ab..623f8604d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterCommand.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterCommand.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterOverlayBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterOverlayBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java index 72ce8a9e8..bbed13b2e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ScatterOverlayBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ScatterOverlayBrush.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ShatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/ShatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java index aab7bd8be..dee338dc6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ShatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/ShatterBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplatterBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java index 3e525da6c..b4c7337e4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplatterBrush.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.mask.SplatterBrushMask; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.brush.mask.SplatterBrushMask; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.function.operation.Operations; @@ -27,7 +27,7 @@ public class SplatterBrush extends ScatterBrush { public void apply(final EditSession editSession, final LocalBlockVectorSet placed, final BlockVector3 position, Pattern p, double size) throws MaxChangedBlocksException { final Pattern finalPattern; if (solid) { - finalPattern = p.apply(position); + finalPattern = p.applyBlock(position); } else { finalPattern = p; } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplineBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplineBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java index 47f6cb71a..54292ab51 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SplineBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SplineBrush.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.mask.IdMask; -import com.boydti.fawe.object.visitor.DFSRecursiveVisitor; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.mask.IdMask; +import com.fastasyncworldedit.core.object.visitor.DFSRecursiveVisitor; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/StencilBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/StencilBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java index 8d87076db..62dc8e970 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/StencilBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/StencilBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.brush.heightmap.HeightMap; -import com.boydti.fawe.object.brush.mask.StencilBrushMask; +import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; +import com.fastasyncworldedit.core.object.brush.mask.StencilBrushMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSphereBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSphereBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java index 5fd3b6cf3..99c7776ed 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSphereBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSphereBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.object.mask.RadiusMask; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.command.tool.brush.Brush; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSpline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSpline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java index aaa0ebb46..c3c3d660b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/SurfaceSpline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/SurfaceSpline.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/TargetMode.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java similarity index 71% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/TargetMode.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java index 98b04a3c8..43318187e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/TargetMode.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/TargetMode.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush; +package com.fastasyncworldedit.core.object.brush; public enum TargetMode { TARGET_BLOCK_RANGE, diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AbstractDelegateHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AbstractDelegateHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java index 3cb4a62ba..c174bf4bb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AbstractDelegateHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AbstractDelegateHeightMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; public class AbstractDelegateHeightMap implements HeightMap { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ArrayHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ArrayHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java index fcf10b0c7..16ae614d7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ArrayHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ArrayHeightMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; public class ArrayHeightMap extends ScalableHeightMap { // The heights diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AverageHeightMapFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AverageHeightMapFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java index 820306b6d..34e7af512 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/AverageHeightMapFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/AverageHeightMapFilter.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; public class AverageHeightMapFilter { private int[] inData; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java index ed5557371..39014cf7a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/FlatScalableHeightMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; public class FlatScalableHeightMap extends ScalableHeightMap { public FlatScalableHeightMap() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java index 0a495dc38..c344700d0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/HeightMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java index d0e287ace..0087db2a0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/RotatableHeightMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ScalableHeightMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java index 81ac51f4c..1b999487e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/ScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/heightmap/ScalableHeightMap.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.brush.heightmap; +package com.fastasyncworldedit.core.object.brush.heightmap; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.object.IntPair; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/ImageBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/ImageBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java index 0de5d8f18..2682f6491 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/ImageBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/ImageBrushMask.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush.mask; +package com.fastasyncworldedit.core.object.brush.mask; -import com.boydti.fawe.object.brush.ImageBrush; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.object.brush.ImageBrush; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/LayerBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/LayerBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java index 3b5a2a9cb..ade248f7e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/LayerBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/LayerBrushMask.java @@ -1,18 +1,15 @@ -package com.boydti.fawe.object.brush.mask; +package com.fastasyncworldedit.core.object.brush.mask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.visitor.BreadthFirstSearch; import com.sk89q.worldedit.function.visitor.RecursiveVisitor; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.world.block.BlockState; -import java.util.Arrays; - public class LayerBrushMask extends AbstractExtentMask { private final EditSession editSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/SplatterBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/SplatterBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java index 94fcc0475..fc0dded7e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/SplatterBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/SplatterBrushMask.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.mask; +package com.fastasyncworldedit.core.object.brush.mask; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/StencilBrushMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/StencilBrushMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java index 607c4fe5c..adbdaf324 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/mask/StencilBrushMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/mask/StencilBrushMask.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush.mask; +package com.fastasyncworldedit.core.object.brush.mask; -import com.boydti.fawe.object.brush.heightmap.HeightMap; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.object.brush.heightmap.HeightMap; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/Scroll.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/Scroll.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java index c17a11584..baeb3e6bb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/Scroll.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/Scroll.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.tool.BrushTool; @@ -38,7 +38,7 @@ public abstract class Scroll implements ScrollTool { return fromArguments(tool, player, session, mode, args, message); } - public static com.boydti.fawe.object.brush.scroll.Scroll fromArguments(BrushTool tool, Player player, LocalSession session, Action mode, List arguments, boolean message) throws InputParseException { + public static Scroll fromArguments(BrushTool tool, Player player, LocalSession session, Action mode, List arguments, boolean message) throws InputParseException { ParserContext parserContext = new ParserContext(); parserContext.setActor(player); parserContext.setWorld(player.getWorld()); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java index c048abac4..e5e1cd6d1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollClipboard.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java index aba5bf42b..a35cc4f2c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollMask.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java index 36bfd5cc4..d7ba467a3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollPattern.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollRange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollRange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java index 1ef919946..31d9cbb07 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollRange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollRange.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollSize.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollSize.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java index 528bb8e1f..0c191e99c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollSize.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollSize.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.tool.BrushTool; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTarget.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java similarity index 77% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTarget.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java index 68d7ceb56..6c8dbf6a1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTarget.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTarget.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; -import com.boydti.fawe.object.brush.TargetMode; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.object.brush.TargetMode; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTargetOffset.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTargetOffset.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java index 2a07431ed..ef959e7b3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTargetOffset.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTargetOffset.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; import com.sk89q.worldedit.command.tool.BrushTool; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTool.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java similarity index 70% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTool.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java index 865f2c2a6..b9ea8de93 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/scroll/ScrollTool.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/scroll/ScrollTool.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.scroll; +package com.fastasyncworldedit.core.object.brush.scroll; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/ClipboardSpline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/ClipboardSpline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java index 133d6a614..090af0a43 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/ClipboardSpline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/ClipboardSpline.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.brush.sweep; +package com.fastasyncworldedit.core.object.brush.sweep; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/Spline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/Spline.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java index 377faf002..65ac995e2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/Spline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/Spline.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.brush.sweep; +package com.fastasyncworldedit.core.object.brush.sweep; import com.google.common.base.Preconditions; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/SweepBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/SweepBrush.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java index d4b3dcdbf..87d5689f7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/sweep/SweepBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/brush/sweep/SweepBrush.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.brush.sweep; +package com.fastasyncworldedit.core.object.brush.sweep; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.brush.ResettableTool; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.brush.ResettableTool; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBiomeChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBiomeChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java index 1b77e0a24..8cb5e8041 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBiomeChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBiomeChange.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.history.UndoContext; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java index def352dd9..b4857b367 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableBlockChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableBlockChange.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.history.UndoContext; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java index 1b3cfaa42..72da7ba37 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableEntityChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableEntityChange.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.DoubleTag; import com.sk89q.jnbt.LongTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java index 300329507..9396829eb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableFullBlockChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableFullBlockChange.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.inventory.BlockBag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java index 6c8c557fe..6cc4a709e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/MutableTileChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/MutableTileChange.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/change/StreamChange.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/change/StreamChange.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java index 8fafe7de3..753e8bb5f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/change/StreamChange.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/change/StreamChange.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.change; +package com.fastasyncworldedit.core.object.change; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockOutputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java index d3947f130..93512b3f1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractChangeSet.java @@ -1,16 +1,16 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.object.HistoryExtent; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.object.HistoryExtent; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.TaskManager; import com.google.common.util.concurrent.Futures; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractDelegateChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractDelegateChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java index 54e2ddeb5..84504e949 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/AbstractDelegateChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/AbstractDelegateChangeSet.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/BlockBagChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/BlockBagChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java index 4b9855523..d27cb4dff 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/BlockBagChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/BlockBagChangeSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.extent.inventory.BlockBag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java index 7e4b9078e..928d13f70 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/DiskStorageHistory.java @@ -1,13 +1,13 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.database.DBHandler; -import com.boydti.fawe.database.RollbackDatabase; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.IntPair; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.database.DBHandler; +import com.fastasyncworldedit.core.database.RollbackDatabase; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.IntPair; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.worldedit.EditSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/FaweStreamChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/FaweStreamChangeSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java index aa90fa9bc..b38cb7480 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/FaweStreamChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/FaweStreamChangeSet.java @@ -1,15 +1,15 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.change.MutableBiomeChange; -import com.boydti.fawe.object.change.MutableBlockChange; -import com.boydti.fawe.object.change.MutableEntityChange; -import com.boydti.fawe.object.change.MutableFullBlockChange; -import com.boydti.fawe.object.change.MutableTileChange; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.change.MutableBiomeChange; +import com.fastasyncworldedit.core.object.change.MutableBlockChange; +import com.fastasyncworldedit.core.object.change.MutableEntityChange; +import com.fastasyncworldedit.core.object.change.MutableFullBlockChange; +import com.fastasyncworldedit.core.object.change.MutableTileChange; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MemoryOptimizedHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MemoryOptimizedHistory.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java index be091c4ee..a270a1019 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/MemoryOptimizedHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/MemoryOptimizedHistory.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; -import com.boydti.fawe.object.io.FastByteArraysInputStream; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/SimpleChangeSetSummary.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/changeset/SimpleChangeSetSummary.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java index 1eec14c7b..174007b4f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/changeset/SimpleChangeSetSummary.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/changeset/SimpleChangeSetSummary.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.changeset; +package com.fastasyncworldedit.core.object.changeset; import com.sk89q.worldedit.history.changeset.ChangeSetSummary; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/CPUOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/CPUOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java index 7aed3ce54..dd5770c3e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/CPUOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/CPUOptimizedClipboard.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.jnbt.streamer.IntValueReader; -import com.boydti.fawe.object.IntTriple; +import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; +import com.fastasyncworldedit.core.object.IntTriple; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java index 8b071e1a1..012b8def8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/DiskOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/DiskOptimizedClipboard.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.jnbt.streamer.IntValueReader; -import com.boydti.fawe.object.IntTriple; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.UnsafeUtility; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; +import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.UnsafeUtility; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/EmptyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/EmptyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java index 68d130d4e..6c4917dec 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/EmptyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/EmptyClipboard.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LazyClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LazyClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java index 1b85a50c2..7c2ed2af3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LazyClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LazyClipboardHolder.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; import com.google.common.io.ByteSource; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java index 5d7df10e5..8ee9e8c90 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/LinearClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/LinearClipboard.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.beta.implementation.filter.block.AbstractFilterBlock; -import com.boydti.fawe.jnbt.streamer.IntValueReader; +import com.fastasyncworldedit.core.beta.implementation.filter.block.AbstractFilterBlock; +import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; import com.google.common.collect.ForwardingIterator; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MemoryOptimizedClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MemoryOptimizedClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java index 4640e95fd..c7d061a0e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MemoryOptimizedClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MemoryOptimizedClipboard.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.jnbt.streamer.IntValueReader; -import com.boydti.fawe.object.IntTriple; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; +import com.fastasyncworldedit.core.object.IntTriple; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MultiClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MultiClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java index cb48f5d99..598d3a974 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/MultiClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/MultiClipboardHolder.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.session.ClipboardHolder; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ReadOnlyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ReadOnlyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java index ddfa5bb57..af29eecd6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ReadOnlyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ReadOnlyClipboard.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.entity.BaseEntity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ResizableClipboardBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ResizableClipboardBuilder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java index 1806ebced..0510d6ed4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/ResizableClipboardBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/ResizableClipboardBuilder.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; -import com.boydti.fawe.object.change.MutableBlockChange; -import com.boydti.fawe.object.change.MutableTileChange; -import com.boydti.fawe.object.changeset.MemoryOptimizedHistory; +import com.fastasyncworldedit.core.object.change.MutableBlockChange; +import com.fastasyncworldedit.core.object.change.MutableTileChange; +import com.fastasyncworldedit.core.object.changeset.MemoryOptimizedHistory; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/SimpleClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/SimpleClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java index 8317860b9..0410743c4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/SimpleClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/SimpleClipboard.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/URIClipboardHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/URIClipboardHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java index 56a2120af..1f6486b37 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/URIClipboardHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/URIClipboardHolder.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.session.ClipboardHolder; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/WorldCopyClipboard.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/WorldCopyClipboard.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java index 2dfc31ec1..3610dfc13 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/clipboard/WorldCopyClipboard.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/clipboard/WorldCopyClipboard.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.clipboard; +package com.fastasyncworldedit.core.object.clipboard; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java index c0d6d56af..b8664657d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedSetCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedSetCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java index f055d5a0d..6cb191daa 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/AdaptedSetCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/AdaptedSetCollection.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import com.google.common.base.Function; import com.google.common.collect.Collections2; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArray.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArray.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java index e42ddc081..f3ebdcb18 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArray.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArray.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; public final class BitArray { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArrayUnstretched.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArrayUnstretched.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java index b850aeb87..4f9434ad6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BitArrayUnstretched.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BitArrayUnstretched.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; public final class BitArrayUnstretched { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java index 53c2f7ea6..15dd2b01c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockSet.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVector3ChunkMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVector3ChunkMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java index eac9ebbff..bfb3af54c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVector3ChunkMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVector3ChunkMap.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; import it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVectorSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVectorSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java index b38d6551a..1d64c7476 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/BlockVectorSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/BlockVectorSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/CleanableThreadLocal.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java similarity index 78% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/CleanableThreadLocal.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java index 69fa34cbc..eb25ccab1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/CleanableThreadLocal.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CleanableThreadLocal.java @@ -1,16 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MainUtil; - -import java.io.Closeable; import java.io.IOException; -import java.lang.ref.Reference; -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.atomic.LongAdder; import java.util.function.Consumer; import java.util.function.Function; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/CpuBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CpuBlockSet.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/CpuBlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/CpuBlockSet.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialArray.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialArray.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java index 366779659..b9b227cb8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialArray.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialArray.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.io.serialize.Serialize; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.io.serialize.Serialize; +import com.fastasyncworldedit.core.util.MainUtil; import java.io.IOException; import java.lang.reflect.Array; @@ -27,7 +27,8 @@ public final class DifferentialArray implements DifferentialCollection { private final char[] dataChars; private char[] changesChars; - @Serialize private final T data; + @Serialize + private final T data; private T changes; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialBlockBuffer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialBlockBuffer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java index 80ea9a3f0..233962161 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialBlockBuffer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialBlockBuffer.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; import java.io.IOException; import java.lang.reflect.Array; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCharBlockBuffer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCharBlockBuffer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java index 3e056ddaf..61ce7de46 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCharBlockBuffer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCharBlockBuffer.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; import java.io.IOException; import java.lang.reflect.Array; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java new file mode 100644 index 000000000..e3d192e2f --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java @@ -0,0 +1,7 @@ +package com.fastasyncworldedit.core.object.collection; + +import com.fastasyncworldedit.core.object.change.StreamChange; + +public interface DifferentialCollection extends StreamChange { + public T get(); +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastBitSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastBitSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java index e5349e957..ab6a14356 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastBitSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastBitSet.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastRandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastRandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java index e59a37f95..39fdd1321 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/FastRandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/FastRandomCollection.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.random.SimpleRandom; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.util.MathMan; import java.util.ArrayList; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/IAdaptedMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/IAdaptedMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java index 0cf6559d3..5b1074424 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/IAdaptedMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/IAdaptedMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import com.google.common.base.Function; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVector2DSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVector2DSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java index 52ab3a577..25dcb1e0c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVector2DSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVector2DSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.MutableBlockVector2; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVectorSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVectorSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java index da172cb7a..ea8b0d6b0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LocalBlockVectorSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LocalBlockVectorSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LongHashSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/LongHashSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java index 712b2ed40..b3f3e7d4b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/LongHashSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/LongHashSet.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/MemBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/MemBlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java index ddfbff231..0092adb2e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/MemBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MemBlockSet.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector2; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/MutablePair.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/MutablePair.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java index 923a5b8a3..7d6da9366 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/MutablePair.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/MutablePair.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java index 21a3f8d87..cddb1b302 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/ObjObjMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/ObjObjMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import java.util.Arrays; import javax.annotation.Nonnull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/RandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/RandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java index ea83647bf..bc4de19f1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/RandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/RandomCollection.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.random.SimpleRandom; +import com.fastasyncworldedit.core.object.random.SimpleRandom; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SimpleRandomCollection.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SimpleRandomCollection.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java index 8e90d0ea3..4d6b9fa71 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SimpleRandomCollection.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SimpleRandomCollection.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.object.random.SimpleRandom; +import com.fastasyncworldedit.core.object.random.SimpleRandom; import java.util.Map; import java.util.NavigableMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SoftHashMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SoftHashMap.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java index 1ac228a98..2e2c0a0c5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SoftHashMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SoftHashMap.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBitSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBitSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java index 8be9d0940..43d43ba8f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBitSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBitSet.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; /*- This software is the work of Paladin Software International, Incorporated, * based upon previous work done for and by Sun Microsystems, Inc. */ diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBlockSet.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java index 2877e825a..72f86e51a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SparseBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SparseBlockSet.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import java.io.Serializable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java index 12f76dd8b..a58108228 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedAreaTable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedAreaTable.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; public class SummedAreaTable { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedColorTable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedColorTable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java index 11ae981de..3c87b6989 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/SummedColorTable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/SummedColorTable.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/YieldIterable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/collection/YieldIterable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java index 83025877e..e5998fcef 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/collection/YieldIterable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/YieldIterable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.collection; +package com.fastasyncworldedit.core.object.collection; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweBlockBagException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java similarity index 61% rename from worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweBlockBagException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java index c81da506c..698cad3b2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweBlockBagException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweBlockBagException.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.exception; +package com.fastasyncworldedit.core.object.exception; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; public class FaweBlockBagException extends FaweException { public FaweBlockBagException() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweChunkLoadException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java similarity index 61% rename from worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweChunkLoadException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java index 15ace72ba..54c38aa0d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweChunkLoadException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweChunkLoadException.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.exception; +package com.fastasyncworldedit.core.object.exception; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; public class FaweChunkLoadException extends FaweException { public FaweChunkLoadException() { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweException.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweException.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java index d9b749c27..9205e89bd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/exception/FaweException.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/exception/FaweException.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.exception; +package com.fastasyncworldedit.core.object.exception; import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java index 4b4c230fd..609c90461 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/BlockTranslateExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/BlockTranslateExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ExtentHeightCacher.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/ExtentHeightCacher.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java index 71e6a7123..135a31a11 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ExtentHeightCacher.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ExtentHeightCacher.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.PassthroughExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java index 71e06f5b4..088d8a854 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/FaweRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/FaweRegionExtent.java @@ -1,11 +1,11 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.WEManager; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.util.ExtentTraverser; +import com.fastasyncworldedit.core.util.WEManager; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/HeightBoundExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java similarity index 82% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/HeightBoundExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java index 51c315f6a..6cae172c6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/HeightBoundExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/HeightBoundExtent.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.RegionWrapper; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.RegionWrapper; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/Linear3DTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/Linear3DTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java index ff41069e1..f2c007b4a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/Linear3DTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/Linear3DTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/LinearTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/LinearTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java index 9ee3aa2fe..55018bdf1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/LinearTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/LinearTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MemoryCheckingExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java similarity index 75% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/MemoryCheckingExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java index 0d20dca58..8191cca1f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MemoryCheckingExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MemoryCheckingExtent.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.util.MemUtil; -import com.boydti.fawe.util.Permission; -import com.boydti.fawe.util.WEManager; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.util.MemUtil; +import com.fastasyncworldedit.core.util.Permission; +import com.fastasyncworldedit.core.util.WEManager; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.PassthroughExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java index 4b0bbc5d5..6a3fa5cf5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiRegionExtent.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.object.FaweLimit; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.object.FaweLimit; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionIntersection; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java index e9531246e..43e08144c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/MultiTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/MultiTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/NullExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/NullExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java index 84518c95f..9981eccb9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/NullExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/NullExtent.java @@ -1,13 +1,13 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.exception.FaweException; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.exception.FaweException; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java index fea7bcd3f..95a76f2ef 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/OffsetExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/OffsetExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/PatternTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/PatternTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java index e65e35d4a..2fd2be0ce 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/PatternTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PatternTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/PositionTransformExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/PositionTransformExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java index f37f23eee..6ec74f6ad 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/PositionTransformExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/PositionTransformExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ProcessedWEExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/ProcessedWEExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java index 51a07bee2..aa144a437 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ProcessedWEExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ProcessedWEExtent.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.util.WEManager; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.util.WEManager; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomOffsetTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomOffsetTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java index d6251e798..3b0c27caa 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomOffsetTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomOffsetTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java index a249a9f83..6f41dd8a9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/RandomTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/RandomTransform.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.object.collection.RandomCollection; -import com.boydti.fawe.object.random.SimpleRandom; -import com.boydti.fawe.object.random.TrueRandom; +import com.fastasyncworldedit.core.object.collection.RandomCollection; +import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.object.random.TrueRandom; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ResettableExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/ResettableExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java index 86056b88f..dd2b1b141 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ResettableExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ResettableExtent.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.ReflectionUtils; +import com.fastasyncworldedit.core.util.ExtentTraverser; +import com.fastasyncworldedit.core.util.ReflectionUtils; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ScaleTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/ScaleTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java index fc7edc33c..2c0490a9e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/ScaleTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/ScaleTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SelectTransform.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/SelectTransform.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java index a0bf46070..3114392b3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SelectTransform.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SelectTransform.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SingleRegionExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/SingleRegionExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java index d5d61d7c3..cd763c3a8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SingleRegionExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SingleRegionExtent.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.object.FaweLimit; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.object.FaweLimit; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SlowExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/SlowExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java index a09051f2f..dec8429e5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SlowExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SlowExtent.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SourceMaskExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/SourceMaskExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java index e642cf8e2..5ff3e7fb9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SourceMaskExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SourceMaskExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/StripNBTExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/StripNBTExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java index ecba6f0b6..c48cc469b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/StripNBTExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/StripNBTExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.Tag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SupplyingExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/SupplyingExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java index f53bc7234..c944b5300 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/SupplyingExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/SupplyingExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.PassthroughExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/TemporalExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/TemporalExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java index 71f21c554..c0aff255e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/TemporalExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TemporalExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.PassthroughExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/TransformExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/extent/TransformExtent.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java index 4dddc4bed..42ca894b9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/extent/TransformExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/extent/TransformExtent.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.extent; +package com.fastasyncworldedit.core.object.extent; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/NullRegionFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/NullRegionFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java index 48db35e5c..ba7ca4847 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/NullRegionFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/NullRegionFunction.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function; +package com.fastasyncworldedit.core.object.function; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/QuadFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java similarity index 65% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/QuadFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java index f47df4fe4..ab7bba08c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/QuadFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/QuadFunction.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function; +package com.fastasyncworldedit.core.object.function; @FunctionalInterface public interface QuadFunction { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/SurfaceRegionFunction.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/SurfaceRegionFunction.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java index 7b6aea4be..02e3345b2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/SurfaceRegionFunction.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/SurfaceRegionFunction.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function; +package com.fastasyncworldedit.core.object.function; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/BiomeCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/block/BiomeCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java index 0ac08f970..c8d3ef390 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/BiomeCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/BiomeCopy.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function.block; +package com.fastasyncworldedit.core.object.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/CombinedBlockCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/block/CombinedBlockCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java index 19092ec75..7e5826525 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/CombinedBlockCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/CombinedBlockCopy.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function.block; +package com.fastasyncworldedit.core.object.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/SimpleBlockCopy.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/block/SimpleBlockCopy.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java index 9f3e40af5..116e38dcb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/block/SimpleBlockCopy.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/block/SimpleBlockCopy.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function.block; +package com.fastasyncworldedit.core.object.function.block; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/function/mask/AbstractDelegateMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/function/mask/AbstractDelegateMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java index 4ece175d0..d416b9fe0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/function/mask/AbstractDelegateMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/function/mask/AbstractDelegateMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.function.mask; +package com.fastasyncworldedit.core.object.function.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/AbstractDelegateOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/AbstractDelegateOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java index bc93baf40..39ce6f35b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/AbstractDelegateOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AbstractDelegateOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.IOException; import java.io.OutputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/AsyncBufferedOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/AsyncBufferedOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java index 10a7cdbf3..598cc0447 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/AsyncBufferedOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/AsyncBufferedOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/BufferedRandomAccessFile.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/BufferedRandomAccessFile.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java index d96b7d43f..7d6ea9690 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/BufferedRandomAccessFile.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/BufferedRandomAccessFile.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.File; import java.io.FileNotFoundException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java index 8ff92fcdc..65b5bdfb2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayInputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java index ba5cb52d5..169c2f52e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArrayOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArrayOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.IOException; import java.io.OutputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArraysInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArraysInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java index d49006063..8ef9f18b5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/FastByteArraysInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/FastByteArraysInputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/LittleEndianOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/LittleEndianOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java index 32cc40ba5..22c317042 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/LittleEndianOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/LittleEndianOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/NonClosableOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/NonClosableOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java index 5ce11ae17..5cd937088 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/NonClosableOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonClosableOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.IOException; import java.io.OutputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/NonCloseableInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/NonCloseableInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java index 15751c817..652538bb9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/NonCloseableInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/NonCloseableInputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.IOException; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java index 288124c7b..87cb915a5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.util.concurrent.Callable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java index a7a350e85..0bb398e97 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPState.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPState.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java index 8e31eda7b..eef34628d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPState.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPState.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.ByteArrayOutputStream; import java.util.zip.Deflater; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPThreadLocal.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPThreadLocal.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java index de3c07217..20937cdb3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/PGZIPThreadLocal.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/PGZIPThreadLocal.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; public class PGZIPThreadLocal extends ThreadLocal { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomAccessInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomAccessInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java index cca1cd959..8dd7586a4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomAccessInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomAccessInputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.IOException; import java.io.InputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomFileOutputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomFileOutputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java index dfd6d4be3..db7d24369 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/RandomFileOutputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/RandomFileOutputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.File; import java.io.FileDescriptor; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/ResettableFileInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/ResettableFileInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java index 2772cf5a0..688ddc3d9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/ResettableFileInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/ResettableFileInputStream.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io; +package com.fastasyncworldedit.core.object.io; import java.io.FileInputStream; import java.io.FilterInputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/serialize/Serialize.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java similarity index 82% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/serialize/Serialize.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java index bc91fbc03..23098f8d6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/serialize/Serialize.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/serialize/Serialize.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.io.serialize; +package com.fastasyncworldedit.core.object.io.serialize; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/io/zstd/ZstdInputStream.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/io/zstd/ZstdInputStream.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java index 777fb730d..e3b06b6ab 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/io/zstd/ZstdInputStream.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/io/zstd/ZstdInputStream.java @@ -1,5 +1,6 @@ -package com.github.luben.zstd; +package com.fastasyncworldedit.core.object.io.zstd; +import com.github.luben.zstd.Zstd; import com.github.luben.zstd.util.Native; import java.io.FilterInputStream; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentAnyMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentAnyMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java index db7f79297..b5d826b3e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentAnyMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentAnyMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java index d1184ba98..5df583d6d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AdjacentMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AdjacentMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AirMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/AirMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java index 69f1bf9c2..ba2d34290 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AirMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AirMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BlockMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AngleMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/AngleMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java index 96cb95286..fa555d524 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/AngleMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/AngleMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/CachedMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/CachedMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java index a7e0adcb9..5bb0ad108 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/CachedMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/CachedMask.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.object.function.mask.AbstractDelegateMask; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.function.mask.AbstractDelegateMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/DataMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/DataMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java index f295da9ff..7479a2a16 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/DataMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/DataMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ExtremaMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/ExtremaMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java index 1ca577d48..2ce78b371 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ExtremaMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ExtremaMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdDataMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdDataMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java index 105af3965..74cae871e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdDataMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdDataMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java index ebb2f5d9b..b9a279374 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/IdMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/IdMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/LiquidMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/LiquidMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java index cdbee5401..6f4232ec7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/LiquidMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/LiquidMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BlockMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/MaskedTargetBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/MaskedTargetBlock.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java index 789c8cab3..575276d3b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/MaskedTargetBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/MaskedTargetBlock.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/PlaneMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/PlaneMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java index 98639ec4c..6fe28fed9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/PlaneMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/PlaneMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ROCAngleMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/ROCAngleMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java index 0e11ae3fe..1d6430839 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ROCAngleMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ROCAngleMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/RadiusMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/RadiusMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java index eb95e1d8f..78d8e2d46 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/RadiusMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RadiusMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/RandomMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/RandomMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java index c42415e17..bc29a43b4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/RandomMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/RandomMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java new file mode 100644 index 000000000..e72277300 --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java @@ -0,0 +1,9 @@ +package com.fastasyncworldedit.core.object.mask; + +import com.fastasyncworldedit.core.Resettable; + +public interface ResettableMask extends Resettable { + + @Override + void reset(); +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/SimplexMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/SimplexMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java index b2e9a5940..3eef3d4f3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/SimplexMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SimplexMask.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; -import com.boydti.fawe.object.random.SimplexNoise; +import com.fastasyncworldedit.core.object.random.SimplexNoise; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/SurfaceMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/SurfaceMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java index ea0497dff..0dbf0dff3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/SurfaceMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/SurfaceMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/WallMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/WallMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java index 3463e2478..f8bee3ff4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/WallMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/WallMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/XAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/XAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java index 9446f8fe4..0d80b09e9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/XAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/XAxisMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/YAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/YAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java index caf8a68f3..e99e099df 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/YAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/YAxisMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractMask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ZAxisMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/mask/ZAxisMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java index 43bd2243e..2daf4ddcb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/mask/ZAxisMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ZAxisMask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.mask; +package com.fastasyncworldedit.core.object.mask; import com.sk89q.worldedit.function.mask.AbstractMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AbstractExtentPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AbstractExtentPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java index 5b6007783..7a04d1028 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AbstractExtentPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AbstractExtentPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AngleColorPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AngleColorPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java index 8617bb8e5..154e9f942 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AngleColorPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AngleColorPattern.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.object.DataAnglePattern; -import com.boydti.fawe.util.TextureHolder; +import com.fastasyncworldedit.core.object.DataAnglePattern; +import com.fastasyncworldedit.core.util.TextureHolder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; @@ -48,7 +48,7 @@ public class AngleColorPattern extends DataAnglePattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock block = extent.getFullBlock(position); int slope = getSlope(block, position, extent); if (slope == -1) { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AverageColorPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AverageColorPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java index 5f5546682..2cf4400d4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/AverageColorPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/AverageColorPattern.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.util.TextureHolder; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.util.TextureHolder; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; @@ -21,7 +21,7 @@ public class AverageColorPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock block = getExtent().getFullBlock(position); TextureUtil util = holder.getTextureUtil(); int currentColor = util.getColor(block.getBlockType()); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BiomeApplyingPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BiomeApplyingPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java index 783dc23c8..0206cc8a8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BiomeApplyingPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BiomeApplyingPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -15,7 +15,7 @@ public class BiomeApplyingPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { getExtent().setBiome(position, this.biomeType); // don't change the block, everything should remain the same return getExtent().getFullBlock(position); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java index 29a497242..9a62d502a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.util.FaweTimer; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.util.FaweTimer; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extent.Extent; @@ -33,8 +33,8 @@ public class BufferedPattern extends AbstractPattern implements ResettablePatter } @Override - public BaseBlock apply(BlockVector3 position) { - return pattern.apply(position); + public BaseBlock applyBlock(BlockVector3 position) { + return pattern.applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern2D.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern2D.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java index ff44d1b43..d14b9f640 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/BufferedPattern2D.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/BufferedPattern2D.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DataPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DataPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java index 7eb167c29..3db455fb0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DataPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DataPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -19,16 +19,16 @@ public class DataPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock oldBlock = getExtent().getFullBlock(position); - BaseBlock newBlock = pattern.apply(position); + BaseBlock newBlock = pattern.applyBlock(position); return oldBlock.toBlockState().withProperties(newBlock.toBlockState()).toBaseBlock(newBlock.getNbtData()); } @Override public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { BaseBlock oldBlock = get.getFullBlock(extent); - BaseBlock newBlock = pattern.apply(get); + BaseBlock newBlock = pattern.applyBlock(get); BlockState oldState = oldBlock.toBlockState(); BlockState newState = oldState.withProperties(newBlock.toBlockState()); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DesaturatePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DesaturatePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java index 57440ecd3..9a8ed5b32 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/DesaturatePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/DesaturatePattern.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.util.TextureHolder; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.util.TextureHolder; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; @@ -21,7 +21,7 @@ public class DesaturatePattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockType block = extent.getBlock(position).getBlockType(); TextureUtil util = holder.getTextureUtil(); int color = getColor(util.getColor(block)); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExistingPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExistingPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java index bd81d765a..a598eff71 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExistingPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExistingPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -11,7 +11,7 @@ public class ExistingPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { return getExtent().getFullBlock(position); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExpressionPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExpressionPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java index d8e967ad7..08d9fb860 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ExpressionPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ExpressionPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.internal.expression.EvaluationException; @@ -43,7 +43,7 @@ public class ExpressionPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 vector) { + public BaseBlock applyBlock(BlockVector3 vector) { try { if (expression.getEnvironment() instanceof WorldEditExpressionEnvironment) { ((WorldEditExpressionEnvironment) expression.getEnvironment()).setCurrentBlock(vector.toVector3()); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java similarity index 82% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java index 937376e6c..93cd8fb9b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdDataMaskPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; @@ -16,9 +16,9 @@ public class IdDataMaskPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock oldBlock = getExtent().getFullBlock(position); - BaseBlock newBlock = pattern.apply(position); + BaseBlock newBlock = pattern.applyBlock(position); int oldData = oldBlock.getInternalPropertiesId(); int newData = newBlock.getInternalPropertiesId() + oldData - (oldData & bitMask); return newBlock.withPropertyId(newData).toBaseBlock(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java similarity index 80% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java index 969d3f097..4adf1c7e7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/IdPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/IdPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; @@ -17,9 +17,9 @@ public class IdPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock oldBlock = getExtent().getFullBlock(position); - BaseBlock newBlock = pattern.apply(position); + BaseBlock newBlock = pattern.applyBlock(position); return newBlock.withPropertyId(oldBlock.getInternalPropertiesId()).toBaseBlock(); } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear2DBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear2DBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java index 0bed3a376..31023b9c1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear2DBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear2DBlockPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -20,12 +20,12 @@ public class Linear2DBlockPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { int index = (position.getBlockX() / this.xScale + position.getBlockZ() / this.zScale) % patternsArray.length; if (index < 0) { index += patternsArray.length; } - return patternsArray[index].apply(position); + return patternsArray[index].applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear3DBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear3DBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java index 9f70debe9..6bcc929f5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/Linear3DBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/Linear3DBlockPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -22,13 +22,13 @@ public class Linear3DBlockPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { int index = (position.getBlockX() / this.xScale + position.getBlockY() / this.yScale + position.getBlockZ() / this.zScale) % patternsArray.length; if (index < 0) { index += patternsArray.length; } - return patternsArray[index].apply(position); + return patternsArray[index].applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/LinearBlockPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java similarity index 85% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/LinearBlockPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java index 078ee6db2..b852e4fb2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/LinearBlockPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/LinearBlockPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -17,11 +17,11 @@ public class LinearBlockPattern extends AbstractPattern implements ResettablePat } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { if (index == patternsArray.length) { index = 0; } - return patternsArray[index++].apply(position); + return patternsArray[index++].applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/MaskedPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java similarity index 83% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/MaskedPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java index de31735ce..3fbfb17ce 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/MaskedPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/MaskedPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -21,11 +21,11 @@ public class MaskedPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { if (mask.test(position)) { - return primary.apply(position); + return primary.applyBlock(position); } - return secondary.apply(position); + return secondary.applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoXPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoXPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java index 6b1cbde66..d20945ea7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoXPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoXPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -18,10 +18,10 @@ public class NoXPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 pos) { + public BaseBlock applyBlock(BlockVector3 pos) { mutable.mutY(pos.getY()); mutable.mutZ(pos.getZ()); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoYPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoYPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java index 27de98222..b0de8e0f7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoYPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoYPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -18,10 +18,10 @@ public class NoYPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 pos) { + public BaseBlock applyBlock(BlockVector3 pos) { mutable.mutX(pos.getX()); mutable.mutZ(pos.getZ()); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoZPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java similarity index 86% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoZPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java index eb875c268..a53466caa 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/NoZPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/NoZPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -19,10 +19,10 @@ public class NoZPattern extends AbstractPattern { private transient MutableBlockVector3 mutable = new MutableBlockVector3(); @Override - public BaseBlock apply(BlockVector3 pos) { + public BaseBlock applyBlock(BlockVector3 pos) { mutable.mutX(pos.getX()); mutable.mutY(pos.getY()); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/OffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/OffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java index 86ff92615..47d319441 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/OffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/OffsetPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -24,11 +24,11 @@ public class OffsetPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { mutable.mutX(position.getX() + dx); mutable.mutY(position.getY() + dy); mutable.mutZ(position.getZ() + dz); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PatternTraverser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PatternTraverser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java index aae740003..6d0b824e2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PatternTraverser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PatternTraverser.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.Resettable; +import com.fastasyncworldedit.core.Resettable; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PropertyPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PropertyPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java index f6940a57d..f82594ada 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/PropertyPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/PropertyPattern.java @@ -1,8 +1,8 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.object.string.MutableCharSequence; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -212,7 +212,7 @@ public class PropertyPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock block = getExtent().getFullBlock(position); return apply(block, block); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomFullClipboardPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomFullClipboardPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java index 0c79b8d1f..b606fdd47 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomFullClipboardPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomFullClipboardPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -57,7 +57,7 @@ public class RandomFullClipboardPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { throw new IllegalStateException("Incorrect use. This pattern can only be applied to an extent!"); } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java similarity index 91% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java index f954113c3..08de59796 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RandomOffsetPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -35,11 +35,11 @@ public class RandomOffsetPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { mutable.mutX((position.getX() + r.nextInt(dx2) - dx)); mutable.mutY((position.getY() + r.nextInt(dy2) - dy)); mutable.mutZ((position.getZ() + r.nextInt(dz2) - dz)); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RelativePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RelativePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java index 88afd3e48..25be48c49 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/RelativePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/RelativePattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -19,14 +19,14 @@ public class RelativePattern extends AbstractPattern implements ResettablePatter } @Override - public BaseBlock apply(BlockVector3 pos) { + public BaseBlock applyBlock(BlockVector3 pos) { if (origin == null) { origin = pos; } mutable.mutX(pos.getX() - origin.getX()); mutable.mutY(pos.getY() - origin.getY()); mutable.mutZ(pos.getZ() - origin.getZ()); - return pattern.apply(mutable); + return pattern.applyBlock(mutable); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java new file mode 100644 index 000000000..1107dbf5c --- /dev/null +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java @@ -0,0 +1,9 @@ +package com.fastasyncworldedit.core.object.pattern; + +import com.fastasyncworldedit.core.Resettable; + +public interface ResettablePattern extends Resettable { + + @Override + void reset(); +} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SaturatePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SaturatePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java index 19b608aa9..c06e295a9 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SaturatePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SaturatePattern.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.util.TextureHolder; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.util.TextureHolder; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; @@ -24,7 +24,7 @@ public class SaturatePattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockType block = extent.getBlock(position).getBlockType(); TextureUtil util = holder.getTextureUtil(); int currentColor = util.getColor(block); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ShadePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ShadePattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java index 32bdb748e..f5d2c780b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ShadePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ShadePattern.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; @@ -23,7 +23,7 @@ public class ShadePattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockType block = extent.getBlock(position).getBlockType(); return (darken ? util.getDarkerBlock(block) : util.getLighterBlock(block)).getDefaultState().toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SolidRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java similarity index 89% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SolidRandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java index 9d0c15ab9..d0ca1d7fb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SolidRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SolidRandomOffsetPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; @@ -47,15 +47,15 @@ public class SolidRandomOffsetPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { mutable.mutX(position.getX() + r.nextInt(dx2) - dx); mutable.mutY(position.getY() + r.nextInt(dy2) - dy); mutable.mutZ(position.getZ() + r.nextInt(dz2) - dz); - BaseBlock block = pattern.apply(mutable); + BaseBlock block = pattern.applyBlock(mutable); if (block.getMaterial().isSolid()) { return block; } - return pattern.apply(position); + return pattern.applyBlock(position); } @Override @@ -63,7 +63,7 @@ public class SolidRandomOffsetPattern extends AbstractPattern { mutable.mutX(set.getX() + r.nextInt(dx2) - dx); mutable.mutY(set.getY() + r.nextInt(dy2) - dy); mutable.mutZ(set.getZ() + r.nextInt(dz2) - dz); - BaseBlock block = pattern.apply(mutable); + BaseBlock block = pattern.applyBlock(mutable); if (block.getMaterial().isSolid()) { return pattern.apply(extent, get, mutable); } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SurfaceRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SurfaceRandomOffsetPattern.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java index 58da0899f..4919229ea 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/pattern/SurfaceRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/SurfaceRandomOffsetPattern.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.pattern; +package com.fastasyncworldedit.core.object.pattern; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; @@ -29,8 +29,8 @@ public class SurfaceRandomOffsetPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { - return pattern.apply(travel(position)); + public BaseBlock applyBlock(BlockVector3 position) { + return pattern.applyBlock(travel(position)); } private BlockVector3 travel(BlockVector3 pos) { @@ -57,7 +57,7 @@ public class SurfaceRandomOffsetPattern extends AbstractPattern { private boolean allowed(BlockVector3 bv) { MutableBlockVector3 v = new MutableBlockVector3(bv); - BaseBlock block = pattern.apply(bv); + BaseBlock block = pattern.applyBlock(bv); if (!block.getBlockType().getMaterial().isMovementBlocker()) { return false; } @@ -101,7 +101,7 @@ public class SurfaceRandomOffsetPattern extends AbstractPattern { } private boolean canPassthrough(BlockVector3 v) { - BaseBlock block = pattern.apply(v); + BaseBlock block = pattern.applyBlock(v); return !block.getBlockType().getMaterial().isMovementBlocker(); } } diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/progress/ChatProgressTracker.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/object/progress/ChatProgressTracker.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java index 46019908f..9cfc2367d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/progress/ChatProgressTracker.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/ChatProgressTracker.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.progress; +package com.fastasyncworldedit.core.object.progress; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/progress/DefaultProgressTracker.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/progress/DefaultProgressTracker.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java index 5ab05eb24..db9e9d722 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/progress/DefaultProgressTracker.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/progress/DefaultProgressTracker.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.object.progress; +package com.fastasyncworldedit.core.object.progress; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/random/NoiseRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/random/NoiseRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java index 774496c84..400ce1b77 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/random/NoiseRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/NoiseRandom.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.random; +package com.fastasyncworldedit.core.object.random; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.noise.NoiseGenerator; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/random/SimpleRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/object/random/SimpleRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java index eb49def14..31e0c33fa 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/random/SimpleRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimpleRandom.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.random; +package com.fastasyncworldedit.core.object.random; public interface SimpleRandom { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/random/SimplexNoise.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/random/SimplexNoise.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java index 551adb64e..ef917d673 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/random/SimplexNoise.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/SimplexNoise.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.random; +package com.fastasyncworldedit.core.object.random; /* * A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. * diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/random/TrueRandom.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java similarity index 88% rename from worldedit-core/src/main/java/com/boydti/fawe/object/random/TrueRandom.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java index a1e379026..99adaec28 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/random/TrueRandom.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/random/TrueRandom.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.random; +package com.fastasyncworldedit.core.object.random; import java.util.SplittableRandom; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/FuzzyRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/regions/FuzzyRegion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java index 699534ba8..3f9b197ba 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/FuzzyRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/FuzzyRegion.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.regions; +package com.fastasyncworldedit.core.object.regions; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/PolyhedralRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/regions/PolyhedralRegion.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java index c80362d41..feb270a18 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/PolyhedralRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/PolyhedralRegion.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.boydti.fawe.object.regions; +package com.fastasyncworldedit.core.object.regions; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/Triangle.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/object/regions/Triangle.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java index 04e1c9cd5..49096b219 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/Triangle.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/Triangle.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.regions; +package com.fastasyncworldedit.core.object.regions; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.base.Preconditions; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/FuzzyRegionSelector.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/FuzzyRegionSelector.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java index eeb42bd9d..5bd49be57 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/FuzzyRegionSelector.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/FuzzyRegionSelector.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.object.regions.selector; +package com.fastasyncworldedit.core.object.regions.selector; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.regions.FuzzyRegion; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.MaskTraverser; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.regions.FuzzyRegion; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.ExtentTraverser; +import com.fastasyncworldedit.core.util.MaskTraverser; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/PolyhedralRegionSelector.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/PolyhedralRegionSelector.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java index c329c4b6c..6c3bd8b9c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/regions/selector/PolyhedralRegionSelector.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/regions/selector/PolyhedralRegionSelector.java @@ -17,10 +17,10 @@ * along with this program. If not, see . */ -package com.boydti.fawe.object.regions.selector; +package com.fastasyncworldedit.core.object.regions.selector; -import com.boydti.fawe.object.regions.PolyhedralRegion; -import com.boydti.fawe.object.regions.Triangle; +import com.fastasyncworldedit.core.object.regions.PolyhedralRegion; +import com.fastasyncworldedit.core.object.regions.Triangle; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/schematic/MinecraftStructure.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/object/schematic/MinecraftStructure.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java index 059c4100e..dd859eaa6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/schematic/MinecraftStructure.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/MinecraftStructure.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.schematic; +package com.fastasyncworldedit.core.object.schematic; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.ListTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/schematic/PNGWriter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/schematic/PNGWriter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java index 78f0b8331..6a21c578e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/schematic/PNGWriter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/PNGWriter.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.schematic; +package com.fastasyncworldedit.core.object.schematic; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.util.TextureUtil; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/schematic/visualizer/SchemVis.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/visualizer/SchemVis.java similarity index 100% rename from worldedit-core/src/main/java/com/boydti/fawe/object/schematic/visualizer/SchemVis.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/schematic/visualizer/SchemVis.java diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/string/JoinedCharSequence.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/string/JoinedCharSequence.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java index 8c494c830..84eb925e1 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/string/JoinedCharSequence.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/JoinedCharSequence.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.string; +package com.fastasyncworldedit.core.object.string; public class JoinedCharSequence implements CharSequence { private char join; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/string/MutableCharSequence.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/string/MutableCharSequence.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java index 05c00c434..a017e3e38 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/string/MutableCharSequence.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/string/MutableCharSequence.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.string; +package com.fastasyncworldedit.core.object.string; public class MutableCharSequence implements CharSequence { private String str; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/task/AsyncNotifyQueue.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/AsyncNotifyQueue.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/task/AsyncNotifyQueue.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/AsyncNotifyQueue.java index 16ed7c4e8..376df2a51 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/task/AsyncNotifyQueue.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/AsyncNotifyQueue.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.object.task; +package com.fastasyncworldedit.core.object.task; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import java.io.Closeable; import java.util.concurrent.Callable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/task/SingleThreadIntervalQueue.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/object/task/SingleThreadIntervalQueue.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java index 887b3c14f..9008cfa4c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/task/SingleThreadIntervalQueue.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/SingleThreadIntervalQueue.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.task; +package com.fastasyncworldedit.core.object.task; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.util.TaskManager; import java.util.Iterator; import java.util.Map; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/task/ThrowableSupplier.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java similarity index 64% rename from worldedit-core/src/main/java/com/boydti/fawe/object/task/ThrowableSupplier.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java index f51044f76..d53e65147 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/task/ThrowableSupplier.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/task/ThrowableSupplier.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.task; +package com.fastasyncworldedit.core.object.task; public interface ThrowableSupplier { Object get() throws T; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/AboveVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/object/visitor/AboveVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java index e15661df4..044acfc4e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/AboveVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/AboveVisitor.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.visitor; +package com.fastasyncworldedit.core.object.visitor; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSRecursiveVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSRecursiveVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java index 6d294437e..5d013c2d3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSRecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSRecursiveVisitor.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.object.visitor; +package com.fastasyncworldedit.core.object.visitor; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSVisitor.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java index 4379d6071..9302b170b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/visitor/DFSVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/object/visitor/DFSVisitor.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.object.visitor; +package com.fastasyncworldedit.core.object.visitor; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.IntTriple; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.IntTriple; import com.google.common.collect.Lists; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java similarity index 84% rename from worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java index f08c3f208..98d2b67db 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMask.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.regions; +package com.fastasyncworldedit.core.regions; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.regions.IDelegateRegion; import com.sk89q.worldedit.regions.Region; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java similarity index 87% rename from worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMaskManager.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java index dcc7a5994..64e0d3ed6 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/regions/FaweMaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FaweMaskManager.java @@ -1,7 +1,7 @@ -package com.boydti.fawe.regions; +package com.fastasyncworldedit.core.regions; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.regions.general.RegionFilter; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.regions.general.RegionFilter; import com.sk89q.worldedit.entity.Player; import java.util.Locale; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/CuboidRegionFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/regions/general/CuboidRegionFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java index 0e3402292..c9d7d1443 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/CuboidRegionFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/CuboidRegionFilter.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.regions.general; +package com.fastasyncworldedit.core.regions.general; -import com.boydti.fawe.object.collection.LongHashSet; +import com.fastasyncworldedit.core.object.collection.LongHashSet; import com.sk89q.worldedit.math.BlockVector2; public abstract class CuboidRegionFilter implements RegionFilter { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/RegionFilter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java similarity index 71% rename from worldedit-core/src/main/java/com/boydti/fawe/regions/general/RegionFilter.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java index 11cc95460..f3a32ba88 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/regions/general/RegionFilter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/general/RegionFilter.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.regions.general; +package com.fastasyncworldedit.core.regions.general; public interface RegionFilter { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java index 48e4ce78d..33537e40e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/BrushCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/BrushCache.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java index d093a0707..3c0f41224 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedMathMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedMathMan.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; public class CachedMathMan { private static final int ATAN2_BITS = 7; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedTextureUtil.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedTextureUtil.java index 252a927ea..25d1222be 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CachedTextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CachedTextureUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.world.block.BlockType; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CleanTextureUtil.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CleanTextureUtil.java index 31de561f5..8a0ae33ad 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/CleanTextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/CleanTextureUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import java.io.FileNotFoundException; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ColorUtil.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ColorUtil.java index 70cc320c9..6ddf9f836 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ColorUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ColorUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import java.awt.Color; import java.lang.reflect.Field; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/DelegateTextureUtil.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/DelegateTextureUtil.java index c84aa83cf..290e8b7db 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/DelegateTextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/DelegateTextureUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.world.block.BlockType; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java similarity index 90% rename from worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java index 9ea27ec45..3dbc32aa5 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/EditSessionBuilder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/EditSessionBuilder.java @@ -1,34 +1,34 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IQueueChunk; -import com.boydti.fawe.beta.IQueueExtent; -import com.boydti.fawe.beta.implementation.lighting.NullRelighter; -import com.boydti.fawe.beta.implementation.lighting.RelightProcessor; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.beta.implementation.processors.HeightmapProcessor; -import com.boydti.fawe.beta.implementation.processors.LimitExtent; -import com.boydti.fawe.beta.implementation.queue.ParallelQueueExtent; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.HistoryExtent; -import com.boydti.fawe.object.NullChangeSet; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.RelightMode; -import com.boydti.fawe.object.changeset.AbstractChangeSet; -import com.boydti.fawe.object.changeset.BlockBagChangeSet; -import com.boydti.fawe.object.changeset.DiskStorageHistory; -import com.boydti.fawe.object.changeset.MemoryOptimizedHistory; -import com.boydti.fawe.object.extent.FaweRegionExtent; -import com.boydti.fawe.object.extent.MultiRegionExtent; -import com.boydti.fawe.object.extent.NullExtent; -import com.boydti.fawe.object.extent.SingleRegionExtent; -import com.boydti.fawe.object.extent.SlowExtent; -import com.boydti.fawe.object.extent.StripNBTExtent; -import com.boydti.fawe.wrappers.WorldWrapper; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.IQueueChunk; +import com.fastasyncworldedit.core.beta.IQueueExtent; +import com.fastasyncworldedit.core.beta.implementation.lighting.NullRelighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelightProcessor; +import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.beta.implementation.processors.HeightmapProcessor; +import com.fastasyncworldedit.core.beta.implementation.processors.LimitExtent; +import com.fastasyncworldedit.core.beta.implementation.queue.ParallelQueueExtent; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.HistoryExtent; +import com.fastasyncworldedit.core.object.NullChangeSet; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.RelightMode; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.changeset.BlockBagChangeSet; +import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; +import com.fastasyncworldedit.core.object.changeset.MemoryOptimizedHistory; +import com.fastasyncworldedit.core.object.extent.FaweRegionExtent; +import com.fastasyncworldedit.core.object.extent.MultiRegionExtent; +import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.object.extent.SingleRegionExtent; +import com.fastasyncworldedit.core.object.extent.SlowExtent; +import com.fastasyncworldedit.core.object.extent.StripNBTExtent; +import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ExtentTraverser.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ExtentTraverser.java index 9e4676782..175fb44f3 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ExtentTraverser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ExtentTraverser.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FaweTimer.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FaweTimer.java index 1a49f3ad9..236b0bcd7 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FaweTimer.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import java.util.Arrays; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FilteredTextureUtil.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FilteredTextureUtil.java index 1956540b0..3fb8bf87d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/FilteredTextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/FilteredTextureUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/IOUtil.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/IOUtil.java index 48367a076..af60522b4 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/IOUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/IOUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import java.io.DataOutput; import java.io.EOFException; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java index 08fd7333f..886ca871f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ImgurUtility.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ImgurUtility.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; import com.google.gson.Gson; import com.google.gson.JsonObject; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java index 069266683..f943b463b 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MainUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MainUtil.java @@ -1,16 +1,16 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.object.RunnableVal2; -import com.boydti.fawe.object.changeset.FaweStreamChangeSet; -import com.boydti.fawe.object.io.AbstractDelegateOutputStream; -import com.github.luben.zstd.ZstdInputStream; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.object.RunnableVal2; +import com.fastasyncworldedit.core.object.changeset.FaweStreamChangeSet; +import com.fastasyncworldedit.core.object.io.AbstractDelegateOutputStream; +import com.fastasyncworldedit.core.object.io.zstd.ZstdInputStream; import com.github.luben.zstd.ZstdOutputStream; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.DoubleTag; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java index 6ed28593a..023ad3b05 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MaskTraverser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MaskTraverser.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.object.mask.ResettableMask; +import com.fastasyncworldedit.core.object.mask.ResettableMask; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.AbstractExtentMask; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java index a411f9943..48d756249 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MathMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; public class MathMan { diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java index 7f16c78e5..fbdf2295f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/MemUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MemUtil.java @@ -1,6 +1,6 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.configuration.Settings; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/Permission.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/Permission.java similarity index 95% rename from worldedit-core/src/main/java/com/boydti/fawe/util/Permission.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/Permission.java index 8e0c0a0b2..26f5a714a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/Permission.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/Permission.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.util.auth.Subject; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/RandomTextureUtil.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/RandomTextureUtil.java index 1f5004d71..37ed8ddcb 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/RandomTextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/RandomTextureUtil.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.world.block.BlockType; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ReflectionUtils.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ReflectionUtils.java index 1db81251f..253e38469 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ReflectionUtils.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ReflectionUtils.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java similarity index 99% rename from worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java index c75f34919..e01ee4dd0 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/StringMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/StringMan.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import java.lang.reflect.Array; import java.util.ArrayList; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java similarity index 97% rename from worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java index 47ff2b0d9..ee4198d96 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/TaskManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TaskManager.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RunnableVal; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.implementation.queue.QueueHandler; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RunnableVal; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureHolder.java similarity index 62% rename from worldedit-core/src/main/java/com/boydti/fawe/util/TextureHolder.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureHolder.java index 8d6496f3d..36829c33f 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureHolder.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; public interface TextureHolder { TextureUtil getTextureUtil(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java index 5ece687e1..0926695ac 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/TextureUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/TextureUtil.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.beta.implementation.filter.block.SingleFilterBlock; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.beta.implementation.filter.block.SingleFilterBlock; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.image.ImageUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; @@ -11,8 +11,6 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.util.PropertiesConfiguration; -import com.sk89q.worldedit.util.report.Unreported; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypesCache; @@ -357,8 +355,8 @@ public class TextureUtil implements TextureHolder { try { LOGGER.info("Downloading asset jar from Mojang, please wait..."); new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/").mkdirs(); - try (BufferedInputStream in = new BufferedInputStream(new URL("https://launcher.mojang.com/v1/objects/37fd3c903861eeff3bc24b71eed48f828b5269c8/client.jar").openStream()); - FileOutputStream fileOutputStream = new FileOutputStream(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/1.16.5.jar")) { + try (BufferedInputStream in = new BufferedInputStream(new URL("https://launcher.mojang.com/v1/objects/1cf89c77ed5e72401b869f66410934804f3d6f52/client.jar").openStream()); + FileOutputStream fileOutputStream = new FileOutputStream(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/1.17.jar")) { byte[] dataBuffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) { @@ -635,8 +633,8 @@ public class TextureUtil implements TextureHolder { } if (files.length == 0) { new File(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/").mkdirs(); - try (BufferedInputStream in = new BufferedInputStream(new URL("https://launcher.mojang.com/v1/objects/37fd3c903861eeff3bc24b71eed48f828b5269c8/client.jar").openStream()); - FileOutputStream fileOutputStream = new FileOutputStream(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/1.16.5.jar")) { + try (BufferedInputStream in = new BufferedInputStream(new URL("https://launcher.mojang.com/v1/objects/1cf89c77ed5e72401b869f66410934804f3d6f52/client.jar").openStream()); + FileOutputStream fileOutputStream = new FileOutputStream(Fawe.imp().getDirectory() + "/" + Settings.IMP.PATHS.TEXTURES + "/" + "/.minecraft/versions/1.17.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/boydti/fawe/util/ThirdPartyManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ThirdPartyManager.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/util/ThirdPartyManager.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ThirdPartyManager.java index 331e95de4..679602b99 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/ThirdPartyManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/ThirdPartyManager.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.Logger; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/UnsafeUtility.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UnsafeUtility.java similarity index 93% rename from worldedit-core/src/main/java/com/boydti/fawe/util/UnsafeUtility.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UnsafeUtility.java index 7f0e11180..a42e803e2 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/UnsafeUtility.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/UnsafeUtility.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; import sun.misc.Unsafe; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java similarity index 92% rename from worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java index b2a4d7c85..a6b321d52 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/WEManager.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/WEManager.java @@ -1,12 +1,12 @@ -package com.boydti.fawe.util; +package com.fastasyncworldedit.core.util; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.extent.NullExtent; -import com.boydti.fawe.regions.FaweMask; -import com.boydti.fawe.regions.FaweMaskManager; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.regions.FaweMask; +import com.fastasyncworldedit.core.regions.FaweMaskManager; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extent.AbstractDelegateExtent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/image/Drawable.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/Drawable.java similarity index 66% rename from worldedit-core/src/main/java/com/boydti/fawe/util/image/Drawable.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/Drawable.java index f7c5eb8ec..341347fcc 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/image/Drawable.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/Drawable.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.image; +package com.fastasyncworldedit.core.util.image; import java.awt.image.BufferedImage; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java index d521ba0ac..5558a608d 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageUtil.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageUtil.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.util.image; +package com.fastasyncworldedit.core.util.image; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.platform.binding.ProvideBindings; import com.sk89q.worldedit.util.formatting.text.TextComponent; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageViewer.java similarity index 70% rename from worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageViewer.java index 7190a5780..d7c503dea 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/image/ImageViewer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/image/ImageViewer.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.image; +package com.fastasyncworldedit.core.util.image; import java.io.Closeable; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/DelayedTask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/DelayedTask.java similarity index 60% rename from worldedit-core/src/main/java/com/boydti/fawe/util/task/DelayedTask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/DelayedTask.java index 315349b26..11c602e6c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/DelayedTask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/DelayedTask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.task; +package com.fastasyncworldedit.core.util.task; public interface DelayedTask { int getDelay(T previousResult); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/InterruptableCondition.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/InterruptableCondition.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/util/task/InterruptableCondition.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/InterruptableCondition.java index b1aeeb7c3..204ec3fef 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/InterruptableCondition.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/InterruptableCondition.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.task; +package com.fastasyncworldedit.core.util.task; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/ReceiveTask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReceiveTask.java similarity index 57% rename from worldedit-core/src/main/java/com/boydti/fawe/util/task/ReceiveTask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReceiveTask.java index 81268f51d..32e569ec8 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/ReceiveTask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReceiveTask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.task; +package com.fastasyncworldedit.core.util.task; public interface ReceiveTask { void run(T previous); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/ReturnTask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReturnTask.java similarity index 51% rename from worldedit-core/src/main/java/com/boydti/fawe/util/task/ReturnTask.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReturnTask.java index 4a8f256e6..4b883a41c 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/ReturnTask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/ReturnTask.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.task; +package com.fastasyncworldedit.core.util.task; public interface ReturnTask { T run(); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/util/task/Task.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/Task.java similarity index 56% rename from worldedit-core/src/main/java/com/boydti/fawe/util/task/Task.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/Task.java index 615237e08..0e3d9c89a 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/util/task/Task.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/task/Task.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.util.task; +package com.fastasyncworldedit.core.util.task; public interface Task { T run(V previousResult); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/AsyncPlayer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/wrappers/AsyncPlayer.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java index 1001d64bd..2e2f0aabf 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/AsyncPlayer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java @@ -1,9 +1,9 @@ -package com.boydti.fawe.wrappers; +package com.fastasyncworldedit.core.wrappers; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/LocationMaskedPlayerWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/LocationMaskedPlayerWrapper.java similarity index 98% rename from worldedit-core/src/main/java/com/boydti/fawe/wrappers/LocationMaskedPlayerWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/LocationMaskedPlayerWrapper.java index 5b3a2e41a..d0bb55701 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/LocationMaskedPlayerWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/LocationMaskedPlayerWrapper.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.wrappers; +package com.fastasyncworldedit.core.wrappers; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/SilentPlayerWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/SilentPlayerWrapper.java similarity index 94% rename from worldedit-core/src/main/java/com/boydti/fawe/wrappers/SilentPlayerWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/SilentPlayerWrapper.java index bbed41799..385b6a183 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/SilentPlayerWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/SilentPlayerWrapper.java @@ -1,4 +1,4 @@ -package com.boydti.fawe.wrappers; +package com.fastasyncworldedit.core.wrappers; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java similarity index 96% rename from worldedit-core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java rename to worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java index 0b8728ff8..1e9c52859 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/wrappers/WorldWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java @@ -1,10 +1,10 @@ -package com.boydti.fawe.wrappers; +package com.fastasyncworldedit.core.wrappers; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.util.ExtentTraverser; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; @@ -38,7 +38,6 @@ import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.weather.WeatherType; -import java.io.IOException; import java.util.List; import java.util.Set; import javax.annotation.Nullable; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java new file mode 100644 index 000000000..e68d1bcf7 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java @@ -0,0 +1,108 @@ +/* + * 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.jnbt; + +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; + +/** + * Converts between JNBT and Adventure-NBT classes. + * + * @deprecated JNBT is being removed in WE8. + */ +@Deprecated +public class AdventureNBTConverter { + private static final BiMap, BinaryTagType> TAG_TYPES = + new ImmutableBiMap.Builder, BinaryTagType>() + .put(ByteArrayTag.class, BinaryTagTypes.BYTE_ARRAY) + .put(ByteTag.class, BinaryTagTypes.BYTE) + .put(CompoundTag.class, BinaryTagTypes.COMPOUND) + .put(DoubleTag.class, BinaryTagTypes.DOUBLE) + .put(EndTag.class, BinaryTagTypes.END) + .put(FloatTag.class, BinaryTagTypes.FLOAT) + .put(IntArrayTag.class, BinaryTagTypes.INT_ARRAY) + .put(IntTag.class, BinaryTagTypes.INT) + .put(ListTag.class, BinaryTagTypes.LIST) + .put(LongArrayTag.class, BinaryTagTypes.LONG_ARRAY) + .put(LongTag.class, BinaryTagTypes.LONG) + .put(ShortTag.class, BinaryTagTypes.SHORT) + .put(StringTag.class, BinaryTagTypes.STRING) + .build(); + + private static final Map, Function> CONVERSION; + + static { + ImmutableMap.Builder, Function> conversion = + ImmutableMap.builder(); + + for (Map.Entry, BinaryTagType> tag : TAG_TYPES.entrySet()) { + Constructor[] constructors = tag.getKey().getConstructors(); + for (Constructor c : constructors) { + if (c.getParameterCount() == 1 && BinaryTag.class.isAssignableFrom(c.getParameterTypes()[0])) { + conversion.put(tag.getValue(), binaryTag -> { + try { + return (Tag) c.newInstance(binaryTag); + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException(e); + } catch (InvocationTargetException e) { + // I assume this is always a RuntimeException since we control the ctor + throw (RuntimeException) e.getCause(); + } + }); + break; + } + } + } + + CONVERSION = conversion.build(); + } + + public static BinaryTagType getAdventureType(Class type) { + return Objects.requireNonNull(TAG_TYPES.get(type), () -> "Missing entry for " + type); + } + + public static Class getJNBTType(BinaryTagType type) { + return Objects.requireNonNull(TAG_TYPES.inverse().get(type), () -> "Missing entry for " + type); + } + + private AdventureNBTConverter() { + } + + public static Tag fromAdventure(BinaryTag other) { + if (other == null) { + return null; + } + Function conversion = CONVERSION.get(other.type()); + if (conversion == null) { + throw new IllegalArgumentException("Can't convert other of type " + other.getClass().getCanonicalName()); + } + return conversion.apply(other); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java index 8311b7c55..a1065cced 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteArrayTag.java @@ -19,14 +19,17 @@ package com.sk89q.jnbt; -import java.util.Locale; +import com.sk89q.worldedit.util.nbt.ByteArrayBinaryTag; /** * The {@code TAG_Byte_Array} tag. + * + * @deprecated Use {@link ByteArrayBinaryTag}. */ +@Deprecated public final class ByteArrayTag extends Tag { - private final byte[] value; + private final ByteArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,25 +38,22 @@ public final class ByteArrayTag extends Tag { */ public ByteArrayTag(byte[] value) { super(); - this.value = value; + this.innerTag = ByteArrayBinaryTag.of(value); + } + + public ByteArrayTag(ByteArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override public byte[] getValue() { - return value; + return innerTag.value(); } @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (byte b : value) { - String hexDigits = Integer.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Byte_Array(" + hex + ")"; + public ByteArrayBinaryTag asBinaryTag() { + return innerTag; } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java index 53a3adcd3..ce90b9a60 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ByteTag.java @@ -19,14 +19,17 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.ByteBinaryTag; /** * The {@code TAG_Byte} tag. + * + * @deprecated Use {@link ByteBinaryTag}. */ -public final class ByteTag extends NumberTag { +@Deprecated +public final class ByteTag extends Tag { - private final byte value; + private final ByteBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +38,22 @@ public final class ByteTag extends NumberTag { */ public ByteTag(byte value) { super(); - this.value = value; + this.innerTag = ByteBinaryTag.of(value); + } + + public ByteTag(ByteBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; } @Override public Byte getValue() { - return value; + return innerTag.value(); } @Override - public String toString() { - return "TAG_Byte(" + value + ")"; + public ByteBinaryTag asBinaryTag() { + return innerTag; } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java index 01ab56e75..eddf565b0 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTag.java @@ -23,6 +23,12 @@ import com.sk89q.jnbt.fawe.NumberTag; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.util.Location; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; import java.util.Collections; import java.util.HashMap; @@ -32,10 +38,13 @@ import java.util.UUID; /** * The {@code TAG_Compound} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.CompoundBinaryTag}. */ +@Deprecated public class CompoundTag extends Tag { - private final Map value; + private final CompoundBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -43,8 +52,13 @@ public class CompoundTag extends Tag { * @param value the value of the tag */ public CompoundTag(Map value) { - super(); - this.value = Collections.unmodifiableMap(value); + this(CompoundBinaryTag.builder() + .put(Maps.transformValues(value, BinaryTagLike::asBinaryTag)) + .build()); + } + + public CompoundTag(CompoundBinaryTag adventureTag) { + this.innerTag = adventureTag; } /** @@ -54,12 +68,26 @@ public class CompoundTag extends Tag { * @return true if the tag contains the given key */ public boolean containsKey(String key) { - return value.containsKey(key); + return innerTag.keySet().contains(key); } @Override public Map getValue() { - return value; + ImmutableMap.Builder map = ImmutableMap.builder(); + for (String key : innerTag.keySet()) { + map.put(key, AdventureNBTConverter.fromAdventure(innerTag.get(key))); + } + return map.build(); + } + + /** + * Return a new compound tag with the given values. + * + * @param value the value + * @return the new compound tag + */ + public CompoundTag setValue(Map value) { + return new CompoundTag(value); } /** @@ -68,7 +96,7 @@ public class CompoundTag extends Tag { * @return the builder */ public CompoundTagBuilder createBuilder() { - return new CompoundTagBuilder(new HashMap<>(value)); + return new CompoundTagBuilder(innerTag); } /** @@ -81,12 +109,7 @@ public class CompoundTag extends Tag { * @return a byte array */ public byte[] getByteArray(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } + return this.innerTag.getByteArray(key); } /** @@ -99,12 +122,7 @@ public class CompoundTag extends Tag { * @return a byte */ public byte getByte(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } + return this.innerTag.getByte(key); } /** @@ -117,12 +135,7 @@ public class CompoundTag extends Tag { * @return a double */ public double getDouble(String key) { - Tag tag = value.get(key); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getDouble(key); } /** @@ -136,28 +149,11 @@ public class CompoundTag extends Tag { * @return a double */ public double asDouble(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - - } else { - return 0; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).doubleValue(); } + return 0; } /** @@ -170,12 +166,7 @@ public class CompoundTag extends Tag { * @return a float */ public float getFloat(String key) { - Tag tag = value.get(key); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getFloat(key); } /** @@ -188,12 +179,7 @@ public class CompoundTag extends Tag { * @return an int array */ public int[] getIntArray(String key) { - Tag tag = value.get(key); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } + return this.innerTag.getIntArray(key); } /** @@ -206,12 +192,7 @@ public class CompoundTag extends Tag { * @return an int */ public int getInt(String key) { - Tag tag = value.get(key); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getInt(key); } /** @@ -225,28 +206,11 @@ public class CompoundTag extends Tag { * @return an int */ public int asInt(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - - } else { - return 0; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).intValue(); } + return 0; } /** @@ -259,12 +223,7 @@ public class CompoundTag extends Tag { * @return a list of tags */ public List getList(String key) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } + return getListTag(key).getValue(); } /** @@ -277,12 +236,7 @@ public class CompoundTag extends Tag { * @return a tag list instance */ public ListTag getListTag(String key) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(StringTag.class, Collections.emptyList()); - } + return new ListTag(this.innerTag.getList(key)); } /** @@ -300,14 +254,9 @@ public class CompoundTag extends Tag { */ @SuppressWarnings("unchecked") public List getList(String key, Class listType) { - Tag tag = value.get(key); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } + ListTag listTag = getListTag(key); + if (listTag.getType().equals(listType)) { + return (List) listTag.getValue(); } else { return Collections.emptyList(); } @@ -323,12 +272,7 @@ public class CompoundTag extends Tag { * @return an int array */ public long[] getLongArray(String key) { - Tag tag = value.get(key); - if (tag instanceof LongArrayTag) { - return ((LongArrayTag) tag).getValue(); - } else { - return new long[0]; - } + return this.innerTag.getLongArray(key); } /** @@ -341,12 +285,7 @@ public class CompoundTag extends Tag { * @return a long */ public long getLong(String key) { - Tag tag = value.get(key); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } + return this.innerTag.getLong(key); } /** @@ -360,28 +299,11 @@ public class CompoundTag extends Tag { * @return a long */ public long asLong(String key) { - Tag tag = value.get(key); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - - } else { - return 0L; + BinaryTag tag = this.innerTag.get(key); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).longValue(); } + return 0; } /** @@ -394,12 +316,7 @@ public class CompoundTag extends Tag { * @return a short */ public short getShort(String key) { - Tag tag = value.get(key); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } + return this.innerTag.getShort(key); } /** @@ -412,25 +329,15 @@ public class CompoundTag extends Tag { * @return a string */ public String getString(String key) { - Tag tag = value.get(key); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } + return this.innerTag.getString(key); } @Override - public String toString() { - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_Compound").append(": ").append(value.size()).append(" entries\r\n{\r\n"); - for (Map.Entry entry : value.entrySet()) { - bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); - } - bldr.append("}"); - return bldr.toString(); + public CompoundBinaryTag asBinaryTag() { + return this.innerTag; } + // FAWE Start public UUID getUUID() { long most = getLong("UUIDMost"); diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java index 7267a72e0..198176916 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/CompoundTagBuilder.java @@ -19,33 +19,39 @@ package com.sk89q.jnbt; -import java.util.HashMap; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + import java.util.Map; +import java.util.Objects; import static com.google.common.base.Preconditions.checkNotNull; /** * Helps create compound tags. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.CompoundBinaryTag.Builder}. */ +@Deprecated public class CompoundTagBuilder { - private final Map entries; + private final CompoundBinaryTag.Builder builder = CompoundBinaryTag.builder(); /** * Create a new instance. */ CompoundTagBuilder() { - this.entries = new HashMap<>(); } /** * Create a new instance and use the given map (which will be modified). * - * @param value the value + * @param source the value */ - CompoundTagBuilder(Map value) { - checkNotNull(value); - this.entries = value; + CompoundTagBuilder(CompoundBinaryTag source) { + checkNotNull(source); + for (String key : source.keySet()) { + this.builder.put(key, Objects.requireNonNull(source.get(key))); + } } /** @@ -58,7 +64,7 @@ public class CompoundTagBuilder { public CompoundTagBuilder put(String key, Tag value) { checkNotNull(key); checkNotNull(value); - entries.put(key, value); + this.builder.put(key, value.asBinaryTag()); return this; } @@ -71,7 +77,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putByteArray(String key, byte[] value) { - return put(key, new ByteArrayTag(value)); + this.builder.putByteArray(key, value); + return this; } /** @@ -83,7 +90,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putByte(String key, byte value) { - return put(key, new ByteTag(value)); + this.builder.putByte(key, value); + return this; } /** @@ -95,7 +103,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putDouble(String key, double value) { - return put(key, new DoubleTag(value)); + this.builder.putDouble(key, value); + return this; } /** @@ -107,7 +116,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putFloat(String key, float value) { - return put(key, new FloatTag(value)); + this.builder.putFloat(key, value); + return this; } /** @@ -119,7 +129,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putIntArray(String key, int[] value) { - return put(key, new IntArrayTag(value)); + this.builder.putIntArray(key, value); + return this; } /** @@ -130,7 +141,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putInt(String key, int value) { - return put(key, new IntTag(value)); + this.builder.putInt(key, value); + return this; } /** @@ -142,7 +154,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putLongArray(String key, long[] value) { - return put(key, new LongArrayTag(value)); + this.builder.putLongArray(key, value); + return this; } /** @@ -154,7 +167,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putLong(String key, long value) { - return put(key, new LongTag(value)); + this.builder.putLong(key, value); + return this; } /** @@ -166,7 +180,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putShort(String key, short value) { - return put(key, new ShortTag(value)); + this.builder.putShort(key, value); + return this; } /** @@ -178,7 +193,8 @@ public class CompoundTagBuilder { * @return this object */ public CompoundTagBuilder putString(String key, String value) { - return put(key, new StringTag(value)); + this.builder.putString(key, value); + return this; } /** @@ -189,7 +205,7 @@ public class CompoundTagBuilder { */ public CompoundTagBuilder remove(String key) { checkNotNull(key); - entries.remove(key); + this.builder.remove(key); return this; } @@ -213,7 +229,7 @@ public class CompoundTagBuilder { * @return the new compound tag */ public CompoundTag build() { - return new CompoundTag(new HashMap<>(entries)); + return new CompoundTag(this.builder.build()); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java index 211405791..1ad649d91 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/DoubleTag.java @@ -20,13 +20,17 @@ package com.sk89q.jnbt; import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.DoubleBinaryTag; /** * The {@code TAG_Double} tag. + * + * @deprecated Use {@link DoubleBinaryTag}. */ +@Deprecated public final class DoubleTag extends NumberTag { - private final double value; + private final DoubleBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +39,22 @@ public final class DoubleTag extends NumberTag { */ public DoubleTag(double value) { super(); - this.value = value; + this.innerTag = DoubleBinaryTag.of(value); + } + + public DoubleTag(DoubleBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public DoubleBinaryTag asBinaryTag() { + return this.innerTag; } @Override public Double getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_Double(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java index 557f9173b..f2f34f2da 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/EndTag.java @@ -19,9 +19,14 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.EndBinaryTag; + /** * The {@code TAG_End} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.EndBinaryTag}. */ +@Deprecated public final class EndTag extends Tag { @Override @@ -30,8 +35,8 @@ public final class EndTag extends Tag { } @Override - public String toString() { - return "TAG_End"; + public EndBinaryTag asBinaryTag() { + return EndBinaryTag.get(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java index 6e107b154..b750728f6 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/FloatTag.java @@ -20,13 +20,17 @@ package com.sk89q.jnbt; import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.FloatBinaryTag; /** * The {@code TAG_Float} tag. + * + * @deprecated Use {@link FloatBinaryTag}. */ +@Deprecated public final class FloatTag extends NumberTag { - private final float value; + private final FloatBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +39,22 @@ public final class FloatTag extends NumberTag { */ public FloatTag(float value) { super(); - this.value = value; + this.innerTag = FloatBinaryTag.of(value); + } + + public FloatTag(FloatBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public FloatBinaryTag asBinaryTag() { + return this.innerTag; } @Override public Float getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_Float(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java index 4fdb56be4..990e4454c 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntArrayTag.java @@ -19,16 +19,19 @@ package com.sk89q.jnbt; -import java.util.Locale; +import com.sk89q.worldedit.util.nbt.IntArrayBinaryTag; import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_Int_Array} tag. + * + * @deprecated Use {@link IntArrayBinaryTag}. */ +@Deprecated public final class IntArrayTag extends Tag { - private final int[] value; + private final IntArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -38,25 +41,22 @@ public final class IntArrayTag extends Tag { public IntArrayTag(int[] value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = IntArrayBinaryTag.of(value); + } + + public IntArrayTag(IntArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public IntArrayBinaryTag asBinaryTag() { + return this.innerTag; } @Override public int[] getValue() { - return value; - } - - @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (int b : value) { - String hexDigits = Integer.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Int_Array(" + hex + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java index 8107a87b2..4da079385 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/IntTag.java @@ -19,14 +19,17 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; /** * The {@code TAG_Int} tag. + * + * @deprecated Use {@link IntBinaryTag}. */ -public final class IntTag extends NumberTag { +@Deprecated +public final class IntTag extends Tag { - private final int value; + private final IntBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +38,22 @@ public final class IntTag extends NumberTag { */ public IntTag(int value) { super(); - this.value = value; + this.innerTag = IntBinaryTag.of(value); + } + + public IntTag(IntBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public IntBinaryTag asBinaryTag() { + return this.innerTag; } @Override public Integer getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_Int(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LazyCompoundTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LazyCompoundTag.java new file mode 100644 index 000000000..00b5aeb9a --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LazyCompoundTag.java @@ -0,0 +1,46 @@ +/* + * 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.jnbt; + + +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; + +import java.util.Map; + +/** + * Allows detection of the version-specific LazyCompoundTag classes. + * + * @deprecated Use {@link CompoundBinaryTag}. + */ +@Deprecated +public abstract class LazyCompoundTag extends CompoundTag { + + public LazyCompoundTag(Map value) { + super(value); + } + + public LazyCompoundTag(CompoundBinaryTag adventureTag) { + super(adventureTag); + } + + @Override + public abstract CompoundBinaryTag asBinaryTag(); + +} diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java index afcde02bc..c6a0b7376 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTag.java @@ -19,19 +19,27 @@ package com.sk89q.jnbt; -import javax.annotation.Nullable; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; + import java.util.Collections; import java.util.List; - -import static com.google.common.base.Preconditions.checkNotNull; +import java.util.function.IntFunction; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import javax.annotation.Nullable; /** * The {@code TAG_List} tag. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.ListBinaryTag}. */ +@Deprecated public final class ListTag extends Tag { - private final Class type; - private final List value; + private final ListBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -40,10 +48,19 @@ public final class ListTag extends Tag { * @param value the value of the tag */ public ListTag(Class type, List value) { - super(); - checkNotNull(value); - this.type = type; - this.value = Collections.unmodifiableList(value); + this(ListBinaryTag.of( + AdventureNBTConverter.getAdventureType(type), + value.stream().map(BinaryTagLike::asBinaryTag).collect(Collectors.toList()) + )); + } + + public ListTag(ListBinaryTag adventureTag) { + this.innerTag = adventureTag; + } + + @Override + public ListBinaryTag asBinaryTag() { + return this.innerTag; } /** @@ -52,12 +69,14 @@ public final class ListTag extends Tag { * @return The type of item in this list. */ public Class getType() { - return type; + return AdventureNBTConverter.getJNBTType(this.innerTag.elementType()); } @Override public List getValue() { - return value; + return this.innerTag.stream() + .map(AdventureNBTConverter::fromAdventure) + .collect(Collectors.toList()); } /** @@ -70,6 +89,13 @@ public final class ListTag extends Tag { return new ListTag(getType(), list); } + private T accessIfExists(int index, Supplier defaultValue, IntFunction accessor) { + if (index >= this.innerTag.size()) { + return defaultValue.get(); + } + return accessor.apply(index); + } + /** * Get the tag if it exists at the given index. * @@ -78,10 +104,11 @@ public final class ListTag extends Tag { */ @Nullable public Tag getIfExists(int index) { - if (index >= value.size()) { - return null; - } - return value.get(index); + return accessIfExists( + index, + () -> null, + i -> AdventureNBTConverter.fromAdventure(this.innerTag.get(i)) + ); } /** @@ -94,12 +121,11 @@ public final class ListTag extends Tag { * @return a byte array */ public byte[] getByteArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteArrayTag) { - return ((ByteArrayTag) tag).getValue(); - } else { - return new byte[0]; - } + return accessIfExists( + index, + () -> new byte[0], + this.innerTag::getByteArray + ); } /** @@ -112,12 +138,11 @@ public final class ListTag extends Tag { * @return a byte */ public byte getByte(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - } else { - return (byte) 0; - } + return accessIfExists( + index, + () -> (byte) 0, + this.innerTag::getByte + ); } /** @@ -130,12 +155,11 @@ public final class ListTag extends Tag { * @return a double */ public double getDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0, + this.innerTag::getDouble + ); } /** @@ -149,28 +173,17 @@ public final class ListTag extends Tag { * @return a double */ public double asDouble(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).doubleValue(); + } + return 0.0; + } + ); } /** @@ -183,12 +196,11 @@ public final class ListTag extends Tag { * @return a float */ public float getFloat(int index) { - Tag tag = getIfExists(index); - if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0.0f, + this.innerTag::getFloat + ); } /** @@ -201,12 +213,11 @@ public final class ListTag extends Tag { * @return an int array */ public int[] getIntArray(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntArrayTag) { - return ((IntArrayTag) tag).getValue(); - } else { - return new int[0]; - } + return accessIfExists( + index, + () -> new int[0], + this.innerTag::getIntArray + ); } /** @@ -219,12 +230,11 @@ public final class ListTag extends Tag { * @return an int */ public int getInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> 0, + this.innerTag::getInt + ); } /** @@ -238,28 +248,17 @@ public final class ListTag extends Tag { * @return an int */ public int asInt(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue().intValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().intValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().intValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).intValue(); + } + return 0; + } + ); } /** @@ -272,12 +271,7 @@ public final class ListTag extends Tag { * @return a list of tags */ public List getList(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return ((ListTag) tag).getValue(); - } else { - return Collections.emptyList(); - } + return getListTag(index).getValue(); } /** @@ -290,12 +284,11 @@ public final class ListTag extends Tag { * @return a tag list instance */ public ListTag getListTag(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - return (ListTag) tag; - } else { - return new ListTag(StringTag.class, Collections.emptyList()); - } + return new ListTag(accessIfExists( + index, + ListBinaryTag::empty, + this.innerTag::getList + )); } /** @@ -313,14 +306,9 @@ public final class ListTag extends Tag { */ @SuppressWarnings("unchecked") public List getList(int index, Class listType) { - Tag tag = getIfExists(index); - if (tag instanceof ListTag) { - ListTag listTag = (ListTag) tag; - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } + ListTag listTag = getListTag(index); + if (listTag.getType().equals(listType)) { + return (List) listTag.getValue(); } else { return Collections.emptyList(); } @@ -336,12 +324,11 @@ public final class ListTag extends Tag { * @return a long */ public long getLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - } else { - return 0L; - } + return accessIfExists( + index, + () -> 0L, + this.innerTag::getLong + ); } /** @@ -355,28 +342,17 @@ public final class ListTag extends Tag { * @return a long */ public long asLong(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ByteTag) { - return ((ByteTag) tag).getValue(); - - } else if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - - } else if (tag instanceof IntTag) { - return ((IntTag) tag).getValue(); - - } else if (tag instanceof LongTag) { - return ((LongTag) tag).getValue(); - - } else if (tag instanceof FloatTag) { - return ((FloatTag) tag).getValue().longValue(); - - } else if (tag instanceof DoubleTag) { - return ((DoubleTag) tag).getValue().longValue(); - - } else { - return 0; - } + return accessIfExists( + index, + () -> 0L, + i -> { + BinaryTag tag = this.innerTag.get(i); + if (tag instanceof NumberBinaryTag) { + return ((NumberBinaryTag) tag).longValue(); + } + return 0L; + } + ); } /** @@ -389,12 +365,11 @@ public final class ListTag extends Tag { * @return a short */ public short getShort(int index) { - Tag tag = getIfExists(index); - if (tag instanceof ShortTag) { - return ((ShortTag) tag).getValue(); - } else { - return 0; - } + return accessIfExists( + index, + () -> (short) 0, + this.innerTag::getShort + ); } /** @@ -407,23 +382,11 @@ public final class ListTag extends Tag { * @return a string */ public String getString(int index) { - Tag tag = getIfExists(index); - if (tag instanceof StringTag) { - return ((StringTag) tag).getValue(); - } else { - return ""; - } - } - - @Override - public String toString() { - StringBuilder bldr = new StringBuilder(); - bldr.append("TAG_List").append(": ").append(value.size()).append(" entries of type ").append(NBTUtils.getTypeName(type)).append("\r\n{\r\n"); - for (Tag t : value) { - bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); - } - bldr.append("}"); - return bldr.toString(); + return accessIfExists( + index, + () -> "", + this.innerTag::getString + ); } // FAWE Start @@ -431,6 +394,5 @@ public final class ListTag extends Tag { public int getTypeCode() { return NBTConstants.TYPE_LIST; } - // FAWE End } diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java index b98c667e5..df1922703 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ListTagBuilder.java @@ -19,30 +19,36 @@ package com.sk89q.jnbt; -import java.util.ArrayList; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagType; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; + import java.util.Arrays; import java.util.Collection; -import java.util.List; import static com.google.common.base.Preconditions.checkNotNull; /** * Helps create list tags. + * + * @deprecated Use {@link com.sk89q.worldedit.util.nbt.ListBinaryTag.Builder}. */ +@Deprecated public class ListTagBuilder { - private final Class type; - private final List entries; + private final ListBinaryTag.Builder builder; /** * Create a new instance. * * @param type of tag contained in this list */ + @SuppressWarnings("unchecked") ListTagBuilder(Class type) { checkNotNull(type); - this.type = type; - this.entries = new ArrayList<>(); + this.builder = type != EndTag.class + ? ListBinaryTag.builder((BinaryTagType) AdventureNBTConverter.getAdventureType(type)) + : ListBinaryTag.builder(); } /** @@ -53,10 +59,7 @@ public class ListTagBuilder { */ public ListTagBuilder add(Tag value) { checkNotNull(value); - if (!type.isInstance(value)) { - throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName()); - } - entries.add(value); + builder.add(value.asBinaryTag()); return this; } @@ -80,7 +83,7 @@ public class ListTagBuilder { * @return the new list tag */ public ListTag build() { - return new ListTag(type, new ArrayList<>(entries)); + return new ListTag(this.builder.build()); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java index 34c31d26b..417e9e3af 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongArrayTag.java @@ -19,16 +19,19 @@ package com.sk89q.jnbt; -import java.util.Locale; +import com.sk89q.worldedit.util.nbt.LongArrayBinaryTag; import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_Long_Array} tag. + * + * @deprecated Use {@link LongArrayBinaryTag}. */ +@Deprecated public class LongArrayTag extends Tag { - private final long[] value; + private final LongArrayBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -38,25 +41,22 @@ public class LongArrayTag extends Tag { public LongArrayTag(long[] value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = LongArrayBinaryTag.of(value); + } + + public LongArrayTag(LongArrayBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public LongArrayBinaryTag asBinaryTag() { + return this.innerTag; } @Override public long[] getValue() { - return value; - } - - @Override - public String toString() { - StringBuilder hex = new StringBuilder(); - for (long b : value) { - String hexDigits = Long.toHexString(b).toUpperCase(Locale.ROOT); - if (hexDigits.length() == 1) { - hex.append("0"); - } - hex.append(hexDigits).append(" "); - } - return "TAG_Long_Array(" + hex + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java index 7b9c87858..526751bd8 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/LongTag.java @@ -19,14 +19,17 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.LongBinaryTag; /** * The {@code TAG_Long} tag. + * + * @deprecated Use {@link LongBinaryTag}. */ -public final class LongTag extends NumberTag { +@Deprecated +public final class LongTag extends Tag { - private final long value; + private final LongBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +38,22 @@ public final class LongTag extends NumberTag { */ public LongTag(long value) { super(); - this.value = value; + this.innerTag = LongBinaryTag.of(value); + } + + public LongTag(LongBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public LongBinaryTag asBinaryTag() { + return this.innerTag; } @Override public Long getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_Long(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java index db6689cb5..9d65f5e79 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTConstants.java @@ -20,13 +20,17 @@ package com.sk89q.jnbt; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; /** * A class which holds constant values. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTConstants { - public static final Charset CHARSET = Charset.forName("UTF-8"); + public static final Charset CHARSET = StandardCharsets.UTF_8; public static final int TYPE_END = 0; public static final int TYPE_BYTE = 1; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java index 50c98ddc1..bfc18a23f 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTInputStream.java @@ -19,8 +19,8 @@ package com.sk89q.jnbt; -import com.boydti.fawe.jnbt.streamer.StreamDelegate; -import com.boydti.fawe.jnbt.streamer.ValueReader; +import com.fastasyncworldedit.core.jnbt.streamer.StreamDelegate; +import com.fastasyncworldedit.core.jnbt.streamer.ValueReader; import java.io.Closeable; import java.io.DataInputStream; @@ -32,8 +32,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -// THIS CLASS HAS BEEN HEAVILY MODIFIED BY FAWE - /** * This class reads NBT, or Named Binary Tag * streams, and produces an object graph of subclasses of the {@code Tag} @@ -44,7 +42,10 @@ import java.util.Map; * found at * https://minecraft.gamepedia.com/NBT_format. *

+ * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTInputStream implements Closeable { private final DataInputStream is; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java index 9a4299841..19c957d2c 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTOutputStream.java @@ -19,7 +19,7 @@ package com.sk89q.jnbt; -import com.boydti.fawe.object.io.LittleEndianOutputStream; +import com.fastasyncworldedit.core.object.io.LittleEndianOutputStream; import java.io.Closeable; import java.io.DataOutput; @@ -43,7 +43,10 @@ import static com.google.common.base.Preconditions.checkNotNull; * found at * https://minecraft.gamepedia.com/NBT_format. *

+ * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTOutputStream extends OutputStream implements Closeable, DataOutput { /** @@ -82,6 +85,7 @@ public final class NBTOutputStream extends OutputStream implements Closeable, Da return os; } + //TODO writeNamedTag was changed in upstream so the code below this comment may not work anymore. /** * Writes a tag. * diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java index f2b6e008a..f4d990001 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NBTUtils.java @@ -20,6 +20,7 @@ package com.sk89q.jnbt; import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.Map; @@ -29,7 +30,9 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * A class which contains NBT-related utility methods. * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public final class NBTUtils { /** @@ -85,36 +88,10 @@ public final class NBTUtils { * @throws IllegalArgumentException if the tag class is invalid. */ public static int getTypeCode(Class clazz) { - if (clazz.equals(ByteArrayTag.class)) { - return NBTConstants.TYPE_BYTE_ARRAY; - } else if (clazz.equals(ByteTag.class)) { - return NBTConstants.TYPE_BYTE; - } else if (CompoundTag.class.isAssignableFrom(clazz)) { - return NBTConstants.TYPE_COMPOUND; - } else if (clazz.equals(DoubleTag.class)) { - return NBTConstants.TYPE_DOUBLE; - } else if (clazz.equals(EndTag.class)) { - return NBTConstants.TYPE_END; - } else if (clazz.equals(FloatTag.class)) { - return NBTConstants.TYPE_FLOAT; - } else if (clazz.equals(IntTag.class)) { - return NBTConstants.TYPE_INT; - } else if (clazz.equals(ListTag.class)) { - return NBTConstants.TYPE_LIST; - } else if (clazz.equals(LongTag.class)) { - return NBTConstants.TYPE_LONG; - } else if (clazz.equals(ShortTag.class)) { - return NBTConstants.TYPE_SHORT; - } else if (clazz.equals(StringTag.class)) { - return NBTConstants.TYPE_STRING; - } else if (clazz.equals(IntArrayTag.class)) { - return NBTConstants.TYPE_INT_ARRAY; - } else if (clazz.equals(LongArrayTag.class)) { - return NBTConstants.TYPE_LONG_ARRAY; - } else { - throw new IllegalArgumentException("Invalid tag class (" - + clazz.getName() + ")."); + if (LazyCompoundTag.class.isAssignableFrom(clazz)) { + return BinaryTagTypes.COMPOUND.id(); } + return AdventureNBTConverter.getAdventureType(clazz).id(); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java index c7089e3f4..80742783c 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/NamedTag.java @@ -23,7 +23,10 @@ import static com.google.common.base.Preconditions.checkNotNull; /** * A tag that has a name. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ +@Deprecated public class NamedTag { private final String name; diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java index 87b69d480..c0849a583 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/ShortTag.java @@ -19,14 +19,17 @@ package com.sk89q.jnbt; -import com.sk89q.jnbt.fawe.NumberTag; +import com.sk89q.worldedit.util.nbt.ShortBinaryTag; /** * The {@code TAG_Short} tag. + * + * @deprecated Use {@link ShortBinaryTag}. */ -public final class ShortTag extends NumberTag { +@Deprecated +public final class ShortTag extends Tag { - private final short value; + private final ShortBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -35,17 +38,22 @@ public final class ShortTag extends NumberTag { */ public ShortTag(short value) { super(); - this.value = value; + this.innerTag = ShortBinaryTag.of(value); + } + + public ShortTag(ShortBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public ShortBinaryTag asBinaryTag() { + return this.innerTag; } @Override public Short getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_Short(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java index ae173441b..ef5ff44c1 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/StringTag.java @@ -19,14 +19,19 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; + import static com.google.common.base.Preconditions.checkNotNull; /** * The {@code TAG_String} tag. + * + * @deprecated Use {@link StringBinaryTag}. */ +@Deprecated public final class StringTag extends Tag { - private final String value; + private final StringBinaryTag innerTag; /** * Creates the tag with an empty name. @@ -36,17 +41,22 @@ public final class StringTag extends Tag { public StringTag(String value) { super(); checkNotNull(value); - this.value = value; + this.innerTag = StringBinaryTag.of(value); + } + + public StringTag(StringBinaryTag adventureTag) { + super(); + this.innerTag = adventureTag; + } + + @Override + public StringBinaryTag asBinaryTag() { + return this.innerTag; } @Override public String getValue() { - return value; - } - - @Override - public String toString() { - return "TAG_String(" + value + ")"; + return innerTag.value(); } // FAWE Start diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java index 3d415da86..2bad9d965 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/Tag.java @@ -19,10 +19,15 @@ package com.sk89q.jnbt; +import com.sk89q.worldedit.util.nbt.BinaryTagLike; + /** * Represents a NBT tag. + * + * @deprecated JNBT is being removed for adventure-nbt in WorldEdit 8. */ -public abstract class Tag { +@Deprecated +public abstract class Tag implements BinaryTagLike { /** * Gets the value of this tag. @@ -31,6 +36,11 @@ public abstract class Tag { */ public abstract Object getValue(); + @Override + public String toString() { + return asBinaryTag().toString(); + } + // FAWE Start public Object toRaw() { return getValue(); diff --git a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java b/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java index 6c9812a20..a45b86b17 100644 --- a/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java +++ b/worldedit-core/src/main/java/com/sk89q/jnbt/fawe/CompressedSchematicTag.java @@ -1,7 +1,7 @@ package com.sk89q.jnbt.fawe; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; -import com.boydti.fawe.object.io.FastByteArraysInputStream; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; import com.sk89q.jnbt.CompressedCompoundTag; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/sk89q/util/yaml/YAMLProcessor.java b/worldedit-core/src/main/java/com/sk89q/util/yaml/YAMLProcessor.java index 9d7ee43f3..79fe703f0 100644 --- a/worldedit-core/src/main/java/com/sk89q/util/yaml/YAMLProcessor.java +++ b/worldedit-core/src/main/java/com/sk89q/util/yaml/YAMLProcessor.java @@ -21,7 +21,7 @@ package com.sk89q.util.yaml; import com.sk89q.util.StringUtil; import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; +import com.fastasyncworldedit.core.configuration.Yaml; import org.yaml.snakeyaml.constructor.SafeConstructor; import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.reader.UnicodeReader; 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 042ea615a..51e196431 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -19,29 +19,29 @@ package com.sk89q.worldedit; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.implementation.lighting.NullRelighter; -import com.boydti.fawe.beta.implementation.lighting.Relighter; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.object.changeset.AbstractChangeSet; -import com.boydti.fawe.object.changeset.BlockBagChangeSet; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; -import com.boydti.fawe.object.extent.FaweRegionExtent; -import com.boydti.fawe.object.extent.ProcessedWEExtent; -import com.boydti.fawe.object.extent.ResettableExtent; -import com.boydti.fawe.object.extent.SourceMaskExtent; -import com.boydti.fawe.object.function.SurfaceRegionFunction; -import com.boydti.fawe.object.mask.ResettableMask; -import com.boydti.fawe.object.pattern.ExistingPattern; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.MaskTraverser; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.implementation.lighting.NullRelighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.changeset.BlockBagChangeSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.extent.FaweRegionExtent; +import com.fastasyncworldedit.core.object.extent.ProcessedWEExtent; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.object.extent.SourceMaskExtent; +import com.fastasyncworldedit.core.object.function.SurfaceRegionFunction; +import com.fastasyncworldedit.core.object.mask.ResettableMask; +import com.fastasyncworldedit.core.object.pattern.ExistingPattern; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.ExtentTraverser; +import com.fastasyncworldedit.core.util.MaskTraverser; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.entity.BaseEntity; import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.entity.Player; 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 3eed26198..77a5ea851 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -19,28 +19,26 @@ package com.sk89q.worldedit; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.changeset.DiskStorageHistory; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; -import com.boydti.fawe.object.collection.SparseBitSet; -import com.boydti.fawe.object.extent.ResettableExtent; -import com.boydti.fawe.util.BrushCache; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.util.TextureHolder; -import com.boydti.fawe.util.TextureUtil; -import com.boydti.fawe.wrappers.WorldWrapper; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.changeset.DiskStorageHistory; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.object.collection.SparseBitSet; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.util.BrushCache; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.util.TextureHolder; +import com.fastasyncworldedit.core.util.TextureUtil; +import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.sk89q.jchronic.Chronic; import com.sk89q.jchronic.Options; import com.sk89q.jchronic.utils.Span; import com.sk89q.jchronic.utils.Time; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.command.tool.BlockTool; @@ -71,6 +69,7 @@ import com.sk89q.worldedit.util.Countable; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Identifiable; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -79,8 +78,6 @@ import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.snapshot.experimental.Snapshot; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -93,12 +90,15 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Objects; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; @@ -122,7 +122,7 @@ public class LocalSession implements TextureHolder { // Session related private transient RegionSelector selector = new CuboidRegionSelector(); private transient boolean placeAtPos1 = false; - private final transient List history = Collections.synchronizedList(new LinkedList() { + private final transient List history = Collections.synchronizedList(new LinkedList<>() { @Override public Object get(int index) { Object value = super.get(index); @@ -1293,13 +1293,15 @@ public class LocalSession implements TextureHolder { BaseBlock block = ServerCUIHandler.createStructureBlock(player); if (block != null) { - // If it's null, we don't need to do anything. The old was already removed. - Map tags = block.getNbtData().getValue(); - BlockVector3 tempCuiTemporaryBlock = BlockVector3.at( - ((IntTag) tags.get("x")).getValue(), - ((IntTag) tags.get("y")).getValue(), - ((IntTag) tags.get("z")).getValue() + CompoundBinaryTag tags = Objects.requireNonNull( + block.getNbt(), "createStructureBlock should return nbt" ); + BlockVector3 tempCuiTemporaryBlock = BlockVector3.at( + tags.getInt("x"), + tags.getInt("y"), + tags.getInt("z") + ); + // If it's null, we don't need to do anything. The old was already removed. if (cuiTemporaryBlock != null && !tempCuiTemporaryBlock.equals(cuiTemporaryBlock)) { // Update the existing block if it's the same location player.sendFakeBlock(cuiTemporaryBlock, null); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/MissingWorldException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/MissingWorldException.java index 108cdc744..35b718377 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/MissingWorldException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/MissingWorldException.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; /** * Raised when a world is missing but is required. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/NotABlockException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/NotABlockException.java index f9177e129..35c1167e9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/NotABlockException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/NotABlockException.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.world.item.ItemType; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/UnknownDirectionException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/UnknownDirectionException.java index 9cba96cfa..7f8e12f38 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/UnknownDirectionException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/UnknownDirectionException.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.util.formatting.text.TextComponent; /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java index d54bf93fc..e4cbe67af 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Throwables; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java index 6ca95e2f9..8c1a01e54 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItem.java @@ -20,9 +20,14 @@ package com.sk89q.worldedit.blocks; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.item.ItemType; +import java.io.IOException; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; @@ -37,7 +42,7 @@ public class BaseItem implements NbtValued { private ItemType itemType; @Nullable - private CompoundTag nbtData; + private LazyReference nbtData; /** * Construct the object. @@ -49,13 +54,24 @@ public class BaseItem implements NbtValued { this.itemType = itemType; } + /** + * Construct the object. + * + * @param itemType Type of the item + * @param nbtData NBT Compound tag + */ + @Deprecated + public BaseItem(ItemType itemType, @Nullable CompoundTag nbtData) { + this(itemType, nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag)); + } + /** * Construct the object. * * @param itemType Type of the item * @param tag NBT Compound tag */ - public BaseItem(ItemType itemType, @Nullable CompoundTag tag) { + public BaseItem(ItemType itemType, @Nullable LazyReference tag) { checkNotNull(itemType); this.itemType = itemType; this.nbtData = tag; @@ -85,19 +101,29 @@ public class BaseItem implements NbtValued { this.itemType = itemType; } - @Override - public boolean hasNbtData() { - return this.nbtData != null; - } - @Nullable @Override - public CompoundTag getNbtData() { + public LazyReference getNbtReference() { return this.nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { this.nbtData = nbtData; } + + @Override + public String toString() { + String nbtString = ""; + LazyReference nbtData = this.nbtData; + if (nbtData != null) { + try { + nbtString = TagStringIO.get().asString(nbtData.getValue()); + } catch (IOException e) { + WorldEdit.logger.error("Failed to serialize NBT of Item", e); + } + } + + return getType().getId() + nbtString; + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java index 2f22ebb93..8d9e4ab07 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/blocks/BaseItemStack.java @@ -22,7 +22,9 @@ package com.sk89q.worldedit.blocks; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.Component; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.item.ItemType; /** @@ -60,15 +62,29 @@ public class BaseItemStack extends BaseItem { * @param id The item type * @param tag Tag value * @param amount amount in the stack + * @deprecated Use {@link #BaseItemStack(ItemType, LazyReference, int)} */ + @Deprecated public BaseItemStack(ItemType id, CompoundTag tag, int amount) { super(id, tag); this.amount = amount; } + /** + * Construct the object. + * + * @param id The item type + * @param tag Tag value + * @param amount amount in the stack + */ + public BaseItemStack(ItemType id, LazyReference tag, int amount) { + super(id, tag); + this.amount = amount; + } + /** * Get the number of items in the stack. - * + * * @return the amount */ public int getAmount() { @@ -77,7 +93,7 @@ public class BaseItemStack extends BaseItem { /** * Set the amount of items in the stack. - * + * * @param amount the amount to set */ public void setAmount(int amount) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java index 3c4514224..c9c6cedc5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.LocalSession; 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 e992056fa..4b2cb1b88 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; 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 b73161d49..fed32c51f 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 @@ -19,46 +19,46 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.brush.BlendBall; -import com.boydti.fawe.object.brush.BlobBrush; -import com.boydti.fawe.object.brush.BrushSettings; -import com.boydti.fawe.object.brush.CatenaryBrush; -import com.boydti.fawe.object.brush.CircleBrush; -import com.boydti.fawe.object.brush.CommandBrush; -import com.boydti.fawe.object.brush.CopyPastaBrush; -import com.boydti.fawe.object.brush.ErodeBrush; -import com.boydti.fawe.object.brush.FallingSphere; -import com.boydti.fawe.object.brush.FlattenBrush; -import com.boydti.fawe.object.brush.HeightBrush; -import com.boydti.fawe.object.brush.ImageBrush; -import com.boydti.fawe.object.brush.LayerBrush; -import com.boydti.fawe.object.brush.LineBrush; -import com.boydti.fawe.object.brush.PopulateSchem; -import com.boydti.fawe.object.brush.RaiseBrush; -import com.boydti.fawe.object.brush.RecurseBrush; -import com.boydti.fawe.object.brush.ScatterBrush; -import com.boydti.fawe.object.brush.ScatterCommand; -import com.boydti.fawe.object.brush.ScatterOverlayBrush; -import com.boydti.fawe.object.brush.ShatterBrush; -import com.boydti.fawe.object.brush.SplatterBrush; -import com.boydti.fawe.object.brush.SplineBrush; -import com.boydti.fawe.object.brush.StencilBrush; -import com.boydti.fawe.object.brush.SurfaceSphereBrush; -import com.boydti.fawe.object.brush.SurfaceSpline; -import com.boydti.fawe.object.brush.heightmap.ScalableHeightMap; -import com.boydti.fawe.object.brush.heightmap.ScalableHeightMap.Shape; -import com.boydti.fawe.object.brush.sweep.SweepBrush; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; -import com.boydti.fawe.object.io.PGZIPOutputStream; -import com.boydti.fawe.object.mask.IdMask; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.brush.BlendBall; +import com.fastasyncworldedit.core.object.brush.BlobBrush; +import com.fastasyncworldedit.core.object.brush.BrushSettings; +import com.fastasyncworldedit.core.object.brush.CatenaryBrush; +import com.fastasyncworldedit.core.object.brush.CircleBrush; +import com.fastasyncworldedit.core.object.brush.CommandBrush; +import com.fastasyncworldedit.core.object.brush.CopyPastaBrush; +import com.fastasyncworldedit.core.object.brush.ErodeBrush; +import com.fastasyncworldedit.core.object.brush.FallingSphere; +import com.fastasyncworldedit.core.object.brush.FlattenBrush; +import com.fastasyncworldedit.core.object.brush.HeightBrush; +import com.fastasyncworldedit.core.object.brush.ImageBrush; +import com.fastasyncworldedit.core.object.brush.LayerBrush; +import com.fastasyncworldedit.core.object.brush.LineBrush; +import com.fastasyncworldedit.core.object.brush.PopulateSchem; +import com.fastasyncworldedit.core.object.brush.RaiseBrush; +import com.fastasyncworldedit.core.object.brush.RecurseBrush; +import com.fastasyncworldedit.core.object.brush.ScatterBrush; +import com.fastasyncworldedit.core.object.brush.ScatterCommand; +import com.fastasyncworldedit.core.object.brush.ScatterOverlayBrush; +import com.fastasyncworldedit.core.object.brush.ShatterBrush; +import com.fastasyncworldedit.core.object.brush.SplatterBrush; +import com.fastasyncworldedit.core.object.brush.SplineBrush; +import com.fastasyncworldedit.core.object.brush.StencilBrush; +import com.fastasyncworldedit.core.object.brush.SurfaceSphereBrush; +import com.fastasyncworldedit.core.object.brush.SurfaceSpline; +import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap; +import com.fastasyncworldedit.core.object.brush.heightmap.ScalableHeightMap.Shape; +import com.fastasyncworldedit.core.object.brush.sweep.SweepBrush; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.object.mask.IdMask; +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.sk89q.minecraft.util.commands.Step; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.EmptyClipboardException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java index 79421c9e8..2119bdfd5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ChunkCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.gson.JsonIOException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; 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 29d2f6f11..30543ab64 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 @@ -19,21 +19,21 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; -import com.boydti.fawe.object.clipboard.ReadOnlyClipboard; -import com.boydti.fawe.object.clipboard.URIClipboardHolder; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; -import com.boydti.fawe.util.ImgurUtility; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.MaskTraverser; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; +import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.util.ImgurUtility; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.MaskTraverser; import com.google.common.collect.Lists; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ExpandCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ExpandCommands.java index 77eba2ffd..686324ced 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ExpandCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ExpandCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; 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 ede30c988..9652fe1cf 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 @@ -19,15 +19,15 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.extent.ResettableExtent; -import com.boydti.fawe.util.CachedTextureUtil; -import com.boydti.fawe.util.CleanTextureUtil; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.RandomTextureUtil; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.util.TextureUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.util.CachedTextureUtil; +import com.fastasyncworldedit.core.util.CleanTextureUtil; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.RandomTextureUtil; +import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.util.TextureUtil; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; 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 7e9afc7a8..9cf12b3ac 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 @@ -19,11 +19,11 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.TextureUtil; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.TextureUtil; +import com.fastasyncworldedit.core.util.image.ImageUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java index 90f0c55cf..a5b601bb6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; 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 3c5eae03d..338ac6c8c 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 @@ -1,16 +1,16 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.database.DBHandler; -import com.boydti.fawe.database.RollbackDatabase; -import com.boydti.fawe.logging.rollback.RollbackOptimizedHistory; -import com.boydti.fawe.object.RegionWrapper; -import com.boydti.fawe.object.changeset.SimpleChangeSetSummary; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.database.DBHandler; +import com.fastasyncworldedit.core.database.RollbackDatabase; +import com.fastasyncworldedit.core.logging.RollbackOptimizedHistory; +import com.fastasyncworldedit.core.object.RegionWrapper; +import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotCommands.java index 38ae35a6b..bb024a86a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotCommands.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotUtilCommands.java index 458de617e..67a61ac24 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/LegacySnapshotUtilCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java index f922cf131..27c292987 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.text.TextComponent; import org.enginehub.piston.annotation.Command; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java index b02182ca3..f87759fbb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/NavigationCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java index 64a272157..6083611ea 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/PaintBrushCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index f6cc0a2c2..b45cdb9d9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.FaweAPI; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.RelightMode; +import com.fastasyncworldedit.core.FaweAPI; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.RelightMode; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; 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 257321ee9..4aae1afe7 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 @@ -19,12 +19,12 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; -import com.boydti.fawe.object.clipboard.URIClipboardHolder; -import com.boydti.fawe.object.schematic.MinecraftStructure; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.object.schematic.MinecraftStructure; +import com.fastasyncworldedit.core.util.MainUtil; import com.google.common.base.Function; import com.google.common.collect.Multimap; import com.sk89q.worldedit.LocalConfiguration; @@ -38,6 +38,7 @@ import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.event.extent.ActorSaveClipboardEvent; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; @@ -91,7 +92,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.regex.Pattern; -import static com.boydti.fawe.util.ReflectionUtils.as; +import static com.fastasyncworldedit.core.util.ReflectionUtils.as; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -328,6 +329,11 @@ public class SchematicCommands { boolean allowOverwrite, @Switch(name = 'g', desc = "Bypasses per-player-schematic folders") boolean global) throws WorldEditException { + if (worldEdit.getPlatformManager().queryCapability(Capability.GAME_HOOKS).getDataVersion() == -1) { + actor.printError(TranslatableComponent.of("worldedit.schematic.unsupported-minecraft-version")); + return; + } + LocalConfiguration config = worldEdit.getConfiguration(); File dir = worldEdit.getWorkingDirectoryPath(config.saveDir).toFile(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java index 4fce96645..8e34fe547 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ScriptingCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index c9d8ad602..58f5a887f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.clipboard.URIClipboardHolder; -import com.boydti.fawe.object.mask.IdMask; -import com.boydti.fawe.object.regions.selector.FuzzyRegionSelector; -import com.boydti.fawe.object.regions.selector.PolyhedralRegionSelector; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.object.mask.IdMask; +import com.fastasyncworldedit.core.object.regions.selector.FuzzyRegionSelector; +import com.fastasyncworldedit.core.object.regions.selector.PolyhedralRegionSelector; import com.google.common.base.Strings; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java index 60f67fc5c..049544a9d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java @@ -21,7 +21,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java index d6ec23811..64801d94a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java index 9404c9d0e..b28fecde0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SuperPickaxeCommands.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java index fc76c93ad..782ceac3c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.brush.InspectBrush; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.brush.InspectBrush; import com.google.common.collect.Collections2; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java index ca67e6437..73ee19c07 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolUtilCommands.java @@ -19,12 +19,12 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.brush.BrushSettings; -import com.boydti.fawe.object.brush.TargetMode; -import com.boydti.fawe.object.brush.scroll.Scroll; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.brush.BrushSettings; +import com.fastasyncworldedit.core.object.brush.TargetMode; +import com.fastasyncworldedit.core.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.collect.Iterables; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; @@ -46,7 +46,6 @@ import org.enginehub.piston.annotation.Command; import org.enginehub.piston.annotation.CommandContainer; import org.enginehub.piston.annotation.param.Arg; import org.enginehub.piston.annotation.param.Switch; -import org.jetbrains.annotations.Range; import java.util.List; import java.util.Locale; 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 0b184b615..ea189bf05 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 @@ -19,13 +19,13 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.DelegateConsumer; -import com.boydti.fawe.object.function.QuadFunction; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.DelegateConsumer; +import com.fastasyncworldedit.core.object.function.QuadFunction; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.image.ImageUtil; import com.google.common.base.Function; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.IncompleteRegionException; 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 a14419a6f..7e615ba2c 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 @@ -19,10 +19,10 @@ package com.sk89q.worldedit.command; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweVersion; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.FaweVersion; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; import com.intellectualsites.paster.IncendoPaster; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java index a56a914d8..712080460 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/EnumConverter.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.argument; -import com.boydti.fawe.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.object.brush.scroll.Scroll; import com.google.common.collect.ImmutableSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.command.util.HookMode; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java index 1d2da8788..baeee8df9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/FactoryConverter.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.argument; -import com.boydti.fawe.object.extent.SupplyingExtent; +import com.fastasyncworldedit.core.object.extent.SupplyingExtent; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; @@ -36,7 +36,6 @@ import com.sk89q.worldedit.internal.annotation.ClipboardMask; import com.sk89q.worldedit.internal.registry.AbstractFactory; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.session.ClipboardHolder; -import com.sk89q.worldedit.session.request.RequestExtent; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.world.World; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/OffsetConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/OffsetConverter.java index 7acaf5a3a..890626000 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/OffsetConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/argument/OffsetConverter.java @@ -22,17 +22,25 @@ package com.sk89q.worldedit.command.argument; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.Locatable; import com.sk89q.worldedit.internal.annotation.Offset; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.math.MathUtils; +import com.sk89q.worldedit.math.Vector3; +import com.sk89q.worldedit.math.transform.AffineTransform; +import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import org.enginehub.piston.CommandManager; import org.enginehub.piston.converter.ArgumentConverter; import org.enginehub.piston.converter.ConversionResult; +import org.enginehub.piston.converter.FailedConversion; import org.enginehub.piston.inject.InjectedValueAccess; import org.enginehub.piston.inject.Key; import java.util.List; +import java.util.stream.Collectors; public class OffsetConverter implements ArgumentConverter { @@ -62,15 +70,70 @@ public class OffsetConverter implements ArgumentConverter { @Override public List getSuggestions(String input, InjectedValueAccess context) { + if (input.startsWith("^") && context.injectedValue(Key.of(Actor.class)) + .filter(actor -> actor instanceof Locatable).isPresent()) { + return vectorConverter.getSuggestions(input.substring(1), context).stream() + .map(s -> "^" + s) + .collect(Collectors.toList()); + } return ImmutableList.copyOf(Iterables.concat( directionVectorConverter.getSuggestions(input, context), vectorConverter.getSuggestions(input, context) )); } + private BlockVector3 rotateToRelative(Location location, BlockVector3 relativeOffset) { + float pitch = location.getPitch(); + float yaw = location.getYaw(); + + // This math was borrowed from the MC codebase, with some changes made for accuracy + double f = MathUtils.dCos(yaw + 90.0); + double g = MathUtils.dSin(yaw + 90.0); + double j = MathUtils.dCos(-pitch + 90.0); + double k = MathUtils.dSin(-pitch + 90.0); + + Vector3 m1 = location.getDirection(); + Vector3 m2 = Vector3.at(f * j, k, g * j); + Vector3 m3 = m1.cross(m2).multiply(-1.0D); + + // Create an affine transform of the columns (col4 is empty due to no translation) + AffineTransform transform = new AffineTransform( + m1.getX(), m2.getX(), m3.getX(), 0, + m1.getY(), m2.getY(), m3.getY(), 0, + m1.getZ(), m2.getZ(), m3.getZ(), 0 + ); + + return transform + .apply(relativeOffset.toVector3()) + // This *MUST* be rounded before converting to block points + .round().toBlockPoint(); + } + @Override public ConversionResult convert(String input, InjectedValueAccess context) { - return directionVectorConverter.convert(input, context) - .orElse(vectorConverter.convert(input, context)); + if (input.startsWith("^")) { + try { + // Looking at a relative vector. + Actor actor = context.injectedValue(Key.of(Actor.class)) + .orElseThrow(() -> new IllegalStateException("An actor is required to use relative offsets")); + + if (!(actor instanceof Locatable)) { + throw new IllegalStateException("Only a locatable actor may use relative offsets"); + } + + Location location = ((Locatable) actor).getLocation(); + + return vectorConverter.convert(input.substring(1), context).map(blockVector3s -> + blockVector3s.stream() + .map(vector -> rotateToRelative(location, vector)) + .collect(Collectors.toList()) + ); + } catch (IllegalStateException e) { + return FailedConversion.from(e); + } + } else { + return directionVectorConverter.convert(input, context) + .orElse(vectorConverter.convert(input, context)); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java index af9e3ed27..572e2d6b6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java index 330a8818a..8a6e25d42 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.Lists; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java index bbf737dd6..dc8df8f89 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java index ef9432b2a..ac66d0ed0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java @@ -19,29 +19,24 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.beta.implementation.IChunkExtent; -import com.boydti.fawe.beta.implementation.processors.NullProcessor; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.brush.BrushSettings; -import com.boydti.fawe.object.brush.MovableTool; -import com.boydti.fawe.object.brush.ResettableTool; -import com.boydti.fawe.object.brush.TargetMode; -import com.boydti.fawe.object.brush.scroll.Scroll; -import com.boydti.fawe.object.brush.scroll.ScrollTool; -import com.boydti.fawe.object.extent.ResettableExtent; -import com.boydti.fawe.object.mask.MaskedTargetBlock; -import com.boydti.fawe.object.pattern.PatternTraverser; -import com.boydti.fawe.util.BrushCache; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.ExtentTraverser; -import com.boydti.fawe.util.MaskTraverser; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.brush.BrushSettings; +import com.fastasyncworldedit.core.object.brush.MovableTool; +import com.fastasyncworldedit.core.object.brush.ResettableTool; +import com.fastasyncworldedit.core.object.brush.TargetMode; +import com.fastasyncworldedit.core.object.brush.scroll.Scroll; +import com.fastasyncworldedit.core.object.brush.scroll.ScrollTool; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.object.mask.MaskedTargetBlock; +import com.fastasyncworldedit.core.object.pattern.PatternTraverser; +import com.fastasyncworldedit.core.util.BrushCache; +import com.fastasyncworldedit.core.util.MaskTraverser; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.command.tool.brush.Brush; import com.sk89q.worldedit.entity.Player; @@ -57,15 +52,11 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.request.Request; import com.sk89q.worldedit.util.Location; -import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockType; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import java.util.function.Supplier; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java index 6934eaf5a..17b3d6413 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/DistanceWand.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java index 8d757c601..e9190d51f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java index b5db455cf..8697e28f8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -102,7 +102,7 @@ public class FloodFillTool implements BlockTool { visited.add(pos); if (editSession.getBlock(pos).getBlockType() == initialType) { - editSession.setBlock(pos, pattern.apply(pos)); + editSession.setBlock(pos, pattern.applyBlock(pos)); } else { return; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java index 3ea04426b..9e60fdcf3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/LongRangeBuildTool.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -64,7 +64,7 @@ public class LongRangeBuildTool extends BrushTool implements DoubleActionTraceTo try (EditSession editSession = session.createEditSession(player, "LongRangeBuildTool")) { try { BlockVector3 blockPoint = pos.toVector().toBlockPoint(); - BaseBlock applied = secondary.apply(blockPoint); + BaseBlock applied = secondary.applyBlock(blockPoint); if (applied.getBlockType().getMaterial().isAir()) { editSession.setBlock(blockPoint, secondary); } else { @@ -93,7 +93,7 @@ public class LongRangeBuildTool extends BrushTool implements DoubleActionTraceTo try (EditSession editSession = session.createEditSession(player, "LongRangeBuildTool")) { try { BlockVector3 blockPoint = pos.toVector().toBlockPoint(); - BaseBlock applied = primary.apply(blockPoint); + BaseBlock applied = primary.applyBlock(blockPoint); if (applied.getBlockType().getMaterial().isAir()) { editSession.setBlock(blockPoint, primary); } else { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java index 6256c621a..f95e31f6c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/NavigationWand.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; 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 b23046bd4..24215270d 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java index a6c47f0a0..5e5f1ffe9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.object.mask.IdMask; +import com.fastasyncworldedit.core.object.mask.IdMask; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; 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 ec3ee090c..309507940 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.entity.Player; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java index 20392cf2c..c96fbff2c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java index a288bae11..62f907511 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/TreePlanter.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.tool; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java index 0133c5a8b..3eeb11786 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/AsyncCommandBuilder.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.util; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.ListenableFuture; 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 848af5955..851e337fd 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.util; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.entity.metadata.EntityProperties; import com.sk89q.worldedit.function.EntityFunction; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PrintCommandHelp.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PrintCommandHelp.java index 1bae6a185..434c42e22 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PrintCommandHelp.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/PrintCommandHelp.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.util; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java index 7a7504474..8ecafa602 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/SuggestionHelper.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.command.util; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; import com.sk89q.worldedit.registry.Registry; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java index 0ea63631a..1bd169420 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/annotation/Confirm.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.command.util.annotation; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.util.task.InterruptableCondition; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.util.task.InterruptableCondition; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.argument.Arguments; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java index 241167e71..3a829adc3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/BaseEntity.java @@ -20,8 +20,8 @@ package com.sk89q.worldedit.entity; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.entity.EntityType; import com.sk89q.worldedit.world.entity.EntityTypes; @@ -45,8 +45,22 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class BaseEntity implements NbtValued { - private EntityType type; - private CompoundTag nbtData; + private final EntityType type; + @Nullable + private LazyReference nbtData; + + /** + * Create a new base entity. + * + * @param type the entity type + * @param nbtData NBT data + * @deprecated Use {@link BaseEntity#BaseEntity(EntityType, LazyReference)} + */ + @Deprecated + public BaseEntity(EntityType type, CompoundTag nbtData) { + this(type); + setNbtData(nbtData); + } /** * Create a new base entity. @@ -54,13 +68,9 @@ public class BaseEntity implements NbtValued { * @param type the entity type * @param nbtData NBT data */ - public BaseEntity(EntityType type, CompoundTag nbtData) { + public BaseEntity(EntityType type, LazyReference nbtData) { this(type); - setNbtData(nbtData); - } - - public BaseEntity(CompoundTag tag) { - this(EntityTypes.parse(tag.getString("Id")), tag); + setNbtReference(nbtData); } /** @@ -80,26 +90,17 @@ public class BaseEntity implements NbtValued { public BaseEntity(BaseEntity other) { checkNotNull(other); this.type = other.getType(); - setNbtData(other.getNbtData()); - } - - public Location getLocation(Extent extent) { - return nbtData.getEntityLocation(extent); - } - - @Override - public boolean hasNbtData() { - return true; + setNbtReference(other.getNbtReference()); } @Nullable @Override - public CompoundTag getNbtData() { + public LazyReference getNbtReference() { return nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { this.nbtData = nbtData; } @@ -112,4 +113,11 @@ public class BaseEntity implements NbtValued { return this.type; } + // FAWE start + public BaseEntity(CompoundTag tag) { + this(EntityTypes.parse(tag.getString("Id")), tag); + } + + // FAWE end + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java index 35fb2de7a..768b3fa77 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/LazyBaseEntity.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.entity; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.world.entity.EntityType; @@ -11,7 +11,7 @@ import javax.annotation.Nullable; public class LazyBaseEntity extends BaseEntity { private Supplier saveTag; public LazyBaseEntity(EntityType type, Supplier saveTag) { - super(type, null); + super(type); this.saveTag = saveTag; } 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 dd37fdc47..32bb2dc3a 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 @@ -19,12 +19,12 @@ package com.sk89q.worldedit.entity; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java index c374ebbcc..12b8bd1de 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/MaskFactory.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.factory.parser.mask.AdjacentMaskParser; import com.sk89q.worldedit.extension.factory.parser.mask.AirMaskParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java index 516da1333..12a633ccc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultBlockParser.java @@ -19,11 +19,11 @@ package com.sk89q.worldedit.extension.factory.parser; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.jnbt.JSON2NBT; -import com.boydti.fawe.jnbt.NBTException; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.jnbt.JSON2NBT; +import com.fastasyncworldedit.core.jnbt.NBTException; +import com.fastasyncworldedit.core.util.MathMan; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.collect.Maps; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.IncompleteRegionException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java index f5e5788f9..d1be80300 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/DefaultItemParser.java @@ -19,22 +19,28 @@ package com.sk89q.worldedit.extension.factory.parser; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItemStack; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.input.InputParseException; +import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.util.HandSide; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.util.formatting.text.TextComponent; +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.registry.LegacyMapper; +import java.io.IOException; import java.util.Locale; import java.util.stream.Stream; @@ -51,44 +57,87 @@ public class DefaultItemParser extends InputParser { @Override public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException { + ItemType itemType; + CompoundBinaryTag itemNbtData = null; + BaseItem item = null; + // Legacy matcher if (context.isTryingLegacy()) { try { String[] split = input.split(":"); - ItemType type; if (split.length == 0) { throw new InputParseException(Caption.of("worldedit.error.parser.invalid-colon")); } else if (split.length == 1) { - type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0])); + itemType = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0])); } else { - type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1])); + itemType = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1])); } - if (type != null) { - item = new BaseItem(type); + if (itemType != null) { + item = new BaseItem(itemType); } } catch (NumberFormatException ignored) { } } - if ("hand".equalsIgnoreCase(input)) { - return getItemInHand(context.requireActor(), HandSide.MAIN_HAND); - } else if ("offhand".equalsIgnoreCase(input)) { - return getItemInHand(context.requireActor(), HandSide.OFF_HAND); - } - if (item == null) { - ItemType type = ItemTypes.get(input.toLowerCase(Locale.ROOT)); - if (type != null) { - item = new BaseItem(type); + String typeString; + String nbtString = null; + int nbtStart = input.indexOf('{'); + + if (nbtStart == -1) { + typeString = input; + } else { + typeString = input.substring(0, nbtStart); + if (nbtStart + 1 >= input.length()) { + throw new InputParseException(TranslatableComponent.of("worldedit.error.parser.hanging-lbracket", TextComponent.of(nbtStart))); + } + int stateEnd = input.lastIndexOf('}'); + if (stateEnd < 0) { + throw new InputParseException(TranslatableComponent.of("worldedit.error.parser.missing-rbracket")); + } + nbtString = input.substring(nbtStart); } + + if ("hand".equalsIgnoreCase(typeString)) { + BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.MAIN_HAND); + itemType = heldItem.getType(); + itemNbtData = heldItem.getNbt(); + } else if ("offhand".equalsIgnoreCase(typeString)) { + BaseItemStack heldItem = getItemInHand(context.requireActor(), HandSide.OFF_HAND); + itemType = heldItem.getType(); + itemNbtData = heldItem.getNbt(); + } else { + itemType = ItemTypes.get(typeString.toLowerCase(Locale.ROOT)); + } + + if (itemType == null) { + throw new NoMatchException(TranslatableComponent.of("worldedit.error.unknown-item", TextComponent.of(input))); + } + + if (nbtString != null) { + try { + CompoundBinaryTag otherTag = TagStringIO.get().asCompound(nbtString); + if (itemNbtData == null) { + itemNbtData = otherTag; + } else { + for (String key : otherTag.keySet()) { + itemNbtData.put(key, otherTag.get(key)); + } + } + } catch (IOException e) { + throw new NoMatchException(TranslatableComponent.of( + "worldedit.error.invalid-nbt", + TextComponent.of(input), + TextComponent.of(e.getMessage()) + )); + } + } + + item = new BaseItem(itemType, itemNbtData == null ? null : LazyReference.computed(itemNbtData)); } - if (item == null) { - throw new InputParseException(Caption.of("worldedit.error.unknown-item", TextComponent.of(input))); - } else { - return item; - } + return item; } private BaseItemStack getItemInHand(Actor actor, HandSide handSide) throws InputParseException { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java index 780b96cf7..9d281e87c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/RichParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Preconditions; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java index d60ef0d9a..71fc4b628 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AdjacentMaskParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.AdjacentAnyMask; -import com.boydti.fawe.object.mask.AdjacentMask; +import com.fastasyncworldedit.core.object.mask.AdjacentAnyMask; +import com.fastasyncworldedit.core.object.mask.AdjacentMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java index 7c45d029a..0b144e5f0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/AngleMaskParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.mask.AngleMask; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.mask.AngleMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BiomeMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BiomeMaskParser.java index cf386b589..ec0cba3d9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BiomeMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BiomeMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Splitter; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockCategoryMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockCategoryMaskParser.java index cbe9405f1..7dd2f9f1d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockCategoryMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockCategoryMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java index 337407db0..4597e2372 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/BlockStateMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Splitter; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java index 80b14c977..19c318c90 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExpressionMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java index dd95e74bf..3b04e5ff0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ExtremaMaskParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.mask.ExtremaMask; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.mask.ExtremaMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java index ef61430f5..77fe732fb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/LiquidMaskParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.LiquidMask; +import com.fastasyncworldedit.core.object.mask.LiquidMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/NegateMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/NegateMaskParser.java index 163071df3..b4bec8ea5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/NegateMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/NegateMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java index 4b0424a24..e2af7862f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ROCAngleMaskParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.mask.ROCAngleMask; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.mask.ROCAngleMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java index ae0f7182e..4c3f8e274 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RadiusMaskParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.RadiusMask; +import com.fastasyncworldedit.core.object.mask.RadiusMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RegionMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RegionMaskParser.java index 851f325be..9d1d42e7c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RegionMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/RegionMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java index 4e96690f0..17bce6c2f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SimplexMaskParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.SimplexMask; +import com.fastasyncworldedit.core.object.mask.SimplexMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java index e485afb04..8407b650e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/SurfaceMaskParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.SurfaceMask; +import com.fastasyncworldedit.core.object.mask.SurfaceMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java index 7b4236315..e9000b212 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/WallMaskParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.WallMask; +import com.fastasyncworldedit.core.object.mask.WallMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java index 91f873e36..8432a3fe3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/XAxisMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.XAxisMask; +import com.fastasyncworldedit.core.object.mask.XAxisMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java index 916e7fe4c..7dd27ffdf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/YAxisMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.YAxisMask; +import com.fastasyncworldedit.core.object.mask.YAxisMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java index 072857e7e..2bbef3ea6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/ZAxisMaskParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.mask; -import com.boydti.fawe.object.mask.ZAxisMask; +import com.fastasyncworldedit.core.object.mask.ZAxisMask; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java index ac6323eea..9c36f4a04 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BiomePatternParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.pattern.BiomeApplyingPattern; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.pattern.BiomeApplyingPattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java index 322fe217c..5d9a5b241 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BlockCategoryPatternParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java index 9f5ae0545..5e1c6e3a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/BufferedPatternParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.pattern.BufferedPattern; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.pattern.BufferedPattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.factory.parser.RichParser; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java index 93490cf08..6d9db2fa4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ClipboardPatternParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java index f69981b9a..838bf3819 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/ExistingPatternParser.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.object.pattern.ExistingPattern; +import com.fastasyncworldedit.core.object.pattern.ExistingPattern; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java index 607e6ba8e..0d9d58eb1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear2DPatternParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.pattern.Linear2DBlockPattern; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.pattern.Linear2DBlockPattern; import com.google.common.base.Preconditions; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java index 83f4c85ef..51eef6f57 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/Linear3DPatternParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.pattern.Linear3DBlockPattern; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.pattern.Linear3DBlockPattern; import com.google.common.base.Preconditions; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java index 2b3965f93..40c3bbb46 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/NoisePatternParser.java @@ -1,7 +1,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.random.NoiseRandom; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.random.NoiseRandom; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.factory.parser.RichParser; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java index 3e01dd17c..76045e1be 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/RandomPatternParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.util.StringUtil; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/TypeOrStateApplyingPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/TypeOrStateApplyingPatternParser.java index a6906e4ff..6a75f6b86 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/TypeOrStateApplyingPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/TypeOrStateApplyingPatternParser.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.factory.parser.pattern; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; import com.sk89q.worldedit.extension.input.InputParseException; 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 26e85daaa..b9f73aee2 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extension.input; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.factory.MaskFactory; import com.sk89q.worldedit.extension.platform.Actor; 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 79874f058..345d3a61e 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 @@ -19,10 +19,10 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.task.AsyncNotifyQueue; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.util.TaskManager; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.internal.cui.CUIEvent; 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 a34eb1642..751af2270 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 @@ -19,12 +19,12 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.task.AsyncNotifyQueue; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.TaskManager; -import com.boydti.fawe.util.WEManager; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.task.AsyncNotifyQueue; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.TaskManager; +import com.fastasyncworldedit.core.util.WEManager; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEdit; 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 b131c87bd..7eb80baaf 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 @@ -19,10 +19,10 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.util.task.InterruptableCondition; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.util.task.InterruptableCondition; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.entity.MapMetadatable; import com.sk89q.worldedit.entity.Player; @@ -35,7 +35,6 @@ import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.format.TextColor; import java.io.File; -import java.io.IOException; import java.util.Locale; /** 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 1a93237fb..69fcd0095 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 @@ -19,7 +19,8 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.beta.implementation.lighting.RelighterFactory; +import com.fastasyncworldedit.core.beta.implementation.lighting.Relighter; +import com.fastasyncworldedit.core.beta.implementation.lighting.RelighterFactory; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; @@ -225,7 +226,7 @@ public interface Platform extends Keyed { /** * Get the {@link RelighterFactory} that can be used to obtain - * {@link com.boydti.fawe.beta.implementation.lighting.Relighter}s. + * {@link Relighter}s. * * @return the relighter factory to be used. */ 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 7a379b819..82f7b0e85 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 @@ -19,13 +19,13 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.task.ThrowableSupplier; -import com.boydti.fawe.util.StringMan; -import com.boydti.fawe.util.TaskManager; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.task.ThrowableSupplier; +import com.fastasyncworldedit.core.util.StringMan; +import com.fastasyncworldedit.core.util.TaskManager; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; @@ -330,9 +330,13 @@ public final class PlatformCommandManager { globalInjectedValues.injectValue(Key.of(InjectedValueAccess.class), Optional::of); } - private void registerSubCommands(String name, List aliases, String desc, - CommandRegistration registration, CI instance) { - registerSubCommands(name, aliases, desc, registration, instance, m -> {}); + /** + * Internal use only. + */ + public void registerSubCommands(String name, List aliases, String desc, + CommandRegistration registration, CI instance) { + registerSubCommands(name, aliases, desc, registration, instance, m -> { + }); } private void registerSubCommands(String name, List aliases, String desc, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java index a45bd567f..72cddf9ae 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformManager.java @@ -19,12 +19,11 @@ package com.sk89q.worldedit.extension.platform; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.pattern.PatternTraverser; -import com.boydti.fawe.wrappers.LocationMaskedPlayerWrapper; -import com.boydti.fawe.wrappers.WorldWrapper; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.pattern.PatternTraverser; +import com.fastasyncworldedit.core.wrappers.LocationMaskedPlayerWrapper; +import com.fastasyncworldedit.core.wrappers.WorldWrapper; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java index 71b15aebd..bf18cc3c6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/Bindings.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.platform.binding; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.util.formatting.text.Component; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java index ae6065418..4150967b0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ConsumeBindings.java @@ -1,9 +1,9 @@ package com.sk89q.worldedit.extension.platform.binding; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.util.MainUtil; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.util.MainUtil; +import com.fastasyncworldedit.core.util.image.ImageUtil; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java index cfa4b92b5..6110cdd30 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/PrimitiveBindings.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extension.platform.binding; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.internal.expression.EvaluationException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java index e79fa4fe4..933ba7883 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/binding/ProvideBindings.java @@ -1,11 +1,11 @@ package com.sk89q.worldedit.extension.platform.binding; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.database.DBHandler; -import com.boydti.fawe.database.RollbackDatabase; -import com.boydti.fawe.regions.FaweMaskManager; -import com.boydti.fawe.util.TextureUtil; -import com.boydti.fawe.util.image.ImageUtil; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.database.DBHandler; +import com.fastasyncworldedit.core.database.RollbackDatabase; +import com.fastasyncworldedit.core.regions.FaweMaskManager; +import com.fastasyncworldedit.core.util.TextureUtil; +import com.fastasyncworldedit.core.util.image.ImageUtil; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; 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 38dc4f4a4..f0efe75be 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 @@ -19,12 +19,12 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.HistoryExtent; -import com.boydti.fawe.object.changeset.AbstractChangeSet; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.util.ExtentTraverser; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.HistoryExtent; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.util.ExtentTraverser; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; 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 79d96f16c..a909c1ba8 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 @@ -19,17 +19,17 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.implementation.filter.block.ExtentFilterBlock; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.changeset.AbstractChangeSet; -import com.boydti.fawe.object.clipboard.WorldCopyClipboard; -import com.boydti.fawe.object.exception.FaweException; -import com.boydti.fawe.object.extent.NullExtent; -import com.boydti.fawe.util.ExtentTraverser; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ExtentFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.clipboard.WorldCopyClipboard; +import com.fastasyncworldedit.core.object.exception.FaweException; +import com.fastasyncworldedit.core.object.extent.NullExtent; +import com.fastasyncworldedit.core.util.ExtentTraverser; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.BaseEntity; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java index 4b5e4c7cf..868e4aefa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; 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 09f39546e..5b7576c8c 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 @@ -19,16 +19,16 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.filter.block.CharFilterBlock; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.filter.block.CharFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; import com.google.common.cache.LoadingCache; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.mask.Mask; 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 3532bfeac..45b1d0713 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.beta.implementation.lighting.HeightMapType; +import com.fastasyncworldedit.core.beta.implementation.lighting.HeightMapType; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.operation.Operation; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java index 1f3cee85e..7f3155997 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/PassthroughExtent.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.extent; -import com.boydti.fawe.beta.Filter; +import com.fastasyncworldedit.core.beta.Filter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java index 5dff99e3c..f3b5e3850 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/buffer/ForgetfulExtentBuffer.java @@ -160,7 +160,7 @@ public class ForgetfulExtentBuffer extends AbstractDelegateExtent implements Pat @Override - public BaseBlock apply(BlockVector3 pos) { + public BaseBlock applyBlock(BlockVector3 pos) { BaseBlock block = buffer.get(pos); if (block != null) { return block; 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 796cf30af..406b60de9 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 @@ -19,14 +19,14 @@ package com.sk89q.worldedit.extent.clipboard; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.clipboard.CPUOptimizedClipboard; -import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; -import com.boydti.fawe.object.clipboard.MemoryOptimizedClipboard; -import com.boydti.fawe.object.clipboard.ReadOnlyClipboard; -import com.boydti.fawe.util.EditSessionBuilder; -import com.boydti.fawe.util.MaskTraverser; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.clipboard.CPUOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.MemoryOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.ReadOnlyClipboard; +import com.fastasyncworldedit.core.util.EditSessionBuilder; +import com.fastasyncworldedit.core.util.MaskTraverser; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.entity.Entity; @@ -41,7 +41,6 @@ import com.sk89q.worldedit.function.operation.Operations; import com.sk89q.worldedit.function.visitor.Order; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.MutableBlockVector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Regions; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java index c4c8b1629..c0c97a55c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/BuiltInClipboardFormat.java @@ -19,10 +19,10 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.object.io.PGZIPOutputStream; -import com.boydti.fawe.object.io.ResettableFileInputStream; -import com.boydti.fawe.object.schematic.MinecraftStructure; -import com.boydti.fawe.object.schematic.PNGWriter; +import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.object.io.ResettableFileInputStream; +import com.fastasyncworldedit.core.object.schematic.MinecraftStructure; +import com.fastasyncworldedit.core.object.schematic.PNGWriter; import com.google.common.collect.ImmutableSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.NBTInputStream; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java index a09ac238e..07292f388 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java @@ -19,10 +19,10 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.object.RunnableVal; -import com.boydti.fawe.object.clipboard.URIClipboardHolder; -import com.boydti.fawe.object.io.PGZIPOutputStream; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.object.RunnableVal; +import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.object.io.PGZIPOutputStream; +import com.fastasyncworldedit.core.util.MainUtil; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.platform.Actor; 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 7d2c29d78..2bd5ee01b 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 @@ -19,13 +19,13 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.clipboard.LazyClipboardHolder; -import com.boydti.fawe.object.clipboard.MultiClipboardHolder; -import com.boydti.fawe.object.clipboard.URIClipboardHolder; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; -import com.boydti.fawe.util.MainUtil; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.clipboard.LazyClipboardHolder; +import com.fastasyncworldedit.core.object.clipboard.MultiClipboardHolder; +import com.fastasyncworldedit.core.object.clipboard.URIClipboardHolder; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.util.MainUtil; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java index ab58c920e..09271b0c2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardReader.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; +import com.fastasyncworldedit.core.object.clipboard.DiskOptimizedClipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java index 4b9fbe494..9f10aa19e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicReader.java @@ -19,14 +19,15 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.jnbt.streamer.StreamDelegate; -import com.boydti.fawe.jnbt.streamer.ValueReader; -import com.boydti.fawe.object.FaweInputStream; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.object.clipboard.LinearClipboard; -import com.boydti.fawe.object.io.FastByteArrayOutputStream; -import com.boydti.fawe.object.io.FastByteArraysInputStream; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.jnbt.streamer.StreamDelegate; +import com.fastasyncworldedit.core.jnbt.streamer.ValueReader; +import com.fastasyncworldedit.core.object.FaweInputStream; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.object.clipboard.LinearClipboard; +import com.fastasyncworldedit.core.object.io.FastByteArrayOutputStream; +import com.fastasyncworldedit.core.object.io.FastByteArraysInputStream; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.NBTInputStream; @@ -43,6 +44,7 @@ import com.sk89q.worldedit.internal.Constants; import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.DataFixer; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -122,18 +124,18 @@ public class FastSchematicReader extends NBTSchematicReader { return fixer.fixUp(DataFixer.FixTypes.BLOCK_STATE, palettePart, dataVersion); } - private CompoundTag fixBlockEntity(CompoundTag tag) { + private CompoundBinaryTag fixBlockEntity(CompoundTag tag) { if (fixer == null || dataVersion == -1) { - return tag; + return tag.asBinaryTag(); } - return fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, tag, dataVersion); + return fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, tag.asBinaryTag(), dataVersion); } - private CompoundTag fixEntity(CompoundTag tag) { + private CompoundBinaryTag fixEntity(CompoundTag tag) { if (fixer == null || dataVersion == -1) { - return tag; + return tag.asBinaryTag(); } - return fixer.fixUp(DataFixer.FixTypes.ENTITY, tag, dataVersion); + return fixer.fixUp(DataFixer.FixTypes.ENTITY, tag.asBinaryTag(), dataVersion); } private String fixBiome(String biomePalettePart) { @@ -358,7 +360,7 @@ public class FastSchematicReader extends NBTSchematicReader { values.remove("Id"); values.remove("Pos"); - clipboard.setTile(x, y, z, fixBlockEntity(new CompoundTag(values))); + clipboard.setTile(x, y, z, (CompoundTag) AdventureNBTConverter.fromAdventure(fixBlockEntity(new CompoundTag(values)))); } } @@ -378,7 +380,7 @@ public class FastSchematicReader extends NBTSchematicReader { EntityType type = EntityTypes.parse(id.getValue()); if (type != null) { - final CompoundTag ent = fixEntity(new CompoundTag(value)); + final CompoundTag ent = (CompoundTag) AdventureNBTConverter.fromAdventure(fixEntity(new CompoundTag(value))); BaseEntity state = new BaseEntity(type, ent); Location loc = ent.getEntityLocation(clipboard); if (brokenEntities) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java index c5e7fe56e..322b620f5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/FastSchematicWriter.java @@ -19,10 +19,10 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.jnbt.streamer.IntValueReader; -import com.boydti.fawe.object.FaweOutputStream; -import com.boydti.fawe.util.IOUtil; +import com.fastasyncworldedit.core.Fawe; +import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; +import com.fastasyncworldedit.core.object.FaweOutputStream; +import com.fastasyncworldedit.core.util.IOUtil; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntArrayTag; import com.sk89q.jnbt.ListTag; 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 e9f9631ad..bb4947994 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 @@ -20,6 +20,7 @@ package com.sk89q.worldedit.extent.clipboard.io; import com.google.common.collect.ImmutableList; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntTag; @@ -47,7 +48,9 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.collection.BlockMap; import com.sk89q.worldedit.world.DataFixer; +import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.entity.EntityType; import com.sk89q.worldedit.world.entity.EntityTypes; @@ -62,6 +65,7 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; @@ -75,17 +79,17 @@ public class MCEditSchematicReader extends NBTSchematicReader { private final NBTInputStream inputStream; private final DataFixer fixer; private static final ImmutableList COMPATIBILITY_HANDLERS - = ImmutableList.of( - new SignCompatibilityHandler(), - new FlowerPotCompatibilityHandler(), - new NoteBlockCompatibilityHandler(), - new SkullBlockCompatibilityHandler(), - new BannerBlockCompatibilityHandler(), - new BedBlockCompatibilityHandler() + = ImmutableList.of( + new SignCompatibilityHandler(), + new FlowerPotCompatibilityHandler(), + new NoteBlockCompatibilityHandler(), + new SkullBlockCompatibilityHandler(), + new BannerBlockCompatibilityHandler(), + new BedBlockCompatibilityHandler() ); private static final ImmutableList ENTITY_COMPATIBILITY_HANDLERS - = ImmutableList.of( - new Pre13HangingCompatibilityHandler() + = ImmutableList.of( + new Pre13HangingCompatibilityHandler() ); /** @@ -184,8 +188,7 @@ public class MCEditSchematicReader extends NBTSchematicReader { // Need to pull out tile entities final ListTag tileEntityTag = getTag(schematic, "TileEntities", ListTag.class); List tileEntities = tileEntityTag == null ? new ArrayList<>() : tileEntityTag.getValue(); - Map> tileEntitiesMap = new HashMap<>(); - Map blockStates = new HashMap<>(); + BlockMap tileEntityBlocks = BlockMap.createForBaseBlock(); for (Tag tag : tileEntities) { if (!(tag instanceof CompoundTag)) { @@ -219,14 +222,20 @@ public class MCEditSchematicReader extends NBTSchematicReader { } if (fixer != null && t != null) { - t = fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, t, -1); + t = (CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, t.asBinaryTag(), -1)); } BlockVector3 vec = BlockVector3.at(x, y, z); - if (t != null) { - tileEntitiesMap.put(vec, t.getValue()); + // Insert into the map if we have changed the block or have a tag + BlockState blockToInsert = newBlock != null + ? newBlock + : (t != null ? block : null); + if (blockToInsert != null) { + BaseBlock baseBlock = t != null + ? blockToInsert.toBaseBlock(new CompoundTag(t.getValue())) + : blockToInsert.toBaseBlock(); + tileEntityBlocks.put(vec, baseBlock); } - blockStates.put(vec, newBlock); } BlockArrayClipboard clipboard = new BlockArrayClipboard(region); @@ -239,22 +248,19 @@ public class MCEditSchematicReader extends NBTSchematicReader { for (int z = 0; z < length; ++z) { int index = y * width * length + z * width + x; BlockVector3 pt = BlockVector3.at(x, y, z); - BlockState state = blockStates.computeIfAbsent(pt, p -> getBlockState(blocks[index], blockData[index])); + BaseBlock state = Optional.ofNullable(tileEntityBlocks.get(pt)) + .orElseGet(() -> getBlockState(blocks[index], blockData[index]).toBaseBlock()); try { if (state != null) { - if (tileEntitiesMap.containsKey(pt)) { - clipboard.setBlock(region.getMinimumPoint().add(pt), state.toBaseBlock(new CompoundTag(tileEntitiesMap.get(pt)))); - } else { - clipboard.setBlock(region.getMinimumPoint().add(pt), state); - } + clipboard.setBlock(region.getMinimumPoint().add(pt), state); } else { short block = blocks[index]; 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."); + + block + ":" + data + ". This is most likely a bad schematic."); } } } catch (WorldEditException ignored) { // BlockArrayClipboard won't throw this @@ -274,7 +280,7 @@ public class MCEditSchematicReader extends NBTSchematicReader { if (tag instanceof CompoundTag) { CompoundTag compound = (CompoundTag) tag; if (fixer != null) { - compound = fixer.fixUp(DataFixer.FixTypes.ENTITY, compound, -1); + compound = (CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.ENTITY, compound.asBinaryTag(), -1)); } String id = convertEntityId(compound.getString("id")); Location location = NBTConversions.toLocation(clipboard, compound.getListTag("Pos"), compound.getListTag("Rotation")); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java index adb7df3ac..099efa100 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/SpongeSchematicReader.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.extent.clipboard.io; import com.google.common.collect.Maps; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.IntArrayTag; @@ -232,9 +233,9 @@ public class SpongeSchematicReader extends NBTSchematicReader { } if (tileEntities != null) { List> tileEntityTags = tileEntities.getValue().stream() - .map(tag -> (CompoundTag) tag) - .map(CompoundTag::getValue) - .collect(Collectors.toList()); + .map(tag -> (CompoundTag) tag) + .map(CompoundTag::getValue) + .collect(Collectors.toList()); for (Map tileEntity : tileEntityTags) { int[] pos = requireTag(tileEntity, "Pos", IntArrayTag.class).getValue(); @@ -247,7 +248,7 @@ public class SpongeSchematicReader extends NBTSchematicReader { values.remove("Id"); values.remove("Pos"); if (fixer != null) { - tileEntity = fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values), dataVersion).getValue(); + tileEntity = ((CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values).asBinaryTag(), dataVersion))).getValue(); } else { tileEntity = values; } @@ -385,14 +386,14 @@ public class SpongeSchematicReader extends NBTSchematicReader { entityTag = entityTag.createBuilder().putString("id", id).remove("Id").build(); if (fixer != null) { - entityTag = fixer.fixUp(DataFixer.FixTypes.ENTITY, entityTag, dataVersion); + entityTag = (CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.ENTITY, entityTag.asBinaryTag(), dataVersion)); } EntityType entityType = EntityTypes.get(id); if (entityType != null) { Location location = NBTConversions.toLocation(clipboard, - requireTag(tags, "Pos", ListTag.class), - requireTag(tags, "Rotation", ListTag.class)); + requireTag(tags, "Pos", ListTag.class), + requireTag(tags, "Rotation", ListTag.class)); BaseEntity state = new BaseEntity(entityType, entityTag); clipboard.createEntity(location, state); } else { 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 b0753f623..340f00c39 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent.clipboard.io; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import com.google.common.collect.Maps; import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java index 130744056..c56b50b9d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/inventory/BlockBagExtent.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent.inventory; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; 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 aebbc4ea7..dca764c57 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.extent.transform; -import com.boydti.fawe.object.extent.ResettableExtent; +import com.fastasyncworldedit.core.object.extent.ResettableExtent; import com.google.common.collect.ImmutableMap; import com.sk89q.jnbt.ByteTag; import com.sk89q.jnbt.CompoundTag; 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 9e796fb70..21c287cd7 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 @@ -23,6 +23,7 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -95,25 +96,11 @@ public class SurvivalModeExtent extends AbstractDelegateExtent { } else { // Can't be an inlined check due to inconsistent generic return type if (stripNbt) { - return super.setBlock(location, block.toBaseBlock(null)); + return super.setBlock(location, block.toBaseBlock((CompoundBinaryTag) null)); } else { return super.setBlock(location, block); } } } - @Override - public > boolean setBlock(int x, int y, int z, B block) throws WorldEditException { - if (toolUse && block.getBlockType().getMaterial().isAir()) { - world.simulateBlockMine(BlockVector3.at(x, y, z)); - return true; - } else { - // Can't be an inlined check due to inconsistent generic return type - if (stripNbt) { - return super.setBlock(x, y, z, block.toBaseBlock(null)); - } else { - return super.setBlock(x, y, z, block); - } - } - } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java index f82ca0810..18ee659a8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/RegionFunction.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.function; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java index 91c194bf9..a08d6fa2c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/BlockReplace.java @@ -50,7 +50,7 @@ public class BlockReplace implements RegionFunction { @Override public boolean apply(BlockVector3 position) throws WorldEditException { - return extent.setBlock(position, pattern.apply(position)); + return extent.setBlock(position, pattern.applyBlock(position)); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java index 7f56aed56..cfa244544 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/ExtentBlockCopy.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.function.block; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.CompoundTagBuilder; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.RegionFunction; @@ -30,6 +28,9 @@ import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Direction.Flag; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.NumberBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import static com.google.common.base.Preconditions.checkNotNull; @@ -87,12 +88,13 @@ public class ExtentBlockCopy implements RegionFunction { * @return a new state or the existing one */ private BaseBlock transformNbtData(BaseBlock state) { - CompoundTag tag = state.getNbtData(); + CompoundBinaryTag tag = state.getNbt(); if (tag != null) { // Handle blocks which store their rotation in NBT - if (tag.containsKey("Rot")) { - int rot = tag.asInt("Rot"); + BinaryTag rotTag = tag.get("Rot"); + if (rotTag instanceof NumberBinaryTag) { + int rot = ((NumberBinaryTag) rotTag).intValue(); Direction direction = MCDirections.fromRotation(rot); @@ -101,11 +103,9 @@ public class ExtentBlockCopy implements RegionFunction { Direction newDirection = Direction.findClosest(vector, Flag.CARDINAL | Flag.ORDINAL | Flag.SECONDARY_ORDINAL); if (newDirection != null) { - CompoundTagBuilder builder = tag.createBuilder(); - - builder.putByte("Rot", (byte) MCDirections.toRotation(newDirection)); - - return state.toBaseBlock(builder.build()); + return state.toBaseBlock( + tag.putByte("Rot", (byte) MCDirections.toRotation(newDirection)) + ); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java index 7d6be17f3..f9d6181c8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/factory/Deform.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.factory; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java index 4dbbac42a..fce236ee3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.function.generator; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; 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 619d5f031..97e7ae5f8 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 @@ -106,10 +106,10 @@ public class FloraGenerator implements RegionFunction { BlockState block = editSession.getBlock(position); if (block.getBlockType() == BlockTypes.GRASS_BLOCK) { - editSession.setBlock(position.add(0, 1, 0), temperatePattern.apply(position)); + editSession.setBlock(position.add(0, 1, 0), temperatePattern.applyBlock(position)); return true; } else if (block.getBlockType() == BlockTypes.SAND) { - editSession.setBlock(position.add(0, 1, 0), desertPattern.apply(position)); + editSession.setBlock(position.add(0, 1, 0), desertPattern.applyBlock(position)); return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java index 428a7a196..35de53d18 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/GardenPatchGenerator.java @@ -118,7 +118,7 @@ public class GardenPatchGenerator implements RegionFunction { setBlockIfAir(editSession, pos.add(1, h, -1), log); affected++; } - setBlockIfAir(editSession, p = pos.add(0, 0, -1), plant.apply(p)); + setBlockIfAir(editSession, p = pos.add(0, 0, -1), plant.applyBlock(p)); affected++; break; @@ -130,7 +130,7 @@ public class GardenPatchGenerator implements RegionFunction { setBlockIfAir(editSession, pos.add(1, h, 0), log); affected++; } - setBlockIfAir(editSession, p = pos.add(1, 0, 1), plant.apply(p)); + setBlockIfAir(editSession, p = pos.add(1, 0, 1), plant.applyBlock(p)); affected++; break; @@ -142,7 +142,7 @@ public class GardenPatchGenerator implements RegionFunction { setBlockIfAir(editSession, pos.add(-1, h, 0), log); affected++; } - setBlockIfAir(editSession, p = pos.add(-1, 0, 1), plant.apply(p)); + setBlockIfAir(editSession, p = pos.add(-1, 0, 1), plant.applyBlock(p)); affected++; break; @@ -154,7 +154,7 @@ public class GardenPatchGenerator implements RegionFunction { setBlockIfAir(editSession, pos.add(-1, h, -1), log); affected++; } - setBlockIfAir(editSession, p = pos.add(-1, 0, -1), plant.apply(p)); + setBlockIfAir(editSession, p = pos.add(-1, 0, -1), plant.applyBlock(p)); affected++; break; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java index 7e35d0cfc..858019623 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/OreGen.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.function.generator; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java index 1489f0495..651cf97b2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/ABlockMask.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.function.mask; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BlockState; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java index 8f192dbfa..d18e52a4c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java @@ -1,10 +1,10 @@ package com.sk89q.worldedit.function.mask; -import com.boydti.fawe.command.SuggestInputParseException; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.collection.FastBitSet; -import com.boydti.fawe.object.string.MutableCharSequence; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.command.SuggestInputParseException; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.collection.FastBitSet; +import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.registry.state.AbstractProperty; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java index 5c8f66b81..ebbcefbca 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/Mask.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.function.mask; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.MaskFilter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.MaskFilter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.math.BlockVector3; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java index 9ed32f4a7..2436fcfbd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ChangeSetExecutor.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.operation; -import com.boydti.fawe.object.changeset.AbstractChangeSet; +import com.fastasyncworldedit.core.object.changeset.AbstractChangeSet; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.inventory.BlockBag; import com.sk89q.worldedit.history.UndoContext; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java index bfb3c43c7..83b259e1c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/operation/ForwardExtentCopy.java @@ -19,13 +19,13 @@ package com.sk89q.worldedit.function.operation; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.extent.BlockTranslateExtent; -import com.boydti.fawe.object.extent.PositionTransformExtent; -import com.boydti.fawe.object.function.block.BiomeCopy; -import com.boydti.fawe.object.function.block.CombinedBlockCopy; -import com.boydti.fawe.object.function.block.SimpleBlockCopy; -import com.boydti.fawe.util.MaskTraverser; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.extent.BlockTranslateExtent; +import com.fastasyncworldedit.core.object.extent.PositionTransformExtent; +import com.fastasyncworldedit.core.object.function.block.BiomeCopy; +import com.fastasyncworldedit.core.object.function.block.CombinedBlockCopy; +import com.fastasyncworldedit.core.object.function.block.SimpleBlockCopy; +import com.fastasyncworldedit.core.util.MaskTraverser; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java index f882cb61d..560fd0b90 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java @@ -64,7 +64,7 @@ public class BlockPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { return block; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/ExtentBufferedCompositePattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/ExtentBufferedCompositePattern.java index 8ed275dbd..5583e5508 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/ExtentBufferedCompositePattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/ExtentBufferedCompositePattern.java @@ -52,10 +52,10 @@ public class ExtentBufferedCompositePattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock lastBlock = null; for (Pattern pattern : patterns) { - lastBlock = pattern.apply(position); + lastBlock = pattern.applyBlock(position); try { getExtent().setBlock(position, lastBlock); } catch (WorldEditException ignored) { // buffer doesn't throw diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java index 754494d77..cdddc1ce1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/Pattern.java @@ -19,8 +19,8 @@ package com.sk89q.worldedit.function.pattern; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.implementation.filter.block.FilterBlock; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.implementation.filter.block.FilterBlock; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.DeprecationUtil; @@ -42,10 +42,16 @@ public interface Pattern extends Filter { * @deprecated use {@link Pattern#applyBlock(BlockVector3)} */ @Deprecated - BaseBlock apply(BlockVector3 position); + @NonAbstractForCompatibility( + delegateName = "applyBlock", + delegateParams = { BlockVector3.class } + ) + default BaseBlock apply(BlockVector3 position) { + return applyBlock(position); + } default boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { - return set.setFullBlock(extent, apply(get)); + return set.setFullBlock(extent, applyBlock(get)); } @Override @@ -63,13 +69,5 @@ public interface Pattern extends Filter { * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} * for details */ - @NonAbstractForCompatibility( - delegateName = "apply", - delegateParams = { BlockVector3.class } - ) - default BaseBlock applyBlock(BlockVector3 position) { - DeprecationUtil.checkDelegatingOverride(getClass()); - - return apply(position); - } + BaseBlock applyBlock(BlockVector3 position); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java index 46e89e397..e88f87174 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomPattern.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.function.pattern; -import com.boydti.fawe.object.collection.RandomCollection; -import com.boydti.fawe.object.random.SimpleRandom; -import com.boydti.fawe.object.random.TrueRandom; +import com.fastasyncworldedit.core.object.collection.RandomCollection; +import com.fastasyncworldedit.core.object.random.SimpleRandom; +import com.fastasyncworldedit.core.object.random.TrueRandom; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector3; @@ -94,8 +94,8 @@ public class RandomPattern extends AbstractPattern { } @Override - public BaseBlock apply(BlockVector3 position) { - return collection.next(position.getBlockX(), position.getBlockY(), position.getBlockZ()).apply(position); + public BaseBlock applyBlock(BlockVector3 position) { + return collection.next(position.getBlockX(), position.getBlockY(), position.getBlockZ()).applyBlock(position); } @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomStatePattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomStatePattern.java index d1f7398a0..65e06336a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomStatePattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RandomStatePattern.java @@ -39,7 +39,7 @@ public class RandomStatePattern implements Pattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { return blocks.get(rand.nextInt(blocks.size())); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java index d95ecfc4d..6d6b94e66 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/RepeatingExtentPattern.java @@ -86,7 +86,7 @@ public class RepeatingExtentPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { int x = Math.floorMod(position.getBlockX() + offset.getBlockX(), size.getBlockX()) + origin.getBlockX(); int y = Math.floorMod(position.getBlockY() + offset.getBlockY(), size.getBlockY()) + origin.getBlockY(); int z = Math.floorMod(position.getBlockZ() + offset.getBlockZ(), size.getBlockZ()) + origin.getBlockZ(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java index a9545c518..0c0158b2f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/StateApplyingPattern.java @@ -44,7 +44,7 @@ public class StateApplyingPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockState block = getExtent().getBlock(position); for (Entry, Object> entry : cache .computeIfAbsent(block.getBlockType(), (b -> resolveProperties(states, b))).entrySet()) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/TypeApplyingPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/TypeApplyingPattern.java index a1db9db3a..2cee171f4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/TypeApplyingPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/TypeApplyingPattern.java @@ -39,7 +39,7 @@ public class TypeApplyingPattern extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BlockState oldBlock = getExtent().getBlock(position); BlockState newBlock = blockState.withProperties(oldBlock); return newBlock.toBaseBlock(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java index 3af0bd293..92b2a5994 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/WaterloggedRemover.java @@ -66,7 +66,7 @@ public class WaterloggedRemover extends AbstractExtentPattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { BaseBlock block = getExtent().getFullBlock(position); BlockState newState = remap[block.getOrdinal()]; if (newState != null) { 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 d18f5fd5f..6484aa182 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 @@ -19,8 +19,8 @@ package com.sk89q.worldedit.function.visitor; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/EntityVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/EntityVisitor.java index 5371a0f39..844c167ce 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/EntityVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/EntityVisitor.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.visitor; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Entity; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/FlatRegionVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/FlatRegionVisitor.java index 9280d94e8..8d4a2ed61 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/FlatRegionVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/FlatRegionVisitor.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.visitor; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.FlatRegionFunction; 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 51be3f7e4..cabb517af 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.function.visitor; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java index 38460a3de..f185c969a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ArrayListHistory.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.history.changeset; -import com.boydti.fawe.object.changeset.SimpleChangeSetSummary; +import com.fastasyncworldedit.core.object.changeset.SimpleChangeSetSummary; import com.google.common.collect.Lists; import com.sk89q.worldedit.history.change.BlockChange; import com.sk89q.worldedit.history.change.Change; 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 795688962..713458e65 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 @@ -67,4 +67,9 @@ public final class Constants { */ public static final int DATA_VERSION_MC_1_16 = 2566; + /** + * The DataVersion for Minecraft 1.17 + */ + public static final int DATA_VERSION_MC_1_17 = 2724; + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java index 8fb320b13..8fd544b2d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/annotation/AllowedRegion.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.internal.annotation; -import com.boydti.fawe.regions.FaweMaskManager; +import com.fastasyncworldedit.core.regions.FaweMaskManager; import org.enginehub.piston.inject.InjectAnnotation; import java.lang.annotation.ElementType; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java index bd1e17da5..b6c8d8e35 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.internal.command; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java index 9af58efea..e5dbe3fbd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/ConfirmHandler.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.internal.command; -import com.boydti.fawe.config.Settings; +import com.fastasyncworldedit.core.configuration.Settings; import com.sk89q.worldedit.command.util.annotation.Confirm; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.text.TextComponent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java index 2fbbbd8fc..dc91aa5e1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.internal.command.exception; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.DisallowedItemException; import com.sk89q.worldedit.EmptyClipboardException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java index 69f9ea5da..85f869e2d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/cui/ServerCUIHandler.java @@ -19,11 +19,6 @@ package com.sk89q.worldedit.internal.cui; -import com.sk89q.jnbt.ByteTag; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.WorldEdit; @@ -34,11 +29,10 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.HashMap; -import java.util.Map; import javax.annotation.Nullable; /** @@ -136,7 +130,7 @@ public class ServerCUIHandler { int z = (int) (location.getZ() - (xz * Math.cos(Math.toRadians(rotX))) * 12); int y = Math.max(0, Math.min(Math.min(255, posY + 32), posY + 3)); - Map structureTag = new HashMap<>(); + CompoundBinaryTag.Builder structureTag = CompoundBinaryTag.builder(); posX -= x; posY -= y; @@ -154,25 +148,25 @@ public class ServerCUIHandler { } } - structureTag.put("name", new StringTag("worldedit:" + player.getName())); - structureTag.put("author", new StringTag(player.getName())); - structureTag.put("metadata", new StringTag("")); - structureTag.put("x", new IntTag(x)); - structureTag.put("y", new IntTag(y)); - structureTag.put("z", new IntTag(z)); - structureTag.put("posX", new IntTag(posX)); - structureTag.put("posY", new IntTag(posY)); - structureTag.put("posZ", new IntTag(posZ)); - structureTag.put("sizeX", new IntTag(width)); - structureTag.put("sizeY", new IntTag(height)); - structureTag.put("sizeZ", new IntTag(length)); - structureTag.put("rotation", new StringTag("NONE")); - structureTag.put("mirror", new StringTag("NONE")); - structureTag.put("mode", new StringTag("SAVE")); - structureTag.put("ignoreEntities", new ByteTag((byte) 1)); - structureTag.put("showboundingbox", new ByteTag((byte) 1)); - structureTag.put("id", new StringTag(BlockTypes.STRUCTURE_BLOCK.getId())); + structureTag.putString("name", "worldedit:" + player.getName()); + structureTag.putString("author", player.getName()); + structureTag.putString("metadata", ""); + structureTag.putInt("x", x); + structureTag.putInt("y", y); + structureTag.putInt("z", z); + structureTag.putInt("posX", posX); + structureTag.putInt("posY", posY); + structureTag.putInt("posZ", posZ); + structureTag.putInt("sizeX", width); + structureTag.putInt("sizeY", height); + structureTag.putInt("sizeZ", length); + structureTag.putString("rotation", "NONE"); + structureTag.putString("mirror", "NONE"); + structureTag.putString("mode", "SAVE"); + structureTag.putByte("ignoreEntities", (byte) 1); + structureTag.putByte("showboundingbox", (byte) 1); + structureTag.putString("id", BlockTypes.STRUCTURE_BLOCK.getId()); - return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(new CompoundTag(structureTag)); + return BlockTypes.STRUCTURE_BLOCK.getDefaultState().toBaseBlock(structureTag.build()); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/AbstractFactory.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/AbstractFactory.java index d743dad00..c427031ac 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/AbstractFactory.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/registry/AbstractFactory.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.internal.registry; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java index 650a9b895..59461963f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/wna/WorldNativeAccess.java @@ -19,11 +19,14 @@ package com.sk89q.worldedit.internal.wna; -import com.sk89q.jnbt.CompoundTag; +import com.google.common.collect.ImmutableMap; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.StringBinaryTag; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -66,14 +69,15 @@ public interface WorldNativeAccess { if (successful || old == newState) { if (block instanceof BaseBlock) { BaseBlock baseBlock = (BaseBlock) block; - CompoundTag tag = baseBlock.getNbtData(); + CompoundBinaryTag tag = baseBlock.getNbt(); if (tag != null) { - tag = tag.createBuilder() - .putString("id", baseBlock.getNbtId()) - .putInt("x", position.getX()) - .putInt("y", position.getY()) - .putInt("z", position.getZ()) - .build(); + tag = tag.put(ImmutableMap.of( + "id", StringBinaryTag.of(baseBlock.getNbtId()), + "x", IntBinaryTag.of(position.getX()), + "y", IntBinaryTag.of(position.getY()), + "z", IntBinaryTag.of(position.getZ()) + )); + // update if TE changed as well successful = updateTileEntity(pos, tag); } @@ -136,13 +140,13 @@ public interface WorldNativeAccess { void updateLightingForBlock(NP position); - boolean updateTileEntity(NP position, CompoundTag tag); + boolean updateTileEntity(NP position, CompoundBinaryTag tag); - void notifyBlockUpdate(NP position, NBS oldState, NBS newState); + void notifyBlockUpdate(NC chunk, NP position, NBS oldState, NBS newState); boolean isChunkTicking(NC chunk); - void markBlockChanged(NP position); + void markBlockChanged(NC chunk, NP position); void notifyNeighbors(NP pos, NBS oldState, NBS newState); @@ -166,10 +170,10 @@ public interface WorldNativeAccess { // Remove redundant branches if (isChunkTicking(chunk)) { if (sideEffectSet.shouldApply(SideEffect.ENTITY_AI)) { - notifyBlockUpdate(pos, oldState, newState); + notifyBlockUpdate(chunk, pos, oldState, newState); } else { // If we want to skip entity AI, just mark the block for sending - markBlockChanged(pos); + markBlockChanged(chunk, pos); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java index 1304d9625..c2f68f4fb 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableBlockVector3.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.math; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; public class MutableBlockVector3 extends BlockVector3 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java index e32489230..878906258 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/MutableVector3.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.math; -import com.boydti.fawe.FaweCache; +import com.fastasyncworldedit.core.FaweCache; public class MutableVector3 extends Vector3 { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java index 1be75c018..c2d752e44 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/Vector3.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.math; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.google.common.collect.ComparisonChain; import com.sk89q.worldedit.math.transform.AffineTransform; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java index a0b9cea68..a5e19b6a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/noise/SimplexNoiseGenerator.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.math.noise; -import com.boydti.fawe.object.random.SimplexNoise; +import com.fastasyncworldedit.core.object.random.SimplexNoise; import com.sk89q.worldedit.math.Vector2; import com.sk89q.worldedit.math.Vector3; 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 ede52fe48..f50c7c28e 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 @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; 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 35bc3675c..1c01f3825 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 @@ -19,14 +19,14 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BlockVectorSet; +import com.fastasyncworldedit.core.FaweCache; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.configuration.Settings; +import com.fastasyncworldedit.core.object.collection.BlockVectorSet; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.MutableBlockVector2; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java index d92723426..cb3a4d818 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CylinderRegion.java @@ -19,12 +19,12 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java index 07599e12b..448c1cf6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/EllipsoidRegion.java @@ -20,13 +20,13 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.config.Caption; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.configuration.Caption; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/NullRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/NullRegion.java index dc820f089..cf845ccd4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/NullRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/NullRegion.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java index 3a2e3bcd0..ca04fa030 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.iterator.FlatRegion3DIterator; 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 4f20cc0c3..efef13577 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 @@ -19,15 +19,15 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.beta.Filter; -import com.boydti.fawe.beta.IBatchProcessor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.filter.block.ChunkFilterBlock; -import com.boydti.fawe.beta.implementation.processors.ProcessorScope; -import com.boydti.fawe.object.FaweLimit; -import com.boydti.fawe.object.extent.SingleRegionExtent; +import com.fastasyncworldedit.core.beta.Filter; +import com.fastasyncworldedit.core.beta.IBatchProcessor; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.beta.implementation.filter.block.ChunkFilterBlock; +import com.fastasyncworldedit.core.beta.implementation.processors.ProcessorScope; +import com.fastasyncworldedit.core.object.FaweLimit; +import com.fastasyncworldedit.core.object.extent.SingleRegionExtent; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.DeprecationUtil; import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; 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 8d2b1366c..1e666e9dd 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 @@ -19,10 +19,10 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.beta.IChunk; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.IChunkSet; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; import com.sk89q.worldedit.math.BlockVector2; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/TransformRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/TransformRegion.java index 477029a98..6211b1747 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/TransformRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/TransformRegion.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java index c9e667959..572abc6cf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ConvexPolyhedralRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java index 40842982b..14ec279e0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CuboidRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java index 6df900dd2..f728674d4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/CylinderRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java index 50c983735..fa7cf4a94 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/EllipsoidRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java index ae60fceed..0cadd5c65 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/ExtendingCuboidRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java index e81e63f51..4279f1516 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/Polygonal2DRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java index 6b801c25c..33e6eca47 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/selector/SphereRegionSelector.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.regions.selector; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.math.BlockVector3; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryShape.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryShape.java index 39af362ee..60ccf643d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryShape.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/ArbitraryShape.java @@ -103,7 +103,7 @@ public abstract class ArbitraryShape { int z = position.getBlockZ(); if (!hollow) { - BaseBlock material = getMaterial(x, y, z, pattern.apply(position)); + BaseBlock material = getMaterial(x, y, z, pattern.applyBlock(position)); if (material != null && editSession.setBlock(position, material)) { ++affected; } @@ -111,7 +111,7 @@ public abstract class ArbitraryShape { continue; } - BaseBlock material = getMaterial(x, y, z, pattern.apply(position)); + BaseBlock material = getMaterial(x, y, z, pattern.applyBlock(position)); if (material == null) { final int index = (y - cacheOffsetY) + (z - cacheOffsetZ) * cacheSizeY + (x - cacheOffsetX) * cacheSizeY * cacheSizeZ; cache[index] = -1; @@ -163,7 +163,7 @@ public abstract class ArbitraryShape { switch (cache[index]) { case 0: - BaseBlock mat = getMaterial(x, y, z, pattern.apply(BlockVector3.at(x, y, z))); + BaseBlock mat = getMaterial(x, y, z, pattern.applyBlock(BlockVector3.at(x, y, z))); if (mat == null) { cache[index] = -1; return false; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java index 1fadaf69a..fe782fff3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/AbstractProperty.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.registry.state; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.sk89q.worldedit.world.block.BlockTypesCache; import org.jetbrains.annotations.Nullable; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java index c5caa0dd3..3177a577b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/registry/state/IntegerProperty.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.registry.state; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.util.StringMan; import java.util.Collections; import java.util.List; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java index 7a73794f0..fe5d43567 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/scripting/CraftScriptContext.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.scripting; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java index 86eaf1bc4..97ca107d3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/session/PasteBuilder.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.session; -import com.boydti.fawe.util.MaskTraverser; +import com.fastasyncworldedit.core.util.MaskTraverser; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.clipboard.Clipboard; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java index b1a5799ec..af84a67c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TreeGenerator.java @@ -93,6 +93,7 @@ public class TreeGenerator { }, SWAMP("Swamp tree", "swamp", "swamptree"), ACACIA("Acacia tree", "acacia"), + AZALEA("Azalea tree", "azalea"), DARK_OAK("Dark oak tree", "darkoak"), PINE("Pine tree", "pine") { @Override diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java index ee571c643..e3203d28c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/collection/Int2BaseBlockMap.java @@ -50,7 +50,7 @@ class Int2BaseBlockMap extends AbstractInt2ObjectMap { * @return the internal ID, or {@link BlockStateIdAccess#invalidId()} if not useful */ private static int optimizedInternalId(BaseBlock block) { - if (block.hasNbtData()) { + if (block.getNbtReference() != null) { return BlockStateIdAccess.invalidId(); } return BlockStateIdAccess.getBlockStateId(block.toImmutableState()); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java index f755b3fa0..8463cac91 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/concurrency/LazyReference.java @@ -32,6 +32,17 @@ public class LazyReference { return new LazyReference<>(valueComputation); } + /** + * Pre-computed reference, for setting a lazy reference field with a known value. + * + * @param value the value of the reference + * @param the type of the value + * @return the new reference + */ + public static LazyReference computed(T value) { + return new LazyReference<>(value); + } + // Memory saving technique: hold the computation info in the same reference field that we'll // put the value into, so the memory possibly retained by those parts is GC'able as soon as // it's no longer needed. @@ -51,6 +62,10 @@ public class LazyReference { this.value = new RefInfo<>(valueComputation); } + private LazyReference(T value) { + this.value = value; + } + // casts are safe, value is either RefInfo or T @SuppressWarnings("unchecked") public T getValue() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java index 4b4d7fedb..1d4a83356 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/PaginationBox.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.util.formatting.component; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java index 42a82b908..78cc42a35 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/SideEffectBox.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.util.formatting.component; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.util.SideEffect; import com.sk89q.worldedit.util.SideEffectSet; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java new file mode 100644 index 000000000..2c032e8bc --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java @@ -0,0 +1,50 @@ +/* + * 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.util.nbt; + +import com.sk89q.worldedit.world.storage.InvalidFormatException; + +public class NbtUtils { + + /** + * Get child tag of a NBT structure. + * + * @param tag the tag to read from + * @param key the key to look for + * @param expected the expected NBT class type + * @return child tag + * @throws InvalidFormatException if the format of the items is invalid + */ + public static T getChildTag(CompoundBinaryTag tag, String key, BinaryTagType expected) throws InvalidFormatException { + BinaryTag childTag = tag.get(key); + if (childTag == null) { + throw new InvalidFormatException("Missing a \"" + key + "\" tag"); + } + + if (childTag.type().id() != expected.id()) { + throw new InvalidFormatException(key + " tag is not of tag type " + expected.toString()); + } + // SAFETY: same binary tag type checked above + @SuppressWarnings("unchecked") + T childTagCast = (T) childTag; + return childTagCast; + } + +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java index 0e4f79048..28d7380b2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/paste/ActorCallbackPaste.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.util.paste; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.command.util.AsyncCommandBuilder; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.text.TextComponent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/DataFixer.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/DataFixer.java index 92176abbd..f548d2687 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/DataFixer.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/DataFixer.java @@ -20,7 +20,7 @@ package com.sk89q.worldedit.world; import com.google.common.annotations.Beta; -import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; /** * This entire class is subject to heavy changes. Do not use this as API. @@ -37,9 +37,9 @@ public interface DataFixer { private FixTypes() { } - public static FixType CHUNK = new FixType<>(); - public static FixType BLOCK_ENTITY = new FixType<>(); - public static FixType ENTITY = new FixType<>(); + public static FixType CHUNK = new FixType<>(); + public static FixType BLOCK_ENTITY = new FixType<>(); + public static FixType ENTITY = new FixType<>(); public static FixType BLOCK_STATE = new FixType<>(); public static FixType BIOME = new FixType<>(); public static FixType ITEM_TYPE = new FixType<>(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java index 86ea9b454..198a78630 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NbtValued.java @@ -20,6 +20,10 @@ package com.sk89q.worldedit.world; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.internal.util.DeprecationUtil; +import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import javax.annotation.Nullable; @@ -35,8 +39,12 @@ public interface NbtValued { * must not return null if this method returns true. * * @return true if there is NBT data + * @deprecated See {@link #getNbt()} */ - boolean hasNbtData(); + @Deprecated + default boolean hasNbtData() { + return getNbt() != null; + } /** * Get the object's NBT data (tile entity data). The returned tag, if @@ -49,15 +57,87 @@ public interface NbtValued { * not return null.

* * @return compound tag, or null + * @deprecated See {@link #getNbt()} + */ + @Deprecated + @Nullable + default CompoundTag getNbtData() { + CompoundBinaryTag tag = getNbt(); + return tag == null ? null : new CompoundTag(tag); + } + + /** + * Set the object's NBT data (tile entity data). + * + * @param nbtData NBT data, or null if no data + * @deprecated See {@link #setNbtReference(LazyReference)} + */ + @Deprecated + default void setNbtData(@Nullable CompoundTag nbtData) { + setNbtReference(nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag)); + } + + /** + * Get the object's NBT data (tile entity data). + * + *

+ * This only needs to be used if you don't want to immediately resolve the data. + * Otherwise, you probably want {@link #getNbt()}. + *

+ * + * @return compound tag, or null + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details + */ + @NonAbstractForCompatibility( + delegateName = "getNbtData", + delegateParams = { } + ) + @Nullable + default LazyReference getNbtReference() { + DeprecationUtil.checkDelegatingOverride(getClass()); + + CompoundTag nbtData = getNbtData(); + return nbtData == null ? null : LazyReference.from(nbtData::asBinaryTag); + } + + /** + * Get the object's NBT data (tile entity data). + * + * @return compound tag, or null + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details */ @Nullable - CompoundTag getNbtData(); + default CompoundBinaryTag getNbt() { + LazyReference ref = getNbtReference(); + return ref == null ? null : ref.getValue(); + } + + /** + * Set the object's NBT data (tile entity data). + * + * @param nbtData NBT data, or null if no data + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details + */ + @NonAbstractForCompatibility( + delegateName = "setNbtData", + delegateParams = { CompoundTag.class } + ) + default void setNbtReference(@Nullable LazyReference nbtData) { + DeprecationUtil.checkDelegatingOverride(getClass()); + + setNbtData(nbtData == null ? null : new CompoundTag(nbtData.getValue())); + } /** * Set the object's NBT data (tile entity data). * * @param nbtData NBT data, or null if no data */ - void setNbtData(@Nullable CompoundTag nbtData); + default void setNbt(@Nullable CompoundBinaryTag nbtData) { + setNbtReference(nbtData == null ? null : LazyReference.computed(nbtData)); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java index 33cc027d1..dc6d4eaa4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/NullWorld.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.world; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.blocks.NullChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.blocks.NullChunkGet; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.google.common.collect.ImmutableSet; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.EditSession; @@ -48,7 +48,6 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.weather.WeatherType; import com.sk89q.worldedit.world.weather.WeatherTypes; -import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Set; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java index 42d05109d..d17d0a31a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/SimpleWorld.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world; -import com.boydti.fawe.Fawe; +import com.fastasyncworldedit.core.Fawe; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java index 003d0596c..ee210871a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.world; -import com.boydti.fawe.beta.IChunkCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; +import com.fastasyncworldedit.core.beta.IChunkCache; +import com.fastasyncworldedit.core.beta.IChunkGet; +import com.fastasyncworldedit.core.beta.implementation.packet.ChunkPacket; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.WorldEditException; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/WorldUnloadedException.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/WorldUnloadedException.java index 51cb6a5c8..30f191c7c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/WorldUnloadedException.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/WorldUnloadedException.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.WorldEditException; /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java index 669de99ed..addfbd0d7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/biome/BiomeTypes.java @@ -49,6 +49,7 @@ public final class BiomeTypes { @Nullable public static final BiomeType DESERT = get("minecraft:desert"); @Nullable public static final BiomeType DESERT_HILLS = get("minecraft:desert_hills"); @Nullable public static final BiomeType DESERT_LAKES = get("minecraft:desert_lakes"); + @Nullable public static final BiomeType DRIPSTONE_CAVES = get("minecraft:dripstone_caves"); @Nullable public static final BiomeType END_BARRENS = get("minecraft:end_barrens"); @Nullable public static final BiomeType END_HIGHLANDS = get("minecraft:end_highlands"); @Nullable public static final BiomeType END_MIDLANDS = get("minecraft:end_midlands"); @@ -67,6 +68,7 @@ public final class BiomeTypes { @Nullable public static final BiomeType JUNGLE_EDGE = get("minecraft:jungle_edge"); @Nullable public static final BiomeType JUNGLE_HILLS = get("minecraft:jungle_hills"); @Nullable public static final BiomeType LUKEWARM_OCEAN = get("minecraft:lukewarm_ocean"); + @Nullable public static final BiomeType LUSH_CAVES = get("minecraft:lush_caves"); @Nullable public static final BiomeType MODIFIED_BADLANDS_PLATEAU = get("minecraft:modified_badlands_plateau"); @Nullable public static final BiomeType MODIFIED_GRAVELLY_MOUNTAINS = get("minecraft:modified_gravelly_mountains"); @Nullable public static final BiomeType MODIFIED_JUNGLE = get("minecraft:modified_jungle"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index e16c803f2..bf1a0962f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -20,8 +20,7 @@ package com.sk89q.worldedit.world.block; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.extent.Extent; @@ -29,9 +28,13 @@ import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.TagStringIO; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.LegacyMapper; +import java.io.IOException; import java.util.Map; import java.util.Objects; import javax.annotation.Nullable; @@ -50,7 +53,8 @@ import static com.google.common.base.Preconditions.checkNotNull; public class BaseBlock implements BlockStateHolder, TileEntityBlock { private final BlockState blockState; - @Nullable private final CompoundTag nbtData; + @Nullable + private final LazyReference nbtData; /** * Construct a block with the given type and default data. @@ -78,7 +82,19 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { * @param state The block state * @param nbtData NBT data, which must be provided */ + @Deprecated public BaseBlock(BlockState state, CompoundTag nbtData) { + this(state, LazyReference.from(checkNotNull(nbtData)::asBinaryTag)); + } + + + /** + * Construct a block with the given ID, data value and NBT data structure. + * + * @param state The block state + * @param nbtData NBT data, which must be provided + */ + protected BaseBlock(BlockState state, LazyReference nbtData) { checkNotNull(nbtData); this.blockState = state; this.nbtData = nbtData; @@ -102,7 +118,6 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { } return blockState; } - /** * Gets a map of state to state values. * @@ -120,7 +135,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { @Override public BaseBlock with(Property property, V value) { - return toImmutableState().with(property, value).toBaseBlock(getNbtData()); + return toImmutableState().with(property, value).toBaseBlock(getNbtReference()); } /** @@ -134,36 +149,23 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return toImmutableState().getState(property); } - @Override - public boolean hasNbtData() { - return getNbtData() != null; - } - @Override public String getNbtId() { - CompoundTag nbtData = getNbtData(); + LazyReference nbtData = this.nbtData; if (nbtData == null) { return ""; } - Tag idTag = nbtData.getValue().get("id"); - if (idTag == null) { - idTag = nbtData.getValue().get("Id"); - } - if (idTag instanceof StringTag) { - return ((StringTag) idTag).getValue(); - } else { - return ""; - } + return nbtData.getValue().getString("id"); } @Nullable @Override - public CompoundTag getNbtData() { + public LazyReference getNbtReference() { return this.nbtData; } @Override - public void setNbtData(@Nullable CompoundTag nbtData) { + public void setNbtReference(@Nullable LazyReference nbtData) { throw new UnsupportedOperationException("This class is immutable."); } @@ -173,7 +175,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { @Override public boolean equals(Object o) { if (!(o instanceof BaseBlock)) { - if (!hasNbtData() && o instanceof BlockStateHolder) { + if (nbtData == null && o instanceof BlockStateHolder) { return Objects.equals(toImmutableState(), ((BlockStateHolder) o).toImmutableState()); } return false; @@ -181,7 +183,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { final BaseBlock otherBlock = (BaseBlock) o; - return this.blockState.equalsFuzzy(otherBlock.blockState) && Objects.equals(getNbtData(), otherBlock.getNbtData()); + return this.blockState.equalsFuzzy(otherBlock.blockState) && Objects.equals(getNbt(), otherBlock.getNbt()); } @Override @@ -260,7 +262,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { } @Override - public BaseBlock toBaseBlock(CompoundTag compoundTag) { + public BaseBlock toBaseBlock(LazyReference compoundTag) { if (compoundTag == null) { return this.blockState.toBaseBlock(); } else if (compoundTag == this.nbtData) { @@ -275,15 +277,26 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { return toImmutableState().getState(property); } + // Fawe start @Override public int hashCode() { return getOrdinal(); } + // Fawe end @Override public String toString() { - // TODO use a json serializer for the NBT data - return blockState.getAsString() + (hasNbtData() ? "{hasNbt}" : ""); + String nbtString = ""; + CompoundBinaryTag nbtData = getNbt(); + if (nbtData != null) { + try { + nbtString = TagStringIO.get().asString(nbtData); + } catch (IOException e) { + WorldEdit.logger.error("Failed to serialize NBT of Block", e); + } + } + + return blockState.getAsString() + nbtString; } public BlockState toBlockState() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java index 116c6adc5..5d1ee427c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlanketBaseBlock.java @@ -1,15 +1,8 @@ package com.sk89q.worldedit.world.block; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.extent.Extent; -import com.sk89q.worldedit.extent.OutputExtent; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.registry.state.Property; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; - /** * BaseBlock that when parsed to masks represents all BlockStates of a BlockType, whilst allowing for NBT storage */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java index 29980fd82..0c99fa704 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockCategories.java @@ -39,23 +39,37 @@ public final class BlockCategories { public static final BlockCategory BIRCH_LOGS = get("minecraft:birch_logs"); public static final BlockCategory BUTTONS = get("minecraft:buttons"); public static final BlockCategory CAMPFIRES = get("minecraft:campfires"); + public static final BlockCategory CANDLE_CAKES = get("minecraft:candle_cakes"); + public static final BlockCategory CANDLES = get("minecraft:candles"); public static final BlockCategory CARPETS = get("minecraft:carpets"); + public static final BlockCategory CAULDRONS = get("minecraft:cauldrons"); + public static final BlockCategory CAVE_VINES = get("minecraft:cave_vines"); public static final BlockCategory CLIMBABLE = get("minecraft:climbable"); + public static final BlockCategory COAL_ORES = get("minecraft:coal_ores"); + public static final BlockCategory COPPER_ORES = get("minecraft:copper_ores"); public static final BlockCategory CORAL_BLOCKS = get("minecraft:coral_blocks"); public static final BlockCategory CORAL_PLANTS = get("minecraft:coral_plants"); public static final BlockCategory CORALS = get("minecraft:corals"); public static final BlockCategory CRIMSON_STEMS = get("minecraft:crimson_stems"); public static final BlockCategory CROPS = get("minecraft:crops"); + public static final BlockCategory CRYSTAL_SOUND_BLOCKS = get("minecraft:crystal_sound_blocks"); public static final BlockCategory DARK_OAK_LOGS = get("minecraft:dark_oak_logs"); + public static final BlockCategory DEEPSLATE_ORE_REPLACEABLES = get("minecraft:deepslate_ore_replaceables"); + public static final BlockCategory DIAMOND_ORES = get("minecraft:diamond_ores"); + public static final BlockCategory DIRT = get("minecraft:dirt"); @Deprecated public static final BlockCategory DIRT_LIKE = get("minecraft:dirt_like"); public static final BlockCategory DOORS = get("minecraft:doors"); public static final BlockCategory DRAGON_IMMUNE = get("minecraft:dragon_immune"); + public static final BlockCategory DRIPSTONE_REPLACEABLE_BLOCKS = get("minecraft:dripstone_replaceable_blocks"); + public static final BlockCategory EMERALD_ORES = get("minecraft:emerald_ores"); public static final BlockCategory ENDERMAN_HOLDABLE = get("minecraft:enderman_holdable"); + public static final BlockCategory FEATURES_CANNOT_REPLACE = get("minecraft:features_cannot_replace"); public static final BlockCategory FENCE_GATES = get("minecraft:fence_gates"); public static final BlockCategory FENCES = get("minecraft:fences"); public static final BlockCategory FIRE = get("minecraft:fire"); public static final BlockCategory FLOWER_POTS = get("minecraft:flower_pots"); public static final BlockCategory FLOWERS = get("minecraft:flowers"); + public static final BlockCategory GEODE_INVALID_BLOCKS = get("minecraft:geode_invalid_blocks"); public static final BlockCategory GOLD_ORES = get("minecraft:gold_ores"); public static final BlockCategory GUARDED_BY_PIGLINS = get("minecraft:guarded_by_piglins"); public static final BlockCategory HOGLIN_REPELLENTS = get("minecraft:hoglin_repellents"); @@ -64,32 +78,50 @@ public final class BlockCategories { public static final BlockCategory INFINIBURN_END = get("minecraft:infiniburn_end"); public static final BlockCategory INFINIBURN_NETHER = get("minecraft:infiniburn_nether"); public static final BlockCategory INFINIBURN_OVERWORLD = get("minecraft:infiniburn_overworld"); + public static final BlockCategory INSIDE_STEP_SOUND_BLOCKS = get("minecraft:inside_step_sound_blocks"); + public static final BlockCategory IRON_ORES = get("minecraft:iron_ores"); public static final BlockCategory JUNGLE_LOGS = get("minecraft:jungle_logs"); + public static final BlockCategory LAPIS_ORES = get("minecraft:lapis_ores"); + public static final BlockCategory LAVA_POOL_STONE_REPLACEABLES = get("minecraft:lava_pool_stone_replaceables"); public static final BlockCategory LEAVES = get("minecraft:leaves"); public static final BlockCategory LOGS = get("minecraft:logs"); public static final BlockCategory LOGS_THAT_BURN = get("minecraft:logs_that_burn"); + public static final BlockCategory LUSH_GROUND_REPLACEABLE = get("minecraft:lush_ground_replaceable"); + public static final BlockCategory MINEABLE_AXE = get("minecraft:mineable/axe"); + public static final BlockCategory MINEABLE_HOE = get("minecraft:mineable/hoe"); + public static final BlockCategory MINEABLE_PICKAXE = get("minecraft:mineable/pickaxe"); + public static final BlockCategory MINEABLE_SHOVEL = get("minecraft:mineable/shovel"); + public static final BlockCategory MOSS_REPLACEABLE = get("minecraft:moss_replaceable"); public static final BlockCategory MUSHROOM_GROW_BLOCK = get("minecraft:mushroom_grow_block"); + public static final BlockCategory NEEDS_DIAMOND_TOOL = get("minecraft:needs_diamond_tool"); + public static final BlockCategory NEEDS_IRON_TOOL = get("minecraft:needs_iron_tool"); + public static final BlockCategory NEEDS_STONE_TOOL = get("minecraft:needs_stone_tool"); public static final BlockCategory NON_FLAMMABLE_WOOD = get("minecraft:non_flammable_wood"); public static final BlockCategory NYLIUM = get("minecraft:nylium"); public static final BlockCategory OAK_LOGS = get("minecraft:oak_logs"); + public static final BlockCategory OCCLUDES_VIBRATION_SIGNALS = get("minecraft:occludes_vibration_signals"); public static final BlockCategory PIGLIN_REPELLENTS = get("minecraft:piglin_repellents"); public static final BlockCategory PLANKS = get("minecraft:planks"); public static final BlockCategory PORTALS = get("minecraft:portals"); public static final BlockCategory PRESSURE_PLATES = get("minecraft:pressure_plates"); public static final BlockCategory PREVENT_MOB_SPAWNING_INSIDE = get("minecraft:prevent_mob_spawning_inside"); public static final BlockCategory RAILS = get("minecraft:rails"); + public static final BlockCategory REDSTONE_ORES = get("minecraft:redstone_ores"); public static final BlockCategory SAND = get("minecraft:sand"); public static final BlockCategory SAPLINGS = get("minecraft:saplings"); public static final BlockCategory SHULKER_BOXES = get("minecraft:shulker_boxes"); public static final BlockCategory SIGNS = get("minecraft:signs"); public static final BlockCategory SLABS = get("minecraft:slabs"); + public static final BlockCategory SMALL_DRIPLEAF_PLACEABLE = get("minecraft:small_dripleaf_placeable"); public static final BlockCategory SMALL_FLOWERS = get("minecraft:small_flowers"); + public static final BlockCategory SNOW = get("minecraft:snow"); public static final BlockCategory SOUL_FIRE_BASE_BLOCKS = get("minecraft:soul_fire_base_blocks"); public static final BlockCategory SOUL_SPEED_BLOCKS = get("minecraft:soul_speed_blocks"); public static final BlockCategory SPRUCE_LOGS = get("minecraft:spruce_logs"); public static final BlockCategory STAIRS = get("minecraft:stairs"); public static final BlockCategory STANDING_SIGNS = get("minecraft:standing_signs"); public static final BlockCategory STONE_BRICKS = get("minecraft:stone_bricks"); + public static final BlockCategory STONE_ORE_REPLACEABLES = get("minecraft:stone_ore_replaceables"); public static final BlockCategory STONE_PRESSURE_PLATES = get("minecraft:stone_pressure_plates"); public static final BlockCategory STRIDER_WARM_BLOCKS = get("minecraft:strider_warm_blocks"); public static final BlockCategory TALL_FLOWERS = get("minecraft:tall_flowers"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index 18a709988..c60fa3a6f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -19,10 +19,10 @@ package com.sk89q.worldedit.world.block; -import com.boydti.fawe.beta.ITileInput; -import com.boydti.fawe.command.SuggestInputParseException; -import com.boydti.fawe.object.string.MutableCharSequence; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.beta.ITileInput; +import com.fastasyncworldedit.core.command.SuggestInputParseException; +import com.fastasyncworldedit.core.object.string.MutableCharSequence; +import com.fastasyncworldedit.core.util.StringMan; import com.google.common.base.Function; import com.google.common.collect.Maps; import com.sk89q.jnbt.CompoundTag; @@ -40,6 +40,8 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.AbstractProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; +import com.sk89q.worldedit.util.concurrency.LazyReference; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.registry.BlockMaterial; import org.jetbrains.annotations.NotNull; @@ -242,7 +244,7 @@ public class BlockState implements BlockStateHolder, Pattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { return this.toBaseBlock(); } @@ -359,8 +361,14 @@ public class BlockState implements BlockStateHolder, Pattern { return getState(getBlockType().getProperty(key)); } + @Deprecated @Override - public BaseBlock toBaseBlock(CompoundTag compoundTag) { + public CompoundTag getNbtData() { + return getBlockType().getMaterial().isTile() ? getBlockType().getMaterial().getDefaultTile() : null; + } + + @Override + public BaseBlock toBaseBlock(LazyReference compoundTag) { if (compoundTag == null) { return toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java index 9457dbb98..a51f69c1e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockStateHolder.java @@ -19,20 +19,23 @@ package com.sk89q.worldedit.world.block; -import com.boydti.fawe.beta.ITileInput; +import com.fastasyncworldedit.core.beta.ITileInput; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.blocks.TileEntityBlock; import com.sk89q.worldedit.extent.OutputExtent; import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.internal.util.DeprecationUtil; +import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; +import com.sk89q.worldedit.util.concurrency.LazyReference; import com.sk89q.worldedit.world.registry.BlockMaterial; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; -import javax.annotation.Nullable; public interface BlockStateHolder> extends TileEntityBlock, Pattern { @@ -143,61 +146,48 @@ public interface BlockStateHolder> extends TileEnt * * @param compoundTag The NBT Data to apply * @return The BaseBlock + * @deprecated Use {@link BlockStateHolder#toBaseBlock(LazyReference)}. */ - BaseBlock toBaseBlock(CompoundTag compoundTag); + @Deprecated + default BaseBlock toBaseBlock(CompoundTag compoundTag) { + return toBaseBlock(compoundTag == null ? null : LazyReference.from(compoundTag::asBinaryTag)); + } + + /** + * Gets a {@link BaseBlock} from this BlockStateHolder. + * + * @param compoundTag The NBT Data to apply + * @return The BaseBlock + * @apiNote This must be overridden by new subclasses. See {@link NonAbstractForCompatibility} + * for details + */ + @NonAbstractForCompatibility( + delegateName = "toBaseBlock", + delegateParams = { CompoundTag.class } + ) + default BaseBlock toBaseBlock(LazyReference compoundTag) { + DeprecationUtil.checkDelegatingOverride(getClass()); + + return toBaseBlock(compoundTag == null ? null : new CompoundTag(compoundTag.getValue())); + } + + /** + * Gets a {@link BaseBlock} from this BlockStateHolder. + * + * @param compoundTag The NBT Data to apply + * @return The BaseBlock + */ + default BaseBlock toBaseBlock(CompoundBinaryTag compoundTag) { + return toBaseBlock(compoundTag == null ? null : LazyReference.computed(compoundTag)); + } @Override - default BaseBlock apply(BlockVector3 position) { + default BaseBlock applyBlock(BlockVector3 position) { return toBaseBlock(); } void applyTileEntity(OutputExtent output, int x, int y, int z); - /** - * Return the name of the title entity ID. - * - * @return tile entity ID, non-null string - */ - default String getNbtId() { - return ""; - } - - /** - * Returns whether the block contains NBT data. {@link #getNbtData()} - * must not return null if this method returns true. - * - * @return true if there is NBT data - */ - default boolean hasNbtData() { - return false; - } - - /** - * Get the object's NBT data (tile entity data). The returned tag, if - * modified in any way, should be sent to {@link #setNbtData(CompoundTag)} - * so that the instance knows of the changes. Making changes without - * calling {@link #setNbtData(CompoundTag)} could have unintended - * consequences. - * - *

{@link #hasNbtData()} must return true if and only if method does - * not return null.

- * - * @return compound tag, or null - */ - @Nullable - default CompoundTag getNbtData() { - return getBlockType().getMaterial().isTile() ? getBlockType().getMaterial().getDefaultTile() : null; - } - - /** - * Set the object's NBT data (tile entity data). - * - * @param nbtData NBT data, or null if no data - */ - default void setNbtData(@Nullable CompoundTag nbtData) { - throw new UnsupportedOperationException("State is immutable"); - } - default BaseBlock toBaseBlock(ITileInput input, int x, int y, int z) { throw new UnsupportedOperationException("State is immutable"); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index 17ed3db47..b5d03e3c3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -353,7 +353,7 @@ public class BlockType implements Keyed, Pattern { } @Override - public BaseBlock apply(BlockVector3 position) { + public BaseBlock applyBlock(BlockVector3 position) { return this.getDefaultState().toBaseBlock(); } 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 458144793..57f9d6aee 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 @@ -19,9 +19,9 @@ package com.sk89q.worldedit.world.block; -import com.boydti.fawe.command.SuggestInputParseException; -import com.boydti.fawe.object.string.JoinedCharSequence; -import com.boydti.fawe.util.StringMan; +import com.fastasyncworldedit.core.command.SuggestInputParseException; +import com.fastasyncworldedit.core.object.string.JoinedCharSequence; +import com.fastasyncworldedit.core.util.StringMan; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.world.registry.LegacyMapper; @@ -59,6 +59,8 @@ public final class BlockTypes { @Nullable public static final BlockType ACTIVATOR_RAIL = init(); @Nullable public static final BlockType AIR = init(); @Nullable public static final BlockType ALLIUM = init(); + @Nullable public static final BlockType AMETHYST_BLOCK = init(); + @Nullable public static final BlockType AMETHYST_CLUSTER = init(); @Nullable public static final BlockType ANCIENT_DEBRIS = init(); @Nullable public static final BlockType ANDESITE = init(); @Nullable public static final BlockType ANDESITE_SLAB = init(); @@ -67,6 +69,8 @@ public final class BlockTypes { @Nullable public static final BlockType ANVIL = init(); @Nullable public static final BlockType ATTACHED_MELON_STEM = init(); @Nullable public static final BlockType ATTACHED_PUMPKIN_STEM = init(); + @Nullable public static final BlockType AZALEA = init(); + @Nullable public static final BlockType AZALEA_LEAVES = init(); @Nullable public static final BlockType AZURE_BLUET = init(); @Nullable public static final BlockType BAMBOO = init(); @Nullable public static final BlockType BAMBOO_SAPLING = init(); @@ -79,6 +83,8 @@ public final class BlockTypes { @Nullable public static final BlockType BEEHIVE = init(); @Nullable public static final BlockType BEETROOTS = init(); @Nullable public static final BlockType BELL = init(); + @Nullable public static final BlockType BIG_DRIPLEAF = init(); + @Nullable public static final BlockType BIG_DRIPLEAF_STEM = init(); @Nullable public static final BlockType BIRCH_BUTTON = init(); @Nullable public static final BlockType BIRCH_DOOR = init(); @Nullable public static final BlockType BIRCH_FENCE = init(); @@ -96,6 +102,8 @@ public final class BlockTypes { @Nullable public static final BlockType BIRCH_WOOD = init(); @Nullable public static final BlockType BLACK_BANNER = init(); @Nullable public static final BlockType BLACK_BED = init(); + @Nullable public static final BlockType BLACK_CANDLE = init(); + @Nullable public static final BlockType BLACK_CANDLE_CAKE = init(); @Nullable public static final BlockType BLACK_CARPET = init(); @Nullable public static final BlockType BLACK_CONCRETE = init(); @Nullable public static final BlockType BLACK_CONCRETE_POWDER = init(); @@ -113,6 +121,8 @@ public final class BlockTypes { @Nullable public static final BlockType BLAST_FURNACE = init(); @Nullable public static final BlockType BLUE_BANNER = init(); @Nullable public static final BlockType BLUE_BED = init(); + @Nullable public static final BlockType BLUE_CANDLE = init(); + @Nullable public static final BlockType BLUE_CANDLE_CAKE = init(); @Nullable public static final BlockType BLUE_CARPET = init(); @Nullable public static final BlockType BLUE_CONCRETE = init(); @Nullable public static final BlockType BLUE_CONCRETE_POWDER = init(); @@ -138,6 +148,8 @@ public final class BlockTypes { @Nullable public static final BlockType BRICKS = init(); @Nullable public static final BlockType BROWN_BANNER = init(); @Nullable public static final BlockType BROWN_BED = init(); + @Nullable public static final BlockType BROWN_CANDLE = init(); + @Nullable public static final BlockType BROWN_CANDLE_CAKE = init(); @Nullable public static final BlockType BROWN_CARPET = init(); @Nullable public static final BlockType BROWN_CONCRETE = init(); @Nullable public static final BlockType BROWN_CONCRETE_POWDER = init(); @@ -155,18 +167,25 @@ public final class BlockTypes { @Nullable public static final BlockType BUBBLE_CORAL_BLOCK = init(); @Nullable public static final BlockType BUBBLE_CORAL_FAN = init(); @Nullable public static final BlockType BUBBLE_CORAL_WALL_FAN = init(); + @Nullable public static final BlockType BUDDING_AMETHYST = init(); @Nullable public static final BlockType CACTUS = init(); @Nullable public static final BlockType CAKE = init(); + @Nullable public static final BlockType CALCITE = init(); @Nullable public static final BlockType CAMPFIRE = init(); + @Nullable public static final BlockType CANDLE = init(); + @Nullable public static final BlockType CANDLE_CAKE = init(); @Nullable public static final BlockType CARROTS = init(); @Nullable public static final BlockType CARTOGRAPHY_TABLE = init(); @Nullable public static final BlockType CARVED_PUMPKIN = init(); @Nullable public static final BlockType CAULDRON = init(); @Nullable public static final BlockType CAVE_AIR = init(); + @Nullable public static final BlockType CAVE_VINES = init(); + @Nullable public static final BlockType CAVE_VINES_PLANT = init(); @Nullable public static final BlockType CHAIN = init(); @Nullable public static final BlockType CHAIN_COMMAND_BLOCK = init(); @Nullable public static final BlockType CHEST = init(); @Nullable public static final BlockType CHIPPED_ANVIL = init(); + @Nullable public static final BlockType CHISELED_DEEPSLATE = init(); @Nullable public static final BlockType CHISELED_NETHER_BRICKS = init(); @Nullable public static final BlockType CHISELED_POLISHED_BLACKSTONE = init(); @Nullable public static final BlockType CHISELED_QUARTZ_BLOCK = init(); @@ -179,6 +198,10 @@ public final class BlockTypes { @Nullable public static final BlockType COAL_BLOCK = init(); @Nullable public static final BlockType COAL_ORE = init(); @Nullable public static final BlockType COARSE_DIRT = init(); + @Nullable public static final BlockType COBBLED_DEEPSLATE = init(); + @Nullable public static final BlockType COBBLED_DEEPSLATE_SLAB = init(); + @Nullable public static final BlockType COBBLED_DEEPSLATE_STAIRS = init(); + @Nullable public static final BlockType COBBLED_DEEPSLATE_WALL = init(); @Nullable public static final BlockType COBBLESTONE = init(); @Nullable public static final BlockType COBBLESTONE_SLAB = init(); @Nullable public static final BlockType COBBLESTONE_STAIRS = init(); @@ -189,7 +212,11 @@ public final class BlockTypes { @Nullable public static final BlockType COMPARATOR = init(); @Nullable public static final BlockType COMPOSTER = init(); @Nullable public static final BlockType CONDUIT = init(); + @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(); + @Nullable public static final BlockType CRACKED_DEEPSLATE_TILES = init(); @Nullable public static final BlockType CRACKED_NETHER_BRICKS = init(); @Nullable public static final BlockType CRACKED_POLISHED_BLACKSTONE_BRICKS = init(); @Nullable public static final BlockType CRACKED_STONE_BRICKS = init(); @@ -213,12 +240,17 @@ public final class BlockTypes { @Nullable public static final BlockType CRIMSON_TRAPDOOR = init(); @Nullable public static final BlockType CRIMSON_WALL_SIGN = init(); @Nullable public static final BlockType CRYING_OBSIDIAN = init(); + @Nullable public static final BlockType CUT_COPPER = init(); + @Nullable public static final BlockType CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType CUT_COPPER_STAIRS = init(); @Nullable public static final BlockType CUT_RED_SANDSTONE = init(); @Nullable public static final BlockType CUT_RED_SANDSTONE_SLAB = init(); @Nullable public static final BlockType CUT_SANDSTONE = init(); @Nullable public static final BlockType CUT_SANDSTONE_SLAB = init(); @Nullable public static final BlockType CYAN_BANNER = init(); @Nullable public static final BlockType CYAN_BED = init(); + @Nullable public static final BlockType CYAN_CANDLE = init(); + @Nullable public static final BlockType CYAN_CANDLE_CAKE = init(); @Nullable public static final BlockType CYAN_CARPET = init(); @Nullable public static final BlockType CYAN_CONCRETE = init(); @Nullable public static final BlockType CYAN_CONCRETE_POWDER = init(); @@ -271,6 +303,23 @@ public final class BlockTypes { @Nullable public static final BlockType DEAD_TUBE_CORAL_BLOCK = init(); @Nullable public static final BlockType DEAD_TUBE_CORAL_FAN = init(); @Nullable public static final BlockType DEAD_TUBE_CORAL_WALL_FAN = init(); + @Nullable public static final BlockType DEEPSLATE = 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(); + @Nullable public static final BlockType DEEPSLATE_DIAMOND_ORE = init(); + @Nullable public static final BlockType DEEPSLATE_EMERALD_ORE = init(); + @Nullable public static final BlockType DEEPSLATE_GOLD_ORE = init(); + @Nullable public static final BlockType DEEPSLATE_IRON_ORE = init(); + @Nullable public static final BlockType DEEPSLATE_LAPIS_ORE = init(); + @Nullable public static final BlockType DEEPSLATE_REDSTONE_ORE = 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(); @Nullable public static final BlockType DIAMOND_ORE = init(); @@ -279,11 +328,13 @@ public final class BlockTypes { @Nullable public static final BlockType DIORITE_STAIRS = init(); @Nullable public static final BlockType DIORITE_WALL = init(); @Nullable public static final BlockType DIRT = init(); + @Nullable public static final BlockType DIRT_PATH = init(); @Nullable public static final BlockType DISPENSER = init(); @Nullable public static final BlockType DRAGON_EGG = init(); @Nullable public static final BlockType DRAGON_HEAD = init(); @Nullable public static final BlockType DRAGON_WALL_HEAD = init(); @Nullable public static final BlockType DRIED_KELP_BLOCK = init(); + @Nullable public static final BlockType DRIPSTONE_BLOCK = init(); @Nullable public static final BlockType DROPPER = init(); @Nullable public static final BlockType EMERALD_BLOCK = init(); @Nullable public static final BlockType EMERALD_ORE = init(); @@ -297,7 +348,11 @@ public final class BlockTypes { @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(); + @Nullable public static final BlockType EXPOSED_CUT_COPPER_STAIRS = init(); @Nullable public static final BlockType FARMLAND = init(); @Nullable public static final BlockType FERN = init(); @Nullable public static final BlockType FIRE = init(); @@ -307,11 +362,14 @@ public final class BlockTypes { @Nullable public static final BlockType FIRE_CORAL_WALL_FAN = init(); @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 FROSTED_ICE = init(); @Nullable public static final BlockType FURNACE = init(); @Nullable public static final BlockType GILDED_BLACKSTONE = init(); @Nullable public static final BlockType GLASS = init(); @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 GOLD_BLOCK = init(); @Nullable public static final BlockType GOLD_ORE = init(); @@ -321,10 +379,12 @@ public final class BlockTypes { @Nullable public static final BlockType GRANITE_WALL = init(); @Nullable public static final BlockType GRASS = init(); @Nullable public static final BlockType GRASS_BLOCK = init(); - @Nullable public static final BlockType GRASS_PATH = init(); + @Deprecated @Nullable public static final BlockType GRASS_PATH = init(); @Nullable public static final BlockType GRAVEL = init(); @Nullable public static final BlockType GRAY_BANNER = init(); @Nullable public static final BlockType GRAY_BED = init(); + @Nullable public static final BlockType GREEN_CANDLE = init(); + @Nullable public static final BlockType GREEN_CANDLE_CAKE = init(); @Nullable public static final BlockType GRAY_CARPET = init(); @Nullable public static final BlockType GRAY_CONCRETE = init(); @Nullable public static final BlockType GRAY_CONCRETE_POWDER = init(); @@ -348,6 +408,7 @@ public final class BlockTypes { @Nullable public static final BlockType GREEN_WALL_BANNER = init(); @Nullable public static final BlockType GREEN_WOOL = init(); @Nullable public static final BlockType GRINDSTONE = init(); + @Nullable public static final BlockType HANGING_ROOTS = init(); @Nullable public static final BlockType HAY_BLOCK = init(); @Nullable public static final BlockType HEAVY_WEIGHTED_PRESSURE_PLATE = init(); @Nullable public static final BlockType HONEY_BLOCK = init(); @@ -361,6 +422,7 @@ public final class BlockTypes { @Nullable public static final BlockType INFESTED_CHISELED_STONE_BRICKS = init(); @Nullable public static final BlockType INFESTED_COBBLESTONE = init(); @Nullable public static final BlockType INFESTED_CRACKED_STONE_BRICKS = init(); + @Nullable public static final BlockType INFESTED_DEEPSLATE = init(); @Nullable public static final BlockType INFESTED_MOSSY_STONE_BRICKS = init(); @Nullable public static final BlockType INFESTED_STONE = init(); @Nullable public static final BlockType INFESTED_STONE_BRICKS = init(); @@ -393,12 +455,17 @@ public final class BlockTypes { @Nullable public static final BlockType LANTERN = init(); @Nullable public static final BlockType LAPIS_BLOCK = init(); @Nullable public static final BlockType LAPIS_ORE = init(); + @Nullable public static final BlockType LARGE_AMETHYST_BUD = init(); @Nullable public static final BlockType LARGE_FERN = init(); @Nullable public static final BlockType LAVA = init(); + @Nullable public static final BlockType LAVA_CAULDRON = init(); @Nullable public static final BlockType LECTERN = init(); @Nullable public static final BlockType LEVER = init(); + @Nullable public static final BlockType LIGHT = init(); @Nullable public static final BlockType LIGHT_BLUE_BANNER = init(); @Nullable public static final BlockType LIGHT_BLUE_BED = init(); + @Nullable public static final BlockType LIGHT_BLUE_CANDLE = init(); + @Nullable public static final BlockType LIGHT_BLUE_CANDLE_CAKE = init(); @Nullable public static final BlockType LIGHT_BLUE_CARPET = init(); @Nullable public static final BlockType LIGHT_BLUE_CONCRETE = init(); @Nullable public static final BlockType LIGHT_BLUE_CONCRETE_POWDER = init(); @@ -411,6 +478,8 @@ public final class BlockTypes { @Nullable public static final BlockType LIGHT_BLUE_WOOL = init(); @Nullable public static final BlockType LIGHT_GRAY_BANNER = init(); @Nullable public static final BlockType LIGHT_GRAY_BED = init(); + @Nullable public static final BlockType LIGHT_GRAY_CANDLE = init(); + @Nullable public static final BlockType LIGHT_GRAY_CANDLE_CAKE = init(); @Nullable public static final BlockType LIGHT_GRAY_CARPET = init(); @Nullable public static final BlockType LIGHT_GRAY_CONCRETE = init(); @Nullable public static final BlockType LIGHT_GRAY_CONCRETE_POWDER = init(); @@ -422,11 +491,14 @@ public final class BlockTypes { @Nullable public static final BlockType LIGHT_GRAY_WALL_BANNER = init(); @Nullable public static final BlockType LIGHT_GRAY_WOOL = init(); @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(); @Nullable public static final BlockType LILY_PAD = init(); @Nullable public static final BlockType LIME_BANNER = init(); @Nullable public static final BlockType LIME_BED = init(); + @Nullable public static final BlockType LIME_CANDLE = init(); + @Nullable public static final BlockType LIME_CANDLE_CAKE = init(); @Nullable public static final BlockType LIME_CARPET = init(); @Nullable public static final BlockType LIME_CONCRETE = init(); @Nullable public static final BlockType LIME_CONCRETE_POWDER = init(); @@ -441,6 +513,8 @@ public final class BlockTypes { @Nullable public static final BlockType LOOM = init(); @Nullable public static final BlockType MAGENTA_BANNER = init(); @Nullable public static final BlockType MAGENTA_BED = init(); + @Nullable public static final BlockType MAGENTA_CANDLE = init(); + @Nullable public static final BlockType MAGENTA_CANDLE_CAKE = init(); @Nullable public static final BlockType MAGENTA_CARPET = init(); @Nullable public static final BlockType MAGENTA_CONCRETE = init(); @Nullable public static final BlockType MAGENTA_CONCRETE_POWDER = init(); @@ -452,8 +526,11 @@ public final class BlockTypes { @Nullable public static final BlockType MAGENTA_WALL_BANNER = init(); @Nullable public static final BlockType MAGENTA_WOOL = init(); @Nullable public static final BlockType MAGMA_BLOCK = init(); + @Nullable public static final BlockType MEDIUM_AMETHYST_BUD = init(); @Nullable public static final BlockType MELON = init(); @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(); @Nullable public static final BlockType MOSSY_COBBLESTONE_STAIRS = init(); @@ -498,6 +575,8 @@ public final class BlockTypes { @Nullable public static final BlockType OBSIDIAN = init(); @Nullable public static final BlockType ORANGE_BANNER = init(); @Nullable public static final BlockType ORANGE_BED = init(); + @Nullable public static final BlockType ORANGE_CANDLE = init(); + @Nullable public static final BlockType ORANGE_CANDLE_CAKE = init(); @Nullable public static final BlockType ORANGE_CARPET = init(); @Nullable public static final BlockType ORANGE_CONCRETE = init(); @Nullable public static final BlockType ORANGE_CONCRETE_POWDER = init(); @@ -510,11 +589,17 @@ public final class BlockTypes { @Nullable public static final BlockType ORANGE_WALL_BANNER = init(); @Nullable public static final BlockType ORANGE_WOOL = init(); @Nullable public static final BlockType OXEYE_DAISY = init(); + @Nullable public static final BlockType OXIDIZED_COPPER = init(); + @Nullable public static final BlockType OXIDIZED_CUT_COPPER = init(); + @Nullable public static final BlockType OXIDIZED_CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType OXIDIZED_CUT_COPPER_STAIRS = init(); @Nullable public static final BlockType PACKED_ICE = init(); @Nullable public static final BlockType PEONY = init(); @Nullable public static final BlockType PETRIFIED_OAK_SLAB = init(); @Nullable public static final BlockType PINK_BANNER = init(); @Nullable public static final BlockType PINK_BED = init(); + @Nullable public static final BlockType PINK_CANDLE = init(); + @Nullable public static final BlockType PINK_CANDLE_CAKE = init(); @Nullable public static final BlockType PINK_CARPET = init(); @Nullable public static final BlockType PINK_CONCRETE = init(); @Nullable public static final BlockType PINK_CONCRETE_POWDER = init(); @@ -531,6 +616,7 @@ public final class BlockTypes { @Nullable public static final BlockType PLAYER_HEAD = init(); @Nullable public static final BlockType PLAYER_WALL_HEAD = init(); @Nullable public static final BlockType PODZOL = init(); + @Nullable public static final BlockType POINTED_DRIPSTONE = init(); @Nullable public static final BlockType POLISHED_ANDESITE = init(); @Nullable public static final BlockType POLISHED_ANDESITE_SLAB = init(); @Nullable public static final BlockType POLISHED_ANDESITE_STAIRS = init(); @@ -545,6 +631,10 @@ public final class BlockTypes { @Nullable public static final BlockType POLISHED_BLACKSTONE_SLAB = init(); @Nullable public static final BlockType POLISHED_BLACKSTONE_STAIRS = init(); @Nullable public static final BlockType POLISHED_BLACKSTONE_WALL = init(); + @Nullable public static final BlockType POLISHED_DEEPSLATE = init(); + @Nullable public static final BlockType POLISHED_DEEPSLATE_SLAB = init(); + @Nullable public static final BlockType POLISHED_DEEPSLATE_STAIRS = init(); + @Nullable public static final BlockType POLISHED_DEEPSLATE_WALL = init(); @Nullable public static final BlockType POLISHED_DIORITE = init(); @Nullable public static final BlockType POLISHED_DIORITE_SLAB = init(); @Nullable public static final BlockType POLISHED_DIORITE_STAIRS = init(); @@ -555,6 +645,7 @@ public final class BlockTypes { @Nullable public static final BlockType POTATOES = init(); @Nullable public static final BlockType POTTED_ACACIA_SAPLING = init(); @Nullable public static final BlockType POTTED_ALLIUM = init(); + @Nullable public static final BlockType POTTED_AZALEA_BUSH = init(); @Nullable public static final BlockType POTTED_AZURE_BLUET = init(); @Nullable public static final BlockType POTTED_BAMBOO = init(); @Nullable public static final BlockType POTTED_BIRCH_SAPLING = init(); @@ -568,6 +659,7 @@ public final class BlockTypes { @Nullable public static final BlockType POTTED_DARK_OAK_SAPLING = init(); @Nullable public static final BlockType POTTED_DEAD_BUSH = init(); @Nullable public static final BlockType POTTED_FERN = init(); + @Nullable public static final BlockType POTTED_FLOWERING_AZALEA_BUSH = init(); @Nullable public static final BlockType POTTED_JUNGLE_SAPLING = init(); @Nullable public static final BlockType POTTED_LILY_OF_THE_VALLEY = init(); @Nullable public static final BlockType POTTED_OAK_SAPLING = init(); @@ -582,6 +674,8 @@ public final class BlockTypes { @Nullable public static final BlockType POTTED_WARPED_ROOTS = init(); @Nullable public static final BlockType POTTED_WHITE_TULIP = init(); @Nullable public static final BlockType POTTED_WITHER_ROSE = init(); + @Nullable public static final BlockType POWDER_SNOW = init(); + @Nullable public static final BlockType POWDER_SNOW_CAULDRON = init(); @Nullable public static final BlockType POWERED_RAIL = init(); @Nullable public static final BlockType PRISMARINE = init(); @Nullable public static final BlockType PRISMARINE_BRICK_SLAB = init(); @@ -594,6 +688,8 @@ public final class BlockTypes { @Nullable public static final BlockType PUMPKIN_STEM = init(); @Nullable public static final BlockType PURPLE_BANNER = init(); @Nullable public static final BlockType PURPLE_BED = init(); + @Nullable public static final BlockType PURPLE_CANDLE = init(); + @Nullable public static final BlockType PURPLE_CANDLE_CAKE = init(); @Nullable public static final BlockType PURPLE_CARPET = init(); @Nullable public static final BlockType PURPLE_CONCRETE = init(); @Nullable public static final BlockType PURPLE_CONCRETE_POWDER = init(); @@ -614,8 +710,13 @@ public final class BlockTypes { @Nullable public static final BlockType QUARTZ_SLAB = init(); @Nullable public static final BlockType QUARTZ_STAIRS = init(); @Nullable public static final BlockType RAIL = init(); + @Nullable public static final BlockType RAW_COPPER_BLOCK = init(); + @Nullable public static final BlockType RAW_GOLD_BLOCK = init(); + @Nullable public static final BlockType RAW_IRON_BLOCK = init(); @Nullable public static final BlockType RED_BANNER = init(); @Nullable public static final BlockType RED_BED = init(); + @Nullable public static final BlockType RED_CANDLE = init(); + @Nullable public static final BlockType RED_CANDLE_CAKE = init(); @Nullable public static final BlockType RED_CARPET = init(); @Nullable public static final BlockType RED_CONCRETE = init(); @Nullable public static final BlockType RED_CONCRETE_POWDER = init(); @@ -647,6 +748,7 @@ public final class BlockTypes { @Nullable public static final BlockType REPEATER = init(); @Nullable public static final BlockType REPEATING_COMMAND_BLOCK = init(); @Nullable public static final BlockType RESPAWN_ANCHOR = init(); + @Nullable public static final BlockType ROOTED_DIRT = init(); @Nullable public static final BlockType ROSE_BUSH = init(); @Nullable public static final BlockType SAND = init(); @Nullable public static final BlockType SANDSTONE = init(); @@ -654,6 +756,7 @@ public final class BlockTypes { @Nullable public static final BlockType SANDSTONE_STAIRS = init(); @Nullable public static final BlockType SANDSTONE_WALL = init(); @Nullable public static final BlockType SCAFFOLDING = init(); + @Nullable public static final BlockType SCULK_SENSOR = init(); @Nullable public static final BlockType SEA_LANTERN = init(); @Nullable public static final BlockType SEA_PICKLE = init(); @Nullable public static final BlockType SEAGRASS = init(); @@ -663,8 +766,11 @@ public final class BlockTypes { @Nullable public static final BlockType SKELETON_SKULL = init(); @Nullable public static final BlockType SKELETON_WALL_SKULL = init(); @Nullable public static final BlockType SLIME_BLOCK = init(); + @Nullable public static final BlockType SMALL_AMETHYST_BUD = init(); + @Nullable public static final BlockType SMALL_DRIPLEAF = init(); @Nullable public static final BlockType SMITHING_TABLE = init(); @Nullable public static final BlockType SMOKER = init(); + @Nullable public static final BlockType SMOOTH_BASALT = init(); @Nullable public static final BlockType SMOOTH_QUARTZ = init(); @Nullable public static final BlockType SMOOTH_QUARTZ_SLAB = init(); @Nullable public static final BlockType SMOOTH_QUARTZ_STAIRS = init(); @@ -687,6 +793,7 @@ public final class BlockTypes { @Nullable public static final BlockType SOUL_WALL_TORCH = init(); @Nullable public static final BlockType SPAWNER = init(); @Nullable public static final BlockType SPONGE = init(); + @Nullable public static final BlockType SPORE_BLOSSOM = init(); @Nullable public static final BlockType SPRUCE_BUTTON = init(); @Nullable public static final BlockType SPRUCE_DOOR = init(); @Nullable public static final BlockType SPRUCE_FENCE = init(); @@ -738,6 +845,7 @@ public final class BlockTypes { @Nullable public static final BlockType TALL_SEAGRASS = init(); @Nullable public static final BlockType TARGET = init(); @Nullable public static final BlockType TERRACOTTA = init(); + @Nullable public static final BlockType TINTED_GLASS = init(); @Nullable public static final BlockType TNT = init(); @Nullable public static final BlockType TORCH = init(); @Nullable public static final BlockType TRAPPED_CHEST = init(); @@ -747,6 +855,7 @@ public final class BlockTypes { @Nullable public static final BlockType TUBE_CORAL_BLOCK = init(); @Nullable public static final BlockType TUBE_CORAL_FAN = init(); @Nullable public static final BlockType TUBE_CORAL_WALL_FAN = init(); + @Nullable public static final BlockType TUFF = init(); @Nullable public static final BlockType TURTLE_EGG = init(); @Nullable public static final BlockType TWISTING_VINES = init(); @Nullable public static final BlockType TWISTING_VINES_PLANT = init(); @@ -772,12 +881,35 @@ public final class BlockTypes { @Nullable public static final BlockType WARPED_WALL_SIGN = init(); @Nullable public static final BlockType WARPED_WART_BLOCK = init(); @Nullable public static final BlockType WATER = init(); + @Nullable public static final BlockType WATER_CAULDRON = init(); + @Nullable public static final BlockType WAXED_COPPER_BLOCK = init(); + @Nullable public static final BlockType WAXED_CUT_COPPER = init(); + @Nullable public static final BlockType WAXED_CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType WAXED_CUT_COPPER_STAIRS = init(); + @Nullable public static final BlockType WAXED_EXPOSED_COPPER = init(); + @Nullable public static final BlockType WAXED_EXPOSED_CUT_COPPER = init(); + @Nullable public static final BlockType WAXED_EXPOSED_CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType WAXED_EXPOSED_CUT_COPPER_STAIRS = init(); + @Nullable public static final BlockType WAXED_OXIDIZED_COPPER = init(); + @Nullable public static final BlockType WAXED_OXIDIZED_CUT_COPPER = init(); + @Nullable public static final BlockType WAXED_OXIDIZED_CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType WAXED_OXIDIZED_CUT_COPPER_STAIRS = init(); + @Nullable public static final BlockType WAXED_WEATHERED_COPPER = init(); + @Nullable public static final BlockType WAXED_WEATHERED_CUT_COPPER = init(); + @Nullable public static final BlockType WAXED_WEATHERED_CUT_COPPER_SLAB = init(); + @Nullable public static final BlockType WAXED_WEATHERED_CUT_COPPER_STAIRS = init(); + @Nullable public static final BlockType WEATHERED_COPPER = init(); + @Nullable public static final BlockType WEATHERED_CUT_COPPER = init(); + @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_PLANT = init(); @Nullable public static final BlockType WET_SPONGE = init(); @Nullable public static final BlockType WHEAT = init(); @Nullable public static final BlockType WHITE_BANNER = init(); @Nullable public static final BlockType WHITE_BED = init(); + @Nullable public static final BlockType WHITE_CANDLE = init(); + @Nullable public static final BlockType WHITE_CANDLE_CAKE = init(); @Nullable public static final BlockType WHITE_CARPET = init(); @Nullable public static final BlockType WHITE_CONCRETE = init(); @Nullable public static final BlockType WHITE_CONCRETE_POWDER = init(); @@ -794,6 +926,8 @@ public final class BlockTypes { @Nullable public static final BlockType WITHER_SKELETON_WALL_SKULL = init(); @Nullable public static final BlockType YELLOW_BANNER = init(); @Nullable public static final BlockType YELLOW_BED = init(); + @Nullable public static final BlockType YELLOW_CANDLE = init(); + @Nullable public static final BlockType YELLOW_CANDLE_CAKE = init(); @Nullable public static final BlockType YELLOW_CARPET = init(); @Nullable public static final BlockType YELLOW_CONCRETE = init(); @Nullable public static final BlockType YELLOW_CONCRETE_POWDER = 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 0464a082c..c5aa2732f 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 @@ -1,6 +1,6 @@ package com.sk89q.worldedit.world.block; -import com.boydti.fawe.util.MathMan; +import com.fastasyncworldedit.core.util.MathMan; import com.google.common.primitives.Booleans; import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.WorldEdit; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java index b3af18520..9ec410eec 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/CompoundInput.java @@ -1,6 +1,6 @@ package com.sk89q.worldedit.world.block; -import com.boydti.fawe.beta.ITileInput; +import com.fastasyncworldedit.core.beta.ITileInput; public enum CompoundInput { NULL, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java index c749879ae..89958209e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/FuzzyBlockState.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.world.block; +import com.sk89q.jnbt.CompoundTag; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.registry.state.PropertyKey; @@ -123,6 +124,12 @@ public class FuzzyBlockState extends BlockState { return new Builder(); } + @Deprecated + @Override + public CompoundTag getNbtData() { + return getBlockType().getMaterial().isTile() ? getBlockType().getMaterial().getDefaultTile() : null; + } + /** * Builder for FuzzyBlockState */ diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java index dd8e407b9..bc1ca6fcd 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java @@ -19,15 +19,15 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteArrayTag; -import com.sk89q.jnbt.ByteTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -36,20 +36,31 @@ import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; public class AnvilChunk implements Chunk { - private final CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private final byte[][] blocks; private final byte[][] blocksAdd; private final byte[][] data; private final int rootX; private final int rootZ; - private Map> tileEntities; + private Map tileEntities; + + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk(CompoundBinaryTag)} + */ + public AnvilChunk(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } /** * Construct the chunk with a compound tag. @@ -57,42 +68,42 @@ public class AnvilChunk implements Chunk { * @param tag the tag to read * @throws DataException on a data error */ - public AnvilChunk(CompoundTag tag) throws DataException { + public AnvilChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); blocks = new byte[16][16 * 16 * 16]; blocksAdd = new byte[16][16 * 16 * 8]; data = new byte[16][16 * 16 * 8]; - List sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue(); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); - for (Tag rawSectionTag : sections) { - if (!(rawSectionTag instanceof CompoundTag)) { + for (BinaryTag rawSectionTag : sections) { + if (!(rawSectionTag instanceof CompoundBinaryTag)) { continue; } - CompoundTag sectionTag = (CompoundTag) rawSectionTag; - if (!sectionTag.getValue().containsKey("Y")) { + CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag; + if (sectionTag.get("Y") == null) { continue; // Empty section. } - int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue(); + int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value(); if (y < 0 || y >= 16) { continue; } - blocks[y] = NBTUtils.getChildTag(sectionTag.getValue(), - "Blocks", ByteArrayTag.class).getValue(); - data[y] = NBTUtils.getChildTag(sectionTag.getValue(), "Data", - ByteArrayTag.class).getValue(); + blocks[y] = NbtUtils.getChildTag(sectionTag, + "Blocks", BinaryTagTypes.BYTE_ARRAY).value(); + data[y] = NbtUtils.getChildTag(sectionTag, "Data", + BinaryTagTypes.BYTE_ARRAY).value(); // 4096 ID block support - if (sectionTag.getValue().containsKey("Add")) { - blocksAdd[y] = NBTUtils.getChildTag(sectionTag.getValue(), - "Add", ByteArrayTag.class).getValue(); + if (sectionTag.get("Add") != null) { + blocksAdd[y] = NbtUtils.getChildTag(sectionTag, + "Add", BinaryTagTypes.BYTE_ARRAY).value(); } } @@ -179,50 +190,50 @@ public class AnvilChunk implements Chunk { * Used to load the tile entities. */ private void populateTileEntities() throws DataException { - List tags = NBTUtils.getChildTag(rootTag.getValue(), - "TileEntities", ListTag.class).getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); tileEntities = new HashMap<>(); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; int x = 0; int y = 0; int z = 0; - Map values = new HashMap<>(); + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - for (Map.Entry entry : t.getValue().entrySet()) { - switch (entry.getKey()) { + for (String key : t.keySet()) { + BinaryTag value = t.get(key); + switch (key) { case "x": - if (entry.getValue() instanceof IntTag) { - x = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + x = ((IntBinaryTag) value).value(); } break; case "y": - if (entry.getValue() instanceof IntTag) { - y = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + y = ((IntBinaryTag) value).value(); } break; case "z": - if (entry.getValue() instanceof IntTag) { - z = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + z = ((IntBinaryTag) value).value(); } break; default: break; } - values.put(entry.getKey(), entry.getValue()); + values.put(key, value); } BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, values.build()); } } @@ -236,17 +247,17 @@ public class AnvilChunk implements Chunk { * @throws DataException thrown if there is a data error */ @Nullable - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -259,7 +270,7 @@ public class AnvilChunk implements Chunk { WorldEdit.logger.warn("Unknown legacy block " + id + ":" + data + " found when loading legacy anvil chunk."); return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java index 4c4ce9e51..91ebb9bbc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java @@ -19,15 +19,15 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteTag; 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.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -36,7 +36,6 @@ import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -45,12 +44,25 @@ import javax.annotation.Nullable; */ public class AnvilChunk13 implements Chunk { - private CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private BlockState[][] blocks; private int rootX; private int rootZ; - private Map> tileEntities; + private Map tileEntities; + + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk13(CompoundBinaryTag)} + */ + @Deprecated + public AnvilChunk13(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } /** * Construct the chunk with a compound tag. @@ -58,49 +70,49 @@ public class AnvilChunk13 implements Chunk { * @param tag the tag to read * @throws DataException on a data error */ - public AnvilChunk13(CompoundTag tag) throws DataException { + public AnvilChunk13(CompoundBinaryTag tag) throws DataException { rootTag = tag; - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); blocks = new BlockState[16][]; - List sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue(); + ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST); - for (Tag rawSectionTag : sections) { - if (!(rawSectionTag instanceof CompoundTag)) { + for (BinaryTag rawSectionTag : sections) { + if (!(rawSectionTag instanceof CompoundBinaryTag)) { continue; } - CompoundTag sectionTag = (CompoundTag) rawSectionTag; - if (!sectionTag.getValue().containsKey("Y")) { + CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag; + if (sectionTag.get("Y") == null) { continue; // Empty section. } - int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue(); + int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value(); if (y < 0 || y >= 16) { continue; } // parse palette - List paletteEntries = sectionTag.getList("Palette", CompoundTag.class); + ListBinaryTag paletteEntries = sectionTag.getList("Palette", BinaryTagTypes.COMPOUND); 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); + CompoundBinaryTag paletteEntry = (CompoundBinaryTag) 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); + if (paletteEntry.get("Properties") != null) { + CompoundBinaryTag properties = NbtUtils.getChildTag(paletteEntry, "Properties", BinaryTagTypes.COMPOUND); for (Property property : blockState.getStates().keySet()) { - if (properties.containsKey(property.getName())) { + if (properties.get(property.getName()) != null) { String value = properties.getString(property.getName()); try { blockState = getBlockStateWith(blockState, property, value); @@ -114,7 +126,7 @@ public class AnvilChunk13 implements Chunk { } // parse block states - long[] blockStatesSerialized = NBTUtils.getChildTag(sectionTag.getValue(), "BlockStates", LongArrayTag.class).getValue(); + long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", BinaryTagTypes.LONG_ARRAY).value(); BlockState[] chunkSectionBlocks = new BlockState[16 * 16 * 16]; blocks[y] = chunkSectionBlocks; @@ -166,26 +178,24 @@ public class AnvilChunk13 implements Chunk { */ private void populateTileEntities() throws DataException { tileEntities = new HashMap<>(); - if (!rootTag.getValue().containsKey("TileEntities")) { + if (rootTag.get("TileEntities") == null) { return; } - List tags = NBTUtils.getChildTag(rootTag.getValue(), - "TileEntities", ListTag.class).getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; - 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(); + int x = ((IntBinaryTag) t.get("x")).value(); + int y = ((IntBinaryTag) t.get("y")).value(); + int z = ((IntBinaryTag) t.get("z")).value(); BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, t); } } @@ -199,17 +209,17 @@ public class AnvilChunk13 implements Chunk { * @throws DataException thrown if there is a data error */ @Nullable - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -228,7 +238,7 @@ public class AnvilChunk13 implements Chunk { BlockState[] sectionBlocks = blocks[section]; BlockState state = sectionBlocks != null ? sectionBlocks[(yIndex << 8) | (z << 4) | x] : BlockTypes.AIR.getDefaultState(); - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); 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 bd9d5e08a..13e69458a 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 @@ -20,6 +20,7 @@ package com.sk89q.worldedit.world.chunk; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.storage.InvalidFormatException; @@ -34,11 +35,23 @@ public class AnvilChunk16 extends AnvilChunk13 { * * @param tag the tag to read * @throws DataException on a data error + * @deprecated Use {@link #AnvilChunk16(CompoundBinaryTag)} */ + @Deprecated public AnvilChunk16(CompoundTag tag) throws DataException { super(tag); } + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag to read + * @throws DataException on a data error + */ + public AnvilChunk16(CompoundBinaryTag tag) throws DataException { + super(tag); + } + @Override protected void readBlockStates(BlockState[] palette, long[] blockStatesSerialized, BlockState[] chunkSectionBlocks) throws InvalidFormatException { PackedIntArrayReader reader = new PackedIntArrayReader(blockStatesSerialized); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java index 8f5665c44..83f695ed1 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java @@ -19,14 +19,15 @@ package com.sk89q.worldedit.world.chunk; -import com.sk89q.jnbt.ByteArrayTag; import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.IntTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.NBTUtils; -import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.util.nbt.BinaryTag; +import com.sk89q.worldedit.util.nbt.BinaryTagTypes; +import com.sk89q.worldedit.util.nbt.CompoundBinaryTag; +import com.sk89q.worldedit.util.nbt.IntBinaryTag; +import com.sk89q.worldedit.util.nbt.ListBinaryTag; +import com.sk89q.worldedit.util.nbt.NbtUtils; import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; @@ -35,7 +36,6 @@ import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.storage.InvalidFormatException; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -43,13 +43,26 @@ import java.util.Map; */ public class OldChunk implements Chunk { - private final CompoundTag rootTag; + private final CompoundBinaryTag rootTag; private final byte[] blocks; private final byte[] data; private final int rootX; private final int rootZ; - private Map> tileEntities; + private Map tileEntities; + + + /** + * Construct the chunk with a compound tag. + * + * @param tag the tag + * @throws DataException if there is an error getting the chunk data + * @deprecated Use {@link #OldChunk(CompoundBinaryTag)} + */ + @Deprecated + public OldChunk(CompoundTag tag) throws DataException { + this(tag.asBinaryTag()); + } /** * Construct the chunk with a compound tag. @@ -57,13 +70,13 @@ public class OldChunk implements Chunk { * @param tag the tag * @throws DataException if there is an error getting the chunk data */ - public OldChunk(CompoundTag tag) throws DataException { + public OldChunk(CompoundBinaryTag tag) throws DataException { rootTag = tag; - blocks = NBTUtils.getChildTag(rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue(); - data = NBTUtils.getChildTag(rootTag.getValue(), "Data", ByteArrayTag.class).getValue(); - rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue(); - rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue(); + blocks = NbtUtils.getChildTag(rootTag, "Blocks", BinaryTagTypes.BYTE_ARRAY).value(); + data = NbtUtils.getChildTag(rootTag, "Data", BinaryTagTypes.BYTE_ARRAY).value(); + rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value(); + rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value(); int size = 16 * 16 * 128; if (blocks.length != size) { @@ -83,51 +96,50 @@ public class OldChunk implements Chunk { * @throws DataException if there is an error getting the chunk data */ private void populateTileEntities() throws DataException { - List tags = NBTUtils.getChildTag( - rootTag.getValue(), "TileEntities", ListTag.class) - .getValue(); + ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST); tileEntities = new HashMap<>(); - for (Tag tag : tags) { - if (!(tag instanceof CompoundTag)) { + for (BinaryTag tag : tags) { + if (!(tag instanceof CompoundBinaryTag)) { throw new InvalidFormatException("CompoundTag expected in TileEntities"); } - CompoundTag t = (CompoundTag) tag; + CompoundBinaryTag t = (CompoundBinaryTag) tag; int x = 0; int y = 0; int z = 0; - Map values = new HashMap<>(); + CompoundBinaryTag.Builder values = CompoundBinaryTag.builder(); - for (Map.Entry entry : t.getValue().entrySet()) { - switch (entry.getKey()) { + for (String key : t.keySet()) { + BinaryTag value = t.get(key); + switch (key) { case "x": - if (entry.getValue() instanceof IntTag) { - x = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + x = ((IntBinaryTag) value).value(); } break; case "y": - if (entry.getValue() instanceof IntTag) { - y = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + y = ((IntBinaryTag) value).value(); } break; case "z": - if (entry.getValue() instanceof IntTag) { - z = ((IntTag) entry.getValue()).getValue(); + if (value instanceof IntBinaryTag) { + z = ((IntBinaryTag) value).value(); } break; default: break; } - values.put(entry.getKey(), entry.getValue()); + values.put(key, value); } BlockVector3 vec = BlockVector3.at(x, y, z); - tileEntities.put(vec, values); + tileEntities.put(vec, values.build()); } } @@ -140,16 +152,16 @@ public class OldChunk implements Chunk { * @return a tag * @throws DataException if there is an error getting the chunk data */ - private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException { + private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException { if (tileEntities == null) { populateTileEntities(); } - Map values = tileEntities.get(position); + CompoundBinaryTag values = tileEntities.get(position); if (values == null) { return null; } - return new CompoundTag(values); + return values; } @Override @@ -189,7 +201,7 @@ public class OldChunk implements Chunk { return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundBinaryTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java index 67dfbd3bd..d613417d2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/entity/EntityTypes.java @@ -32,6 +32,7 @@ public final class EntityTypes { @Nullable public static final EntityType AREA_EFFECT_CLOUD = get("minecraft:area_effect_cloud"); @Nullable public static final EntityType ARMOR_STAND = get("minecraft:armor_stand"); @Nullable public static final EntityType ARROW = get("minecraft:arrow"); + @Nullable public static final EntityType AXOLOTL = get("minecraft:axolotl"); @Nullable public static final EntityType BAT = get("minecraft:bat"); @Nullable public static final EntityType BEE = get("minecraft:bee"); @Nullable public static final EntityType BLAZE = get("minecraft:blaze"); @@ -68,6 +69,9 @@ public final class EntityTypes { @Nullable public static final EntityType FURNACE_MINECART = get("minecraft:furnace_minecart"); @Nullable public static final EntityType GHAST = get("minecraft:ghast"); @Nullable public static final EntityType GIANT = get("minecraft:giant"); + @Nullable public static final EntityType GLOW_ITEM_FRAME = get("minecraft:glow_item_frame"); + @Nullable public static final EntityType GLOW_SQUID = get("minecraft:glow_squid"); + @Nullable public static final EntityType GOAT = get("minecraft:goat"); @Nullable public static final EntityType GUARDIAN = get("minecraft:guardian"); @Nullable public static final EntityType HOGLIN = get("minecraft:hoglin"); @Nullable public static final EntityType HOPPER_MINECART = get("minecraft:hopper_minecart"); @@ -82,6 +86,7 @@ public final class EntityTypes { @Nullable public static final EntityType LLAMA = get("minecraft:llama"); @Nullable public static final EntityType LLAMA_SPIT = get("minecraft:llama_spit"); @Nullable public static final EntityType MAGMA_CUBE = get("minecraft:magma_cube"); + @Nullable public static final EntityType MARKER = get("minecraft:marker"); @Nullable public static final EntityType MINECART = get("minecraft:minecart"); @Nullable public static final EntityType MOOSHROOM = get("minecraft:mooshroom"); @Nullable public static final EntityType MULE = get("minecraft:mule"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java index 03b50763d..3265bbdb2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemCategories.java @@ -29,24 +29,36 @@ public final class ItemCategories { public static final ItemCategory ACACIA_LOGS = get("minecraft:acacia_logs"); public static final ItemCategory ANVIL = get("minecraft:anvil"); public static final ItemCategory ARROWS = get("minecraft:arrows"); + public static final ItemCategory AXOLOTL_TEMPT_ITEMS = get("minecraft:axolotl_tempt_items"); public static final ItemCategory BANNERS = get("minecraft:banners"); public static final ItemCategory BEACON_PAYMENT_ITEMS = get("minecraft:beacon_payment_items"); public static final ItemCategory BEDS = get("minecraft:beds"); public static final ItemCategory BIRCH_LOGS = get("minecraft:birch_logs"); public static final ItemCategory BOATS = get("minecraft:boats"); public static final ItemCategory BUTTONS = get("minecraft:buttons"); + public static final ItemCategory CANDLES = get("minecraft:candles"); public static final ItemCategory CARPETS = get("minecraft:carpets"); + public static final ItemCategory CLUSTER_MAX_HARVESTABLES = get("minecraft:cluster_max_harvestables"); + public static final ItemCategory COAL_ORES = get("minecraft:coal_ores"); public static final ItemCategory COALS = get("minecraft:coals"); + public static final ItemCategory COPPER_ORES = get("minecraft:copper_ores"); public static final ItemCategory CREEPER_DROP_MUSIC_DISCS = get("minecraft:creeper_drop_music_discs"); public static final ItemCategory CRIMSON_STEMS = get("minecraft:crimson_stems"); public static final ItemCategory DARK_OAK_LOGS = get("minecraft:dark_oak_logs"); + public static final ItemCategory DIAMOND_ORES = get("minecraft:diamond_ores"); public static final ItemCategory DOORS = get("minecraft:doors"); + public static final ItemCategory EMERALD_ORES = get("minecraft:emerald_ores"); public static final ItemCategory FENCES = get("minecraft:fences"); public static final ItemCategory FISHES = get("minecraft:fishes"); public static final ItemCategory FLOWERS = get("minecraft:flowers"); + public static final ItemCategory FOX_FOOD = get("minecraft:fox_food"); + public static final ItemCategory FREEZE_IMMUNE_WEARABLES = get("minecraft:freeze_immune_wearables"); @Deprecated public static final ItemCategory FURNACE_MATERIALS = get("minecraft:furnace_materials"); public static final ItemCategory GOLD_ORES = get("minecraft:gold_ores"); + public static final ItemCategory IGNORED_BY_PIGLIN_BABIES = get("minecraft:ignored_by_piglin_babies"); + public static final ItemCategory IRON_ORES = get("minecraft:iron_ores"); public static final ItemCategory JUNGLE_LOGS = get("minecraft:jungle_logs"); + public static final ItemCategory LAPIS_ORES = get("minecraft:lapis_ores"); public static final ItemCategory LEAVES = get("minecraft:leaves"); public static final ItemCategory LECTERN_BOOKS = get("minecraft:lectern_books"); public static final ItemCategory LOGS = get("minecraft:logs"); @@ -54,10 +66,13 @@ public final class ItemCategories { public static final ItemCategory MUSIC_DISCS = get("minecraft:music_discs"); public static final ItemCategory NON_FLAMMABLE_WOOD = get("minecraft:non_flammable_wood"); public static final ItemCategory OAK_LOGS = get("minecraft:oak_logs"); + public static final ItemCategory OCCLUDES_VIBRATION_SIGNALS = get("minecraft:occludes_vibration_signals"); + public static final ItemCategory PIGLIN_FOOD = get("minecraft:piglin_food"); public static final ItemCategory PIGLIN_LOVED = get("minecraft:piglin_loved"); public static final ItemCategory PIGLIN_REPELLENTS = get("minecraft:piglin_repellents"); public static final ItemCategory PLANKS = get("minecraft:planks"); public static final ItemCategory RAILS = get("minecraft:rails"); + public static final ItemCategory REDSTONE_ORES = get("minecraft:redstone_ores"); public static final ItemCategory SAND = get("minecraft:sand"); public static final ItemCategory SAPLINGS = get("minecraft:saplings"); public static final ItemCategory SIGNS = get("minecraft:signs"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java index 5752ea831..6bd091dc3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/item/ItemTypes.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.item; -import com.boydti.fawe.object.string.JoinedCharSequence; +import com.fastasyncworldedit.core.object.string.JoinedCharSequence; import com.sk89q.worldedit.world.block.ItemTypesCache; import com.sk89q.worldedit.world.registry.LegacyMapper; @@ -53,6 +53,9 @@ public final class ItemTypes { @Nullable public static final ItemType ACTIVATOR_RAIL = init(); @Nullable public static final ItemType AIR = init(); @Nullable public static final ItemType ALLIUM = init(); + @Nullable public static final ItemType AMETHYST_BLOCK = init(); + @Nullable public static final ItemType AMETHYST_CLUSTER = init(); + @Nullable public static final ItemType AMETHYST_SHARD = init(); @Nullable public static final ItemType ANCIENT_DEBRIS = init(); @Nullable public static final ItemType ANDESITE = init(); @Nullable public static final ItemType ANDESITE_SLAB = init(); @@ -62,6 +65,10 @@ public final class ItemTypes { @Nullable public static final ItemType APPLE = init(); @Nullable public static final ItemType ARMOR_STAND = init(); @Nullable public static final ItemType ARROW = init(); + @Nullable public static final ItemType AXOLOTL_BUCKET = init(); + @Nullable public static final ItemType AXOLOTL_SPAWN_EGG = init(); + @Nullable public static final ItemType AZALEA = init(); + @Nullable public static final ItemType AZALEA_LEAVES = init(); @Nullable public static final ItemType AZURE_BLUET = init(); @Nullable public static final ItemType BAKED_POTATO = init(); @Nullable public static final ItemType BAMBOO = init(); @@ -79,6 +86,7 @@ public final class ItemTypes { @Nullable public static final ItemType BEETROOT_SEEDS = init(); @Nullable public static final ItemType BEETROOT_SOUP = init(); @Nullable public static final ItemType BELL = init(); + @Nullable public static final ItemType BIG_DRIPLEAF = init(); @Nullable public static final ItemType BIRCH_BOAT = init(); @Nullable public static final ItemType BIRCH_BUTTON = init(); @Nullable public static final ItemType BIRCH_DOOR = init(); @@ -96,6 +104,7 @@ public final class ItemTypes { @Nullable public static final ItemType BIRCH_WOOD = init(); @Nullable public static final ItemType BLACK_BANNER = init(); @Nullable public static final ItemType BLACK_BED = init(); + @Nullable public static final ItemType BLACK_CANDLE = init(); @Nullable public static final ItemType BLACK_CARPET = init(); @Nullable public static final ItemType BLACK_CONCRETE = init(); @Nullable public static final ItemType BLACK_CONCRETE_POWDER = init(); @@ -116,6 +125,8 @@ public final class ItemTypes { @Nullable public static final ItemType BLAZE_SPAWN_EGG = init(); @Nullable public static final ItemType BLUE_BANNER = init(); @Nullable public static final ItemType BLUE_BED = init(); + @Nullable public static final ItemType BLUE_CANDLE = init(); + @Nullable public static final ItemType BROWN_CANDLE = init(); @Nullable public static final ItemType BLUE_CARPET = init(); @Nullable public static final ItemType BLUE_CONCRETE = init(); @Nullable public static final ItemType BLUE_CONCRETE_POWDER = init(); @@ -163,10 +174,14 @@ public final class ItemTypes { @Nullable public static final ItemType BUBBLE_CORAL_BLOCK = init(); @Nullable public static final ItemType BUBBLE_CORAL_FAN = init(); @Nullable public static final ItemType BUCKET = init(); + @Nullable public static final ItemType BUDDING_AMETHYST = init(); + @Nullable public static final ItemType BUNDLE = init(); @Nullable public static final ItemType CACTUS = init(); @Deprecated @Nullable public static final ItemType CACTUS_GREEN = init(); @Nullable public static final ItemType CAKE = init(); + @Nullable public static final ItemType CALCITE = init(); @Nullable public static final ItemType CAMPFIRE = init(); + @Nullable public static final ItemType CANDLE = init(); @Nullable public static final ItemType CARROT = init(); @Nullable public static final ItemType CARROT_ON_A_STICK = init(); @Nullable public static final ItemType CARTOGRAPHY_TABLE = init(); @@ -186,6 +201,7 @@ public final class ItemTypes { @Nullable public static final ItemType CHICKEN = init(); @Nullable public static final ItemType CHICKEN_SPAWN_EGG = init(); @Nullable public static final ItemType CHIPPED_ANVIL = init(); + @Nullable public static final ItemType CHISELED_DEEPSLATE = init(); @Nullable public static final ItemType CHISELED_NETHER_BRICKS = init(); @Nullable public static final ItemType CHISELED_POLISHED_BLACKSTONE = init(); @Nullable public static final ItemType CHISELED_QUARTZ_BLOCK = init(); @@ -202,6 +218,10 @@ public final class ItemTypes { @Nullable public static final ItemType COAL_BLOCK = init(); @Nullable public static final ItemType COAL_ORE = init(); @Nullable public static final ItemType COARSE_DIRT = init(); + @Nullable public static final ItemType COBBLED_DEEPSLATE = init(); + @Nullable public static final ItemType COBBLED_DEEPSLATE_SLAB = init(); + @Nullable public static final ItemType COBBLED_DEEPSLATE_STAIRS = init(); + @Nullable public static final ItemType COBBLED_DEEPSLATE_WALL = init(); @Nullable public static final ItemType COBBLESTONE = init(); @Nullable public static final ItemType COBBLESTONE_SLAB = init(); @Nullable public static final ItemType COBBLESTONE_STAIRS = init(); @@ -225,8 +245,13 @@ public final class ItemTypes { @Nullable public static final ItemType COOKED_RABBIT = init(); @Nullable public static final ItemType COOKED_SALMON = init(); @Nullable public static final ItemType COOKIE = init(); + @Nullable public static final ItemType COPPER_BLOCK = init(); + @Nullable public static final ItemType COPPER_INGOT = init(); + @Nullable public static final ItemType COPPER_ORE = init(); @Nullable public static final ItemType CORNFLOWER = init(); @Nullable public static final ItemType COW_SPAWN_EGG = init(); + @Nullable public static final ItemType CRACKED_DEEPSLATE_BRICKS = init(); + @Nullable public static final ItemType CRACKED_DEEPSLATE_TILES = init(); @Nullable public static final ItemType CRACKED_NETHER_BRICKS = init(); @Nullable public static final ItemType CRACKED_POLISHED_BLACKSTONE_BRICKS = init(); @Nullable public static final ItemType CRACKED_STONE_BRICKS = init(); @@ -251,12 +276,16 @@ public final class ItemTypes { @Nullable public static final ItemType CRIMSON_TRAPDOOR = init(); @Nullable public static final ItemType CROSSBOW = init(); @Nullable public static final ItemType CRYING_OBSIDIAN = init(); + @Nullable public static final ItemType CUT_COPPER = init(); + @Nullable public static final ItemType CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType CUT_COPPER_STAIRS = init(); @Nullable public static final ItemType CUT_RED_SANDSTONE = init(); @Nullable public static final ItemType CUT_RED_SANDSTONE_SLAB = init(); @Nullable public static final ItemType CUT_SANDSTONE = init(); @Nullable public static final ItemType CUT_SANDSTONE_SLAB = init(); @Nullable public static final ItemType CYAN_BANNER = init(); @Nullable public static final ItemType CYAN_BED = init(); + @Nullable public static final ItemType CYAN_CANDLE = init(); @Nullable public static final ItemType CYAN_CARPET = init(); @Nullable public static final ItemType CYAN_CONCRETE = init(); @Nullable public static final ItemType CYAN_CONCRETE_POWDER = init(); @@ -306,6 +335,23 @@ public final class ItemTypes { @Nullable public static final ItemType DEAD_TUBE_CORAL_BLOCK = init(); @Nullable public static final ItemType DEAD_TUBE_CORAL_FAN = init(); @Nullable public static final ItemType DEBUG_STICK = init(); + @Nullable public static final ItemType DEEPSLATE = init(); + @Nullable public static final ItemType DEEPSLATE_BRICK_SLAB = init(); + @Nullable public static final ItemType DEEPSLATE_BRICK_STAIRS = init(); + @Nullable public static final ItemType DEEPSLATE_BRICK_WALL = init(); + @Nullable public static final ItemType DEEPSLATE_BRICKS = init(); + @Nullable public static final ItemType DEEPSLATE_COAL_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_COPPER_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_DIAMOND_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_EMERALD_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_GOLD_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_IRON_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_LAPIS_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_REDSTONE_ORE = init(); + @Nullable public static final ItemType DEEPSLATE_TILE_SLAB = init(); + @Nullable public static final ItemType DEEPSLATE_TILE_STAIRS = init(); + @Nullable public static final ItemType DEEPSLATE_TILE_WALL = init(); + @Nullable public static final ItemType DEEPSLATE_TILES = init(); @Nullable public static final ItemType DETECTOR_RAIL = init(); @Nullable public static final ItemType DIAMOND = init(); @Nullable public static final ItemType DIAMOND_AXE = init(); @@ -325,6 +371,7 @@ public final class ItemTypes { @Nullable public static final ItemType DIORITE_STAIRS = init(); @Nullable public static final ItemType DIORITE_WALL = init(); @Nullable public static final ItemType DIRT = init(); + @Nullable public static final ItemType DIRT_PATH = init(); @Nullable public static final ItemType DISPENSER = init(); @Nullable public static final ItemType DOLPHIN_SPAWN_EGG = init(); @Nullable public static final ItemType DONKEY_SPAWN_EGG = init(); @@ -333,6 +380,7 @@ public final class ItemTypes { @Nullable public static final ItemType DRAGON_HEAD = init(); @Nullable public static final ItemType DRIED_KELP = init(); @Nullable public static final ItemType DRIED_KELP_BLOCK = init(); + @Nullable public static final ItemType DRIPSTONE_BLOCK = init(); @Nullable public static final ItemType DROPPER = init(); @Nullable public static final ItemType DROWNED_SPAWN_EGG = init(); @Nullable public static final ItemType EGG = init(); @@ -359,6 +407,10 @@ public final class ItemTypes { @Nullable public static final ItemType ENDERMITE_SPAWN_EGG = init(); @Nullable public static final ItemType EVOKER_SPAWN_EGG = init(); @Nullable public static final ItemType EXPERIENCE_BOTTLE = init(); + @Nullable public static final ItemType EXPOSED_COPPER = init(); + @Nullable public static final ItemType EXPOSED_CUT_COPPER = init(); + @Nullable public static final ItemType EXPOSED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType EXPOSED_CUT_COPPER_STAIRS = init(); @Nullable public static final ItemType FARMLAND = init(); @Nullable public static final ItemType FEATHER = init(); @Nullable public static final ItemType FERMENTED_SPIDER_EYE = init(); @@ -376,6 +428,8 @@ public final class ItemTypes { @Nullable public static final ItemType FLINT_AND_STEEL = init(); @Nullable public static final ItemType FLOWER_BANNER_PATTERN = init(); @Nullable public static final ItemType FLOWER_POT = init(); + @Nullable public static final ItemType FLOWERING_AZALEA = init(); + @Nullable public static final ItemType FLOWERING_AZALEA_LEAVES = init(); @Nullable public static final ItemType FOX_SPAWN_EGG = init(); @Nullable public static final ItemType FURNACE = init(); @Nullable public static final ItemType FURNACE_MINECART = init(); @@ -387,8 +441,14 @@ public final class ItemTypes { @Nullable public static final ItemType GLASS_PANE = init(); @Nullable public static final ItemType GLISTERING_MELON_SLICE = init(); @Nullable public static final ItemType GLOBE_BANNER_PATTERN = init(); + @Nullable public static final ItemType GLOW_BERRIES = init(); + @Nullable public static final ItemType GLOW_INK_SAC = init(); + @Nullable public static final ItemType GLOW_ITEM_FRAME = init(); + @Nullable public static final ItemType GLOW_LICHEN = init(); + @Nullable public static final ItemType GLOW_SQUID_SPAWN_EGG = init(); @Nullable public static final ItemType GLOWSTONE = init(); @Nullable public static final ItemType GLOWSTONE_DUST = init(); + @Nullable public static final ItemType GOAT_SPAWN_EGG = init(); @Nullable public static final ItemType GOLD_BLOCK = init(); @Nullable public static final ItemType GOLD_INGOT = init(); @Nullable public static final ItemType GOLD_NUGGET = init(); @@ -411,10 +471,11 @@ public final class ItemTypes { @Nullable public static final ItemType GRANITE_WALL = init(); @Nullable public static final ItemType GRASS = init(); @Nullable public static final ItemType GRASS_BLOCK = init(); - @Nullable public static final ItemType GRASS_PATH = init(); + @Deprecated @Nullable public static final ItemType GRASS_PATH = init(); @Nullable public static final ItemType GRAVEL = init(); @Nullable public static final ItemType GRAY_BANNER = init(); @Nullable public static final ItemType GRAY_BED = init(); + @Nullable public static final ItemType GREEN_CANDLE = init(); @Nullable public static final ItemType GRAY_CARPET = init(); @Nullable public static final ItemType GRAY_CONCRETE = init(); @Nullable public static final ItemType GRAY_CONCRETE_POWDER = init(); @@ -440,6 +501,7 @@ public final class ItemTypes { @Nullable public static final ItemType GRINDSTONE = init(); @Nullable public static final ItemType GUARDIAN_SPAWN_EGG = init(); @Nullable public static final ItemType GUNPOWDER = init(); + @Nullable public static final ItemType HANGING_ROOTS = init(); @Nullable public static final ItemType HAY_BLOCK = init(); @Nullable public static final ItemType HEART_OF_THE_SEA = init(); @Nullable public static final ItemType HEAVY_WEIGHTED_PRESSURE_PLATE = init(); @@ -459,6 +521,7 @@ public final class ItemTypes { @Nullable public static final ItemType INFESTED_CHISELED_STONE_BRICKS = init(); @Nullable public static final ItemType INFESTED_COBBLESTONE = init(); @Nullable public static final ItemType INFESTED_CRACKED_STONE_BRICKS = init(); + @Nullable public static final ItemType INFESTED_DEEPSLATE = init(); @Nullable public static final ItemType INFESTED_MOSSY_STONE_BRICKS = init(); @Nullable public static final ItemType INFESTED_STONE = init(); @Nullable public static final ItemType INFESTED_STONE_BRICKS = init(); @@ -506,6 +569,7 @@ public final class ItemTypes { @Nullable public static final ItemType LAPIS_BLOCK = init(); @Nullable public static final ItemType LAPIS_LAZULI = init(); @Nullable public static final ItemType LAPIS_ORE = init(); + @Nullable public static final ItemType LARGE_AMETHYST_BUD = init(); @Nullable public static final ItemType LARGE_FERN = init(); @Nullable public static final ItemType LAVA_BUCKET = init(); @Nullable public static final ItemType LEAD = init(); @@ -517,8 +581,10 @@ public final class ItemTypes { @Nullable public static final ItemType LEATHER_LEGGINGS = init(); @Nullable public static final ItemType LECTERN = init(); @Nullable public static final ItemType LEVER = init(); + @Nullable public static final ItemType LIGHT = init(); @Nullable public static final ItemType LIGHT_BLUE_BANNER = init(); @Nullable public static final ItemType LIGHT_BLUE_BED = init(); + @Nullable public static final ItemType LIGHT_BLUE_CANDLE = init(); @Nullable public static final ItemType LIGHT_BLUE_CARPET = init(); @Nullable public static final ItemType LIGHT_BLUE_CONCRETE = init(); @Nullable public static final ItemType LIGHT_BLUE_CONCRETE_POWDER = init(); @@ -531,6 +597,7 @@ public final class ItemTypes { @Nullable public static final ItemType LIGHT_BLUE_WOOL = init(); @Nullable public static final ItemType LIGHT_GRAY_BANNER = init(); @Nullable public static final ItemType LIGHT_GRAY_BED = init(); + @Nullable public static final ItemType LIGHT_GRAY_CANDLE = init(); @Nullable public static final ItemType LIGHT_GRAY_CARPET = init(); @Nullable public static final ItemType LIGHT_GRAY_CONCRETE = init(); @Nullable public static final ItemType LIGHT_GRAY_CONCRETE_POWDER = init(); @@ -542,11 +609,13 @@ public final class ItemTypes { @Nullable public static final ItemType LIGHT_GRAY_TERRACOTTA = init(); @Nullable public static final ItemType LIGHT_GRAY_WOOL = init(); @Nullable public static final ItemType LIGHT_WEIGHTED_PRESSURE_PLATE = init(); + @Nullable public static final ItemType LIGHTNING_ROD = init(); @Nullable public static final ItemType LILAC = init(); @Nullable public static final ItemType LILY_OF_THE_VALLEY = init(); @Nullable public static final ItemType LILY_PAD = init(); @Nullable public static final ItemType LIME_BANNER = init(); @Nullable public static final ItemType LIME_BED = init(); + @Nullable public static final ItemType LIME_CANDLE = init(); @Nullable public static final ItemType LIME_CARPET = init(); @Nullable public static final ItemType LIME_CONCRETE = init(); @Nullable public static final ItemType LIME_CONCRETE_POWDER = init(); @@ -563,6 +632,7 @@ public final class ItemTypes { @Nullable public static final ItemType LOOM = init(); @Nullable public static final ItemType MAGENTA_BANNER = init(); @Nullable public static final ItemType MAGENTA_BED = init(); + @Nullable public static final ItemType MAGENTA_CANDLE = init(); @Nullable public static final ItemType MAGENTA_CARPET = init(); @Nullable public static final ItemType MAGENTA_CONCRETE = init(); @Nullable public static final ItemType MAGENTA_CONCRETE_POWDER = init(); @@ -577,6 +647,7 @@ public final class ItemTypes { @Nullable public static final ItemType MAGMA_CREAM = init(); @Nullable public static final ItemType MAGMA_CUBE_SPAWN_EGG = init(); @Nullable public static final ItemType MAP = init(); + @Nullable public static final ItemType MEDIUM_AMETHYST_BUD = init(); @Nullable public static final ItemType MELON = init(); @Nullable public static final ItemType MELON_SEEDS = init(); @Nullable public static final ItemType MELON_SLICE = init(); @@ -584,6 +655,8 @@ public final class ItemTypes { @Nullable public static final ItemType MINECART = init(); @Nullable public static final ItemType MOJANG_BANNER_PATTERN = init(); @Nullable public static final ItemType MOOSHROOM_SPAWN_EGG = init(); + @Nullable public static final ItemType MOSS_BLOCK = init(); + @Nullable public static final ItemType MOSS_CARPET = init(); @Nullable public static final ItemType MOSSY_COBBLESTONE = init(); @Nullable public static final ItemType MOSSY_COBBLESTONE_SLAB = init(); @Nullable public static final ItemType MOSSY_COBBLESTONE_STAIRS = init(); @@ -658,6 +731,7 @@ public final class ItemTypes { @Nullable public static final ItemType OCELOT_SPAWN_EGG = init(); @Nullable public static final ItemType ORANGE_BANNER = init(); @Nullable public static final ItemType ORANGE_BED = init(); + @Nullable public static final ItemType ORANGE_CANDLE = init(); @Nullable public static final ItemType ORANGE_CARPET = init(); @Nullable public static final ItemType ORANGE_CONCRETE = init(); @Nullable public static final ItemType ORANGE_CONCRETE_POWDER = init(); @@ -670,6 +744,10 @@ public final class ItemTypes { @Nullable public static final ItemType ORANGE_TULIP = init(); @Nullable public static final ItemType ORANGE_WOOL = init(); @Nullable public static final ItemType OXEYE_DAISY = init(); + @Nullable public static final ItemType OXIDIZED_COPPER = init(); + @Nullable public static final ItemType OXIDIZED_CUT_COPPER = init(); + @Nullable public static final ItemType OXIDIZED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType OXIDIZED_CUT_COPPER_STAIRS = init(); @Nullable public static final ItemType PACKED_ICE = init(); @Nullable public static final ItemType PAINTING = init(); @Nullable public static final ItemType PANDA_SPAWN_EGG = init(); @@ -685,6 +763,7 @@ public final class ItemTypes { @Nullable public static final ItemType PILLAGER_SPAWN_EGG = init(); @Nullable public static final ItemType PINK_BANNER = init(); @Nullable public static final ItemType PINK_BED = init(); + @Nullable public static final ItemType PINK_CANDLE = init(); @Nullable public static final ItemType PINK_CARPET = init(); @Nullable public static final ItemType PINK_CONCRETE = init(); @Nullable public static final ItemType PINK_CONCRETE_POWDER = init(); @@ -699,6 +778,7 @@ public final class ItemTypes { @Nullable public static final ItemType PISTON = init(); @Nullable public static final ItemType PLAYER_HEAD = init(); @Nullable public static final ItemType PODZOL = init(); + @Nullable public static final ItemType POINTED_DRIPSTONE = init(); @Nullable public static final ItemType POISONOUS_POTATO = init(); @Nullable public static final ItemType POLAR_BEAR_SPAWN_EGG = init(); @Nullable public static final ItemType POLISHED_ANDESITE = init(); @@ -715,6 +795,10 @@ public final class ItemTypes { @Nullable public static final ItemType POLISHED_BLACKSTONE_SLAB = init(); @Nullable public static final ItemType POLISHED_BLACKSTONE_STAIRS = init(); @Nullable public static final ItemType POLISHED_BLACKSTONE_WALL = init(); + @Nullable public static final ItemType POLISHED_DEEPSLATE = init(); + @Nullable public static final ItemType POLISHED_DEEPSLATE_SLAB = init(); + @Nullable public static final ItemType POLISHED_DEEPSLATE_STAIRS = init(); + @Nullable public static final ItemType POLISHED_DEEPSLATE_WALL = init(); @Nullable public static final ItemType POLISHED_DIORITE = init(); @Nullable public static final ItemType POLISHED_DIORITE_SLAB = init(); @Nullable public static final ItemType POLISHED_DIORITE_STAIRS = init(); @@ -726,6 +810,7 @@ public final class ItemTypes { @Nullable public static final ItemType PORKCHOP = init(); @Nullable public static final ItemType POTATO = init(); @Nullable public static final ItemType POTION = init(); + @Nullable public static final ItemType POWDER_SNOW_BUCKET = init(); @Nullable public static final ItemType POWERED_RAIL = init(); @Nullable public static final ItemType PRISMARINE = init(); @Nullable public static final ItemType PRISMARINE_BRICK_SLAB = init(); @@ -744,6 +829,7 @@ public final class ItemTypes { @Nullable public static final ItemType PUMPKIN_SEEDS = init(); @Nullable public static final ItemType PURPLE_BANNER = init(); @Nullable public static final ItemType PURPLE_BED = init(); + @Nullable public static final ItemType PURPLE_CANDLE = init(); @Nullable public static final ItemType PURPLE_CARPET = init(); @Nullable public static final ItemType PURPLE_CONCRETE = init(); @Nullable public static final ItemType PURPLE_CONCRETE_POWDER = init(); @@ -771,8 +857,15 @@ public final class ItemTypes { @Nullable public static final ItemType RABBIT_STEW = init(); @Nullable public static final ItemType RAIL = init(); @Nullable public static final ItemType RAVAGER_SPAWN_EGG = init(); + @Nullable public static final ItemType RAW_COPPER = init(); + @Nullable public static final ItemType RAW_COPPER_BLOCK = init(); + @Nullable public static final ItemType RAW_GOLD = init(); + @Nullable public static final ItemType RAW_GOLD_BLOCK = init(); + @Nullable public static final ItemType RAW_IRON = init(); + @Nullable public static final ItemType RAW_IRON_BLOCK = init(); @Nullable public static final ItemType RED_BANNER = init(); @Nullable public static final ItemType RED_BED = init(); + @Nullable public static final ItemType RED_CANDLE = init(); @Nullable public static final ItemType RED_CARPET = init(); @Nullable public static final ItemType RED_CONCRETE = init(); @Nullable public static final ItemType RED_CONCRETE_POWDER = init(); @@ -803,6 +896,7 @@ public final class ItemTypes { @Nullable public static final ItemType REPEATER = init(); @Nullable public static final ItemType REPEATING_COMMAND_BLOCK = init(); @Nullable public static final ItemType RESPAWN_ANCHOR = init(); + @Nullable public static final ItemType ROOTED_DIRT = init(); @Nullable public static final ItemType ROSE_BUSH = init(); @Deprecated @Nullable public static final ItemType ROSE_RED = init(); @Nullable public static final ItemType ROTTEN_FLESH = init(); @@ -816,6 +910,7 @@ public final class ItemTypes { @Nullable public static final ItemType SANDSTONE_STAIRS = init(); @Nullable public static final ItemType SANDSTONE_WALL = init(); @Nullable public static final ItemType SCAFFOLDING = init(); + @Nullable public static final ItemType SCULK_SENSOR = init(); @Nullable public static final ItemType SCUTE = init(); @Nullable public static final ItemType SEA_LANTERN = init(); @Nullable public static final ItemType SEA_PICKLE = init(); @@ -836,8 +931,11 @@ public final class ItemTypes { @Nullable public static final ItemType SLIME_BALL = init(); @Nullable public static final ItemType SLIME_BLOCK = init(); @Nullable public static final ItemType SLIME_SPAWN_EGG = init(); + @Nullable public static final ItemType SMALL_AMETHYST_BUD = init(); + @Nullable public static final ItemType SMALL_DRIPLEAF = init(); @Nullable public static final ItemType SMITHING_TABLE = init(); @Nullable public static final ItemType SMOKER = init(); + @Nullable public static final ItemType SMOOTH_BASALT = init(); @Nullable public static final ItemType SMOOTH_QUARTZ = init(); @Nullable public static final ItemType SMOOTH_QUARTZ_SLAB = init(); @Nullable public static final ItemType SMOOTH_QUARTZ_STAIRS = init(); @@ -863,6 +961,7 @@ public final class ItemTypes { @Nullable public static final ItemType SPIDER_SPAWN_EGG = init(); @Nullable public static final ItemType SPLASH_POTION = init(); @Nullable public static final ItemType SPONGE = init(); + @Nullable public static final ItemType SPORE_BLOSSOM = init(); @Nullable public static final ItemType SPRUCE_BOAT = init(); @Nullable public static final ItemType SPRUCE_BUTTON = init(); @Nullable public static final ItemType SPRUCE_DOOR = init(); @@ -878,6 +977,7 @@ public final class ItemTypes { @Nullable public static final ItemType SPRUCE_STAIRS = init(); @Nullable public static final ItemType SPRUCE_TRAPDOOR = init(); @Nullable public static final ItemType SPRUCE_WOOD = init(); + @Nullable public static final ItemType SPYGLASS = init(); @Nullable public static final ItemType SQUID_SPAWN_EGG = init(); @Nullable public static final ItemType STICK = init(); @Nullable public static final ItemType STICKY_PISTON = init(); @@ -925,6 +1025,7 @@ public final class ItemTypes { @Nullable public static final ItemType TALL_GRASS = init(); @Nullable public static final ItemType TARGET = init(); @Nullable public static final ItemType TERRACOTTA = init(); + @Nullable public static final ItemType TINTED_GLASS = init(); @Nullable public static final ItemType TIPPED_ARROW = init(); @Nullable public static final ItemType TNT = init(); @Nullable public static final ItemType TNT_MINECART = init(); @@ -940,6 +1041,7 @@ public final class ItemTypes { @Nullable public static final ItemType TUBE_CORAL = init(); @Nullable public static final ItemType TUBE_CORAL_BLOCK = init(); @Nullable public static final ItemType TUBE_CORAL_FAN = init(); + @Nullable public static final ItemType TUFF = init(); @Nullable public static final ItemType TURTLE_EGG = init(); @Nullable public static final ItemType TURTLE_HELMET = init(); @Nullable public static final ItemType TURTLE_SPAWN_EGG = init(); @@ -967,12 +1069,33 @@ public final class ItemTypes { @Nullable public static final ItemType WARPED_TRAPDOOR = init(); @Nullable public static final ItemType WARPED_WART_BLOCK = init(); @Nullable public static final ItemType WATER_BUCKET = init(); + @Nullable public static final ItemType WAXED_COPPER_BLOCK = init(); + @Nullable public static final ItemType WAXED_CUT_COPPER = init(); + @Nullable public static final ItemType WAXED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType WAXED_CUT_COPPER_STAIRS = init(); + @Nullable public static final ItemType WAXED_EXPOSED_COPPER = init(); + @Nullable public static final ItemType WAXED_EXPOSED_CUT_COPPER = init(); + @Nullable public static final ItemType WAXED_EXPOSED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType WAXED_EXPOSED_CUT_COPPER_STAIRS = init(); + @Nullable public static final ItemType WAXED_OXIDIZED_COPPER = init(); + @Nullable public static final ItemType WAXED_OXIDIZED_CUT_COPPER = init(); + @Nullable public static final ItemType WAXED_OXIDIZED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType WAXED_OXIDIZED_CUT_COPPER_STAIRS = init(); + @Nullable public static final ItemType WAXED_WEATHERED_COPPER = init(); + @Nullable public static final ItemType WAXED_WEATHERED_CUT_COPPER = init(); + @Nullable public static final ItemType WAXED_WEATHERED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType WAXED_WEATHERED_CUT_COPPER_STAIRS = init(); + @Nullable public static final ItemType WEATHERED_COPPER = init(); + @Nullable public static final ItemType WEATHERED_CUT_COPPER = init(); + @Nullable public static final ItemType WEATHERED_CUT_COPPER_SLAB = init(); + @Nullable public static final ItemType WEATHERED_CUT_COPPER_STAIRS = init(); @Nullable public static final ItemType WEEPING_VINES = init(); @Nullable public static final ItemType WET_SPONGE = init(); @Nullable public static final ItemType WHEAT = init(); @Nullable public static final ItemType WHEAT_SEEDS = init(); @Nullable public static final ItemType WHITE_BANNER = init(); @Nullable public static final ItemType WHITE_BED = init(); + @Nullable public static final ItemType WHITE_CANDLE = init(); @Nullable public static final ItemType WHITE_CARPET = init(); @Nullable public static final ItemType WHITE_CONCRETE = init(); @Nullable public static final ItemType WHITE_CONCRETE_POWDER = init(); @@ -998,6 +1121,7 @@ public final class ItemTypes { @Nullable public static final ItemType WRITTEN_BOOK = init(); @Nullable public static final ItemType YELLOW_BANNER = init(); @Nullable public static final ItemType YELLOW_BED = init(); + @Nullable public static final ItemType YELLOW_CANDLE = init(); @Nullable public static final ItemType YELLOW_CARPET = init(); @Nullable public static final ItemType YELLOW_CONCRETE = init(); @Nullable public static final ItemType YELLOW_CONCRETE_POWDER = init(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java index 27f697551..9fdd1baad 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockData.java @@ -96,7 +96,9 @@ public final class BundledBlockData { Gson gson = gsonBuilder.create(); URL url = null; final int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion(); - if (dataVersion >= Constants.DATA_VERSION_MC_1_16) { + if (dataVersion >= Constants.DATA_VERSION_MC_1_17) { + url = resourceLoader.getResource(BundledBlockData.class, "blocks.117.json"); + } else if (dataVersion >= Constants.DATA_VERSION_MC_1_16) { url = resourceLoader.getResource(BundledBlockData.class, "blocks.116.json"); } else if (dataVersion >= Constants.DATA_VERSION_MC_1_15) { url = resourceLoader.getResource(BundledBlockData.class, "blocks.115.json"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java index 4a87dcb97..a5965f0db 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledBlockRegistry.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.registry; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java index b5aad4280..5d169570b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemData.java @@ -83,7 +83,9 @@ public final class BundledItemData { Gson gson = gsonBuilder.create(); URL url = null; final int dataVersion = WorldEdit.getInstance().getPlatformManager().queryCapability(Capability.WORLD_EDITING).getDataVersion(); - if (dataVersion >= Constants.DATA_VERSION_MC_1_16) { + if (dataVersion >= Constants.DATA_VERSION_MC_1_17) { + url = resourceLoader.getResource(BundledBlockData.class, "items.117.json"); + } else if (dataVersion >= Constants.DATA_VERSION_MC_1_16) { url = resourceLoader.getResource(BundledBlockData.class, "items.116.json"); } else if (dataVersion >= Constants.DATA_VERSION_MC_1_15) { url = resourceLoader.getResource(BundledBlockData.class, "items.115.json"); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemRegistry.java index 257c7480d..11eef7a70 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/BundledItemRegistry.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.registry; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.translation.TranslationManager; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/NullBiomeRegistry.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/NullBiomeRegistry.java index bbf00c21b..4e575a444 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/NullBiomeRegistry.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/registry/NullBiomeRegistry.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.registry; -import com.boydti.fawe.config.Caption; +import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.translation.TranslationManager; import com.sk89q.worldedit.world.biome.BiomeData; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java index 13ee5f549..0965dcf24 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/snapshot/SnapshotRestore.java @@ -19,7 +19,7 @@ package com.sk89q.worldedit.world.snapshot; -import com.boydti.fawe.object.collection.LocalBlockVectorSet; +import com.fastasyncworldedit.core.object.collection.LocalBlockVectorSet; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.math.BlockVector2; 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 70f189f6f..76a1c82b5 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 @@ -19,6 +19,7 @@ package com.sk89q.worldedit.world.storage; +import com.sk89q.jnbt.AdventureNBTConverter; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.Tag; @@ -96,7 +97,7 @@ public class ChunkStoreHelper { 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) { - tag = (CompoundTag) dataFixer.fixUp(DataFixer.FixTypes.CHUNK, rootTag, dataVersion).getValue().get("Level"); + tag = (CompoundTag) ((CompoundTag) AdventureNBTConverter.fromAdventure(dataFixer.fixUp(DataFixer.FixTypes.CHUNK, rootTag.asBinaryTag(), dataVersion))).getValue().get("Level"); dataVersion = currentDataVersion; } } diff --git a/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/blocks.117.json b/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/blocks.117.json new file mode 100644 index 000000000..4f60b0771 --- /dev/null +++ b/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/blocks.117.json @@ -0,0 +1 @@ +[{"id":"minecraft:acacia_button","localizedName":"Acacia Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_door","localizedName":"Acacia Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_fence","localizedName":"Acacia Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_fence_gate","localizedName":"Acacia Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_leaves","localizedName":"Acacia Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_log","localizedName":"Acacia Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_planks","localizedName":"Acacia Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_pressure_plate","localizedName":"Acacia Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_sapling","localizedName":"Acacia Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_sign","localizedName":"Acacia Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_slab","localizedName":"Acacia Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_stairs","localizedName":"Acacia Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_trapdoor","localizedName":"Acacia Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_wall_sign","localizedName":"Acacia Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:acacia_wood","localizedName":"Acacia Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:activator_rail","localizedName":"Activator Rail","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.7,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.7,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:air","localizedName":"Air","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:allium","localizedName":"Allium","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:amethyst_block","localizedName":"Block of Amethyst","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:amethyst_cluster","localizedName":"Amethyst Cluster","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":5,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:ancient_debris","localizedName":"Ancient Debris","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":30.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:andesite","localizedName":"Andesite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:andesite_slab","localizedName":"Andesite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:andesite_stairs","localizedName":"Andesite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:andesite_wall","localizedName":"Andesite Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:anvil","localizedName":"Anvil","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":true}},{"id":"minecraft:attached_melon_stem","localizedName":"Attached Melon Stem","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:attached_pumpkin_stem","localizedName":"Attached Pumpkin Stem","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:azalea","localizedName":"Azalea","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:azalea_leaves","localizedName":"Azalea Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:azure_bluet","localizedName":"Azure Bluet","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bamboo","localizedName":"Bamboo","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bamboo_sapling","localizedName":"Bamboo Shoot","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":false,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:barrel","localizedName":"Barrel","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:barrier","localizedName":"Barrier","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:basalt","localizedName":"Basalt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:beacon","localizedName":"Beacon","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bedrock","localizedName":"Bedrock","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bee_nest","localizedName":"Bee Nest","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:beehive","localizedName":"Beehive","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:beetroots","localizedName":"Beetroots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bell","localizedName":"Bell","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":5.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:big_dripleaf","localizedName":"Big Dripleaf","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:big_dripleaf_stem","localizedName":"Big Dripleaf Stem","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_button","localizedName":"Birch Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_door","localizedName":"Birch Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_fence","localizedName":"Birch Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_fence_gate","localizedName":"Birch Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_leaves","localizedName":"Birch Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_log","localizedName":"Birch Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_planks","localizedName":"Birch Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_pressure_plate","localizedName":"Birch Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_sapling","localizedName":"Birch Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_sign","localizedName":"Birch Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_slab","localizedName":"Birch Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_stairs","localizedName":"Birch Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_trapdoor","localizedName":"Birch Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_wall_sign","localizedName":"Birch Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:birch_wood","localizedName":"Birch Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_banner","localizedName":"Black Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_bed","localizedName":"Black Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_candle","localizedName":"Black Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_candle_cake","localizedName":"Cake with Black Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_carpet","localizedName":"Black Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_concrete","localizedName":"Black Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:black_concrete_powder","localizedName":"Black Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_glazed_terracotta","localizedName":"Black Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:black_shulker_box","localizedName":"Black Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_stained_glass","localizedName":"Black Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_stained_glass_pane","localizedName":"Black Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_terracotta","localizedName":"Black Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:black_wall_banner","localizedName":"Black Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:black_wool","localizedName":"Black Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blackstone","localizedName":"Blackstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blackstone_slab","localizedName":"Blackstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blackstone_stairs","localizedName":"Blackstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blackstone_wall","localizedName":"Blackstone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blast_furnace","localizedName":"Blast Furnace","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blue_banner","localizedName":"Blue Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_bed","localizedName":"Blue Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_candle","localizedName":"Blue Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_candle_cake","localizedName":"Cake with Blue Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_carpet","localizedName":"Blue Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_concrete","localizedName":"Blue Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blue_concrete_powder","localizedName":"Blue Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_glazed_terracotta","localizedName":"Blue Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blue_ice","localizedName":"Blue Ice","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a0a0ff","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.8,"slipperiness":0.989,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_orchid","localizedName":"Blue Orchid","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_shulker_box","localizedName":"Blue Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_stained_glass","localizedName":"Blue Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_stained_glass_pane","localizedName":"Blue Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_terracotta","localizedName":"Blue Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:blue_wall_banner","localizedName":"Blue Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:blue_wool","localizedName":"Blue Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bone_block","localizedName":"Bone Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:bookshelf","localizedName":"Bookshelf","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brain_coral","localizedName":"Brain Coral","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brain_coral_block","localizedName":"Brain Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brain_coral_fan","localizedName":"Brain Coral Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brain_coral_wall_fan","localizedName":"Brain Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brewing_stand","localizedName":"Brewing Stand","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":true,"lightValue":1,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brick_slab","localizedName":"Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brick_stairs","localizedName":"Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brick_wall","localizedName":"Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:bricks","localizedName":"Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brown_banner","localizedName":"Brown Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_bed","localizedName":"Brown Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_candle","localizedName":"Brown Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_candle_cake","localizedName":"Cake with Brown Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_carpet","localizedName":"Brown Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_concrete","localizedName":"Brown Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brown_concrete_powder","localizedName":"Brown Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_glazed_terracotta","localizedName":"Brown Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brown_mushroom","localizedName":"Brown Mushroom","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":1,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_mushroom_block","localizedName":"Brown Mushroom Block","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_shulker_box","localizedName":"Brown Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_stained_glass","localizedName":"Brown Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_stained_glass_pane","localizedName":"Brown Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_terracotta","localizedName":"Brown Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:brown_wall_banner","localizedName":"Brown Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:brown_wool","localizedName":"Brown Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bubble_column","localizedName":"Bubble Column","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":true,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bubble_coral","localizedName":"Bubble Coral","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bubble_coral_block","localizedName":"Bubble Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:bubble_coral_fan","localizedName":"Bubble Coral Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:bubble_coral_wall_fan","localizedName":"Bubble Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:budding_amethyst","localizedName":"Budding Amethyst","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cactus","localizedName":"Cactus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cake","localizedName":"Cake","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:calcite","localizedName":"Calcite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:campfire","localizedName":"Campfire","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":true,"lightValue":15,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:candle","localizedName":"Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:candle_cake","localizedName":"Cake with Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:carrots","localizedName":"Carrots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cartography_table","localizedName":"Cartography Table","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:carved_pumpkin","localizedName":"Carved Pumpkin","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cauldron","localizedName":"Cauldron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cave_air","localizedName":"Cave Air","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cave_vines","localizedName":"Cave Vines","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cave_vines_plant","localizedName":"Cave Vines Plant","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:chain","localizedName":"Chain","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chain_command_block","localizedName":"Chain Command Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chest","localizedName":"Chest","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:chipped_anvil","localizedName":"Chipped Anvil","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":true}},{"id":"minecraft:chiseled_deepslate","localizedName":"Chiseled Deepslate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_nether_bricks","localizedName":"Chiseled Nether Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_polished_blackstone","localizedName":"Chiseled Polished Blackstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_quartz_block","localizedName":"Chiseled Quartz Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_red_sandstone","localizedName":"Chiseled Red Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_sandstone","localizedName":"Chiseled Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chiseled_stone_bricks","localizedName":"Chiseled Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:chorus_flower","localizedName":"Chorus Flower","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:chorus_plant","localizedName":"Chorus Plant","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:clay","localizedName":"Clay","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:coal_block","localizedName":"Block of Coal","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:coal_ore","localizedName":"Coal Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:coarse_dirt","localizedName":"Coarse Dirt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cobbled_deepslate","localizedName":"Cobbled Deepslate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobbled_deepslate_slab","localizedName":"Cobbled Deepslate Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobbled_deepslate_stairs","localizedName":"Cobbled Deepslate Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobbled_deepslate_wall","localizedName":"Cobbled Deepslate Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobblestone","localizedName":"Cobblestone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobblestone_slab","localizedName":"Cobblestone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobblestone_stairs","localizedName":"Cobblestone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobblestone_wall","localizedName":"Cobblestone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cobweb","localizedName":"Cobweb","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":4.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cocoa","localizedName":"Cocoa","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:command_block","localizedName":"Command Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:comparator","localizedName":"Redstone Comparator","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:composter","localizedName":"Composter","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:conduit","localizedName":"Conduit","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:copper_block","localizedName":"Block of Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:copper_ore","localizedName":"Copper Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cornflower","localizedName":"Cornflower","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cracked_deepslate_bricks","localizedName":"Cracked Deepslate Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cracked_deepslate_tiles","localizedName":"Cracked Deepslate Tiles","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cracked_nether_bricks","localizedName":"Cracked Nether Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cracked_polished_blackstone_bricks","localizedName":"Cracked Polished Blackstone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cracked_stone_bricks","localizedName":"Cracked Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:crafting_table","localizedName":"Crafting Table","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:creeper_head","localizedName":"Creeper Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:creeper_wall_head","localizedName":"Creeper Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_button","localizedName":"Crimson Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_door","localizedName":"Crimson Door","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_fence","localizedName":"Crimson Fence","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_fence_gate","localizedName":"Crimson Fence Gate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_fungus","localizedName":"Crimson Fungus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_hyphae","localizedName":"Crimson Hyphae","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_nylium","localizedName":"Crimson Nylium","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:crimson_planks","localizedName":"Crimson Planks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_pressure_plate","localizedName":"Crimson Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_roots","localizedName":"Crimson Roots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_sign","localizedName":"Crimson Sign","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_slab","localizedName":"Crimson Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_stairs","localizedName":"Crimson Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_stem","localizedName":"Crimson Stem","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_trapdoor","localizedName":"Crimson Trapdoor","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crimson_wall_sign","localizedName":"Crimson Sign","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:crying_obsidian","localizedName":"Crying Obsidian","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":50.0,"hasContainer":false,"lightValue":10,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_copper","localizedName":"Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_copper_slab","localizedName":"Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_copper_stairs","localizedName":"Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_red_sandstone","localizedName":"Cut Red Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_red_sandstone_slab","localizedName":"Cut Red Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_sandstone","localizedName":"Cut Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cut_sandstone_slab","localizedName":"Cut Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cyan_banner","localizedName":"Cyan Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_bed","localizedName":"Cyan Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_candle","localizedName":"Cyan Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_candle_cake","localizedName":"Cake with Cyan Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_carpet","localizedName":"Cyan Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_concrete","localizedName":"Cyan Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cyan_concrete_powder","localizedName":"Cyan Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_glazed_terracotta","localizedName":"Cyan Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cyan_shulker_box","localizedName":"Cyan Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_stained_glass","localizedName":"Cyan Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_stained_glass_pane","localizedName":"Cyan Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_terracotta","localizedName":"Cyan Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:cyan_wall_banner","localizedName":"Cyan Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:cyan_wool","localizedName":"Cyan Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:damaged_anvil","localizedName":"Damaged Anvil","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":true}},{"id":"minecraft:dandelion","localizedName":"Dandelion","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_button","localizedName":"Dark Oak Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_door","localizedName":"Dark Oak Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_fence","localizedName":"Dark Oak Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_fence_gate","localizedName":"Dark Oak Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_leaves","localizedName":"Dark Oak Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_log","localizedName":"Dark Oak Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_planks","localizedName":"Dark Oak Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_pressure_plate","localizedName":"Dark Oak Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_sapling","localizedName":"Dark Oak Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_sign","localizedName":"Dark Oak Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_slab","localizedName":"Dark Oak Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_stairs","localizedName":"Dark Oak Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_trapdoor","localizedName":"Dark Oak Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_wall_sign","localizedName":"Dark Oak Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_oak_wood","localizedName":"Dark Oak Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dark_prismarine","localizedName":"Dark Prismarine","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dark_prismarine_slab","localizedName":"Dark Prismarine Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dark_prismarine_stairs","localizedName":"Dark Prismarine Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:daylight_detector","localizedName":"Daylight Detector","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dead_brain_coral","localizedName":"Dead Brain Coral","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_brain_coral_block","localizedName":"Dead Brain Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_brain_coral_fan","localizedName":"Dead Brain Coral Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_brain_coral_wall_fan","localizedName":"Dead Brain Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_bubble_coral","localizedName":"Dead Bubble Coral","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_bubble_coral_block","localizedName":"Dead Bubble Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_bubble_coral_fan","localizedName":"Dead Bubble Coral Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_bubble_coral_wall_fan","localizedName":"Dead Bubble Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_bush","localizedName":"Dead Bush","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dead_fire_coral","localizedName":"Dead Fire Coral","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_fire_coral_block","localizedName":"Dead Fire Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_fire_coral_fan","localizedName":"Dead Fire Coral Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_fire_coral_wall_fan","localizedName":"Dead Fire Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_horn_coral","localizedName":"Dead Horn Coral","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_horn_coral_block","localizedName":"Dead Horn Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_horn_coral_fan","localizedName":"Dead Horn Coral Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_horn_coral_wall_fan","localizedName":"Dead Horn Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_tube_coral","localizedName":"Dead Tube Coral","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_tube_coral_block","localizedName":"Dead Tube Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_tube_coral_fan","localizedName":"Dead Tube Coral Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dead_tube_coral_wall_fan","localizedName":"Dead Tube Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate","localizedName":"Deepslate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_brick_slab","localizedName":"Deepslate Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_brick_stairs","localizedName":"Deepslate Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_brick_wall","localizedName":"Deepslate Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_bricks","localizedName":"Deepslate Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_coal_ore","localizedName":"Deepslate Coal Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_copper_ore","localizedName":"Deepslate Copper Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_diamond_ore","localizedName":"Deepslate Diamond Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_emerald_ore","localizedName":"Deepslate Emerald Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_gold_ore","localizedName":"Deepslate Gold Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_iron_ore","localizedName":"Deepslate Iron Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_lapis_ore","localizedName":"Deepslate Lapis Lazuli Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_redstone_ore","localizedName":"Deepslate Redstone Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":4.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_tile_slab","localizedName":"Deepslate Tile Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_tile_stairs","localizedName":"Deepslate Tile Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_tile_wall","localizedName":"Deepslate Tile Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:deepslate_tiles","localizedName":"Deepslate Tiles","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:detector_rail","localizedName":"Detector Rail","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.7,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.7,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:diamond_block","localizedName":"Block of Diamond","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:diamond_ore","localizedName":"Diamond Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:diorite","localizedName":"Diorite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:diorite_slab","localizedName":"Diorite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:diorite_stairs","localizedName":"Diorite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:diorite_wall","localizedName":"Diorite Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dirt","localizedName":"Dirt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dirt_path","localizedName":"Dirt Path","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.65,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.65,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dispenser","localizedName":"Dispenser","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dragon_egg","localizedName":"Dragon Egg","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":1,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dragon_head","localizedName":"Dragon Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dragon_wall_head","localizedName":"Dragon Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dried_kelp_block","localizedName":"Dried Kelp Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:dripstone_block","localizedName":"Dripstone Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:dropper","localizedName":"Dropper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:emerald_block","localizedName":"Block of Emerald","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:emerald_ore","localizedName":"Emerald Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:enchanting_table","localizedName":"Enchanting Table","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:end_gateway","localizedName":"End Gateway","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:end_portal","localizedName":"End Portal","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:end_portal_frame","localizedName":"End Portal Frame","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":1,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:end_rod","localizedName":"End Rod","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":14,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:end_stone","localizedName":"End Stone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:end_stone_brick_slab","localizedName":"End Stone Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:end_stone_brick_stairs","localizedName":"End Stone Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:end_stone_brick_wall","localizedName":"End Stone Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:end_stone_bricks","localizedName":"End Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":9.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:ender_chest","localizedName":"Ender Chest","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":22.5,"hasContainer":false,"lightValue":7,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":600.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:exposed_copper","localizedName":"Exposed Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:exposed_cut_copper","localizedName":"Exposed Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:exposed_cut_copper_slab","localizedName":"Exposed Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:exposed_cut_copper_stairs","localizedName":"Exposed Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:farmland","localizedName":"Farmland","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fern","localizedName":"Fern","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fire","localizedName":"Fire","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fire_coral","localizedName":"Fire Coral","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fire_coral_block","localizedName":"Fire Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:fire_coral_fan","localizedName":"Fire Coral Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fire_coral_wall_fan","localizedName":"Fire Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:fletching_table","localizedName":"Fletching Table","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:flower_pot","localizedName":"Flower Pot","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:flowering_azalea","localizedName":"Flowering Azalea","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:flowering_azalea_leaves","localizedName":"Flowering Azalea Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:frosted_ice","localizedName":"Frosted Ice","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a0a0ff","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.98,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:furnace","localizedName":"Furnace","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:gilded_blackstone","localizedName":"Gilded Blackstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:glass","localizedName":"Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:glass_pane","localizedName":"Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:glow_lichen","localizedName":"Glow Lichen","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.2,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:glowstone","localizedName":"Glowstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gold_block","localizedName":"Block of Gold","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:gold_ore","localizedName":"Gold Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:granite","localizedName":"Granite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:granite_slab","localizedName":"Granite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:granite_stairs","localizedName":"Granite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:granite_wall","localizedName":"Granite Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:grass","localizedName":"Grass","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:grass_block","localizedName":"Grass Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gravel","localizedName":"Gravel","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_banner","localizedName":"Gray Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_bed","localizedName":"Gray Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_candle","localizedName":"Gray Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_candle_cake","localizedName":"Cake with Gray Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_carpet","localizedName":"Gray Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_concrete","localizedName":"Gray Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:gray_concrete_powder","localizedName":"Gray Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_glazed_terracotta","localizedName":"Gray Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:gray_shulker_box","localizedName":"Gray Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_stained_glass","localizedName":"Gray Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_stained_glass_pane","localizedName":"Gray Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_terracotta","localizedName":"Gray Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:gray_wall_banner","localizedName":"Gray Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:gray_wool","localizedName":"Gray Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_banner","localizedName":"Green Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_bed","localizedName":"Green Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_candle","localizedName":"Green Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_candle_cake","localizedName":"Cake with Green Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_carpet","localizedName":"Green Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_concrete","localizedName":"Green Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:green_concrete_powder","localizedName":"Green Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_glazed_terracotta","localizedName":"Green Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:green_shulker_box","localizedName":"Green Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_stained_glass","localizedName":"Green Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_stained_glass_pane","localizedName":"Green Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_terracotta","localizedName":"Green Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:green_wall_banner","localizedName":"Green Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:green_wool","localizedName":"Green Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:grindstone","localizedName":"Grindstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":true}},{"id":"minecraft:hanging_roots","localizedName":"Hanging Roots","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:hay_block","localizedName":"Hay Bale","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:heavy_weighted_pressure_plate","localizedName":"Heavy Weighted Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:honey_block","localizedName":"Honey Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:honeycomb_block","localizedName":"Honeycomb Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:hopper","localizedName":"Hopper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:horn_coral","localizedName":"Horn Coral","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:horn_coral_block","localizedName":"Horn Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:horn_coral_fan","localizedName":"Horn Coral Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:horn_coral_wall_fan","localizedName":"Horn Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:ice","localizedName":"Ice","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a0a0ff","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.98,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_chiseled_stone_bricks","localizedName":"Infested Chiseled Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_cobblestone","localizedName":"Infested Cobblestone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_cracked_stone_bricks","localizedName":"Infested Cracked Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_deepslate","localizedName":"Infested Deepslate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_mossy_stone_bricks","localizedName":"Infested Mossy Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_stone","localizedName":"Infested Stone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:infested_stone_bricks","localizedName":"Infested Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.75,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.75,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:iron_bars","localizedName":"Iron Bars","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:iron_block","localizedName":"Block of Iron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:iron_door","localizedName":"Iron Door","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":5.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:iron_ore","localizedName":"Iron Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:iron_trapdoor","localizedName":"Iron Trapdoor","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":5.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:jack_o_lantern","localizedName":"Jack o\u0027Lantern","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jigsaw","localizedName":"Jigsaw Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:jukebox","localizedName":"Jukebox","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_button","localizedName":"Jungle Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_door","localizedName":"Jungle Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_fence","localizedName":"Jungle Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_fence_gate","localizedName":"Jungle Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_leaves","localizedName":"Jungle Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_log","localizedName":"Jungle Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_planks","localizedName":"Jungle Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_pressure_plate","localizedName":"Jungle Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_sapling","localizedName":"Jungle Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_sign","localizedName":"Jungle Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_slab","localizedName":"Jungle Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_stairs","localizedName":"Jungle Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_trapdoor","localizedName":"Jungle Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_wall_sign","localizedName":"Jungle Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:jungle_wood","localizedName":"Jungle Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:kelp","localizedName":"Kelp","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:kelp_plant","localizedName":"Kelp Plant","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:ladder","localizedName":"Ladder","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lantern","localizedName":"Lantern","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lapis_block","localizedName":"Block of Lapis Lazuli","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lapis_ore","localizedName":"Lapis Lazuli Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:large_amethyst_bud","localizedName":"Large Amethyst Bud","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":4,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:large_fern","localizedName":"Large Fern","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lava","localizedName":"Lava","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":100.0,"hasContainer":false,"lightValue":15,"liquid":true,"mapColor":"#ff0000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":100.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lava_cauldron","localizedName":"Lava Cauldron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lectern","localizedName":"Lectern","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lever","localizedName":"Lever","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light","localizedName":"Light","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":3600000.8,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_banner","localizedName":"Light Blue Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_bed","localizedName":"Light Blue Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_candle","localizedName":"Light Blue Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_candle_cake","localizedName":"Cake with Light Blue Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_carpet","localizedName":"Light Blue Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_concrete","localizedName":"Light Blue Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_blue_concrete_powder","localizedName":"Light Blue Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_glazed_terracotta","localizedName":"Light Blue Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_blue_shulker_box","localizedName":"Light Blue Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_stained_glass","localizedName":"Light Blue Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_stained_glass_pane","localizedName":"Light Blue Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_terracotta","localizedName":"Light Blue Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_blue_wall_banner","localizedName":"Light Blue Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_blue_wool","localizedName":"Light Blue Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_banner","localizedName":"Light Gray Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_bed","localizedName":"Light Gray Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_candle","localizedName":"Light Gray Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_candle_cake","localizedName":"Cake with Light Gray Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_carpet","localizedName":"Light Gray Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_concrete","localizedName":"Light Gray Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_gray_concrete_powder","localizedName":"Light Gray Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_glazed_terracotta","localizedName":"Light Gray Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_gray_shulker_box","localizedName":"Light Gray Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_stained_glass","localizedName":"Light Gray Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_stained_glass_pane","localizedName":"Light Gray Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_terracotta","localizedName":"Light Gray Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:light_gray_wall_banner","localizedName":"Light Gray Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_gray_wool","localizedName":"Light Gray Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:light_weighted_pressure_plate","localizedName":"Light Weighted Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lightning_rod","localizedName":"Lightning Rod","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lilac","localizedName":"Lilac","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lily_of_the_valley","localizedName":"Lily of the Valley","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lily_pad","localizedName":"Lily Pad","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_banner","localizedName":"Lime Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_bed","localizedName":"Lime Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_candle","localizedName":"Lime Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_candle_cake","localizedName":"Cake with Lime Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_carpet","localizedName":"Lime Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_concrete","localizedName":"Lime Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lime_concrete_powder","localizedName":"Lime Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_glazed_terracotta","localizedName":"Lime Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lime_shulker_box","localizedName":"Lime Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_stained_glass","localizedName":"Lime Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_stained_glass_pane","localizedName":"Lime Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_terracotta","localizedName":"Lime Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:lime_wall_banner","localizedName":"Lime Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lime_wool","localizedName":"Lime Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:lodestone","localizedName":"Lodestone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":true}},{"id":"minecraft:loom","localizedName":"Loom","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_banner","localizedName":"Magenta Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_bed","localizedName":"Magenta Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_candle","localizedName":"Magenta Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_candle_cake","localizedName":"Cake with Magenta Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_carpet","localizedName":"Magenta Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_concrete","localizedName":"Magenta Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:magenta_concrete_powder","localizedName":"Magenta Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_glazed_terracotta","localizedName":"Magenta Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:magenta_shulker_box","localizedName":"Magenta Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_stained_glass","localizedName":"Magenta Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_stained_glass_pane","localizedName":"Magenta Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_terracotta","localizedName":"Magenta Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:magenta_wall_banner","localizedName":"Magenta Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magenta_wool","localizedName":"Magenta Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:magma_block","localizedName":"Magma Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":3,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:medium_amethyst_bud","localizedName":"Medium Amethyst Bud","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":2,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:melon","localizedName":"Melon","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:melon_stem","localizedName":"Melon Stem","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:moss_block","localizedName":"Moss Block","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:moss_carpet","localizedName":"Moss Carpet","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:mossy_cobblestone","localizedName":"Mossy Cobblestone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_cobblestone_slab","localizedName":"Mossy Cobblestone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_cobblestone_stairs","localizedName":"Mossy Cobblestone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_cobblestone_wall","localizedName":"Mossy Cobblestone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_stone_brick_slab","localizedName":"Mossy Stone Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_stone_brick_stairs","localizedName":"Mossy Stone Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_stone_brick_wall","localizedName":"Mossy Stone Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:mossy_stone_bricks","localizedName":"Mossy Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:moving_piston","localizedName":"Moving Piston","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:mushroom_stem","localizedName":"Mushroom Stem","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:mycelium","localizedName":"Mycelium","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:nether_brick_fence","localizedName":"Nether Brick Fence","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_brick_slab","localizedName":"Nether Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_brick_stairs","localizedName":"Nether Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_brick_wall","localizedName":"Nether Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_bricks","localizedName":"Nether Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_gold_ore","localizedName":"Nether Gold Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_portal","localizedName":"Nether Portal","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":-1.0,"hasContainer":false,"lightValue":11,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":true}},{"id":"minecraft:nether_quartz_ore","localizedName":"Nether Quartz Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:nether_sprouts","localizedName":"Nether Sprouts","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:nether_wart","localizedName":"Nether Wart","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:nether_wart_block","localizedName":"Nether Wart Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:netherite_block","localizedName":"Block of Netherite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":50.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:netherrack","localizedName":"Netherrack","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:note_block","localizedName":"Note Block","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_button","localizedName":"Oak Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_door","localizedName":"Oak Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_fence","localizedName":"Oak Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_fence_gate","localizedName":"Oak Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_leaves","localizedName":"Oak Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_log","localizedName":"Oak Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_planks","localizedName":"Oak Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_pressure_plate","localizedName":"Oak Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_sapling","localizedName":"Oak Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_sign","localizedName":"Oak Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_slab","localizedName":"Oak Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_stairs","localizedName":"Oak Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_trapdoor","localizedName":"Oak Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_wall_sign","localizedName":"Oak Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oak_wood","localizedName":"Oak Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:observer","localizedName":"Observer","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:obsidian","localizedName":"Obsidian","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":50.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:orange_banner","localizedName":"Orange Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_bed","localizedName":"Orange Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_candle","localizedName":"Orange Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_candle_cake","localizedName":"Cake with Orange Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_carpet","localizedName":"Orange Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_concrete","localizedName":"Orange Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:orange_concrete_powder","localizedName":"Orange Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_glazed_terracotta","localizedName":"Orange Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:orange_shulker_box","localizedName":"Orange Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_stained_glass","localizedName":"Orange Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_stained_glass_pane","localizedName":"Orange Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_terracotta","localizedName":"Orange Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:orange_tulip","localizedName":"Orange Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_wall_banner","localizedName":"Orange Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:orange_wool","localizedName":"Orange Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oxeye_daisy","localizedName":"Oxeye Daisy","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:oxidized_copper","localizedName":"Oxidized Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:oxidized_cut_copper","localizedName":"Oxidized Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:oxidized_cut_copper_slab","localizedName":"Oxidized Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:oxidized_cut_copper_stairs","localizedName":"Oxidized Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:packed_ice","localizedName":"Packed Ice","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a0a0ff","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.98,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:peony","localizedName":"Peony","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:petrified_oak_slab","localizedName":"Petrified Oak Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:pink_banner","localizedName":"Pink Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_bed","localizedName":"Pink Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_candle","localizedName":"Pink Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_candle_cake","localizedName":"Cake with Pink Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_carpet","localizedName":"Pink Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_concrete","localizedName":"Pink Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:pink_concrete_powder","localizedName":"Pink Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_glazed_terracotta","localizedName":"Pink Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:pink_shulker_box","localizedName":"Pink Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_stained_glass","localizedName":"Pink Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_stained_glass_pane","localizedName":"Pink Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_terracotta","localizedName":"Pink Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:pink_tulip","localizedName":"Pink Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_wall_banner","localizedName":"Pink Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pink_wool","localizedName":"Pink Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:piston","localizedName":"Piston","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:piston_head","localizedName":"Piston Head","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:player_head","localizedName":"Player Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:player_wall_head","localizedName":"Player Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:podzol","localizedName":"Podzol","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pointed_dripstone","localizedName":"Pointed Dripstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:polished_andesite","localizedName":"Polished Andesite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_andesite_slab","localizedName":"Polished Andesite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_andesite_stairs","localizedName":"Polished Andesite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_basalt","localizedName":"Polished Basalt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone","localizedName":"Polished Blackstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_brick_slab","localizedName":"Polished Blackstone Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_brick_stairs","localizedName":"Polished Blackstone Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_brick_wall","localizedName":"Polished Blackstone Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_bricks","localizedName":"Polished Blackstone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_button","localizedName":"Polished Blackstone Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:polished_blackstone_pressure_plate","localizedName":"Polished Blackstone Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_slab","localizedName":"Polished Blackstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_stairs","localizedName":"Polished Blackstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_blackstone_wall","localizedName":"Polished Blackstone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_deepslate","localizedName":"Polished Deepslate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_deepslate_slab","localizedName":"Polished Deepslate Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_deepslate_stairs","localizedName":"Polished Deepslate Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_deepslate_wall","localizedName":"Polished Deepslate Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_diorite","localizedName":"Polished Diorite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_diorite_slab","localizedName":"Polished Diorite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_diorite_stairs","localizedName":"Polished Diorite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_granite","localizedName":"Polished Granite","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_granite_slab","localizedName":"Polished Granite Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:polished_granite_stairs","localizedName":"Polished Granite Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:poppy","localizedName":"Poppy","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potatoes","localizedName":"Potatoes","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_acacia_sapling","localizedName":"Potted Acacia Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_allium","localizedName":"Potted Allium","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_azalea_bush","localizedName":"Potted Azalea","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_azure_bluet","localizedName":"Potted Azure Bluet","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_bamboo","localizedName":"Potted Bamboo","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_birch_sapling","localizedName":"Potted Birch Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_blue_orchid","localizedName":"Potted Blue Orchid","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_brown_mushroom","localizedName":"Potted Brown Mushroom","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_cactus","localizedName":"Potted Cactus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_cornflower","localizedName":"Potted Cornflower","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_crimson_fungus","localizedName":"Potted Crimson Fungus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_crimson_roots","localizedName":"Potted Crimson Roots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_dandelion","localizedName":"Potted Dandelion","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_dark_oak_sapling","localizedName":"Potted Dark Oak Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_dead_bush","localizedName":"Potted Dead Bush","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_fern","localizedName":"Potted Fern","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_flowering_azalea_bush","localizedName":"Potted Flowering Azalea","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_jungle_sapling","localizedName":"Potted Jungle Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_lily_of_the_valley","localizedName":"Potted Lily of the Valley","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_oak_sapling","localizedName":"Potted Oak Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_orange_tulip","localizedName":"Potted Orange Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_oxeye_daisy","localizedName":"Potted Oxeye Daisy","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_pink_tulip","localizedName":"Potted Pink Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_poppy","localizedName":"Potted Poppy","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_red_mushroom","localizedName":"Potted Red Mushroom","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_red_tulip","localizedName":"Potted Red Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_spruce_sapling","localizedName":"Potted Spruce Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_warped_fungus","localizedName":"Potted Warped Fungus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_warped_roots","localizedName":"Potted Warped Roots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_white_tulip","localizedName":"Potted White Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:potted_wither_rose","localizedName":"Potted Wither Rose","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:powder_snow","localizedName":"Powder Snow","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#ffffff","movementBlocker":false,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.25,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:powder_snow_cauldron","localizedName":"Powder Snow Cauldron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:powered_rail","localizedName":"Powered Rail","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.7,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.7,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:prismarine","localizedName":"Prismarine","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_brick_slab","localizedName":"Prismarine Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_brick_stairs","localizedName":"Prismarine Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_bricks","localizedName":"Prismarine Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_slab","localizedName":"Prismarine Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_stairs","localizedName":"Prismarine Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:prismarine_wall","localizedName":"Prismarine Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:pumpkin","localizedName":"Pumpkin","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:pumpkin_stem","localizedName":"Pumpkin Stem","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_banner","localizedName":"Purple Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_bed","localizedName":"Purple Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_candle","localizedName":"Purple Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_candle_cake","localizedName":"Cake with Purple Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_carpet","localizedName":"Purple Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_concrete","localizedName":"Purple Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purple_concrete_powder","localizedName":"Purple Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_glazed_terracotta","localizedName":"Purple Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purple_shulker_box","localizedName":"Purple Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_stained_glass","localizedName":"Purple Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_stained_glass_pane","localizedName":"Purple Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_terracotta","localizedName":"Purple Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purple_wall_banner","localizedName":"Purple Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purple_wool","localizedName":"Purple Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:purpur_block","localizedName":"Purpur Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purpur_pillar","localizedName":"Purpur Pillar","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purpur_slab","localizedName":"Purpur Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:purpur_stairs","localizedName":"Purpur Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:quartz_block","localizedName":"Block of Quartz","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:quartz_bricks","localizedName":"Quartz Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:quartz_pillar","localizedName":"Quartz Pillar","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:quartz_slab","localizedName":"Quartz Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:quartz_stairs","localizedName":"Quartz Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:rail","localizedName":"Rail","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.7,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.7,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:raw_copper_block","localizedName":"Block of Raw Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:raw_gold_block","localizedName":"Block of Raw Gold","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:raw_iron_block","localizedName":"Block of Raw Iron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_banner","localizedName":"Red Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_bed","localizedName":"Red Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_candle","localizedName":"Red Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_candle_cake","localizedName":"Cake with Red Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_carpet","localizedName":"Red Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_concrete","localizedName":"Red Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_concrete_powder","localizedName":"Red Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_glazed_terracotta","localizedName":"Red Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_mushroom","localizedName":"Red Mushroom","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_mushroom_block","localizedName":"Red Mushroom Block","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_nether_brick_slab","localizedName":"Red Nether Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_nether_brick_stairs","localizedName":"Red Nether Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_nether_brick_wall","localizedName":"Red Nether Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_nether_bricks","localizedName":"Red Nether Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_sand","localizedName":"Red Sand","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_sandstone","localizedName":"Red Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_sandstone_slab","localizedName":"Red Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_sandstone_stairs","localizedName":"Red Sandstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_sandstone_wall","localizedName":"Red Sandstone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_shulker_box","localizedName":"Red Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_stained_glass","localizedName":"Red Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_stained_glass_pane","localizedName":"Red Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_terracotta","localizedName":"Red Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:red_tulip","localizedName":"Red Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_wall_banner","localizedName":"Red Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:red_wool","localizedName":"Red Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:redstone_block","localizedName":"Block of Redstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:redstone_lamp","localizedName":"Redstone Lamp","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:redstone_ore","localizedName":"Redstone Ore","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:redstone_torch","localizedName":"Redstone Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":7,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:redstone_wall_torch","localizedName":"Redstone Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":7,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:redstone_wire","localizedName":"Redstone Wire","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:repeater","localizedName":"Redstone Repeater","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:repeating_command_block","localizedName":"Repeating Command Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:respawn_anchor","localizedName":"Respawn Anchor","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":50.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1200.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:rooted_dirt","localizedName":"Rooted Dirt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:rose_bush","localizedName":"Rose Bush","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sand","localizedName":"Sand","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sandstone","localizedName":"Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:sandstone_slab","localizedName":"Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:sandstone_stairs","localizedName":"Sandstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:sandstone_wall","localizedName":"Sandstone Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:scaffolding","localizedName":"Scaffolding","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":true,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sculk_sensor","localizedName":"Sculk Sensor","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":1,"liquid":false,"mapColor":"#191919","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sea_lantern","localizedName":"Sea Lantern","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sea_pickle","localizedName":"Sea Pickle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":6,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:seagrass","localizedName":"Seagrass","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:shroomlight","localizedName":"Shroomlight","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":15,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:shulker_box","localizedName":"Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:skeleton_skull","localizedName":"Skeleton Skull","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:skeleton_wall_skull","localizedName":"Skeleton Skull","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:slime_block","localizedName":"Slime Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a4a8b8","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.8,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:small_amethyst_bud","localizedName":"Small Amethyst Bud","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":1,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:small_dripleaf","localizedName":"Small Dripleaf","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:smithing_table","localizedName":"Smithing Table","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:smoker","localizedName":"Smoker","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_basalt","localizedName":"Smooth Basalt","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_quartz","localizedName":"Smooth Quartz Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_quartz_slab","localizedName":"Smooth Quartz Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_quartz_stairs","localizedName":"Smooth Quartz Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_red_sandstone","localizedName":"Smooth Red Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_red_sandstone_slab","localizedName":"Smooth Red Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_red_sandstone_stairs","localizedName":"Smooth Red Sandstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_sandstone","localizedName":"Smooth Sandstone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_sandstone_slab","localizedName":"Smooth Sandstone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_sandstone_stairs","localizedName":"Smooth Sandstone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_stone","localizedName":"Smooth Stone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:smooth_stone_slab","localizedName":"Smooth Stone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:snow","localizedName":"Snow","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#ffffff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:snow_block","localizedName":"Snow Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#ffffff","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:soul_campfire","localizedName":"Soul Campfire","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":true,"lightValue":10,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:soul_fire","localizedName":"Soul Fire","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":10,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:soul_lantern","localizedName":"Soul Lantern","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":10,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:soul_sand","localizedName":"Soul Sand","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:soul_soil","localizedName":"Soul Soil","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#976d4d","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:soul_torch","localizedName":"Soul Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":10,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:soul_wall_torch","localizedName":"Soul Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":10,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spawner","localizedName":"Spawner","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":5.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":5.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:sponge","localizedName":"Sponge","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#e5e533","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spore_blossom","localizedName":"Spore Blossom","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_button","localizedName":"Spruce Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_door","localizedName":"Spruce Door","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_fence","localizedName":"Spruce Fence","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_fence_gate","localizedName":"Spruce Fence Gate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_leaves","localizedName":"Spruce Leaves","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":true,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_log","localizedName":"Spruce Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_planks","localizedName":"Spruce Planks","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_pressure_plate","localizedName":"Spruce Pressure Plate","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_sapling","localizedName":"Spruce Sapling","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_sign","localizedName":"Spruce Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_slab","localizedName":"Spruce Slab","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_stairs","localizedName":"Spruce Stairs","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_trapdoor","localizedName":"Spruce Trapdoor","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_wall_sign","localizedName":"Spruce Sign","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:spruce_wood","localizedName":"Spruce Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sticky_piston","localizedName":"Sticky Piston","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":true}},{"id":"minecraft:stone","localizedName":"Stone","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_brick_slab","localizedName":"Stone Brick Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_brick_stairs","localizedName":"Stone Brick Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_brick_wall","localizedName":"Stone Brick Wall","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_bricks","localizedName":"Stone Bricks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_button","localizedName":"Stone Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stone_pressure_plate","localizedName":"Stone Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_slab","localizedName":"Stone Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stone_stairs","localizedName":"Stone Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stonecutter","localizedName":"Stonecutter","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:stripped_acacia_log","localizedName":"Stripped Acacia Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_acacia_wood","localizedName":"Stripped Acacia Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_birch_log","localizedName":"Stripped Birch Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_birch_wood","localizedName":"Stripped Birch Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_crimson_hyphae","localizedName":"Stripped Crimson Hyphae","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_crimson_stem","localizedName":"Stripped Crimson Stem","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_dark_oak_log","localizedName":"Stripped Dark Oak Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_dark_oak_wood","localizedName":"Stripped Dark Oak Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_jungle_log","localizedName":"Stripped Jungle Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_jungle_wood","localizedName":"Stripped Jungle Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_oak_log","localizedName":"Stripped Oak Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_oak_wood","localizedName":"Stripped Oak Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_spruce_log","localizedName":"Stripped Spruce Log","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_spruce_wood","localizedName":"Stripped Spruce Wood","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_warped_hyphae","localizedName":"Stripped Warped Hyphae","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:stripped_warped_stem","localizedName":"Stripped Warped Stem","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:structure_block","localizedName":"Structure Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":-1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3600000.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:structure_void","localizedName":"Structure Void","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sugar_cane","localizedName":"Sugar Cane","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sunflower","localizedName":"Sunflower","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:sweet_berry_bush","localizedName":"Sweet Berry Bush","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tall_grass","localizedName":"Tall Grass","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tall_seagrass","localizedName":"Tall Seagrass","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:target","localizedName":"Target","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:terracotta","localizedName":"Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:tinted_glass","localizedName":"Tinted Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tnt","localizedName":"TNT","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#ff0000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:torch","localizedName":"Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":14,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:trapped_chest","localizedName":"Trapped Chest","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":2.5,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":2.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tripwire","localizedName":"Tripwire","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tripwire_hook","localizedName":"Tripwire Hook","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tube_coral","localizedName":"Tube Coral","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tube_coral_block","localizedName":"Tube Coral Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:tube_coral_fan","localizedName":"Tube Coral Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tube_coral_wall_fan","localizedName":"Tube Coral Wall Fan","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:tuff","localizedName":"Tuff","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:turtle_egg","localizedName":"Turtle Egg","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:twisting_vines","localizedName":"Twisting Vines","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:twisting_vines_plant","localizedName":"Twisting Vines Plant","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:vine","localizedName":"Vines","material":{"burnable":true,"fragileWhenPushed":true,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.2,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:void_air","localizedName":"Void Air","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wall_torch","localizedName":"Torch","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":14,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_button","localizedName":"Warped Button","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_door","localizedName":"Warped Door","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_fence","localizedName":"Warped Fence","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_fence_gate","localizedName":"Warped Fence Gate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_fungus","localizedName":"Warped Fungus","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_hyphae","localizedName":"Warped Hyphae","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_nylium","localizedName":"Warped Nylium","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.4,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:warped_planks","localizedName":"Warped Planks","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_pressure_plate","localizedName":"Warped Pressure Plate","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":true,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_roots","localizedName":"Warped Roots","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_sign","localizedName":"Warped Sign","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_slab","localizedName":"Warped Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_stairs","localizedName":"Warped Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_stem","localizedName":"Warped Stem","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_trapdoor","localizedName":"Warped Trapdoor","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":3.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_wall_sign","localizedName":"Warped Sign","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:warped_wart_block","localizedName":"Warped Wart Block","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#7fb238","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:water","localizedName":"Water","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":100.0,"hasContainer":false,"lightValue":0,"liquid":true,"mapColor":"#4040ff","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":true,"resistance":100.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:water_cauldron","localizedName":"Water Cauldron","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_copper_block","localizedName":"Waxed Block of Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_cut_copper","localizedName":"Waxed Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_cut_copper_slab","localizedName":"Waxed Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_cut_copper_stairs","localizedName":"Waxed Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_exposed_copper","localizedName":"Waxed Exposed Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_exposed_cut_copper","localizedName":"Waxed Exposed Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_exposed_cut_copper_slab","localizedName":"Waxed Exposed Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_exposed_cut_copper_stairs","localizedName":"Waxed Exposed Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_oxidized_copper","localizedName":"Waxed Oxidized Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_oxidized_cut_copper","localizedName":"Waxed Oxidized Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_oxidized_cut_copper_slab","localizedName":"Waxed Oxidized Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","localizedName":"Waxed Oxidized Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_weathered_copper","localizedName":"Waxed Weathered Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_weathered_cut_copper","localizedName":"Waxed Weathered Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_weathered_cut_copper_slab","localizedName":"Waxed Weathered Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:waxed_weathered_cut_copper_stairs","localizedName":"Waxed Weathered Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:weathered_copper","localizedName":"Weathered Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:weathered_cut_copper","localizedName":"Weathered Cut Copper","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:weathered_cut_copper_slab","localizedName":"Weathered Cut Copper Slab","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:weathered_cut_copper_stairs","localizedName":"Weathered Cut Copper Stairs","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":3.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#a7a7a7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":6.0,"slipperiness":0.6,"solid":true,"ticksRandomly":true,"toolRequired":true,"unpushable":false}},{"id":"minecraft:weeping_vines","localizedName":"Weeping Vines","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:weeping_vines_plant","localizedName":"Weeping Vines Plant","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wet_sponge","localizedName":"Wet Sponge","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.6,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#e5e533","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.6,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wheat","localizedName":"Wheat Crops","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":true,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_banner","localizedName":"White Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_bed","localizedName":"White Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_candle","localizedName":"White Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_candle_cake","localizedName":"Cake with White Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_carpet","localizedName":"White Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_concrete","localizedName":"White Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:white_concrete_powder","localizedName":"White Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_glazed_terracotta","localizedName":"White Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:white_shulker_box","localizedName":"White Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_stained_glass","localizedName":"White Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_stained_glass_pane","localizedName":"White Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_terracotta","localizedName":"White Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:white_tulip","localizedName":"White Tulip","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_wall_banner","localizedName":"White Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:white_wool","localizedName":"White Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wither_rose","localizedName":"Wither Rose","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#007c00","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wither_skeleton_skull","localizedName":"Wither Skeleton Skull","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:wither_skeleton_wall_skull","localizedName":"Wither Skeleton Skull","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_banner","localizedName":"Yellow Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_bed","localizedName":"Yellow Bed","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.2,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_candle","localizedName":"Yellow Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_candle_cake","localizedName":"Cake with Yellow Candle","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_carpet","localizedName":"Yellow Carpet","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":0.1,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.1,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_concrete","localizedName":"Yellow Concrete","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:yellow_concrete_powder","localizedName":"Yellow Concrete Powder","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.5,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#f7e9a3","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.5,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_glazed_terracotta","localizedName":"Yellow Glazed Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.4,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.4,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:yellow_shulker_box","localizedName":"Yellow Shulker Box","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":2.0,"hasContainer":true,"lightValue":0,"liquid":false,"mapColor":"#7f3fb2","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":2.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_stained_glass","localizedName":"Yellow Stained Glass","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_stained_glass_pane","localizedName":"Yellow Stained Glass Pane","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":false,"hardness":0.3,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":true,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.3,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_terracotta","localizedName":"Yellow Terracotta","material":{"burnable":false,"fragileWhenPushed":false,"fullCube":true,"hardness":1.25,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#707070","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":4.2,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":true,"unpushable":false}},{"id":"minecraft:yellow_wall_banner","localizedName":"Yellow Banner","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#8f7748","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:yellow_wool","localizedName":"Yellow Wool","material":{"burnable":true,"fragileWhenPushed":false,"fullCube":true,"hardness":0.8,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#c7c7c7","movementBlocker":true,"opaque":true,"powerSource":false,"replacedDuringPlacement":false,"resistance":0.8,"slipperiness":0.6,"solid":true,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:zombie_head","localizedName":"Zombie Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}},{"id":"minecraft:zombie_wall_head","localizedName":"Zombie Head","material":{"burnable":false,"fragileWhenPushed":true,"fullCube":false,"hardness":1.0,"hasContainer":false,"lightValue":0,"liquid":false,"mapColor":"#000000","movementBlocker":false,"opaque":false,"powerSource":false,"replacedDuringPlacement":false,"resistance":1.0,"slipperiness":0.6,"solid":false,"ticksRandomly":false,"toolRequired":false,"unpushable":false}}] diff --git a/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/items.117.json b/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/items.117.json new file mode 100644 index 000000000..ed74d4d09 --- /dev/null +++ b/worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/items.117.json @@ -0,0 +1 @@ +[{"id":"minecraft:acacia_boat","localizedName":"Acacia Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.acacia_boat"},{"id":"minecraft:acacia_button","localizedName":"Acacia Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_button"},{"id":"minecraft:acacia_door","localizedName":"Acacia Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_door"},{"id":"minecraft:acacia_fence","localizedName":"Acacia Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_fence"},{"id":"minecraft:acacia_fence_gate","localizedName":"Acacia Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_fence_gate"},{"id":"minecraft:acacia_leaves","localizedName":"Acacia Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_leaves"},{"id":"minecraft:acacia_log","localizedName":"Acacia Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_log"},{"id":"minecraft:acacia_planks","localizedName":"Acacia Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_planks"},{"id":"minecraft:acacia_pressure_plate","localizedName":"Acacia Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_pressure_plate"},{"id":"minecraft:acacia_sapling","localizedName":"Acacia Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_sapling"},{"id":"minecraft:acacia_sign","localizedName":"Acacia Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.acacia_sign"},{"id":"minecraft:acacia_slab","localizedName":"Acacia Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_slab"},{"id":"minecraft:acacia_stairs","localizedName":"Acacia Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_stairs"},{"id":"minecraft:acacia_trapdoor","localizedName":"Acacia Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_trapdoor"},{"id":"minecraft:acacia_wood","localizedName":"Acacia Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.acacia_wood"},{"id":"minecraft:activator_rail","localizedName":"Activator Rail","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.activator_rail"},{"id":"minecraft:air","localizedName":"Air","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.air"},{"id":"minecraft:allium","localizedName":"Allium","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.allium"},{"id":"minecraft:amethyst_block","localizedName":"Block of Amethyst","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.amethyst_block"},{"id":"minecraft:amethyst_cluster","localizedName":"Amethyst Cluster","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.amethyst_cluster"},{"id":"minecraft:amethyst_shard","localizedName":"Amethyst Shard","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.amethyst_shard"},{"id":"minecraft:ancient_debris","localizedName":"Ancient Debris","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.ancient_debris"},{"id":"minecraft:andesite","localizedName":"Andesite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.andesite"},{"id":"minecraft:andesite_slab","localizedName":"Andesite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.andesite_slab"},{"id":"minecraft:andesite_stairs","localizedName":"Andesite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.andesite_stairs"},{"id":"minecraft:andesite_wall","localizedName":"Andesite Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.andesite_wall"},{"id":"minecraft:anvil","localizedName":"Anvil","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.anvil"},{"id":"minecraft:apple","localizedName":"Apple","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.apple"},{"id":"minecraft:armor_stand","localizedName":"Armor Stand","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.armor_stand"},{"id":"minecraft:arrow","localizedName":"Arrow","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.arrow"},{"id":"minecraft:axolotl_bucket","localizedName":"Bucket of Axolotl","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.axolotl_bucket"},{"id":"minecraft:axolotl_spawn_egg","localizedName":"Axolotl Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.axolotl_spawn_egg"},{"id":"minecraft:azalea","localizedName":"Azalea","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.azalea"},{"id":"minecraft:azalea_leaves","localizedName":"Azalea Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.azalea_leaves"},{"id":"minecraft:azure_bluet","localizedName":"Azure Bluet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.azure_bluet"},{"id":"minecraft:baked_potato","localizedName":"Baked Potato","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.baked_potato"},{"id":"minecraft:bamboo","localizedName":"Bamboo","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bamboo"},{"id":"minecraft:barrel","localizedName":"Barrel","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.barrel"},{"id":"minecraft:barrier","localizedName":"Barrier","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.barrier"},{"id":"minecraft:basalt","localizedName":"Basalt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.basalt"},{"id":"minecraft:bat_spawn_egg","localizedName":"Bat Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bat_spawn_egg"},{"id":"minecraft:beacon","localizedName":"Beacon","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.beacon"},{"id":"minecraft:bedrock","localizedName":"Bedrock","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bedrock"},{"id":"minecraft:bee_nest","localizedName":"Bee Nest","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bee_nest"},{"id":"minecraft:bee_spawn_egg","localizedName":"Bee Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bee_spawn_egg"},{"id":"minecraft:beef","localizedName":"Raw Beef","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.beef"},{"id":"minecraft:beehive","localizedName":"Beehive","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.beehive"},{"id":"minecraft:beetroot","localizedName":"Beetroot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.beetroot"},{"id":"minecraft:beetroot_seeds","localizedName":"Beetroot Seeds","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.beetroot_seeds"},{"id":"minecraft:beetroot_soup","localizedName":"Beetroot Soup","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.beetroot_soup"},{"id":"minecraft:bell","localizedName":"Bell","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bell"},{"id":"minecraft:big_dripleaf","localizedName":"Big Dripleaf","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.big_dripleaf"},{"id":"minecraft:birch_boat","localizedName":"Birch Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.birch_boat"},{"id":"minecraft:birch_button","localizedName":"Birch Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_button"},{"id":"minecraft:birch_door","localizedName":"Birch Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_door"},{"id":"minecraft:birch_fence","localizedName":"Birch Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_fence"},{"id":"minecraft:birch_fence_gate","localizedName":"Birch Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_fence_gate"},{"id":"minecraft:birch_leaves","localizedName":"Birch Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_leaves"},{"id":"minecraft:birch_log","localizedName":"Birch Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_log"},{"id":"minecraft:birch_planks","localizedName":"Birch Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_planks"},{"id":"minecraft:birch_pressure_plate","localizedName":"Birch Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_pressure_plate"},{"id":"minecraft:birch_sapling","localizedName":"Birch Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_sapling"},{"id":"minecraft:birch_sign","localizedName":"Birch Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.birch_sign"},{"id":"minecraft:birch_slab","localizedName":"Birch Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_slab"},{"id":"minecraft:birch_stairs","localizedName":"Birch Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_stairs"},{"id":"minecraft:birch_trapdoor","localizedName":"Birch Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_trapdoor"},{"id":"minecraft:birch_wood","localizedName":"Birch Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.birch_wood"},{"id":"minecraft:black_banner","localizedName":"Black Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.black_banner"},{"id":"minecraft:black_bed","localizedName":"Black Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.black_bed"},{"id":"minecraft:black_candle","localizedName":"Black Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_candle"},{"id":"minecraft:black_carpet","localizedName":"Black Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_carpet"},{"id":"minecraft:black_concrete","localizedName":"Black Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_concrete"},{"id":"minecraft:black_concrete_powder","localizedName":"Black Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_concrete_powder"},{"id":"minecraft:black_dye","localizedName":"Black Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.black_dye"},{"id":"minecraft:black_glazed_terracotta","localizedName":"Black Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_glazed_terracotta"},{"id":"minecraft:black_shulker_box","localizedName":"Black Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.black_shulker_box"},{"id":"minecraft:black_stained_glass","localizedName":"Black Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_stained_glass"},{"id":"minecraft:black_stained_glass_pane","localizedName":"Black Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_stained_glass_pane"},{"id":"minecraft:black_terracotta","localizedName":"Black Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_terracotta"},{"id":"minecraft:black_wool","localizedName":"Black Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.black_wool"},{"id":"minecraft:blackstone","localizedName":"Blackstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blackstone"},{"id":"minecraft:blackstone_slab","localizedName":"Blackstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blackstone_slab"},{"id":"minecraft:blackstone_stairs","localizedName":"Blackstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blackstone_stairs"},{"id":"minecraft:blackstone_wall","localizedName":"Blackstone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blackstone_wall"},{"id":"minecraft:blast_furnace","localizedName":"Blast Furnace","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blast_furnace"},{"id":"minecraft:blaze_powder","localizedName":"Blaze Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.blaze_powder"},{"id":"minecraft:blaze_rod","localizedName":"Blaze Rod","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.blaze_rod"},{"id":"minecraft:blaze_spawn_egg","localizedName":"Blaze Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.blaze_spawn_egg"},{"id":"minecraft:blue_banner","localizedName":"Blue Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.blue_banner"},{"id":"minecraft:blue_bed","localizedName":"Blue Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.blue_bed"},{"id":"minecraft:blue_candle","localizedName":"Blue Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_candle"},{"id":"minecraft:blue_carpet","localizedName":"Blue Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_carpet"},{"id":"minecraft:blue_concrete","localizedName":"Blue Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_concrete"},{"id":"minecraft:blue_concrete_powder","localizedName":"Blue Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_concrete_powder"},{"id":"minecraft:blue_dye","localizedName":"Blue Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.blue_dye"},{"id":"minecraft:blue_glazed_terracotta","localizedName":"Blue Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_glazed_terracotta"},{"id":"minecraft:blue_ice","localizedName":"Blue Ice","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_ice"},{"id":"minecraft:blue_orchid","localizedName":"Blue Orchid","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_orchid"},{"id":"minecraft:blue_shulker_box","localizedName":"Blue Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.blue_shulker_box"},{"id":"minecraft:blue_stained_glass","localizedName":"Blue Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_stained_glass"},{"id":"minecraft:blue_stained_glass_pane","localizedName":"Blue Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_stained_glass_pane"},{"id":"minecraft:blue_terracotta","localizedName":"Blue Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_terracotta"},{"id":"minecraft:blue_wool","localizedName":"Blue Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.blue_wool"},{"id":"minecraft:bone","localizedName":"Bone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bone"},{"id":"minecraft:bone_block","localizedName":"Bone Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bone_block"},{"id":"minecraft:bone_meal","localizedName":"Bone Meal","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bone_meal"},{"id":"minecraft:book","localizedName":"Book","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.book"},{"id":"minecraft:bookshelf","localizedName":"Bookshelf","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bookshelf"},{"id":"minecraft:bow","localizedName":"Bow","maxDamage":384,"maxStackSize":1,"unlocalizedName":"item.minecraft.bow"},{"id":"minecraft:bowl","localizedName":"Bowl","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bowl"},{"id":"minecraft:brain_coral","localizedName":"Brain Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brain_coral"},{"id":"minecraft:brain_coral_block","localizedName":"Brain Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brain_coral_block"},{"id":"minecraft:brain_coral_fan","localizedName":"Brain Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brain_coral_fan"},{"id":"minecraft:bread","localizedName":"Bread","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.bread"},{"id":"minecraft:brewing_stand","localizedName":"Brewing Stand","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brewing_stand"},{"id":"minecraft:brick","localizedName":"Brick","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.brick"},{"id":"minecraft:brick_slab","localizedName":"Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brick_slab"},{"id":"minecraft:brick_stairs","localizedName":"Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brick_stairs"},{"id":"minecraft:brick_wall","localizedName":"Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brick_wall"},{"id":"minecraft:bricks","localizedName":"Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bricks"},{"id":"minecraft:brown_banner","localizedName":"Brown Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.brown_banner"},{"id":"minecraft:brown_bed","localizedName":"Brown Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.brown_bed"},{"id":"minecraft:brown_candle","localizedName":"Brown Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_candle"},{"id":"minecraft:brown_carpet","localizedName":"Brown Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_carpet"},{"id":"minecraft:brown_concrete","localizedName":"Brown Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_concrete"},{"id":"minecraft:brown_concrete_powder","localizedName":"Brown Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_concrete_powder"},{"id":"minecraft:brown_dye","localizedName":"Brown Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.brown_dye"},{"id":"minecraft:brown_glazed_terracotta","localizedName":"Brown Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_glazed_terracotta"},{"id":"minecraft:brown_mushroom","localizedName":"Brown Mushroom","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_mushroom"},{"id":"minecraft:brown_mushroom_block","localizedName":"Brown Mushroom Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_mushroom_block"},{"id":"minecraft:brown_shulker_box","localizedName":"Brown Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.brown_shulker_box"},{"id":"minecraft:brown_stained_glass","localizedName":"Brown Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_stained_glass"},{"id":"minecraft:brown_stained_glass_pane","localizedName":"Brown Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_stained_glass_pane"},{"id":"minecraft:brown_terracotta","localizedName":"Brown Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_terracotta"},{"id":"minecraft:brown_wool","localizedName":"Brown Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.brown_wool"},{"id":"minecraft:bubble_coral","localizedName":"Bubble Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bubble_coral"},{"id":"minecraft:bubble_coral_block","localizedName":"Bubble Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bubble_coral_block"},{"id":"minecraft:bubble_coral_fan","localizedName":"Bubble Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.bubble_coral_fan"},{"id":"minecraft:bucket","localizedName":"Bucket","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.bucket"},{"id":"minecraft:budding_amethyst","localizedName":"Budding Amethyst","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.budding_amethyst"},{"id":"minecraft:bundle","localizedName":"Bundle","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.bundle"},{"id":"minecraft:cactus","localizedName":"Cactus","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cactus"},{"id":"minecraft:cake","localizedName":"Cake","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.cake"},{"id":"minecraft:calcite","localizedName":"Calcite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.calcite"},{"id":"minecraft:campfire","localizedName":"Campfire","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.campfire"},{"id":"minecraft:candle","localizedName":"Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.candle"},{"id":"minecraft:carrot","localizedName":"Carrot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.carrot"},{"id":"minecraft:carrot_on_a_stick","localizedName":"Carrot on a Stick","maxDamage":25,"maxStackSize":1,"unlocalizedName":"item.minecraft.carrot_on_a_stick"},{"id":"minecraft:cartography_table","localizedName":"Cartography Table","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cartography_table"},{"id":"minecraft:carved_pumpkin","localizedName":"Carved Pumpkin","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.carved_pumpkin"},{"id":"minecraft:cat_spawn_egg","localizedName":"Cat Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cat_spawn_egg"},{"id":"minecraft:cauldron","localizedName":"Cauldron","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cauldron"},{"id":"minecraft:cave_spider_spawn_egg","localizedName":"Cave Spider Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cave_spider_spawn_egg"},{"id":"minecraft:chain","localizedName":"Chain","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chain"},{"id":"minecraft:chain_command_block","localizedName":"Chain Command Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chain_command_block"},{"id":"minecraft:chainmail_boots","localizedName":"Chainmail Boots","maxDamage":195,"maxStackSize":1,"unlocalizedName":"item.minecraft.chainmail_boots"},{"id":"minecraft:chainmail_chestplate","localizedName":"Chainmail Chestplate","maxDamage":240,"maxStackSize":1,"unlocalizedName":"item.minecraft.chainmail_chestplate"},{"id":"minecraft:chainmail_helmet","localizedName":"Chainmail Helmet","maxDamage":165,"maxStackSize":1,"unlocalizedName":"item.minecraft.chainmail_helmet"},{"id":"minecraft:chainmail_leggings","localizedName":"Chainmail Leggings","maxDamage":225,"maxStackSize":1,"unlocalizedName":"item.minecraft.chainmail_leggings"},{"id":"minecraft:charcoal","localizedName":"Charcoal","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.charcoal"},{"id":"minecraft:chest","localizedName":"Chest","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chest"},{"id":"minecraft:chest_minecart","localizedName":"Minecart with Chest","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.chest_minecart"},{"id":"minecraft:chicken","localizedName":"Raw Chicken","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.chicken"},{"id":"minecraft:chicken_spawn_egg","localizedName":"Chicken Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.chicken_spawn_egg"},{"id":"minecraft:chipped_anvil","localizedName":"Chipped Anvil","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chipped_anvil"},{"id":"minecraft:chiseled_deepslate","localizedName":"Chiseled Deepslate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_deepslate"},{"id":"minecraft:chiseled_nether_bricks","localizedName":"Chiseled Nether Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_nether_bricks"},{"id":"minecraft:chiseled_polished_blackstone","localizedName":"Chiseled Polished Blackstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_polished_blackstone"},{"id":"minecraft:chiseled_quartz_block","localizedName":"Chiseled Quartz Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_quartz_block"},{"id":"minecraft:chiseled_red_sandstone","localizedName":"Chiseled Red Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_red_sandstone"},{"id":"minecraft:chiseled_sandstone","localizedName":"Chiseled Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_sandstone"},{"id":"minecraft:chiseled_stone_bricks","localizedName":"Chiseled Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chiseled_stone_bricks"},{"id":"minecraft:chorus_flower","localizedName":"Chorus Flower","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chorus_flower"},{"id":"minecraft:chorus_fruit","localizedName":"Chorus Fruit","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.chorus_fruit"},{"id":"minecraft:chorus_plant","localizedName":"Chorus Plant","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.chorus_plant"},{"id":"minecraft:clay","localizedName":"Clay","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.clay"},{"id":"minecraft:clay_ball","localizedName":"Clay Ball","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.clay_ball"},{"id":"minecraft:clock","localizedName":"Clock","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.clock"},{"id":"minecraft:coal","localizedName":"Coal","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.coal"},{"id":"minecraft:coal_block","localizedName":"Block of Coal","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.coal_block"},{"id":"minecraft:coal_ore","localizedName":"Coal Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.coal_ore"},{"id":"minecraft:coarse_dirt","localizedName":"Coarse Dirt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.coarse_dirt"},{"id":"minecraft:cobbled_deepslate","localizedName":"Cobbled Deepslate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobbled_deepslate"},{"id":"minecraft:cobbled_deepslate_slab","localizedName":"Cobbled Deepslate Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobbled_deepslate_slab"},{"id":"minecraft:cobbled_deepslate_stairs","localizedName":"Cobbled Deepslate Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobbled_deepslate_stairs"},{"id":"minecraft:cobbled_deepslate_wall","localizedName":"Cobbled Deepslate Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobbled_deepslate_wall"},{"id":"minecraft:cobblestone","localizedName":"Cobblestone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobblestone"},{"id":"minecraft:cobblestone_slab","localizedName":"Cobblestone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobblestone_slab"},{"id":"minecraft:cobblestone_stairs","localizedName":"Cobblestone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobblestone_stairs"},{"id":"minecraft:cobblestone_wall","localizedName":"Cobblestone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobblestone_wall"},{"id":"minecraft:cobweb","localizedName":"Cobweb","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cobweb"},{"id":"minecraft:cocoa_beans","localizedName":"Cocoa Beans","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cocoa_beans"},{"id":"minecraft:cod","localizedName":"Raw Cod","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cod"},{"id":"minecraft:cod_bucket","localizedName":"Bucket of Cod","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.cod_bucket"},{"id":"minecraft:cod_spawn_egg","localizedName":"Cod Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cod_spawn_egg"},{"id":"minecraft:command_block","localizedName":"Command Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.command_block"},{"id":"minecraft:command_block_minecart","localizedName":"Minecart with Command Block","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.command_block_minecart"},{"id":"minecraft:comparator","localizedName":"Redstone Comparator","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.comparator"},{"id":"minecraft:compass","localizedName":"Compass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.compass"},{"id":"minecraft:composter","localizedName":"Composter","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.composter"},{"id":"minecraft:conduit","localizedName":"Conduit","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.conduit"},{"id":"minecraft:cooked_beef","localizedName":"Steak","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_beef"},{"id":"minecraft:cooked_chicken","localizedName":"Cooked Chicken","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_chicken"},{"id":"minecraft:cooked_cod","localizedName":"Cooked Cod","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_cod"},{"id":"minecraft:cooked_mutton","localizedName":"Cooked Mutton","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_mutton"},{"id":"minecraft:cooked_porkchop","localizedName":"Cooked Porkchop","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_porkchop"},{"id":"minecraft:cooked_rabbit","localizedName":"Cooked Rabbit","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_rabbit"},{"id":"minecraft:cooked_salmon","localizedName":"Cooked Salmon","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cooked_salmon"},{"id":"minecraft:cookie","localizedName":"Cookie","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cookie"},{"id":"minecraft:copper_block","localizedName":"Block of Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.copper_block"},{"id":"minecraft:copper_ingot","localizedName":"Copper Ingot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.copper_ingot"},{"id":"minecraft:copper_ore","localizedName":"Copper Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.copper_ore"},{"id":"minecraft:cornflower","localizedName":"Cornflower","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cornflower"},{"id":"minecraft:cow_spawn_egg","localizedName":"Cow Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cow_spawn_egg"},{"id":"minecraft:cracked_deepslate_bricks","localizedName":"Cracked Deepslate Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cracked_deepslate_bricks"},{"id":"minecraft:cracked_deepslate_tiles","localizedName":"Cracked Deepslate Tiles","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cracked_deepslate_tiles"},{"id":"minecraft:cracked_nether_bricks","localizedName":"Cracked Nether Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cracked_nether_bricks"},{"id":"minecraft:cracked_polished_blackstone_bricks","localizedName":"Cracked Polished Blackstone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cracked_polished_blackstone_bricks"},{"id":"minecraft:cracked_stone_bricks","localizedName":"Cracked Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cracked_stone_bricks"},{"id":"minecraft:crafting_table","localizedName":"Crafting Table","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crafting_table"},{"id":"minecraft:creeper_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.creeper_banner_pattern"},{"id":"minecraft:creeper_head","localizedName":"Creeper Head","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.creeper_head"},{"id":"minecraft:creeper_spawn_egg","localizedName":"Creeper Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.creeper_spawn_egg"},{"id":"minecraft:crimson_button","localizedName":"Crimson Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_button"},{"id":"minecraft:crimson_door","localizedName":"Crimson Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_door"},{"id":"minecraft:crimson_fence","localizedName":"Crimson Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_fence"},{"id":"minecraft:crimson_fence_gate","localizedName":"Crimson Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_fence_gate"},{"id":"minecraft:crimson_fungus","localizedName":"Crimson Fungus","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_fungus"},{"id":"minecraft:crimson_hyphae","localizedName":"Crimson Hyphae","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_hyphae"},{"id":"minecraft:crimson_nylium","localizedName":"Crimson Nylium","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_nylium"},{"id":"minecraft:crimson_planks","localizedName":"Crimson Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_planks"},{"id":"minecraft:crimson_pressure_plate","localizedName":"Crimson Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_pressure_plate"},{"id":"minecraft:crimson_roots","localizedName":"Crimson Roots","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_roots"},{"id":"minecraft:crimson_sign","localizedName":"Crimson Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.crimson_sign"},{"id":"minecraft:crimson_slab","localizedName":"Crimson Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_slab"},{"id":"minecraft:crimson_stairs","localizedName":"Crimson Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_stairs"},{"id":"minecraft:crimson_stem","localizedName":"Crimson Stem","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_stem"},{"id":"minecraft:crimson_trapdoor","localizedName":"Crimson Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crimson_trapdoor"},{"id":"minecraft:crossbow","localizedName":"Crossbow","maxDamage":326,"maxStackSize":1,"unlocalizedName":"item.minecraft.crossbow"},{"id":"minecraft:crying_obsidian","localizedName":"Crying Obsidian","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.crying_obsidian"},{"id":"minecraft:cut_copper","localizedName":"Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_copper"},{"id":"minecraft:cut_copper_slab","localizedName":"Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_copper_slab"},{"id":"minecraft:cut_copper_stairs","localizedName":"Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_copper_stairs"},{"id":"minecraft:cut_red_sandstone","localizedName":"Cut Red Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_red_sandstone"},{"id":"minecraft:cut_red_sandstone_slab","localizedName":"Cut Red Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_red_sandstone_slab"},{"id":"minecraft:cut_sandstone","localizedName":"Cut Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_sandstone"},{"id":"minecraft:cut_sandstone_slab","localizedName":"Cut Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cut_sandstone_slab"},{"id":"minecraft:cyan_banner","localizedName":"Cyan Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.cyan_banner"},{"id":"minecraft:cyan_bed","localizedName":"Cyan Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.cyan_bed"},{"id":"minecraft:cyan_candle","localizedName":"Cyan Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_candle"},{"id":"minecraft:cyan_carpet","localizedName":"Cyan Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_carpet"},{"id":"minecraft:cyan_concrete","localizedName":"Cyan Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_concrete"},{"id":"minecraft:cyan_concrete_powder","localizedName":"Cyan Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_concrete_powder"},{"id":"minecraft:cyan_dye","localizedName":"Cyan Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.cyan_dye"},{"id":"minecraft:cyan_glazed_terracotta","localizedName":"Cyan Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_glazed_terracotta"},{"id":"minecraft:cyan_shulker_box","localizedName":"Cyan Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.cyan_shulker_box"},{"id":"minecraft:cyan_stained_glass","localizedName":"Cyan Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_stained_glass"},{"id":"minecraft:cyan_stained_glass_pane","localizedName":"Cyan Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_stained_glass_pane"},{"id":"minecraft:cyan_terracotta","localizedName":"Cyan Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_terracotta"},{"id":"minecraft:cyan_wool","localizedName":"Cyan Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.cyan_wool"},{"id":"minecraft:damaged_anvil","localizedName":"Damaged Anvil","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.damaged_anvil"},{"id":"minecraft:dandelion","localizedName":"Dandelion","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dandelion"},{"id":"minecraft:dark_oak_boat","localizedName":"Dark Oak Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.dark_oak_boat"},{"id":"minecraft:dark_oak_button","localizedName":"Dark Oak Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_button"},{"id":"minecraft:dark_oak_door","localizedName":"Dark Oak Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_door"},{"id":"minecraft:dark_oak_fence","localizedName":"Dark Oak Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_fence"},{"id":"minecraft:dark_oak_fence_gate","localizedName":"Dark Oak Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_fence_gate"},{"id":"minecraft:dark_oak_leaves","localizedName":"Dark Oak Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_leaves"},{"id":"minecraft:dark_oak_log","localizedName":"Dark Oak Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_log"},{"id":"minecraft:dark_oak_planks","localizedName":"Dark Oak Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_planks"},{"id":"minecraft:dark_oak_pressure_plate","localizedName":"Dark Oak Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_pressure_plate"},{"id":"minecraft:dark_oak_sapling","localizedName":"Dark Oak Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_sapling"},{"id":"minecraft:dark_oak_sign","localizedName":"Dark Oak Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.dark_oak_sign"},{"id":"minecraft:dark_oak_slab","localizedName":"Dark Oak Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_slab"},{"id":"minecraft:dark_oak_stairs","localizedName":"Dark Oak Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_stairs"},{"id":"minecraft:dark_oak_trapdoor","localizedName":"Dark Oak Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_trapdoor"},{"id":"minecraft:dark_oak_wood","localizedName":"Dark Oak Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_oak_wood"},{"id":"minecraft:dark_prismarine","localizedName":"Dark Prismarine","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_prismarine"},{"id":"minecraft:dark_prismarine_slab","localizedName":"Dark Prismarine Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_prismarine_slab"},{"id":"minecraft:dark_prismarine_stairs","localizedName":"Dark Prismarine Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dark_prismarine_stairs"},{"id":"minecraft:daylight_detector","localizedName":"Daylight Detector","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.daylight_detector"},{"id":"minecraft:dead_brain_coral","localizedName":"Dead Brain Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_brain_coral"},{"id":"minecraft:dead_brain_coral_block","localizedName":"Dead Brain Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_brain_coral_block"},{"id":"minecraft:dead_brain_coral_fan","localizedName":"Dead Brain Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_brain_coral_fan"},{"id":"minecraft:dead_bubble_coral","localizedName":"Dead Bubble Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_bubble_coral"},{"id":"minecraft:dead_bubble_coral_block","localizedName":"Dead Bubble Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_bubble_coral_block"},{"id":"minecraft:dead_bubble_coral_fan","localizedName":"Dead Bubble Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_bubble_coral_fan"},{"id":"minecraft:dead_bush","localizedName":"Dead Bush","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_bush"},{"id":"minecraft:dead_fire_coral","localizedName":"Dead Fire Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_fire_coral"},{"id":"minecraft:dead_fire_coral_block","localizedName":"Dead Fire Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_fire_coral_block"},{"id":"minecraft:dead_fire_coral_fan","localizedName":"Dead Fire Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_fire_coral_fan"},{"id":"minecraft:dead_horn_coral","localizedName":"Dead Horn Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_horn_coral"},{"id":"minecraft:dead_horn_coral_block","localizedName":"Dead Horn Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_horn_coral_block"},{"id":"minecraft:dead_horn_coral_fan","localizedName":"Dead Horn Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_horn_coral_fan"},{"id":"minecraft:dead_tube_coral","localizedName":"Dead Tube Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_tube_coral"},{"id":"minecraft:dead_tube_coral_block","localizedName":"Dead Tube Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_tube_coral_block"},{"id":"minecraft:dead_tube_coral_fan","localizedName":"Dead Tube Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dead_tube_coral_fan"},{"id":"minecraft:debug_stick","localizedName":"Debug Stick","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.debug_stick"},{"id":"minecraft:deepslate","localizedName":"Deepslate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate"},{"id":"minecraft:deepslate_brick_slab","localizedName":"Deepslate Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_brick_slab"},{"id":"minecraft:deepslate_brick_stairs","localizedName":"Deepslate Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_brick_stairs"},{"id":"minecraft:deepslate_brick_wall","localizedName":"Deepslate Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_brick_wall"},{"id":"minecraft:deepslate_bricks","localizedName":"Deepslate Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_bricks"},{"id":"minecraft:deepslate_coal_ore","localizedName":"Deepslate Coal Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_coal_ore"},{"id":"minecraft:deepslate_copper_ore","localizedName":"Deepslate Copper Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_copper_ore"},{"id":"minecraft:deepslate_diamond_ore","localizedName":"Deepslate Diamond Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_diamond_ore"},{"id":"minecraft:deepslate_emerald_ore","localizedName":"Deepslate Emerald Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_emerald_ore"},{"id":"minecraft:deepslate_gold_ore","localizedName":"Deepslate Gold Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_gold_ore"},{"id":"minecraft:deepslate_iron_ore","localizedName":"Deepslate Iron Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_iron_ore"},{"id":"minecraft:deepslate_lapis_ore","localizedName":"Deepslate Lapis Lazuli Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_lapis_ore"},{"id":"minecraft:deepslate_redstone_ore","localizedName":"Deepslate Redstone Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_redstone_ore"},{"id":"minecraft:deepslate_tile_slab","localizedName":"Deepslate Tile Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_tile_slab"},{"id":"minecraft:deepslate_tile_stairs","localizedName":"Deepslate Tile Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_tile_stairs"},{"id":"minecraft:deepslate_tile_wall","localizedName":"Deepslate Tile Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_tile_wall"},{"id":"minecraft:deepslate_tiles","localizedName":"Deepslate Tiles","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.deepslate_tiles"},{"id":"minecraft:detector_rail","localizedName":"Detector Rail","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.detector_rail"},{"id":"minecraft:diamond","localizedName":"Diamond","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.diamond"},{"id":"minecraft:diamond_axe","localizedName":"Diamond Axe","maxDamage":1561,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_axe"},{"id":"minecraft:diamond_block","localizedName":"Block of Diamond","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diamond_block"},{"id":"minecraft:diamond_boots","localizedName":"Diamond Boots","maxDamage":429,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_boots"},{"id":"minecraft:diamond_chestplate","localizedName":"Diamond Chestplate","maxDamage":528,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_chestplate"},{"id":"minecraft:diamond_helmet","localizedName":"Diamond Helmet","maxDamage":363,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_helmet"},{"id":"minecraft:diamond_hoe","localizedName":"Diamond Hoe","maxDamage":1561,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_hoe"},{"id":"minecraft:diamond_horse_armor","localizedName":"Diamond Horse Armor","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_horse_armor"},{"id":"minecraft:diamond_leggings","localizedName":"Diamond Leggings","maxDamage":495,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_leggings"},{"id":"minecraft:diamond_ore","localizedName":"Diamond Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diamond_ore"},{"id":"minecraft:diamond_pickaxe","localizedName":"Diamond Pickaxe","maxDamage":1561,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_pickaxe"},{"id":"minecraft:diamond_shovel","localizedName":"Diamond Shovel","maxDamage":1561,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_shovel"},{"id":"minecraft:diamond_sword","localizedName":"Diamond Sword","maxDamage":1561,"maxStackSize":1,"unlocalizedName":"item.minecraft.diamond_sword"},{"id":"minecraft:diorite","localizedName":"Diorite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diorite"},{"id":"minecraft:diorite_slab","localizedName":"Diorite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diorite_slab"},{"id":"minecraft:diorite_stairs","localizedName":"Diorite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diorite_stairs"},{"id":"minecraft:diorite_wall","localizedName":"Diorite Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.diorite_wall"},{"id":"minecraft:dirt","localizedName":"Dirt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dirt"},{"id":"minecraft:dirt_path","localizedName":"Dirt Path","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dirt_path"},{"id":"minecraft:dispenser","localizedName":"Dispenser","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dispenser"},{"id":"minecraft:dolphin_spawn_egg","localizedName":"Dolphin Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.dolphin_spawn_egg"},{"id":"minecraft:donkey_spawn_egg","localizedName":"Donkey Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.donkey_spawn_egg"},{"id":"minecraft:dragon_breath","localizedName":"Dragon\u0027s Breath","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.dragon_breath"},{"id":"minecraft:dragon_egg","localizedName":"Dragon Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dragon_egg"},{"id":"minecraft:dragon_head","localizedName":"Dragon Head","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dragon_head"},{"id":"minecraft:dried_kelp","localizedName":"Dried Kelp","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.dried_kelp"},{"id":"minecraft:dried_kelp_block","localizedName":"Dried Kelp Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dried_kelp_block"},{"id":"minecraft:dripstone_block","localizedName":"Dripstone Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dripstone_block"},{"id":"minecraft:dropper","localizedName":"Dropper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.dropper"},{"id":"minecraft:drowned_spawn_egg","localizedName":"Drowned Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.drowned_spawn_egg"},{"id":"minecraft:egg","localizedName":"Egg","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.egg"},{"id":"minecraft:elder_guardian_spawn_egg","localizedName":"Elder Guardian Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.elder_guardian_spawn_egg"},{"id":"minecraft:elytra","localizedName":"Elytra","maxDamage":432,"maxStackSize":1,"unlocalizedName":"item.minecraft.elytra"},{"id":"minecraft:emerald","localizedName":"Emerald","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.emerald"},{"id":"minecraft:emerald_block","localizedName":"Block of Emerald","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.emerald_block"},{"id":"minecraft:emerald_ore","localizedName":"Emerald Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.emerald_ore"},{"id":"minecraft:enchanted_book","localizedName":"Enchanted Book","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.enchanted_book"},{"id":"minecraft:enchanted_golden_apple","localizedName":"Enchanted Golden Apple","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.enchanted_golden_apple"},{"id":"minecraft:enchanting_table","localizedName":"Enchanting Table","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.enchanting_table"},{"id":"minecraft:end_crystal","localizedName":"End Crystal","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.end_crystal"},{"id":"minecraft:end_portal_frame","localizedName":"End Portal Frame","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_portal_frame"},{"id":"minecraft:end_rod","localizedName":"End Rod","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_rod"},{"id":"minecraft:end_stone","localizedName":"End Stone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_stone"},{"id":"minecraft:end_stone_brick_slab","localizedName":"End Stone Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_stone_brick_slab"},{"id":"minecraft:end_stone_brick_stairs","localizedName":"End Stone Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_stone_brick_stairs"},{"id":"minecraft:end_stone_brick_wall","localizedName":"End Stone Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_stone_brick_wall"},{"id":"minecraft:end_stone_bricks","localizedName":"End Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.end_stone_bricks"},{"id":"minecraft:ender_chest","localizedName":"Ender Chest","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.ender_chest"},{"id":"minecraft:ender_eye","localizedName":"Eye of Ender","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ender_eye"},{"id":"minecraft:ender_pearl","localizedName":"Ender Pearl","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.ender_pearl"},{"id":"minecraft:enderman_spawn_egg","localizedName":"Enderman Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.enderman_spawn_egg"},{"id":"minecraft:endermite_spawn_egg","localizedName":"Endermite Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.endermite_spawn_egg"},{"id":"minecraft:evoker_spawn_egg","localizedName":"Evoker Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.evoker_spawn_egg"},{"id":"minecraft:experience_bottle","localizedName":"Bottle o\u0027 Enchanting","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.experience_bottle"},{"id":"minecraft:exposed_copper","localizedName":"Exposed Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.exposed_copper"},{"id":"minecraft:exposed_cut_copper","localizedName":"Exposed Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.exposed_cut_copper"},{"id":"minecraft:exposed_cut_copper_slab","localizedName":"Exposed Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.exposed_cut_copper_slab"},{"id":"minecraft:exposed_cut_copper_stairs","localizedName":"Exposed Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.exposed_cut_copper_stairs"},{"id":"minecraft:farmland","localizedName":"Farmland","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.farmland"},{"id":"minecraft:feather","localizedName":"Feather","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.feather"},{"id":"minecraft:fermented_spider_eye","localizedName":"Fermented Spider Eye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.fermented_spider_eye"},{"id":"minecraft:fern","localizedName":"Fern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.fern"},{"id":"minecraft:filled_map","localizedName":"Map","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.filled_map"},{"id":"minecraft:fire_charge","localizedName":"Fire Charge","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.fire_charge"},{"id":"minecraft:fire_coral","localizedName":"Fire Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.fire_coral"},{"id":"minecraft:fire_coral_block","localizedName":"Fire Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.fire_coral_block"},{"id":"minecraft:fire_coral_fan","localizedName":"Fire Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.fire_coral_fan"},{"id":"minecraft:firework_rocket","localizedName":"Firework Rocket","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.firework_rocket"},{"id":"minecraft:firework_star","localizedName":"Firework Star","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.firework_star"},{"id":"minecraft:fishing_rod","localizedName":"Fishing Rod","maxDamage":64,"maxStackSize":1,"unlocalizedName":"item.minecraft.fishing_rod"},{"id":"minecraft:fletching_table","localizedName":"Fletching Table","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.fletching_table"},{"id":"minecraft:flint","localizedName":"Flint","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.flint"},{"id":"minecraft:flint_and_steel","localizedName":"Flint and Steel","maxDamage":64,"maxStackSize":1,"unlocalizedName":"item.minecraft.flint_and_steel"},{"id":"minecraft:flower_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.flower_banner_pattern"},{"id":"minecraft:flower_pot","localizedName":"Flower Pot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.flower_pot"},{"id":"minecraft:flowering_azalea","localizedName":"Flowering Azalea","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.flowering_azalea"},{"id":"minecraft:flowering_azalea_leaves","localizedName":"Flowering Azalea Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.flowering_azalea_leaves"},{"id":"minecraft:fox_spawn_egg","localizedName":"Fox Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.fox_spawn_egg"},{"id":"minecraft:furnace","localizedName":"Furnace","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.furnace"},{"id":"minecraft:furnace_minecart","localizedName":"Minecart with Furnace","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.furnace_minecart"},{"id":"minecraft:ghast_spawn_egg","localizedName":"Ghast Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ghast_spawn_egg"},{"id":"minecraft:ghast_tear","localizedName":"Ghast Tear","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ghast_tear"},{"id":"minecraft:gilded_blackstone","localizedName":"Gilded Blackstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gilded_blackstone"},{"id":"minecraft:glass","localizedName":"Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.glass"},{"id":"minecraft:glass_bottle","localizedName":"Glass Bottle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glass_bottle"},{"id":"minecraft:glass_pane","localizedName":"Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.glass_pane"},{"id":"minecraft:glistering_melon_slice","localizedName":"Glistering Melon Slice","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glistering_melon_slice"},{"id":"minecraft:globe_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.globe_banner_pattern"},{"id":"minecraft:glow_berries","localizedName":"Glow Berries","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glow_berries"},{"id":"minecraft:glow_ink_sac","localizedName":"Glow Ink Sac","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glow_ink_sac"},{"id":"minecraft:glow_item_frame","localizedName":"Glow Item Frame","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glow_item_frame"},{"id":"minecraft:glow_lichen","localizedName":"Glow Lichen","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.glow_lichen"},{"id":"minecraft:glow_squid_spawn_egg","localizedName":"Glow Squid Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glow_squid_spawn_egg"},{"id":"minecraft:glowstone","localizedName":"Glowstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.glowstone"},{"id":"minecraft:glowstone_dust","localizedName":"Glowstone Dust","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.glowstone_dust"},{"id":"minecraft:goat_spawn_egg","localizedName":"Goat Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.goat_spawn_egg"},{"id":"minecraft:gold_block","localizedName":"Block of Gold","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gold_block"},{"id":"minecraft:gold_ingot","localizedName":"Gold Ingot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.gold_ingot"},{"id":"minecraft:gold_nugget","localizedName":"Gold Nugget","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.gold_nugget"},{"id":"minecraft:gold_ore","localizedName":"Gold Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gold_ore"},{"id":"minecraft:golden_apple","localizedName":"Golden Apple","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.golden_apple"},{"id":"minecraft:golden_axe","localizedName":"Golden Axe","maxDamage":32,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_axe"},{"id":"minecraft:golden_boots","localizedName":"Golden Boots","maxDamage":91,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_boots"},{"id":"minecraft:golden_carrot","localizedName":"Golden Carrot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.golden_carrot"},{"id":"minecraft:golden_chestplate","localizedName":"Golden Chestplate","maxDamage":112,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_chestplate"},{"id":"minecraft:golden_helmet","localizedName":"Golden Helmet","maxDamage":77,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_helmet"},{"id":"minecraft:golden_hoe","localizedName":"Golden Hoe","maxDamage":32,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_hoe"},{"id":"minecraft:golden_horse_armor","localizedName":"Golden Horse Armor","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_horse_armor"},{"id":"minecraft:golden_leggings","localizedName":"Golden Leggings","maxDamage":105,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_leggings"},{"id":"minecraft:golden_pickaxe","localizedName":"Golden Pickaxe","maxDamage":32,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_pickaxe"},{"id":"minecraft:golden_shovel","localizedName":"Golden Shovel","maxDamage":32,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_shovel"},{"id":"minecraft:golden_sword","localizedName":"Golden Sword","maxDamage":32,"maxStackSize":1,"unlocalizedName":"item.minecraft.golden_sword"},{"id":"minecraft:granite","localizedName":"Granite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.granite"},{"id":"minecraft:granite_slab","localizedName":"Granite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.granite_slab"},{"id":"minecraft:granite_stairs","localizedName":"Granite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.granite_stairs"},{"id":"minecraft:granite_wall","localizedName":"Granite Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.granite_wall"},{"id":"minecraft:grass","localizedName":"Grass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.grass"},{"id":"minecraft:grass_block","localizedName":"Grass Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.grass_block"},{"id":"minecraft:gravel","localizedName":"Gravel","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gravel"},{"id":"minecraft:gray_banner","localizedName":"Gray Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.gray_banner"},{"id":"minecraft:gray_bed","localizedName":"Gray Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.gray_bed"},{"id":"minecraft:gray_candle","localizedName":"Gray Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_candle"},{"id":"minecraft:gray_carpet","localizedName":"Gray Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_carpet"},{"id":"minecraft:gray_concrete","localizedName":"Gray Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_concrete"},{"id":"minecraft:gray_concrete_powder","localizedName":"Gray Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_concrete_powder"},{"id":"minecraft:gray_dye","localizedName":"Gray Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.gray_dye"},{"id":"minecraft:gray_glazed_terracotta","localizedName":"Gray Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_glazed_terracotta"},{"id":"minecraft:gray_shulker_box","localizedName":"Gray Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.gray_shulker_box"},{"id":"minecraft:gray_stained_glass","localizedName":"Gray Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_stained_glass"},{"id":"minecraft:gray_stained_glass_pane","localizedName":"Gray Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_stained_glass_pane"},{"id":"minecraft:gray_terracotta","localizedName":"Gray Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_terracotta"},{"id":"minecraft:gray_wool","localizedName":"Gray Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.gray_wool"},{"id":"minecraft:green_banner","localizedName":"Green Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.green_banner"},{"id":"minecraft:green_bed","localizedName":"Green Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.green_bed"},{"id":"minecraft:green_candle","localizedName":"Green Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_candle"},{"id":"minecraft:green_carpet","localizedName":"Green Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_carpet"},{"id":"minecraft:green_concrete","localizedName":"Green Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_concrete"},{"id":"minecraft:green_concrete_powder","localizedName":"Green Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_concrete_powder"},{"id":"minecraft:green_dye","localizedName":"Green Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.green_dye"},{"id":"minecraft:green_glazed_terracotta","localizedName":"Green Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_glazed_terracotta"},{"id":"minecraft:green_shulker_box","localizedName":"Green Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.green_shulker_box"},{"id":"minecraft:green_stained_glass","localizedName":"Green Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_stained_glass"},{"id":"minecraft:green_stained_glass_pane","localizedName":"Green Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_stained_glass_pane"},{"id":"minecraft:green_terracotta","localizedName":"Green Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_terracotta"},{"id":"minecraft:green_wool","localizedName":"Green Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.green_wool"},{"id":"minecraft:grindstone","localizedName":"Grindstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.grindstone"},{"id":"minecraft:guardian_spawn_egg","localizedName":"Guardian Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.guardian_spawn_egg"},{"id":"minecraft:gunpowder","localizedName":"Gunpowder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.gunpowder"},{"id":"minecraft:hanging_roots","localizedName":"Hanging Roots","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.hanging_roots"},{"id":"minecraft:hay_block","localizedName":"Hay Bale","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.hay_block"},{"id":"minecraft:heart_of_the_sea","localizedName":"Heart of the Sea","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.heart_of_the_sea"},{"id":"minecraft:heavy_weighted_pressure_plate","localizedName":"Heavy Weighted Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.heavy_weighted_pressure_plate"},{"id":"minecraft:hoglin_spawn_egg","localizedName":"Hoglin Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.hoglin_spawn_egg"},{"id":"minecraft:honey_block","localizedName":"Honey Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.honey_block"},{"id":"minecraft:honey_bottle","localizedName":"Honey Bottle","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.honey_bottle"},{"id":"minecraft:honeycomb","localizedName":"Honeycomb","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.honeycomb"},{"id":"minecraft:honeycomb_block","localizedName":"Honeycomb Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.honeycomb_block"},{"id":"minecraft:hopper","localizedName":"Hopper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.hopper"},{"id":"minecraft:hopper_minecart","localizedName":"Minecart with Hopper","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.hopper_minecart"},{"id":"minecraft:horn_coral","localizedName":"Horn Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.horn_coral"},{"id":"minecraft:horn_coral_block","localizedName":"Horn Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.horn_coral_block"},{"id":"minecraft:horn_coral_fan","localizedName":"Horn Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.horn_coral_fan"},{"id":"minecraft:horse_spawn_egg","localizedName":"Horse Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.horse_spawn_egg"},{"id":"minecraft:husk_spawn_egg","localizedName":"Husk Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.husk_spawn_egg"},{"id":"minecraft:ice","localizedName":"Ice","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.ice"},{"id":"minecraft:infested_chiseled_stone_bricks","localizedName":"Infested Chiseled Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_chiseled_stone_bricks"},{"id":"minecraft:infested_cobblestone","localizedName":"Infested Cobblestone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_cobblestone"},{"id":"minecraft:infested_cracked_stone_bricks","localizedName":"Infested Cracked Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_cracked_stone_bricks"},{"id":"minecraft:infested_deepslate","localizedName":"Infested Deepslate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_deepslate"},{"id":"minecraft:infested_mossy_stone_bricks","localizedName":"Infested Mossy Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_mossy_stone_bricks"},{"id":"minecraft:infested_stone","localizedName":"Infested Stone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_stone"},{"id":"minecraft:infested_stone_bricks","localizedName":"Infested Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.infested_stone_bricks"},{"id":"minecraft:ink_sac","localizedName":"Ink Sac","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ink_sac"},{"id":"minecraft:iron_axe","localizedName":"Iron Axe","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_axe"},{"id":"minecraft:iron_bars","localizedName":"Iron Bars","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.iron_bars"},{"id":"minecraft:iron_block","localizedName":"Block of Iron","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.iron_block"},{"id":"minecraft:iron_boots","localizedName":"Iron Boots","maxDamage":195,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_boots"},{"id":"minecraft:iron_chestplate","localizedName":"Iron Chestplate","maxDamage":240,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_chestplate"},{"id":"minecraft:iron_door","localizedName":"Iron Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.iron_door"},{"id":"minecraft:iron_helmet","localizedName":"Iron Helmet","maxDamage":165,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_helmet"},{"id":"minecraft:iron_hoe","localizedName":"Iron Hoe","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_hoe"},{"id":"minecraft:iron_horse_armor","localizedName":"Iron Horse Armor","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_horse_armor"},{"id":"minecraft:iron_ingot","localizedName":"Iron Ingot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.iron_ingot"},{"id":"minecraft:iron_leggings","localizedName":"Iron Leggings","maxDamage":225,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_leggings"},{"id":"minecraft:iron_nugget","localizedName":"Iron Nugget","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.iron_nugget"},{"id":"minecraft:iron_ore","localizedName":"Iron Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.iron_ore"},{"id":"minecraft:iron_pickaxe","localizedName":"Iron Pickaxe","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_pickaxe"},{"id":"minecraft:iron_shovel","localizedName":"Iron Shovel","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_shovel"},{"id":"minecraft:iron_sword","localizedName":"Iron Sword","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.iron_sword"},{"id":"minecraft:iron_trapdoor","localizedName":"Iron Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.iron_trapdoor"},{"id":"minecraft:item_frame","localizedName":"Item Frame","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.item_frame"},{"id":"minecraft:jack_o_lantern","localizedName":"Jack o\u0027Lantern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jack_o_lantern"},{"id":"minecraft:jigsaw","localizedName":"Jigsaw Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jigsaw"},{"id":"minecraft:jukebox","localizedName":"Jukebox","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jukebox"},{"id":"minecraft:jungle_boat","localizedName":"Jungle Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.jungle_boat"},{"id":"minecraft:jungle_button","localizedName":"Jungle Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_button"},{"id":"minecraft:jungle_door","localizedName":"Jungle Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_door"},{"id":"minecraft:jungle_fence","localizedName":"Jungle Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_fence"},{"id":"minecraft:jungle_fence_gate","localizedName":"Jungle Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_fence_gate"},{"id":"minecraft:jungle_leaves","localizedName":"Jungle Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_leaves"},{"id":"minecraft:jungle_log","localizedName":"Jungle Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_log"},{"id":"minecraft:jungle_planks","localizedName":"Jungle Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_planks"},{"id":"minecraft:jungle_pressure_plate","localizedName":"Jungle Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_pressure_plate"},{"id":"minecraft:jungle_sapling","localizedName":"Jungle Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_sapling"},{"id":"minecraft:jungle_sign","localizedName":"Jungle Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.jungle_sign"},{"id":"minecraft:jungle_slab","localizedName":"Jungle Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_slab"},{"id":"minecraft:jungle_stairs","localizedName":"Jungle Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_stairs"},{"id":"minecraft:jungle_trapdoor","localizedName":"Jungle Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_trapdoor"},{"id":"minecraft:jungle_wood","localizedName":"Jungle Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.jungle_wood"},{"id":"minecraft:kelp","localizedName":"Kelp","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.kelp"},{"id":"minecraft:knowledge_book","localizedName":"Knowledge Book","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.knowledge_book"},{"id":"minecraft:ladder","localizedName":"Ladder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.ladder"},{"id":"minecraft:lantern","localizedName":"Lantern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lantern"},{"id":"minecraft:lapis_block","localizedName":"Block of Lapis Lazuli","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lapis_block"},{"id":"minecraft:lapis_lazuli","localizedName":"Lapis Lazuli","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.lapis_lazuli"},{"id":"minecraft:lapis_ore","localizedName":"Lapis Lazuli Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lapis_ore"},{"id":"minecraft:large_amethyst_bud","localizedName":"Large Amethyst Bud","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.large_amethyst_bud"},{"id":"minecraft:large_fern","localizedName":"Large Fern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.large_fern"},{"id":"minecraft:lava_bucket","localizedName":"Lava Bucket","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.lava_bucket"},{"id":"minecraft:lead","localizedName":"Lead","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.lead"},{"id":"minecraft:leather","localizedName":"Leather","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.leather"},{"id":"minecraft:leather_boots","localizedName":"Leather Boots","maxDamage":65,"maxStackSize":1,"unlocalizedName":"item.minecraft.leather_boots"},{"id":"minecraft:leather_chestplate","localizedName":"Leather Tunic","maxDamage":80,"maxStackSize":1,"unlocalizedName":"item.minecraft.leather_chestplate"},{"id":"minecraft:leather_helmet","localizedName":"Leather Cap","maxDamage":55,"maxStackSize":1,"unlocalizedName":"item.minecraft.leather_helmet"},{"id":"minecraft:leather_horse_armor","localizedName":"Leather Horse Armor","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.leather_horse_armor"},{"id":"minecraft:leather_leggings","localizedName":"Leather Pants","maxDamage":75,"maxStackSize":1,"unlocalizedName":"item.minecraft.leather_leggings"},{"id":"minecraft:lectern","localizedName":"Lectern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lectern"},{"id":"minecraft:lever","localizedName":"Lever","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lever"},{"id":"minecraft:light","localizedName":"Light","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light"},{"id":"minecraft:light_blue_banner","localizedName":"Light Blue Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.light_blue_banner"},{"id":"minecraft:light_blue_bed","localizedName":"Light Blue Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.light_blue_bed"},{"id":"minecraft:light_blue_candle","localizedName":"Light Blue Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_candle"},{"id":"minecraft:light_blue_carpet","localizedName":"Light Blue Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_carpet"},{"id":"minecraft:light_blue_concrete","localizedName":"Light Blue Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_concrete"},{"id":"minecraft:light_blue_concrete_powder","localizedName":"Light Blue Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_concrete_powder"},{"id":"minecraft:light_blue_dye","localizedName":"Light Blue Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.light_blue_dye"},{"id":"minecraft:light_blue_glazed_terracotta","localizedName":"Light Blue Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_glazed_terracotta"},{"id":"minecraft:light_blue_shulker_box","localizedName":"Light Blue Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.light_blue_shulker_box"},{"id":"minecraft:light_blue_stained_glass","localizedName":"Light Blue Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_stained_glass"},{"id":"minecraft:light_blue_stained_glass_pane","localizedName":"Light Blue Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_stained_glass_pane"},{"id":"minecraft:light_blue_terracotta","localizedName":"Light Blue Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_terracotta"},{"id":"minecraft:light_blue_wool","localizedName":"Light Blue Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_blue_wool"},{"id":"minecraft:light_gray_banner","localizedName":"Light Gray Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.light_gray_banner"},{"id":"minecraft:light_gray_bed","localizedName":"Light Gray Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.light_gray_bed"},{"id":"minecraft:light_gray_candle","localizedName":"Light Gray Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_candle"},{"id":"minecraft:light_gray_carpet","localizedName":"Light Gray Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_carpet"},{"id":"minecraft:light_gray_concrete","localizedName":"Light Gray Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_concrete"},{"id":"minecraft:light_gray_concrete_powder","localizedName":"Light Gray Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_concrete_powder"},{"id":"minecraft:light_gray_dye","localizedName":"Light Gray Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.light_gray_dye"},{"id":"minecraft:light_gray_glazed_terracotta","localizedName":"Light Gray Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_glazed_terracotta"},{"id":"minecraft:light_gray_shulker_box","localizedName":"Light Gray Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.light_gray_shulker_box"},{"id":"minecraft:light_gray_stained_glass","localizedName":"Light Gray Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_stained_glass"},{"id":"minecraft:light_gray_stained_glass_pane","localizedName":"Light Gray Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_stained_glass_pane"},{"id":"minecraft:light_gray_terracotta","localizedName":"Light Gray Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_terracotta"},{"id":"minecraft:light_gray_wool","localizedName":"Light Gray Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_gray_wool"},{"id":"minecraft:light_weighted_pressure_plate","localizedName":"Light Weighted Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.light_weighted_pressure_plate"},{"id":"minecraft:lightning_rod","localizedName":"Lightning Rod","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lightning_rod"},{"id":"minecraft:lilac","localizedName":"Lilac","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lilac"},{"id":"minecraft:lily_of_the_valley","localizedName":"Lily of the Valley","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lily_of_the_valley"},{"id":"minecraft:lily_pad","localizedName":"Lily Pad","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lily_pad"},{"id":"minecraft:lime_banner","localizedName":"Lime Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.lime_banner"},{"id":"minecraft:lime_bed","localizedName":"Lime Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.lime_bed"},{"id":"minecraft:lime_candle","localizedName":"Lime Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_candle"},{"id":"minecraft:lime_carpet","localizedName":"Lime Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_carpet"},{"id":"minecraft:lime_concrete","localizedName":"Lime Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_concrete"},{"id":"minecraft:lime_concrete_powder","localizedName":"Lime Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_concrete_powder"},{"id":"minecraft:lime_dye","localizedName":"Lime Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.lime_dye"},{"id":"minecraft:lime_glazed_terracotta","localizedName":"Lime Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_glazed_terracotta"},{"id":"minecraft:lime_shulker_box","localizedName":"Lime Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.lime_shulker_box"},{"id":"minecraft:lime_stained_glass","localizedName":"Lime Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_stained_glass"},{"id":"minecraft:lime_stained_glass_pane","localizedName":"Lime Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_stained_glass_pane"},{"id":"minecraft:lime_terracotta","localizedName":"Lime Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_terracotta"},{"id":"minecraft:lime_wool","localizedName":"Lime Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lime_wool"},{"id":"minecraft:lingering_potion","localizedName":"Lingering Water Bottle","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.lingering_potion.effect.water"},{"id":"minecraft:llama_spawn_egg","localizedName":"Llama Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.llama_spawn_egg"},{"id":"minecraft:lodestone","localizedName":"Lodestone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.lodestone"},{"id":"minecraft:loom","localizedName":"Loom","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.loom"},{"id":"minecraft:magenta_banner","localizedName":"Magenta Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.magenta_banner"},{"id":"minecraft:magenta_bed","localizedName":"Magenta Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.magenta_bed"},{"id":"minecraft:magenta_candle","localizedName":"Magenta Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_candle"},{"id":"minecraft:magenta_carpet","localizedName":"Magenta Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_carpet"},{"id":"minecraft:magenta_concrete","localizedName":"Magenta Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_concrete"},{"id":"minecraft:magenta_concrete_powder","localizedName":"Magenta Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_concrete_powder"},{"id":"minecraft:magenta_dye","localizedName":"Magenta Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.magenta_dye"},{"id":"minecraft:magenta_glazed_terracotta","localizedName":"Magenta Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_glazed_terracotta"},{"id":"minecraft:magenta_shulker_box","localizedName":"Magenta Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.magenta_shulker_box"},{"id":"minecraft:magenta_stained_glass","localizedName":"Magenta Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_stained_glass"},{"id":"minecraft:magenta_stained_glass_pane","localizedName":"Magenta Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_stained_glass_pane"},{"id":"minecraft:magenta_terracotta","localizedName":"Magenta Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_terracotta"},{"id":"minecraft:magenta_wool","localizedName":"Magenta Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magenta_wool"},{"id":"minecraft:magma_block","localizedName":"Magma Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.magma_block"},{"id":"minecraft:magma_cream","localizedName":"Magma Cream","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.magma_cream"},{"id":"minecraft:magma_cube_spawn_egg","localizedName":"Magma Cube Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.magma_cube_spawn_egg"},{"id":"minecraft:map","localizedName":"Empty Map","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.map"},{"id":"minecraft:medium_amethyst_bud","localizedName":"Medium Amethyst Bud","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.medium_amethyst_bud"},{"id":"minecraft:melon","localizedName":"Melon","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.melon"},{"id":"minecraft:melon_seeds","localizedName":"Melon Seeds","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.melon_seeds"},{"id":"minecraft:melon_slice","localizedName":"Melon Slice","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.melon_slice"},{"id":"minecraft:milk_bucket","localizedName":"Milk Bucket","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.milk_bucket"},{"id":"minecraft:minecart","localizedName":"Minecart","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.minecart"},{"id":"minecraft:mojang_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.mojang_banner_pattern"},{"id":"minecraft:mooshroom_spawn_egg","localizedName":"Mooshroom Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.mooshroom_spawn_egg"},{"id":"minecraft:moss_block","localizedName":"Moss Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.moss_block"},{"id":"minecraft:moss_carpet","localizedName":"Moss Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.moss_carpet"},{"id":"minecraft:mossy_cobblestone","localizedName":"Mossy Cobblestone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_cobblestone"},{"id":"minecraft:mossy_cobblestone_slab","localizedName":"Mossy Cobblestone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_cobblestone_slab"},{"id":"minecraft:mossy_cobblestone_stairs","localizedName":"Mossy Cobblestone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_cobblestone_stairs"},{"id":"minecraft:mossy_cobblestone_wall","localizedName":"Mossy Cobblestone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_cobblestone_wall"},{"id":"minecraft:mossy_stone_brick_slab","localizedName":"Mossy Stone Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_stone_brick_slab"},{"id":"minecraft:mossy_stone_brick_stairs","localizedName":"Mossy Stone Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_stone_brick_stairs"},{"id":"minecraft:mossy_stone_brick_wall","localizedName":"Mossy Stone Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_stone_brick_wall"},{"id":"minecraft:mossy_stone_bricks","localizedName":"Mossy Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mossy_stone_bricks"},{"id":"minecraft:mule_spawn_egg","localizedName":"Mule Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.mule_spawn_egg"},{"id":"minecraft:mushroom_stem","localizedName":"Mushroom Stem","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mushroom_stem"},{"id":"minecraft:mushroom_stew","localizedName":"Mushroom Stew","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.mushroom_stew"},{"id":"minecraft:music_disc_11","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_11"},{"id":"minecraft:music_disc_13","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_13"},{"id":"minecraft:music_disc_blocks","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_blocks"},{"id":"minecraft:music_disc_cat","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_cat"},{"id":"minecraft:music_disc_chirp","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_chirp"},{"id":"minecraft:music_disc_far","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_far"},{"id":"minecraft:music_disc_mall","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_mall"},{"id":"minecraft:music_disc_mellohi","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_mellohi"},{"id":"minecraft:music_disc_pigstep","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_pigstep"},{"id":"minecraft:music_disc_stal","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_stal"},{"id":"minecraft:music_disc_strad","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_strad"},{"id":"minecraft:music_disc_wait","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_wait"},{"id":"minecraft:music_disc_ward","localizedName":"Music Disc","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.music_disc_ward"},{"id":"minecraft:mutton","localizedName":"Raw Mutton","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.mutton"},{"id":"minecraft:mycelium","localizedName":"Mycelium","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.mycelium"},{"id":"minecraft:name_tag","localizedName":"Name Tag","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.name_tag"},{"id":"minecraft:nautilus_shell","localizedName":"Nautilus Shell","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.nautilus_shell"},{"id":"minecraft:nether_brick","localizedName":"Nether Brick","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.nether_brick"},{"id":"minecraft:nether_brick_fence","localizedName":"Nether Brick Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_brick_fence"},{"id":"minecraft:nether_brick_slab","localizedName":"Nether Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_brick_slab"},{"id":"minecraft:nether_brick_stairs","localizedName":"Nether Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_brick_stairs"},{"id":"minecraft:nether_brick_wall","localizedName":"Nether Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_brick_wall"},{"id":"minecraft:nether_bricks","localizedName":"Nether Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_bricks"},{"id":"minecraft:nether_gold_ore","localizedName":"Nether Gold Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_gold_ore"},{"id":"minecraft:nether_quartz_ore","localizedName":"Nether Quartz Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_quartz_ore"},{"id":"minecraft:nether_sprouts","localizedName":"Nether Sprouts","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_sprouts"},{"id":"minecraft:nether_star","localizedName":"Nether Star","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.nether_star"},{"id":"minecraft:nether_wart","localizedName":"Nether Wart","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.nether_wart"},{"id":"minecraft:nether_wart_block","localizedName":"Nether Wart Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.nether_wart_block"},{"id":"minecraft:netherite_axe","localizedName":"Netherite Axe","maxDamage":2031,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_axe"},{"id":"minecraft:netherite_block","localizedName":"Block of Netherite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.netherite_block"},{"id":"minecraft:netherite_boots","localizedName":"Netherite Boots","maxDamage":481,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_boots"},{"id":"minecraft:netherite_chestplate","localizedName":"Netherite Chestplate","maxDamage":592,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_chestplate"},{"id":"minecraft:netherite_helmet","localizedName":"Netherite Helmet","maxDamage":407,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_helmet"},{"id":"minecraft:netherite_hoe","localizedName":"Netherite Hoe","maxDamage":2031,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_hoe"},{"id":"minecraft:netherite_ingot","localizedName":"Netherite Ingot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.netherite_ingot"},{"id":"minecraft:netherite_leggings","localizedName":"Netherite Leggings","maxDamage":555,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_leggings"},{"id":"minecraft:netherite_pickaxe","localizedName":"Netherite Pickaxe","maxDamage":2031,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_pickaxe"},{"id":"minecraft:netherite_scrap","localizedName":"Netherite Scrap","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.netherite_scrap"},{"id":"minecraft:netherite_shovel","localizedName":"Netherite Shovel","maxDamage":2031,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_shovel"},{"id":"minecraft:netherite_sword","localizedName":"Netherite Sword","maxDamage":2031,"maxStackSize":1,"unlocalizedName":"item.minecraft.netherite_sword"},{"id":"minecraft:netherrack","localizedName":"Netherrack","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.netherrack"},{"id":"minecraft:note_block","localizedName":"Note Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.note_block"},{"id":"minecraft:oak_boat","localizedName":"Oak Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.oak_boat"},{"id":"minecraft:oak_button","localizedName":"Oak Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_button"},{"id":"minecraft:oak_door","localizedName":"Oak Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_door"},{"id":"minecraft:oak_fence","localizedName":"Oak Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_fence"},{"id":"minecraft:oak_fence_gate","localizedName":"Oak Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_fence_gate"},{"id":"minecraft:oak_leaves","localizedName":"Oak Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_leaves"},{"id":"minecraft:oak_log","localizedName":"Oak Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_log"},{"id":"minecraft:oak_planks","localizedName":"Oak Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_planks"},{"id":"minecraft:oak_pressure_plate","localizedName":"Oak Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_pressure_plate"},{"id":"minecraft:oak_sapling","localizedName":"Oak Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_sapling"},{"id":"minecraft:oak_sign","localizedName":"Oak Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.oak_sign"},{"id":"minecraft:oak_slab","localizedName":"Oak Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_slab"},{"id":"minecraft:oak_stairs","localizedName":"Oak Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_stairs"},{"id":"minecraft:oak_trapdoor","localizedName":"Oak Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_trapdoor"},{"id":"minecraft:oak_wood","localizedName":"Oak Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oak_wood"},{"id":"minecraft:observer","localizedName":"Observer","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.observer"},{"id":"minecraft:obsidian","localizedName":"Obsidian","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.obsidian"},{"id":"minecraft:ocelot_spawn_egg","localizedName":"Ocelot Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ocelot_spawn_egg"},{"id":"minecraft:orange_banner","localizedName":"Orange Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.orange_banner"},{"id":"minecraft:orange_bed","localizedName":"Orange Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.orange_bed"},{"id":"minecraft:orange_candle","localizedName":"Orange Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_candle"},{"id":"minecraft:orange_carpet","localizedName":"Orange Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_carpet"},{"id":"minecraft:orange_concrete","localizedName":"Orange Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_concrete"},{"id":"minecraft:orange_concrete_powder","localizedName":"Orange Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_concrete_powder"},{"id":"minecraft:orange_dye","localizedName":"Orange Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.orange_dye"},{"id":"minecraft:orange_glazed_terracotta","localizedName":"Orange Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_glazed_terracotta"},{"id":"minecraft:orange_shulker_box","localizedName":"Orange Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.orange_shulker_box"},{"id":"minecraft:orange_stained_glass","localizedName":"Orange Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_stained_glass"},{"id":"minecraft:orange_stained_glass_pane","localizedName":"Orange Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_stained_glass_pane"},{"id":"minecraft:orange_terracotta","localizedName":"Orange Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_terracotta"},{"id":"minecraft:orange_tulip","localizedName":"Orange Tulip","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_tulip"},{"id":"minecraft:orange_wool","localizedName":"Orange Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.orange_wool"},{"id":"minecraft:oxeye_daisy","localizedName":"Oxeye Daisy","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oxeye_daisy"},{"id":"minecraft:oxidized_copper","localizedName":"Oxidized Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oxidized_copper"},{"id":"minecraft:oxidized_cut_copper","localizedName":"Oxidized Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oxidized_cut_copper"},{"id":"minecraft:oxidized_cut_copper_slab","localizedName":"Oxidized Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oxidized_cut_copper_slab"},{"id":"minecraft:oxidized_cut_copper_stairs","localizedName":"Oxidized Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.oxidized_cut_copper_stairs"},{"id":"minecraft:packed_ice","localizedName":"Packed Ice","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.packed_ice"},{"id":"minecraft:painting","localizedName":"Painting","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.painting"},{"id":"minecraft:panda_spawn_egg","localizedName":"Panda Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.panda_spawn_egg"},{"id":"minecraft:paper","localizedName":"Paper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.paper"},{"id":"minecraft:parrot_spawn_egg","localizedName":"Parrot Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.parrot_spawn_egg"},{"id":"minecraft:peony","localizedName":"Peony","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.peony"},{"id":"minecraft:petrified_oak_slab","localizedName":"Petrified Oak Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.petrified_oak_slab"},{"id":"minecraft:phantom_membrane","localizedName":"Phantom Membrane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.phantom_membrane"},{"id":"minecraft:phantom_spawn_egg","localizedName":"Phantom Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.phantom_spawn_egg"},{"id":"minecraft:pig_spawn_egg","localizedName":"Pig Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pig_spawn_egg"},{"id":"minecraft:piglin_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.piglin_banner_pattern"},{"id":"minecraft:piglin_brute_spawn_egg","localizedName":"Piglin Brute Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.piglin_brute_spawn_egg"},{"id":"minecraft:piglin_spawn_egg","localizedName":"Piglin Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.piglin_spawn_egg"},{"id":"minecraft:pillager_spawn_egg","localizedName":"Pillager Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pillager_spawn_egg"},{"id":"minecraft:pink_banner","localizedName":"Pink Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.pink_banner"},{"id":"minecraft:pink_bed","localizedName":"Pink Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.pink_bed"},{"id":"minecraft:pink_candle","localizedName":"Pink Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_candle"},{"id":"minecraft:pink_carpet","localizedName":"Pink Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_carpet"},{"id":"minecraft:pink_concrete","localizedName":"Pink Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_concrete"},{"id":"minecraft:pink_concrete_powder","localizedName":"Pink Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_concrete_powder"},{"id":"minecraft:pink_dye","localizedName":"Pink Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pink_dye"},{"id":"minecraft:pink_glazed_terracotta","localizedName":"Pink Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_glazed_terracotta"},{"id":"minecraft:pink_shulker_box","localizedName":"Pink Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.pink_shulker_box"},{"id":"minecraft:pink_stained_glass","localizedName":"Pink Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_stained_glass"},{"id":"minecraft:pink_stained_glass_pane","localizedName":"Pink Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_stained_glass_pane"},{"id":"minecraft:pink_terracotta","localizedName":"Pink Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_terracotta"},{"id":"minecraft:pink_tulip","localizedName":"Pink Tulip","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_tulip"},{"id":"minecraft:pink_wool","localizedName":"Pink Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pink_wool"},{"id":"minecraft:piston","localizedName":"Piston","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.piston"},{"id":"minecraft:player_head","localizedName":"Player Head","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.player_head"},{"id":"minecraft:podzol","localizedName":"Podzol","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.podzol"},{"id":"minecraft:pointed_dripstone","localizedName":"Pointed Dripstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pointed_dripstone"},{"id":"minecraft:poisonous_potato","localizedName":"Poisonous Potato","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.poisonous_potato"},{"id":"minecraft:polar_bear_spawn_egg","localizedName":"Polar Bear Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.polar_bear_spawn_egg"},{"id":"minecraft:polished_andesite","localizedName":"Polished Andesite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_andesite"},{"id":"minecraft:polished_andesite_slab","localizedName":"Polished Andesite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_andesite_slab"},{"id":"minecraft:polished_andesite_stairs","localizedName":"Polished Andesite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_andesite_stairs"},{"id":"minecraft:polished_basalt","localizedName":"Polished Basalt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_basalt"},{"id":"minecraft:polished_blackstone","localizedName":"Polished Blackstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone"},{"id":"minecraft:polished_blackstone_brick_slab","localizedName":"Polished Blackstone Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_brick_slab"},{"id":"minecraft:polished_blackstone_brick_stairs","localizedName":"Polished Blackstone Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_brick_stairs"},{"id":"minecraft:polished_blackstone_brick_wall","localizedName":"Polished Blackstone Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_brick_wall"},{"id":"minecraft:polished_blackstone_bricks","localizedName":"Polished Blackstone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_bricks"},{"id":"minecraft:polished_blackstone_button","localizedName":"Polished Blackstone Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_button"},{"id":"minecraft:polished_blackstone_pressure_plate","localizedName":"Polished Blackstone Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_pressure_plate"},{"id":"minecraft:polished_blackstone_slab","localizedName":"Polished Blackstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_slab"},{"id":"minecraft:polished_blackstone_stairs","localizedName":"Polished Blackstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_stairs"},{"id":"minecraft:polished_blackstone_wall","localizedName":"Polished Blackstone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_blackstone_wall"},{"id":"minecraft:polished_deepslate","localizedName":"Polished Deepslate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_deepslate"},{"id":"minecraft:polished_deepslate_slab","localizedName":"Polished Deepslate Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_deepslate_slab"},{"id":"minecraft:polished_deepslate_stairs","localizedName":"Polished Deepslate Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_deepslate_stairs"},{"id":"minecraft:polished_deepslate_wall","localizedName":"Polished Deepslate Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_deepslate_wall"},{"id":"minecraft:polished_diorite","localizedName":"Polished Diorite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_diorite"},{"id":"minecraft:polished_diorite_slab","localizedName":"Polished Diorite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_diorite_slab"},{"id":"minecraft:polished_diorite_stairs","localizedName":"Polished Diorite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_diorite_stairs"},{"id":"minecraft:polished_granite","localizedName":"Polished Granite","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_granite"},{"id":"minecraft:polished_granite_slab","localizedName":"Polished Granite Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_granite_slab"},{"id":"minecraft:polished_granite_stairs","localizedName":"Polished Granite Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.polished_granite_stairs"},{"id":"minecraft:popped_chorus_fruit","localizedName":"Popped Chorus Fruit","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.popped_chorus_fruit"},{"id":"minecraft:poppy","localizedName":"Poppy","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.poppy"},{"id":"minecraft:porkchop","localizedName":"Raw Porkchop","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.porkchop"},{"id":"minecraft:potato","localizedName":"Potato","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.potato"},{"id":"minecraft:potion","localizedName":"Water Bottle","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.potion.effect.water"},{"id":"minecraft:powder_snow_bucket","localizedName":"Powder Snow Bucket","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.powder_snow_bucket"},{"id":"minecraft:powered_rail","localizedName":"Powered Rail","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.powered_rail"},{"id":"minecraft:prismarine","localizedName":"Prismarine","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine"},{"id":"minecraft:prismarine_brick_slab","localizedName":"Prismarine Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_brick_slab"},{"id":"minecraft:prismarine_brick_stairs","localizedName":"Prismarine Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_brick_stairs"},{"id":"minecraft:prismarine_bricks","localizedName":"Prismarine Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_bricks"},{"id":"minecraft:prismarine_crystals","localizedName":"Prismarine Crystals","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.prismarine_crystals"},{"id":"minecraft:prismarine_shard","localizedName":"Prismarine Shard","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.prismarine_shard"},{"id":"minecraft:prismarine_slab","localizedName":"Prismarine Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_slab"},{"id":"minecraft:prismarine_stairs","localizedName":"Prismarine Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_stairs"},{"id":"minecraft:prismarine_wall","localizedName":"Prismarine Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.prismarine_wall"},{"id":"minecraft:pufferfish","localizedName":"Pufferfish","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pufferfish"},{"id":"minecraft:pufferfish_bucket","localizedName":"Bucket of Pufferfish","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.pufferfish_bucket"},{"id":"minecraft:pufferfish_spawn_egg","localizedName":"Pufferfish Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pufferfish_spawn_egg"},{"id":"minecraft:pumpkin","localizedName":"Pumpkin","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.pumpkin"},{"id":"minecraft:pumpkin_pie","localizedName":"Pumpkin Pie","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pumpkin_pie"},{"id":"minecraft:pumpkin_seeds","localizedName":"Pumpkin Seeds","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.pumpkin_seeds"},{"id":"minecraft:purple_banner","localizedName":"Purple Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.purple_banner"},{"id":"minecraft:purple_bed","localizedName":"Purple Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.purple_bed"},{"id":"minecraft:purple_candle","localizedName":"Purple Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_candle"},{"id":"minecraft:purple_carpet","localizedName":"Purple Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_carpet"},{"id":"minecraft:purple_concrete","localizedName":"Purple Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_concrete"},{"id":"minecraft:purple_concrete_powder","localizedName":"Purple Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_concrete_powder"},{"id":"minecraft:purple_dye","localizedName":"Purple Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.purple_dye"},{"id":"minecraft:purple_glazed_terracotta","localizedName":"Purple Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_glazed_terracotta"},{"id":"minecraft:purple_shulker_box","localizedName":"Purple Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.purple_shulker_box"},{"id":"minecraft:purple_stained_glass","localizedName":"Purple Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_stained_glass"},{"id":"minecraft:purple_stained_glass_pane","localizedName":"Purple Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_stained_glass_pane"},{"id":"minecraft:purple_terracotta","localizedName":"Purple Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_terracotta"},{"id":"minecraft:purple_wool","localizedName":"Purple Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purple_wool"},{"id":"minecraft:purpur_block","localizedName":"Purpur Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purpur_block"},{"id":"minecraft:purpur_pillar","localizedName":"Purpur Pillar","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purpur_pillar"},{"id":"minecraft:purpur_slab","localizedName":"Purpur Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purpur_slab"},{"id":"minecraft:purpur_stairs","localizedName":"Purpur Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.purpur_stairs"},{"id":"minecraft:quartz","localizedName":"Nether Quartz","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.quartz"},{"id":"minecraft:quartz_block","localizedName":"Block of Quartz","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.quartz_block"},{"id":"minecraft:quartz_bricks","localizedName":"Quartz Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.quartz_bricks"},{"id":"minecraft:quartz_pillar","localizedName":"Quartz Pillar","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.quartz_pillar"},{"id":"minecraft:quartz_slab","localizedName":"Quartz Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.quartz_slab"},{"id":"minecraft:quartz_stairs","localizedName":"Quartz Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.quartz_stairs"},{"id":"minecraft:rabbit","localizedName":"Raw Rabbit","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.rabbit"},{"id":"minecraft:rabbit_foot","localizedName":"Rabbit\u0027s Foot","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.rabbit_foot"},{"id":"minecraft:rabbit_hide","localizedName":"Rabbit Hide","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.rabbit_hide"},{"id":"minecraft:rabbit_spawn_egg","localizedName":"Rabbit Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.rabbit_spawn_egg"},{"id":"minecraft:rabbit_stew","localizedName":"Rabbit Stew","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.rabbit_stew"},{"id":"minecraft:rail","localizedName":"Rail","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.rail"},{"id":"minecraft:ravager_spawn_egg","localizedName":"Ravager Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.ravager_spawn_egg"},{"id":"minecraft:raw_copper","localizedName":"Raw Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.raw_copper"},{"id":"minecraft:raw_copper_block","localizedName":"Block of Raw Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.raw_copper_block"},{"id":"minecraft:raw_gold","localizedName":"Raw Gold","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.raw_gold"},{"id":"minecraft:raw_gold_block","localizedName":"Block of Raw Gold","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.raw_gold_block"},{"id":"minecraft:raw_iron","localizedName":"Raw Iron","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.raw_iron"},{"id":"minecraft:raw_iron_block","localizedName":"Block of Raw Iron","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.raw_iron_block"},{"id":"minecraft:red_banner","localizedName":"Red Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.red_banner"},{"id":"minecraft:red_bed","localizedName":"Red Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.red_bed"},{"id":"minecraft:red_candle","localizedName":"Red Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_candle"},{"id":"minecraft:red_carpet","localizedName":"Red Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_carpet"},{"id":"minecraft:red_concrete","localizedName":"Red Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_concrete"},{"id":"minecraft:red_concrete_powder","localizedName":"Red Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_concrete_powder"},{"id":"minecraft:red_dye","localizedName":"Red Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.red_dye"},{"id":"minecraft:red_glazed_terracotta","localizedName":"Red Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_glazed_terracotta"},{"id":"minecraft:red_mushroom","localizedName":"Red Mushroom","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_mushroom"},{"id":"minecraft:red_mushroom_block","localizedName":"Red Mushroom Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_mushroom_block"},{"id":"minecraft:red_nether_brick_slab","localizedName":"Red Nether Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_nether_brick_slab"},{"id":"minecraft:red_nether_brick_stairs","localizedName":"Red Nether Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_nether_brick_stairs"},{"id":"minecraft:red_nether_brick_wall","localizedName":"Red Nether Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_nether_brick_wall"},{"id":"minecraft:red_nether_bricks","localizedName":"Red Nether Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_nether_bricks"},{"id":"minecraft:red_sand","localizedName":"Red Sand","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_sand"},{"id":"minecraft:red_sandstone","localizedName":"Red Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_sandstone"},{"id":"minecraft:red_sandstone_slab","localizedName":"Red Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_sandstone_slab"},{"id":"minecraft:red_sandstone_stairs","localizedName":"Red Sandstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_sandstone_stairs"},{"id":"minecraft:red_sandstone_wall","localizedName":"Red Sandstone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_sandstone_wall"},{"id":"minecraft:red_shulker_box","localizedName":"Red Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.red_shulker_box"},{"id":"minecraft:red_stained_glass","localizedName":"Red Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_stained_glass"},{"id":"minecraft:red_stained_glass_pane","localizedName":"Red Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_stained_glass_pane"},{"id":"minecraft:red_terracotta","localizedName":"Red Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_terracotta"},{"id":"minecraft:red_tulip","localizedName":"Red Tulip","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_tulip"},{"id":"minecraft:red_wool","localizedName":"Red Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.red_wool"},{"id":"minecraft:redstone","localizedName":"Redstone Dust","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.redstone"},{"id":"minecraft:redstone_block","localizedName":"Block of Redstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.redstone_block"},{"id":"minecraft:redstone_lamp","localizedName":"Redstone Lamp","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.redstone_lamp"},{"id":"minecraft:redstone_ore","localizedName":"Redstone Ore","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.redstone_ore"},{"id":"minecraft:redstone_torch","localizedName":"Redstone Torch","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.redstone_torch"},{"id":"minecraft:repeater","localizedName":"Redstone Repeater","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.repeater"},{"id":"minecraft:repeating_command_block","localizedName":"Repeating Command Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.repeating_command_block"},{"id":"minecraft:respawn_anchor","localizedName":"Respawn Anchor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.respawn_anchor"},{"id":"minecraft:rooted_dirt","localizedName":"Rooted Dirt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.rooted_dirt"},{"id":"minecraft:rose_bush","localizedName":"Rose Bush","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.rose_bush"},{"id":"minecraft:rotten_flesh","localizedName":"Rotten Flesh","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.rotten_flesh"},{"id":"minecraft:saddle","localizedName":"Saddle","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.saddle"},{"id":"minecraft:salmon","localizedName":"Raw Salmon","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.salmon"},{"id":"minecraft:salmon_bucket","localizedName":"Bucket of Salmon","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.salmon_bucket"},{"id":"minecraft:salmon_spawn_egg","localizedName":"Salmon Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.salmon_spawn_egg"},{"id":"minecraft:sand","localizedName":"Sand","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sand"},{"id":"minecraft:sandstone","localizedName":"Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sandstone"},{"id":"minecraft:sandstone_slab","localizedName":"Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sandstone_slab"},{"id":"minecraft:sandstone_stairs","localizedName":"Sandstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sandstone_stairs"},{"id":"minecraft:sandstone_wall","localizedName":"Sandstone Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sandstone_wall"},{"id":"minecraft:scaffolding","localizedName":"Scaffolding","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.scaffolding"},{"id":"minecraft:sculk_sensor","localizedName":"Sculk Sensor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sculk_sensor"},{"id":"minecraft:scute","localizedName":"Scute","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.scute"},{"id":"minecraft:sea_lantern","localizedName":"Sea Lantern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sea_lantern"},{"id":"minecraft:sea_pickle","localizedName":"Sea Pickle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sea_pickle"},{"id":"minecraft:seagrass","localizedName":"Seagrass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.seagrass"},{"id":"minecraft:shears","localizedName":"Shears","maxDamage":238,"maxStackSize":1,"unlocalizedName":"item.minecraft.shears"},{"id":"minecraft:sheep_spawn_egg","localizedName":"Sheep Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.sheep_spawn_egg"},{"id":"minecraft:shield","localizedName":"Shield","maxDamage":336,"maxStackSize":1,"unlocalizedName":"item.minecraft.shield"},{"id":"minecraft:shroomlight","localizedName":"Shroomlight","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.shroomlight"},{"id":"minecraft:shulker_box","localizedName":"Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.shulker_box"},{"id":"minecraft:shulker_shell","localizedName":"Shulker Shell","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.shulker_shell"},{"id":"minecraft:shulker_spawn_egg","localizedName":"Shulker Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.shulker_spawn_egg"},{"id":"minecraft:silverfish_spawn_egg","localizedName":"Silverfish Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.silverfish_spawn_egg"},{"id":"minecraft:skeleton_horse_spawn_egg","localizedName":"Skeleton Horse Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.skeleton_horse_spawn_egg"},{"id":"minecraft:skeleton_skull","localizedName":"Skeleton Skull","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.skeleton_skull"},{"id":"minecraft:skeleton_spawn_egg","localizedName":"Skeleton Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.skeleton_spawn_egg"},{"id":"minecraft:skull_banner_pattern","localizedName":"Banner Pattern","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.skull_banner_pattern"},{"id":"minecraft:slime_ball","localizedName":"Slimeball","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.slime_ball"},{"id":"minecraft:slime_block","localizedName":"Slime Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.slime_block"},{"id":"minecraft:slime_spawn_egg","localizedName":"Slime Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.slime_spawn_egg"},{"id":"minecraft:small_amethyst_bud","localizedName":"Small Amethyst Bud","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.small_amethyst_bud"},{"id":"minecraft:small_dripleaf","localizedName":"Small Dripleaf","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.small_dripleaf"},{"id":"minecraft:smithing_table","localizedName":"Smithing Table","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smithing_table"},{"id":"minecraft:smoker","localizedName":"Smoker","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smoker"},{"id":"minecraft:smooth_basalt","localizedName":"Smooth Basalt","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_basalt"},{"id":"minecraft:smooth_quartz","localizedName":"Smooth Quartz Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_quartz"},{"id":"minecraft:smooth_quartz_slab","localizedName":"Smooth Quartz Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_quartz_slab"},{"id":"minecraft:smooth_quartz_stairs","localizedName":"Smooth Quartz Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_quartz_stairs"},{"id":"minecraft:smooth_red_sandstone","localizedName":"Smooth Red Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_red_sandstone"},{"id":"minecraft:smooth_red_sandstone_slab","localizedName":"Smooth Red Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_red_sandstone_slab"},{"id":"minecraft:smooth_red_sandstone_stairs","localizedName":"Smooth Red Sandstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_red_sandstone_stairs"},{"id":"minecraft:smooth_sandstone","localizedName":"Smooth Sandstone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_sandstone"},{"id":"minecraft:smooth_sandstone_slab","localizedName":"Smooth Sandstone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_sandstone_slab"},{"id":"minecraft:smooth_sandstone_stairs","localizedName":"Smooth Sandstone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_sandstone_stairs"},{"id":"minecraft:smooth_stone","localizedName":"Smooth Stone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_stone"},{"id":"minecraft:smooth_stone_slab","localizedName":"Smooth Stone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.smooth_stone_slab"},{"id":"minecraft:snow","localizedName":"Snow","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.snow"},{"id":"minecraft:snow_block","localizedName":"Snow Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.snow_block"},{"id":"minecraft:snowball","localizedName":"Snowball","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.snowball"},{"id":"minecraft:soul_campfire","localizedName":"Soul Campfire","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.soul_campfire"},{"id":"minecraft:soul_lantern","localizedName":"Soul Lantern","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.soul_lantern"},{"id":"minecraft:soul_sand","localizedName":"Soul Sand","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.soul_sand"},{"id":"minecraft:soul_soil","localizedName":"Soul Soil","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.soul_soil"},{"id":"minecraft:soul_torch","localizedName":"Soul Torch","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.soul_torch"},{"id":"minecraft:spawner","localizedName":"Spawner","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spawner"},{"id":"minecraft:spectral_arrow","localizedName":"Spectral Arrow","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.spectral_arrow"},{"id":"minecraft:spider_eye","localizedName":"Spider Eye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.spider_eye"},{"id":"minecraft:spider_spawn_egg","localizedName":"Spider Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.spider_spawn_egg"},{"id":"minecraft:splash_potion","localizedName":"Splash Water Bottle","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.splash_potion.effect.water"},{"id":"minecraft:sponge","localizedName":"Sponge","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sponge"},{"id":"minecraft:spore_blossom","localizedName":"Spore Blossom","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spore_blossom"},{"id":"minecraft:spruce_boat","localizedName":"Spruce Boat","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.spruce_boat"},{"id":"minecraft:spruce_button","localizedName":"Spruce Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_button"},{"id":"minecraft:spruce_door","localizedName":"Spruce Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_door"},{"id":"minecraft:spruce_fence","localizedName":"Spruce Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_fence"},{"id":"minecraft:spruce_fence_gate","localizedName":"Spruce Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_fence_gate"},{"id":"minecraft:spruce_leaves","localizedName":"Spruce Leaves","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_leaves"},{"id":"minecraft:spruce_log","localizedName":"Spruce Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_log"},{"id":"minecraft:spruce_planks","localizedName":"Spruce Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_planks"},{"id":"minecraft:spruce_pressure_plate","localizedName":"Spruce Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_pressure_plate"},{"id":"minecraft:spruce_sapling","localizedName":"Spruce Sapling","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_sapling"},{"id":"minecraft:spruce_sign","localizedName":"Spruce Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.spruce_sign"},{"id":"minecraft:spruce_slab","localizedName":"Spruce Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_slab"},{"id":"minecraft:spruce_stairs","localizedName":"Spruce Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_stairs"},{"id":"minecraft:spruce_trapdoor","localizedName":"Spruce Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_trapdoor"},{"id":"minecraft:spruce_wood","localizedName":"Spruce Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.spruce_wood"},{"id":"minecraft:spyglass","localizedName":"Spyglass","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.spyglass"},{"id":"minecraft:squid_spawn_egg","localizedName":"Squid Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.squid_spawn_egg"},{"id":"minecraft:stick","localizedName":"Stick","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.stick"},{"id":"minecraft:sticky_piston","localizedName":"Sticky Piston","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sticky_piston"},{"id":"minecraft:stone","localizedName":"Stone","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone"},{"id":"minecraft:stone_axe","localizedName":"Stone Axe","maxDamage":131,"maxStackSize":1,"unlocalizedName":"item.minecraft.stone_axe"},{"id":"minecraft:stone_brick_slab","localizedName":"Stone Brick Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_brick_slab"},{"id":"minecraft:stone_brick_stairs","localizedName":"Stone Brick Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_brick_stairs"},{"id":"minecraft:stone_brick_wall","localizedName":"Stone Brick Wall","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_brick_wall"},{"id":"minecraft:stone_bricks","localizedName":"Stone Bricks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_bricks"},{"id":"minecraft:stone_button","localizedName":"Stone Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_button"},{"id":"minecraft:stone_hoe","localizedName":"Stone Hoe","maxDamage":131,"maxStackSize":1,"unlocalizedName":"item.minecraft.stone_hoe"},{"id":"minecraft:stone_pickaxe","localizedName":"Stone Pickaxe","maxDamage":131,"maxStackSize":1,"unlocalizedName":"item.minecraft.stone_pickaxe"},{"id":"minecraft:stone_pressure_plate","localizedName":"Stone Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_pressure_plate"},{"id":"minecraft:stone_shovel","localizedName":"Stone Shovel","maxDamage":131,"maxStackSize":1,"unlocalizedName":"item.minecraft.stone_shovel"},{"id":"minecraft:stone_slab","localizedName":"Stone Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_slab"},{"id":"minecraft:stone_stairs","localizedName":"Stone Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stone_stairs"},{"id":"minecraft:stone_sword","localizedName":"Stone Sword","maxDamage":131,"maxStackSize":1,"unlocalizedName":"item.minecraft.stone_sword"},{"id":"minecraft:stonecutter","localizedName":"Stonecutter","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stonecutter"},{"id":"minecraft:stray_spawn_egg","localizedName":"Stray Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.stray_spawn_egg"},{"id":"minecraft:strider_spawn_egg","localizedName":"Strider Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.strider_spawn_egg"},{"id":"minecraft:string","localizedName":"String","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.string"},{"id":"minecraft:stripped_acacia_log","localizedName":"Stripped Acacia Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_acacia_log"},{"id":"minecraft:stripped_acacia_wood","localizedName":"Stripped Acacia Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_acacia_wood"},{"id":"minecraft:stripped_birch_log","localizedName":"Stripped Birch Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_birch_log"},{"id":"minecraft:stripped_birch_wood","localizedName":"Stripped Birch Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_birch_wood"},{"id":"minecraft:stripped_crimson_hyphae","localizedName":"Stripped Crimson Hyphae","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_crimson_hyphae"},{"id":"minecraft:stripped_crimson_stem","localizedName":"Stripped Crimson Stem","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_crimson_stem"},{"id":"minecraft:stripped_dark_oak_log","localizedName":"Stripped Dark Oak Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_dark_oak_log"},{"id":"minecraft:stripped_dark_oak_wood","localizedName":"Stripped Dark Oak Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_dark_oak_wood"},{"id":"minecraft:stripped_jungle_log","localizedName":"Stripped Jungle Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_jungle_log"},{"id":"minecraft:stripped_jungle_wood","localizedName":"Stripped Jungle Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_jungle_wood"},{"id":"minecraft:stripped_oak_log","localizedName":"Stripped Oak Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_oak_log"},{"id":"minecraft:stripped_oak_wood","localizedName":"Stripped Oak Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_oak_wood"},{"id":"minecraft:stripped_spruce_log","localizedName":"Stripped Spruce Log","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_spruce_log"},{"id":"minecraft:stripped_spruce_wood","localizedName":"Stripped Spruce Wood","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_spruce_wood"},{"id":"minecraft:stripped_warped_hyphae","localizedName":"Stripped Warped Hyphae","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_warped_hyphae"},{"id":"minecraft:stripped_warped_stem","localizedName":"Stripped Warped Stem","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.stripped_warped_stem"},{"id":"minecraft:structure_block","localizedName":"Structure Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.structure_block"},{"id":"minecraft:structure_void","localizedName":"Structure Void","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.structure_void"},{"id":"minecraft:sugar","localizedName":"Sugar","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.sugar"},{"id":"minecraft:sugar_cane","localizedName":"Sugar Cane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sugar_cane"},{"id":"minecraft:sunflower","localizedName":"Sunflower","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.sunflower"},{"id":"minecraft:suspicious_stew","localizedName":"Suspicious Stew","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.suspicious_stew"},{"id":"minecraft:sweet_berries","localizedName":"Sweet Berries","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.sweet_berries"},{"id":"minecraft:tall_grass","localizedName":"Tall Grass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tall_grass"},{"id":"minecraft:target","localizedName":"Target","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.target"},{"id":"minecraft:terracotta","localizedName":"Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.terracotta"},{"id":"minecraft:tinted_glass","localizedName":"Tinted Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tinted_glass"},{"id":"minecraft:tipped_arrow","localizedName":"Arrow of Poison","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.tipped_arrow.effect.poison"},{"id":"minecraft:tnt","localizedName":"TNT","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tnt"},{"id":"minecraft:tnt_minecart","localizedName":"Minecart with TNT","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.tnt_minecart"},{"id":"minecraft:torch","localizedName":"Torch","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.torch"},{"id":"minecraft:totem_of_undying","localizedName":"Totem of Undying","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.totem_of_undying"},{"id":"minecraft:trader_llama_spawn_egg","localizedName":"Trader Llama Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.trader_llama_spawn_egg"},{"id":"minecraft:trapped_chest","localizedName":"Trapped Chest","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.trapped_chest"},{"id":"minecraft:trident","localizedName":"Trident","maxDamage":250,"maxStackSize":1,"unlocalizedName":"item.minecraft.trident"},{"id":"minecraft:tripwire_hook","localizedName":"Tripwire Hook","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tripwire_hook"},{"id":"minecraft:tropical_fish","localizedName":"Tropical Fish","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.tropical_fish"},{"id":"minecraft:tropical_fish_bucket","localizedName":"Bucket of Tropical Fish","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.tropical_fish_bucket"},{"id":"minecraft:tropical_fish_spawn_egg","localizedName":"Tropical Fish Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.tropical_fish_spawn_egg"},{"id":"minecraft:tube_coral","localizedName":"Tube Coral","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tube_coral"},{"id":"minecraft:tube_coral_block","localizedName":"Tube Coral Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tube_coral_block"},{"id":"minecraft:tube_coral_fan","localizedName":"Tube Coral Fan","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tube_coral_fan"},{"id":"minecraft:tuff","localizedName":"Tuff","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.tuff"},{"id":"minecraft:turtle_egg","localizedName":"Turtle Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.turtle_egg"},{"id":"minecraft:turtle_helmet","localizedName":"Turtle Shell","maxDamage":275,"maxStackSize":1,"unlocalizedName":"item.minecraft.turtle_helmet"},{"id":"minecraft:turtle_spawn_egg","localizedName":"Turtle Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.turtle_spawn_egg"},{"id":"minecraft:twisting_vines","localizedName":"Twisting Vines","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.twisting_vines"},{"id":"minecraft:vex_spawn_egg","localizedName":"Vex Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.vex_spawn_egg"},{"id":"minecraft:villager_spawn_egg","localizedName":"Villager Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.villager_spawn_egg"},{"id":"minecraft:vindicator_spawn_egg","localizedName":"Vindicator Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.vindicator_spawn_egg"},{"id":"minecraft:vine","localizedName":"Vines","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.vine"},{"id":"minecraft:wandering_trader_spawn_egg","localizedName":"Wandering Trader Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.wandering_trader_spawn_egg"},{"id":"minecraft:warped_button","localizedName":"Warped Button","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_button"},{"id":"minecraft:warped_door","localizedName":"Warped Door","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_door"},{"id":"minecraft:warped_fence","localizedName":"Warped Fence","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_fence"},{"id":"minecraft:warped_fence_gate","localizedName":"Warped Fence Gate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_fence_gate"},{"id":"minecraft:warped_fungus","localizedName":"Warped Fungus","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_fungus"},{"id":"minecraft:warped_fungus_on_a_stick","localizedName":"Warped Fungus on a Stick","maxDamage":100,"maxStackSize":1,"unlocalizedName":"item.minecraft.warped_fungus_on_a_stick"},{"id":"minecraft:warped_hyphae","localizedName":"Warped Hyphae","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_hyphae"},{"id":"minecraft:warped_nylium","localizedName":"Warped Nylium","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_nylium"},{"id":"minecraft:warped_planks","localizedName":"Warped Planks","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_planks"},{"id":"minecraft:warped_pressure_plate","localizedName":"Warped Pressure Plate","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_pressure_plate"},{"id":"minecraft:warped_roots","localizedName":"Warped Roots","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_roots"},{"id":"minecraft:warped_sign","localizedName":"Warped Sign","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.warped_sign"},{"id":"minecraft:warped_slab","localizedName":"Warped Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_slab"},{"id":"minecraft:warped_stairs","localizedName":"Warped Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_stairs"},{"id":"minecraft:warped_stem","localizedName":"Warped Stem","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_stem"},{"id":"minecraft:warped_trapdoor","localizedName":"Warped Trapdoor","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_trapdoor"},{"id":"minecraft:warped_wart_block","localizedName":"Warped Wart Block","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.warped_wart_block"},{"id":"minecraft:water_bucket","localizedName":"Water Bucket","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.water_bucket"},{"id":"minecraft:waxed_copper_block","localizedName":"Waxed Block of Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_copper_block"},{"id":"minecraft:waxed_cut_copper","localizedName":"Waxed Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_cut_copper"},{"id":"minecraft:waxed_cut_copper_slab","localizedName":"Waxed Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_cut_copper_slab"},{"id":"minecraft:waxed_cut_copper_stairs","localizedName":"Waxed Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_cut_copper_stairs"},{"id":"minecraft:waxed_exposed_copper","localizedName":"Waxed Exposed Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_exposed_copper"},{"id":"minecraft:waxed_exposed_cut_copper","localizedName":"Waxed Exposed Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_exposed_cut_copper"},{"id":"minecraft:waxed_exposed_cut_copper_slab","localizedName":"Waxed Exposed Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_exposed_cut_copper_slab"},{"id":"minecraft:waxed_exposed_cut_copper_stairs","localizedName":"Waxed Exposed Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_exposed_cut_copper_stairs"},{"id":"minecraft:waxed_oxidized_copper","localizedName":"Waxed Oxidized Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_oxidized_copper"},{"id":"minecraft:waxed_oxidized_cut_copper","localizedName":"Waxed Oxidized Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_oxidized_cut_copper"},{"id":"minecraft:waxed_oxidized_cut_copper_slab","localizedName":"Waxed Oxidized Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_oxidized_cut_copper_slab"},{"id":"minecraft:waxed_oxidized_cut_copper_stairs","localizedName":"Waxed Oxidized Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_oxidized_cut_copper_stairs"},{"id":"minecraft:waxed_weathered_copper","localizedName":"Waxed Weathered Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_weathered_copper"},{"id":"minecraft:waxed_weathered_cut_copper","localizedName":"Waxed Weathered Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_weathered_cut_copper"},{"id":"minecraft:waxed_weathered_cut_copper_slab","localizedName":"Waxed Weathered Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_weathered_cut_copper_slab"},{"id":"minecraft:waxed_weathered_cut_copper_stairs","localizedName":"Waxed Weathered Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.waxed_weathered_cut_copper_stairs"},{"id":"minecraft:weathered_copper","localizedName":"Weathered Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.weathered_copper"},{"id":"minecraft:weathered_cut_copper","localizedName":"Weathered Cut Copper","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.weathered_cut_copper"},{"id":"minecraft:weathered_cut_copper_slab","localizedName":"Weathered Cut Copper Slab","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.weathered_cut_copper_slab"},{"id":"minecraft:weathered_cut_copper_stairs","localizedName":"Weathered Cut Copper Stairs","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.weathered_cut_copper_stairs"},{"id":"minecraft:weeping_vines","localizedName":"Weeping Vines","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.weeping_vines"},{"id":"minecraft:wet_sponge","localizedName":"Wet Sponge","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.wet_sponge"},{"id":"minecraft:wheat","localizedName":"Wheat","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.wheat"},{"id":"minecraft:wheat_seeds","localizedName":"Wheat Seeds","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.wheat_seeds"},{"id":"minecraft:white_banner","localizedName":"White Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.white_banner"},{"id":"minecraft:white_bed","localizedName":"White Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.white_bed"},{"id":"minecraft:white_candle","localizedName":"White Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_candle"},{"id":"minecraft:white_carpet","localizedName":"White Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_carpet"},{"id":"minecraft:white_concrete","localizedName":"White Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_concrete"},{"id":"minecraft:white_concrete_powder","localizedName":"White Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_concrete_powder"},{"id":"minecraft:white_dye","localizedName":"White Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.white_dye"},{"id":"minecraft:white_glazed_terracotta","localizedName":"White Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_glazed_terracotta"},{"id":"minecraft:white_shulker_box","localizedName":"White Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.white_shulker_box"},{"id":"minecraft:white_stained_glass","localizedName":"White Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_stained_glass"},{"id":"minecraft:white_stained_glass_pane","localizedName":"White Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_stained_glass_pane"},{"id":"minecraft:white_terracotta","localizedName":"White Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_terracotta"},{"id":"minecraft:white_tulip","localizedName":"White Tulip","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_tulip"},{"id":"minecraft:white_wool","localizedName":"White Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.white_wool"},{"id":"minecraft:witch_spawn_egg","localizedName":"Witch Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.witch_spawn_egg"},{"id":"minecraft:wither_rose","localizedName":"Wither Rose","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.wither_rose"},{"id":"minecraft:wither_skeleton_skull","localizedName":"Wither Skeleton Skull","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.wither_skeleton_skull"},{"id":"minecraft:wither_skeleton_spawn_egg","localizedName":"Wither Skeleton Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.wither_skeleton_spawn_egg"},{"id":"minecraft:wolf_spawn_egg","localizedName":"Wolf Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.wolf_spawn_egg"},{"id":"minecraft:wooden_axe","localizedName":"Wooden Axe","maxDamage":59,"maxStackSize":1,"unlocalizedName":"item.minecraft.wooden_axe"},{"id":"minecraft:wooden_hoe","localizedName":"Wooden Hoe","maxDamage":59,"maxStackSize":1,"unlocalizedName":"item.minecraft.wooden_hoe"},{"id":"minecraft:wooden_pickaxe","localizedName":"Wooden Pickaxe","maxDamage":59,"maxStackSize":1,"unlocalizedName":"item.minecraft.wooden_pickaxe"},{"id":"minecraft:wooden_shovel","localizedName":"Wooden Shovel","maxDamage":59,"maxStackSize":1,"unlocalizedName":"item.minecraft.wooden_shovel"},{"id":"minecraft:wooden_sword","localizedName":"Wooden Sword","maxDamage":59,"maxStackSize":1,"unlocalizedName":"item.minecraft.wooden_sword"},{"id":"minecraft:writable_book","localizedName":"Book and Quill","maxDamage":0,"maxStackSize":1,"unlocalizedName":"item.minecraft.writable_book"},{"id":"minecraft:written_book","localizedName":"Written Book","maxDamage":0,"maxStackSize":16,"unlocalizedName":"item.minecraft.written_book"},{"id":"minecraft:yellow_banner","localizedName":"Yellow Banner","maxDamage":0,"maxStackSize":16,"unlocalizedName":"block.minecraft.yellow_banner"},{"id":"minecraft:yellow_bed","localizedName":"Yellow Bed","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.yellow_bed"},{"id":"minecraft:yellow_candle","localizedName":"Yellow Candle","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_candle"},{"id":"minecraft:yellow_carpet","localizedName":"Yellow Carpet","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_carpet"},{"id":"minecraft:yellow_concrete","localizedName":"Yellow Concrete","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_concrete"},{"id":"minecraft:yellow_concrete_powder","localizedName":"Yellow Concrete Powder","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_concrete_powder"},{"id":"minecraft:yellow_dye","localizedName":"Yellow Dye","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.yellow_dye"},{"id":"minecraft:yellow_glazed_terracotta","localizedName":"Yellow Glazed Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_glazed_terracotta"},{"id":"minecraft:yellow_shulker_box","localizedName":"Yellow Shulker Box","maxDamage":0,"maxStackSize":1,"unlocalizedName":"block.minecraft.yellow_shulker_box"},{"id":"minecraft:yellow_stained_glass","localizedName":"Yellow Stained Glass","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_stained_glass"},{"id":"minecraft:yellow_stained_glass_pane","localizedName":"Yellow Stained Glass Pane","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_stained_glass_pane"},{"id":"minecraft:yellow_terracotta","localizedName":"Yellow Terracotta","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_terracotta"},{"id":"minecraft:yellow_wool","localizedName":"Yellow Wool","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.yellow_wool"},{"id":"minecraft:zoglin_spawn_egg","localizedName":"Zoglin Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.zoglin_spawn_egg"},{"id":"minecraft:zombie_head","localizedName":"Zombie Head","maxDamage":0,"maxStackSize":64,"unlocalizedName":"block.minecraft.zombie_head"},{"id":"minecraft:zombie_horse_spawn_egg","localizedName":"Zombie Horse Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.zombie_horse_spawn_egg"},{"id":"minecraft:zombie_spawn_egg","localizedName":"Zombie Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.zombie_spawn_egg"},{"id":"minecraft:zombie_villager_spawn_egg","localizedName":"Zombie Villager Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.zombie_villager_spawn_egg"},{"id":"minecraft:zombified_piglin_spawn_egg","localizedName":"Zombified Piglin Spawn Egg","maxDamage":0,"maxStackSize":64,"unlocalizedName":"item.minecraft.zombified_piglin_spawn_egg"}] diff --git a/worldedit-core/src/main/resources/cs_adv.js b/worldedit-core/src/main/resources/cs_adv.js deleted file mode 100644 index c0f6e7081..000000000 --- a/worldedit-core/src/main/resources/cs_adv.js +++ /dev/null @@ -1,51 +0,0 @@ -{ - var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; - var ARGUMENT_NAMES = /([^\s,]+)/g; - function getParamNames(func) { - var a = func.toString().replace(STRIP_COMMENTS, ''); - var r = a.slice(a.indexOf('(')+1, a.indexOf(')')).match(ARGUMENT_NAMES); - var l = new java.util.ArrayList(); - if (r !== null) { - for (var i = 0; i < r.length; i++) { - l.add(r[i]); - } - } - return l; - } - - function getAllFunctions() { - var a = new java.util.ArrayList(); - for (var f in this) { - if (this.hasOwnProperty(f) && this[f] instanceof Function && !/a/i.test(f)) { - a.add(this[f]); - } - } - return a; - } - - var functions = getAllFunctions(); - var commands = new java.util.ArrayList() - for (var i = 0; i < functions.length; i++) { - var f = functions[i]; - if (f.hasOwnProperty('desc')) - { - if (!f.hasOwnProperty('permission')) f.permission = "fawe.use"; - if (!f.hasOwnProperty('aliases')) f.aliases = [f.name]; - if (!f.hasOwnProperty('queued')) f.queued = true; - var cmd = com.boydti.fawe.config.Commands.fromArgs(f.aliases, f.usage, f.desc, f.min, f.max, f.flags, f.help, f.queued); - var man = com.sk89q.worldedit.extension.platform.CommandManager.getInstance(); - var builder = man.getBuilder(); - var args = getParamNames(f); - - var wrap = Java.extend(java.util.function.Function, { - apply: function(a) { - return f.apply(null, a); - } - }); - var w2 = new wrap(); - var callable = new com.sk89q.worldedit.util.command.parametric.FunctionParametricCallable(builder, "", cmd, f.permission, args, w2); - commands.add(callable); - } - } - commands; -} diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index 51c86ac5e..e70c499a7 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -133,6 +133,7 @@ "fawe.error.too-simple": "Complexity must be in the range 0-100", "fawe.error.input-parser-exception": "Invalid empty string instead of boolean.", "fawe.error.invalid-boolean": "Invalid boolean {0}", + "fawe.error.schematic.not.found": "Schematic {0} not found.", "fawe.cancel.worldedit.cancel.count": "Cancelled {0} edits.", "fawe.cancel.worldedit.cancel.reason.confirm": "Use //confirm to execute {2}", @@ -372,6 +373,7 @@ "worldedit.schematic.directory-does-not-exist": "Directory '{0}' does not exist!", "worldedit.schematic.file-perm-fail": "Creation of '{0}' failed! Check file permission.", "worldedit.schematic.sorting-old-new": "Cannot sort by oldest and newest.", + "worldedit.schematic.unsupported-minecraft-version": "This version of WorldEdit does not support your Minecraft version. Schematics will not work until this is resolved.", "worldedit.pos.already-set": "Position already set.", "worldedit.pos.console-require-coords": "You must provide coordinates as console.", @@ -577,6 +579,8 @@ "worldedit.operation.affected.entity": "{0} entities affected", "worldedit.operation.deform.expression": "deformed using {0}", + "worldedit.error.parser.invalid-nbt": "Invalid NBT Data in input: '{0}'. Error: {1}", + "worldedit.selection.convex.info.vertices": "Vertices: {0}", "worldedit.selection.convex.info.triangles": "Triangles: {0}", "worldedit.selection.convex.explain.primary": "Started new selection with vertex {0}.", diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java index 5e22fbf00..b70c9f574 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java @@ -25,8 +25,10 @@ import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent; import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.Preference; +import com.sk89q.worldedit.util.test.ResourceLockKeys; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.parallel.ResourceLock; import java.util.function.Function; import java.util.stream.Collectors; @@ -39,13 +41,14 @@ import static org.mockito.Mockito.when; /** * Common setup code for expression tests. */ +@ResourceLock(ResourceLockKeys.WORLDEDIT_PLATFORM) class BaseExpressionTest { static double readSlot(Expression expr, String name) { return expr.getSlots().getSlotValue(name).orElseThrow(IllegalStateException::new); } - private Platform mockPlat = mock(Platform.class); + private final Platform mockPlat = mock(Platform.class); @BeforeEach void setup() { @@ -92,22 +95,22 @@ class BaseExpressionTest { @Override public int getBlockTypeAbs(double x, double y, double z) { - return (int) x*10; + return (int) x * 10; } @Override public int getBlockDataAbs(double x, double y, double z) { - return (int) y*10; + return (int) y * 10; } @Override public int getBlockTypeRel(double x, double y, double z) { - return (int) x*100; + return (int) x * 100; } @Override public int getBlockDataRel(double x, double y, double z) { - return (int) y*100; + return (int) y * 100; } }); diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/math/BlockVector3Test.java b/worldedit-core/src/test/java/com/sk89q/worldedit/math/BlockVector3Test.java index c2fc731c5..3e3e27306 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/math/BlockVector3Test.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/math/BlockVector3Test.java @@ -19,18 +19,25 @@ package com.sk89q.worldedit.math; -import com.sk89q.worldedit.util.test.VariedVectors; +import com.sk89q.worldedit.util.test.VariedVectorGenerator; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @DisplayName("A 3D block vector") public class BlockVector3Test { - @VariedVectors.Test(capToVanilla = true, divisionsXZ = 50, divisionsY = 50) + @Test @DisplayName("survives a round-trip through long-packing") - void longPackingRoundTrip(BlockVector3 vec) { - assertEquals(vec, BlockVector3.fromLongPackedForm(vec.toLongPackedForm())); + void longPackingRoundTrip() { + new VariedVectorGenerator(true, 25, 25).makeVectorsStream() + .forEach(vec -> + assertEquals( + vec, + BlockVector3.fromLongPackedForm(vec.toLongPackedForm()) + ) + ); } -} +} \ No newline at end of file diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/BlockMapTest.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/BlockMapTest.java index ac2a8048e..1bb09ee17 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/BlockMapTest.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/BlockMapTest.java @@ -17,13 +17,66 @@ * along with this program. If not, see . */ +/* package com.sk89q.worldedit.util.collection; +import com.google.common.collect.ImmutableMap; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent; +import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.extension.platform.Platform; +import com.sk89q.worldedit.extension.platform.PlatformManager; +import com.sk89q.worldedit.extension.platform.Preference; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.registry.Registry; +import com.sk89q.worldedit.util.test.ResourceLockKeys; +import com.sk89q.worldedit.util.test.VariedVectorGenerator; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockType; +import com.sk89q.worldedit.world.block.BlockTypes; +import com.sk89q.worldedit.world.registry.BundledRegistries; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.api.parallel.ResourceLock; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import java.lang.reflect.Field; +import java.util.AbstractMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeFalse; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; + +@Execution(ExecutionMode.CONCURRENT) +@ResourceLock(ResourceLockKeys.WORLDEDIT_PLATFORM) @DisplayName("An ordered block map") class BlockMapTest { -/* + private static final Platform MOCKED_PLATFORM = mock(Platform.class); @BeforeAll @@ -31,8 +84,8 @@ class BlockMapTest { when(MOCKED_PLATFORM.getRegistries()).thenReturn(new BundledRegistries() { }); when(MOCKED_PLATFORM.getCapabilities()).thenReturn( - Stream.of(Capability.values()) - .collect(Collectors.toMap(Function.identity(), __ -> Preference.NORMAL)) + Stream.of(Capability.values()) + .collect(Collectors.toMap(Function.identity(), __ -> Preference.NORMAL)) ); PlatformManager platformManager = WorldEdit.getInstance().getPlatformManager(); platformManager.register(MOCKED_PLATFORM); @@ -64,21 +117,22 @@ class BlockMapTest { private final BaseBlock air = checkNotNull(BlockTypes.AIR).getDefaultState().toBaseBlock(); private final BaseBlock oakWood = checkNotNull(BlockTypes.OAK_WOOD).getDefaultState().toBaseBlock(); - private final BlockMap map = BlockMap.createForBaseBlock(); + private AutoCloseable mocks; @BeforeEach void setUp() { - MockitoAnnotations.initMocks(this); + mocks = MockitoAnnotations.openMocks(this); } @AfterEach - void tearDown() { - map.clear(); + void tearDown() throws Exception { + mocks.close(); } @Test @DisplayName("throws ClassCastException if invalid argument to get") void throwsFromGetOnInvalidArgument() { + BlockMap map = BlockMap.createForBaseBlock(); assertThrows(ClassCastException.class, () -> map.get("")); } @@ -89,30 +143,35 @@ class BlockMapTest { @Test @DisplayName("is empty") void isEmpty() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(0, map.size()); } @Test @DisplayName("is equal to another empty map") void isEqualToEmptyMap() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(ImmutableMap.of(), map); } @Test @DisplayName("has the same hashCode as another empty map") void isHashCodeEqualToEmptyMap() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(ImmutableMap.of().hashCode(), map.hashCode()); } @Test @DisplayName("returns `null` from get") void returnsNullFromGet() { + BlockMap map = BlockMap.createForBaseBlock(); assertNull(map.get(BlockVector3.ZERO)); } @Test @DisplayName("contains no keys") void containsNoKeys() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(0, map.keySet().size()); assertFalse(map.containsKey(BlockVector3.ZERO)); } @@ -120,6 +179,7 @@ class BlockMapTest { @Test @DisplayName("contains no values") void containsNoValues() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(0, map.values().size()); assertFalse(map.containsValue(air)); } @@ -127,32 +187,41 @@ class BlockMapTest { @Test @DisplayName("contains no entries") void containsNoEntries() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(0, map.entrySet().size()); } @Test @DisplayName("returns the default value from getOrDefault") void returnsDefaultFromGetOrDefault() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(air, map.getOrDefault(BlockVector3.ZERO, air)); } @Test @DisplayName("never calls the forEach action") - void neverCallsForEachAction() { - map.forEach(biConsumer); - verifyNoMoreInteractions(biConsumer); + void neverCallsForEachAction() throws Exception { + try (AutoCloseable ignored = MockitoAnnotations.openMocks(this)) { + BlockMap map = BlockMap.createForBaseBlock(); + map.forEach(biConsumer); + verifyNoMoreInteractions(biConsumer); + } } @Test @DisplayName("never calls the replaceAll function") - void neverCallsReplaceAllFunction() { - map.replaceAll(biFunction); - verifyNoMoreInteractions(biFunction); + void neverCallsReplaceAllFunction() throws Exception { + try (AutoCloseable ignored = MockitoAnnotations.openMocks(this)) { + BlockMap map = BlockMap.createForBaseBlock(); + map.replaceAll(biFunction); + verifyNoMoreInteractions(biFunction); + } } @Test @DisplayName("inserts on putIfAbsent") void insertOnPutIfAbsent() { + BlockMap map = BlockMap.createForBaseBlock(); assertNull(map.putIfAbsent(BlockVector3.ZERO, air)); assertEquals(1, map.size()); assertEquals(air, map.get(BlockVector3.ZERO)); @@ -161,18 +230,21 @@ class BlockMapTest { @Test @DisplayName("remove(key) returns null") void removeKeyReturnsNull() { + BlockMap map = BlockMap.createForBaseBlock(); assertNull(map.remove(BlockVector3.ZERO)); } @Test @DisplayName("remove(key, value) returns false") void removeKeyValueReturnsFalse() { + BlockMap map = BlockMap.createForBaseBlock(); assertFalse(map.remove(BlockVector3.ZERO, air)); } @Test @DisplayName("does nothing on replace") void doesNothingOnReplace() { + BlockMap map = BlockMap.createForBaseBlock(); assertNull(map.replace(BlockVector3.ZERO, air)); assertEquals(0, map.size()); assertFalse(map.replace(BlockVector3.ZERO, null, air)); @@ -182,6 +254,7 @@ class BlockMapTest { @Test @DisplayName("inserts on computeIfAbsent") void insertOnComputeIfAbsent() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(air, map.computeIfAbsent(BlockVector3.ZERO, k -> air)); assertEquals(1, map.size()); assertEquals(air, map.get(BlockVector3.ZERO)); @@ -190,6 +263,7 @@ class BlockMapTest { @Test @DisplayName("inserts on compute") void insertOnCompute() { + BlockMap map = BlockMap.createForBaseBlock(); assertEquals(air, map.compute(BlockVector3.ZERO, (k, v) -> air)); assertEquals(1, map.size()); assertEquals(air, map.get(BlockVector3.ZERO)); @@ -198,17 +272,21 @@ class BlockMapTest { @Test @DisplayName("does nothing on computeIfPresent") void doesNothingOnComputeIfPresent() { + BlockMap map = BlockMap.createForBaseBlock(); assertNull(map.computeIfPresent(BlockVector3.ZERO, (k, v) -> air)); assertEquals(0, map.size()); } @Test @DisplayName("inserts on merge, without calling merge function") - void insertsOnMerge() { - assertEquals(air, map.merge(BlockVector3.ZERO, air, mergeFunction)); - assertEquals(1, map.size()); - assertEquals(air, map.get(BlockVector3.ZERO)); - verifyNoMoreInteractions(mergeFunction); + void insertsOnMerge() throws Exception { + try (AutoCloseable ignored = MockitoAnnotations.openMocks(this)) { + BlockMap map = BlockMap.createForBaseBlock(); + assertEquals(air, map.merge(BlockVector3.ZERO, air, mergeFunction)); + assertEquals(1, map.size()); + assertEquals(air, map.get(BlockVector3.ZERO)); + verifyNoMoreInteractions(mergeFunction); + } } } @@ -217,328 +295,450 @@ class BlockMapTest { @DisplayName("after having an entry added") class AfterEntryAdded { - // Note: This section of tests would really benefit from - // being able to parameterize classes. It's not part of JUnit - // yet though: https://github.com/junit-team/junit5/issues/878 + private final VariedVectorGenerator generator = new VariedVectorGenerator(); - @VariedVectors.Test + @Test @DisplayName("has a size of one") - void hasSizeOne(BlockVector3 vec) { - map.put(vec, air); - assertEquals(1, map.size()); + void hasSizeOne() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(1, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("is equal to another map with the same entry") - void isEqualToSimilarMap(BlockVector3 vec) { - map.put(vec, air); - assertEquals(ImmutableMap.of(vec, air), map); + void isEqualToSimilarMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(ImmutableMap.of(vec, air), map); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("is not equal to another map with a different key") - void isNotEqualToDifferentKeyMap(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertNotEquals(ImmutableMap.of(nonMatch, air), map); + void isNotEqualToDifferentKeyMap() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(ImmutableMap.of(nonMatch, air), map); + }); } - @VariedVectors.Test + @Test @DisplayName("is not equal to another map with a different value") - void isNotEqualToDifferentValueMap(BlockVector3 vec) { - map.put(vec, air); - assertNotEquals(ImmutableMap.of(vec, oakWood), map); + void isNotEqualToDifferentValueMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(ImmutableMap.of(vec, oakWood), map); + }); } - @VariedVectors.Test + @Test @DisplayName("is not equal to an empty map") - void isNotEqualToEmptyMap(BlockVector3 vec) { - map.put(vec, air); - assertNotEquals(ImmutableMap.of(), map); + void isNotEqualToEmptyMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(ImmutableMap.of(), map); + }); } - @VariedVectors.Test + @Test @DisplayName("has the same hashCode as another map with the same entry") - void isHashCodeEqualToSimilarMap(BlockVector3 vec) { - map.put(vec, air); - assertEquals(ImmutableMap.of(vec, air).hashCode(), map.hashCode()); + void isHashCodeEqualToSimilarMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(ImmutableMap.of(vec, air).hashCode(), map.hashCode()); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("has a different hashCode from another map with a different key") - void isHashCodeNotEqualToDifferentKeyMap(BlockVector3 vec, BlockVector3 nonMatch) { - assumeFalse(vec.hashCode() == nonMatch.hashCode(), - "Vectors have equivalent hashCodes, maps will too."); - map.put(vec, air); - assertNotEquals(ImmutableMap.of(nonMatch, air).hashCode(), map.hashCode()); + void isHashCodeNotEqualToDifferentKeyMap() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + assumeFalse(vec.hashCode() == nonMatch.hashCode(), + "Vectors have equivalent hashCodes, maps will too."); + map.put(vec, air); + assertNotEquals(ImmutableMap.of(nonMatch, air).hashCode(), map.hashCode()); + }); } - @VariedVectors.Test + @Test @DisplayName("has a different hashCode from another map with a different value") - void isHashCodeNotEqualToDifferentValueMap(BlockVector3 vec) { - map.put(vec, air); - assertNotEquals(ImmutableMap.of(vec, oakWood).hashCode(), map.hashCode()); + void isHashCodeNotEqualToDifferentValueMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(ImmutableMap.of(vec, oakWood).hashCode(), map.hashCode()); + }); } - @VariedVectors.Test + @Test @DisplayName("has a different hashCode from an empty map") - void isHashCodeNotEqualToEmptyMap(BlockVector3 vec) { - map.put(vec, air); - assertNotEquals(ImmutableMap.of().hashCode(), map.hashCode()); + void isHashCodeNotEqualToEmptyMap() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(ImmutableMap.of().hashCode(), map.hashCode()); + }); } - @VariedVectors.Test + @Test @DisplayName("returns value from get") - void returnsValueFromGet(BlockVector3 vec) { - map.put(vec, air); - assertEquals(air, map.get(vec)); + void returnsValueFromGet() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("returns `null` from get with different key") - void returnsValueFromGet(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertNotEquals(air, map.get(nonMatch)); + void returnsValueFromGetDifferentKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNotEquals(air, map.get(nonMatch)); + }); } - @VariedVectors.Test + @Test @DisplayName("contains the key") - void containsTheKey(BlockVector3 vec) { - map.put(vec, air); - assertEquals(1, map.keySet().size()); - assertTrue(map.keySet().contains(vec)); - assertTrue(map.containsKey(vec)); + void containsTheKey() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(1, map.keySet().size()); + assertTrue(map.keySet().contains(vec)); + assertTrue(map.containsKey(vec)); + }); } - @VariedVectors.Test + @Test @DisplayName("contains the value") - void containsTheValue(BlockVector3 vec) { - map.put(vec, air); - assertEquals(1, map.values().size()); - assertTrue(map.values().contains(air)); - assertTrue(map.containsValue(air)); + void containsTheValue() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(1, map.values().size()); + assertTrue(map.values().contains(air)); + assertTrue(map.containsValue(air)); + }); } - @VariedVectors.Test + @Test @DisplayName("contains the entry") - void containsTheEntry(BlockVector3 vec) { - map.put(vec, air); - assertEquals(1, map.entrySet().size()); - assertEquals(new AbstractMap.SimpleImmutableEntry<>(vec, air), map.entrySet().iterator().next()); + void containsTheEntry() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(1, map.entrySet().size()); + assertEquals(new AbstractMap.SimpleImmutableEntry<>(vec, air), map.entrySet().iterator().next()); + }); } - @VariedVectors.Test + @Test @DisplayName("returns the provided value from getOrDefault") - void returnsProvidedFromGetOrDefault(BlockVector3 vec) { - map.put(vec, air); - assertEquals(air, map.getOrDefault(vec, oakWood)); + void returnsProvidedFromGetOrDefault() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(air, map.getOrDefault(vec, oakWood)); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("returns the default value from getOrDefault with a different key") - void returnsDefaultFromGetOrDefaultWrongKey(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertEquals(oakWood, map.getOrDefault(nonMatch, oakWood)); + void returnsDefaultFromGetOrDefaultWrongKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.getOrDefault(nonMatch, oakWood)); + }); } - @VariedVectors.Test + @Test @DisplayName("calls the forEach action once") - void neverCallsForEachAction(BlockVector3 vec) { - map.put(vec, air); - map.forEach(biConsumer); - verify(biConsumer).accept(vec, air); - verifyNoMoreInteractions(biConsumer); + void neverCallsForEachAction() { + generator.makeVectorsStream().sequential().forEach(vec -> { + try (AutoCloseable ignored = MockitoAnnotations.openMocks(this)) { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + map.forEach(biConsumer); + verify(biConsumer).accept(vec, air); + verifyNoMoreInteractions(biConsumer); + } catch (Exception e) { + throw new AssertionError(e); + } + }); } - @VariedVectors.Test + @Test @DisplayName("replaces value using replaceAll") - void neverCallsReplaceAllFunction(BlockVector3 vec) { - map.put(vec, air); - map.replaceAll((v, b) -> oakWood); - assertEquals(oakWood, map.get(vec)); + void neverCallsReplaceAllFunction() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + map.replaceAll((v, b) -> oakWood); + assertEquals(oakWood, map.get(vec)); + }); } - @VariedVectors.Test + @Test @DisplayName("does not insert on `putIfAbsent`") - void noInsertOnPutIfAbsent(BlockVector3 vec) { - map.put(vec, air); - assertEquals(air, map.putIfAbsent(vec, oakWood)); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + void noInsertOnPutIfAbsent() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(air, map.putIfAbsent(vec, oakWood)); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("inserts on `putIfAbsent` to a different key") - void insertOnPutIfAbsentDifferentKey(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertNull(map.putIfAbsent(nonMatch, oakWood)); - assertEquals(2, map.size()); - assertEquals(air, map.get(vec)); - assertEquals(oakWood, map.get(nonMatch)); + void insertOnPutIfAbsentDifferentKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNull(map.putIfAbsent(nonMatch, oakWood)); + assertEquals(2, map.size()); + assertEquals(air, map.get(vec)); + assertEquals(oakWood, map.get(nonMatch)); + }); } - @VariedVectors.Test + @Test @DisplayName("remove(key) returns the old value") - void removeKeyReturnsOldValue(BlockVector3 vec) { - map.put(vec, air); - assertEquals(air, map.remove(vec)); - assertEquals(0, map.size()); + void removeKeyReturnsOldValue() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(air, map.remove(vec)); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("keySet().remove(key) removes the entry from the map") - void keySetRemovePassesThrough(BlockVector3 vec) { - map.put(vec, air); - assertTrue(map.keySet().remove(vec)); - assertEquals(0, map.size()); + void keySetRemovePassesThrough() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertTrue(map.keySet().remove(vec)); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("entrySet().iterator().remove() removes the entry from the map") - void entrySetIteratorRemovePassesThrough(BlockVector3 vec) { - map.put(vec, air); - Iterator> iterator = map.entrySet().iterator(); - assertTrue(iterator.hasNext()); - Map.Entry entry = iterator.next(); - assertEquals(entry.getKey(), vec); - iterator.remove(); - assertEquals(0, map.size()); + void entrySetIteratorRemovePassesThrough() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + Iterator> iterator = map.entrySet().iterator(); + assertTrue(iterator.hasNext()); + Map.Entry entry = iterator.next(); + assertEquals(entry.getKey(), vec); + iterator.remove(); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("remove(nonMatch) returns null") - void removeNonMatchingKeyReturnsNull(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertNull(map.remove(nonMatch)); - assertEquals(1, map.size()); + void removeNonMatchingKeyReturnsNull() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertNull(map.remove(nonMatch)); + assertEquals(1, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("remove(key, value) returns true") - void removeKeyValueReturnsTrue(BlockVector3 vec) { - map.put(vec, air); - assertTrue(map.remove(vec, air)); - assertEquals(0, map.size()); + void removeKeyValueReturnsTrue() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertTrue(map.remove(vec, air)); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("remove(key, value) returns false for wrong value") - void removeKeyValueReturnsFalseWrongValue(BlockVector3 vec) { - map.put(vec, air); - assertFalse(map.remove(vec, oakWood)); - assertEquals(1, map.size()); + void removeKeyValueReturnsFalseWrongValue() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertFalse(map.remove(vec, oakWood)); + assertEquals(1, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("replaces value at key") - void replacesValueAtKey(BlockVector3 vec) { - map.put(vec, air); + void replacesValueAtKey() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); - assertEquals(air, map.replace(vec, oakWood)); - assertEquals(1, map.size()); - assertEquals(oakWood, map.get(vec)); + assertEquals(air, map.replace(vec, oakWood)); + assertEquals(1, map.size()); + assertEquals(oakWood, map.get(vec)); - assertTrue(map.replace(vec, oakWood, air)); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + assertTrue(map.replace(vec, oakWood, air)); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("does not replace value at different key") - void doesNotReplaceAtDifferentKey(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); + void doesNotReplaceAtDifferentKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); - assertNull(map.replace(nonMatch, oakWood)); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + assertNull(map.replace(nonMatch, oakWood)); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); - assertFalse(map.replace(nonMatch, air, oakWood)); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + assertFalse(map.replace(nonMatch, air, oakWood)); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test + @Test @DisplayName("does not insert on computeIfAbsent") - void doesNotInsertComputeIfAbsent(BlockVector3 vec) { - map.put(vec, air); - assertEquals(air, map.computeIfAbsent(vec, k -> { - assertEquals(vec, k); - return oakWood; - })); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + void doesNotInsertComputeIfAbsent() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(air, map.computeIfAbsent(vec, k -> { + assertEquals(vec, k); + return oakWood; + })); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("inserts on computeIfAbsent with different key") - void insertsOnComputeIfAbsentDifferentKey(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertEquals(oakWood, map.computeIfAbsent(nonMatch, k -> { - assertEquals(nonMatch, k); - return oakWood; - })); - assertEquals(2, map.size()); - assertEquals(air, map.get(vec)); - assertEquals(oakWood, map.get(nonMatch)); + void insertsOnComputeIfAbsentDifferentKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.computeIfAbsent(nonMatch, k -> { + assertEquals(nonMatch, k); + return oakWood; + })); + assertEquals(2, map.size()); + assertEquals(air, map.get(vec)); + assertEquals(oakWood, map.get(nonMatch)); + }); } - @VariedVectors.Test + @Test @DisplayName("replaces on compute") - void replaceOnCompute(BlockVector3 vec) { - map.put(vec, air); - assertEquals(oakWood, map.compute(vec, (k, v) -> { - assertEquals(vec, k); - assertEquals(air, v); - return oakWood; - })); - assertEquals(1, map.size()); - assertEquals(oakWood, map.get(vec)); - assertNull(map.compute(vec, (k, v) -> null)); - assertEquals(0, map.size()); + void replaceOnCompute() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.compute(vec, (k, v) -> { + assertEquals(vec, k); + assertEquals(air, v); + return oakWood; + })); + assertEquals(1, map.size()); + assertEquals(oakWood, map.get(vec)); + assertNull(map.compute(vec, (k, v) -> null)); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test(provideNonMatching = true) + @Test @DisplayName("inserts on compute with different key") - void insertOnComputeDifferentKey(BlockVector3 vec, BlockVector3 nonMatch) { - map.put(vec, air); - assertEquals(oakWood, map.compute(nonMatch, (k, v) -> { - assertEquals(nonMatch, k); - assertNull(v); - return oakWood; - })); - assertEquals(2, map.size()); - assertEquals(air, map.get(vec)); - assertEquals(oakWood, map.get(nonMatch)); - assertNull(map.compute(nonMatch, (k, v) -> null)); - assertEquals(1, map.size()); - assertEquals(air, map.get(vec)); + void insertOnComputeDifferentKey() { + generator.makePairedVectorsStream().forEach(pair -> { + BlockVector3 vec = pair.first; + BlockVector3 nonMatch = pair.second; + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.compute(nonMatch, (k, v) -> { + assertEquals(nonMatch, k); + assertNull(v); + return oakWood; + })); + assertEquals(2, map.size()); + assertEquals(air, map.get(vec)); + assertEquals(oakWood, map.get(nonMatch)); + assertNull(map.compute(nonMatch, (k, v) -> null)); + assertEquals(1, map.size()); + assertEquals(air, map.get(vec)); + }); } - @VariedVectors.Test + @Test @DisplayName("replaces on computeIfPresent") - void replacesOnComputeIfPresent(BlockVector3 vec) { - map.put(vec, air); - assertEquals(oakWood, map.computeIfPresent(vec, (k, v) -> { - assertEquals(vec, k); - assertEquals(air, v); - return oakWood; - })); - assertEquals(1, map.size()); - assertEquals(oakWood, map.get(vec)); - assertNull(map.computeIfPresent(vec, (k, v) -> null)); - assertEquals(0, map.size()); + void replacesOnComputeIfPresent() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.computeIfPresent(vec, (k, v) -> { + assertEquals(vec, k); + assertEquals(air, v); + return oakWood; + })); + assertEquals(1, map.size()); + assertEquals(oakWood, map.get(vec)); + assertNull(map.computeIfPresent(vec, (k, v) -> null)); + assertEquals(0, map.size()); + }); } - @VariedVectors.Test + @Test @DisplayName("inserts on merge, with call to merge function") - void insertsOnMerge(BlockVector3 vec) { - map.put(vec, air); - assertEquals(oakWood, map.merge(vec, oakWood, (o, n) -> { - assertEquals(air, o); - assertEquals(oakWood, n); - return n; - })); - assertEquals(1, map.size()); - assertEquals(oakWood, map.get(vec)); + void insertsOnMerge() { + generator.makeVectorsStream().forEach(vec -> { + BlockMap map = BlockMap.createForBaseBlock(); + map.put(vec, air); + assertEquals(oakWood, map.merge(vec, oakWood, (o, n) -> { + assertEquals(air, o); + assertEquals(oakWood, n); + return n; + })); + assertEquals(1, map.size()); + assertEquals(oakWood, map.get(vec)); + }); } } @@ -546,9 +746,10 @@ class BlockMapTest { @Test @DisplayName("contains all inserted vectors") void containsAllInsertedVectors() { + BlockMap map = BlockMap.createForBaseBlock(); Set allVectors = new VariedVectorGenerator() - .makeVectorsStream() - .collect(Collectors.toSet()); + .makeVectorsStream() + .collect(Collectors.toSet()); for (BlockVector3 vec : allVectors) { map.put(vec, air); } @@ -559,5 +760,6 @@ class BlockMapTest { assertEquals(air, entry.getValue()); } } -*/ + } + */ diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/PositionListTest.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/PositionListTest.java index e3452113f..fda8d867d 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/PositionListTest.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/util/collection/PositionListTest.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.util.collection; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.util.test.VariedVectors; +import com.sk89q.worldedit.util.test.VariedVectorGenerator; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,70 +29,91 @@ import static org.junit.jupiter.api.Assertions.assertTrue; abstract class PositionListTest { static class Long extends PositionListTest { - protected Long() { - super(new LongPositionList()); + @Override + protected PositionList createPositionList() { + return new LongPositionList(); } } static class Vector extends PositionListTest { - protected Vector() { - super(new VectorPositionList()); + @Override + protected PositionList createPositionList() { + return new VectorPositionList(); } } - private final PositionList positionList; + private final VariedVectorGenerator generator = new VariedVectorGenerator(true); - protected PositionListTest(PositionList positionList) { - this.positionList = positionList; - } + protected abstract PositionList createPositionList(); - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling add(vec) increases size by 1") - void addIncreasesSizeByOne(BlockVector3 vec) { - positionList.add(vec); - assertEquals(1, positionList.size()); + void addIncreasesSizeByOne() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertEquals(1, positionList.size()); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling get(0) after add(vec) returns vec") - void canGetVectorAfterAdd(BlockVector3 vec) { - positionList.add(vec); - assertEquals(vec, positionList.get(0)); + void canGetVectorAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertEquals(vec, positionList.get(0)); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling iterator().hasNext() after add(vec) returns true") - void hasNextAfterAdd(BlockVector3 vec) { - positionList.add(vec); - assertTrue(positionList.iterator().hasNext()); + void hasNextAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertTrue(positionList.iterator().hasNext()); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling iterator().next() after add(vec) returns vec") - void nextAfterAdd(BlockVector3 vec) { - positionList.add(vec); - assertEquals(vec, positionList.iterator().next()); + void nextAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertEquals(vec, positionList.iterator().next()); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling reverseIterator().hasNext() after add(vec) returns true") - void reverseHasNextAfterAdd(BlockVector3 vec) { - positionList.add(vec); - assertTrue(positionList.reverseIterator().hasNext()); + void reverseHasNextAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertTrue(positionList.reverseIterator().hasNext()); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling reverseIterator().next() after add(vec) returns vec") - void reverseNextAfterAdd(BlockVector3 vec) { - positionList.add(vec); - assertEquals(vec, positionList.reverseIterator().next()); + void reverseNextAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + assertEquals(vec, positionList.reverseIterator().next()); + }); } - @VariedVectors.Test(capToVanilla = true) + @Test @DisplayName("calling clear() after add(vec) makes the size() zero") - void clearAfterAdd(BlockVector3 vec) { - positionList.add(vec); - positionList.clear(); - assertEquals(0, positionList.size()); + void clearAfterAdd() { + generator.makeVectorsStream().forEach(vec -> { + PositionList positionList = createPositionList(); + positionList.add(vec); + positionList.clear(); + assertEquals(0, positionList.size()); + }); } } diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/ResourceLockKeys.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/ResourceLockKeys.java new file mode 100644 index 000000000..b0eb01de9 --- /dev/null +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/ResourceLockKeys.java @@ -0,0 +1,27 @@ +/* + * 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.util.test; + +public class ResourceLockKeys { + public static final String WORLDEDIT_PLATFORM = "WORLDEDIT_PLATFORM"; + + private ResourceLockKeys() { + } +} diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorGenerator.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorGenerator.java index fc915d08a..8a4cf7b8d 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorGenerator.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorGenerator.java @@ -30,12 +30,10 @@ import java.util.stream.Stream; public class VariedVectorGenerator { - // For better coverage assurance, increase these values for a local Gradle run. - // Don't do it for IntelliJ, it'll probably run out of memory. private static final int DEFAULT_DIVISIONS_XZ = - Integer.getInteger("variedvecs.divisions.xz", 5); + Integer.getInteger("variedvecs.divisions.xz", 10); private static final int DEFAULT_DIVISIONS_Y = - Integer.getInteger("variedvecs.divisions.y", 5); + Integer.getInteger("variedvecs.divisions.y", 10); public final int divisionsXZ; public final int divisionsY; @@ -46,29 +44,42 @@ public class VariedVectorGenerator { public final Set alwaysInclude; public VariedVectorGenerator() { - this(false, -1, -1); + this(false); + } + + public VariedVectorGenerator(boolean vanilla) { + this(vanilla, -1, -1); } public VariedVectorGenerator(boolean vanilla, int divisionsXZ, int divisionsY) { this.divisionsXZ = divisionsXZ == -1 ? DEFAULT_DIVISIONS_XZ : divisionsXZ; this.divisionsY = divisionsY == -1 ? DEFAULT_DIVISIONS_Y : divisionsY; maxXZ = 30_000_000; - maxY = vanilla ? 255 : Integer.MAX_VALUE; + maxY = vanilla ? 2047 : Integer.MAX_VALUE; xzStep = (maxXZ * 2) / this.divisionsXZ; yStep = (maxY * 2) / this.divisionsY; alwaysInclude = - ImmutableSet.of(BlockVector3.ZERO, BlockVector3.ONE, - BlockVector3.at(-maxXZ, 0, -maxXZ), - BlockVector3.at(maxXZ, 0, maxXZ), - BlockVector3.at(-maxXZ, maxY, -maxXZ), - BlockVector3.at(maxXZ, maxY, maxXZ)); + ImmutableSet.of(BlockVector3.ZERO, BlockVector3.ONE, + BlockVector3.at(-maxXZ, -maxY - 1, -maxXZ), + BlockVector3.at(maxXZ, -maxY - 1, maxXZ), + BlockVector3.at(-maxXZ, maxY, -maxXZ), + BlockVector3.at(maxXZ, maxY, maxXZ)); } public Stream makeVectorsStream() { return Stream.concat( - alwaysInclude.stream(), - Streams.stream(generateVectors()).filter(v -> !alwaysInclude.contains(v)) - ); + alwaysInclude.stream(), + Streams.stream(generateVectors()).filter(v -> !alwaysInclude.contains(v)) + ).parallel(); + } + + /** + * Gives two vectors from {@link #makeVectorsStream()} that aren't the same. + */ + public Stream makePairedVectorsStream() { + return makeVectorsStream() + .flatMap(vec -> makeVectorsStream().filter(v -> !v.equals(vec)) + .map(v -> new VariedVectorPair(vec, v))); } private Iterator generateVectors() { @@ -86,7 +97,7 @@ public class VariedVectorGenerator { BlockVector3 newVector = BlockVector3.at(x, (int) y, z); y += yStep; if (y > maxY) { - y = 0; + y = -maxY - 1; z += xzStep; if (z > maxXZ) { z = -maxXZ; diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorPair.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorPair.java new file mode 100644 index 000000000..2d55b7b0d --- /dev/null +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorPair.java @@ -0,0 +1,32 @@ +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * Copyright (C) WorldEdit team and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.sk89q.worldedit.util.test; + +import com.sk89q.worldedit.math.BlockVector3; + +public class VariedVectorPair { + public final BlockVector3 first; + public final BlockVector3 second; + + public VariedVectorPair(BlockVector3 first, BlockVector3 second) { + this.first = first; + this.second = second; + } +} diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectors.java b/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectors.java deleted file mode 100644 index 8fa39c337..000000000 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectors.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.util.test; - -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; -import org.junit.jupiter.params.provider.ArgumentsSource; -import org.junit.jupiter.params.support.AnnotationConsumer; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.stream.Stream; - -/** - * Argument provider for various vectors. - */ -public final class VariedVectors implements ArgumentsProvider, AnnotationConsumer { - - @Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @Documented - @ArgumentsSource(VariedVectors.class) - @ParameterizedTest(name = ParameterizedTest.ARGUMENTS_PLACEHOLDER) - public @interface Test { - - /** - * If {@code true}, provide a non-matching vector from - * the existing vectors set as well. This will nearly - * square the number of tests executed, since it will - * test every non-matching vector. - */ - boolean provideNonMatching() default false; - - /** - * If {@code true}, only provide vectors inside the range of Vanilla MC. - * This caps the Y value to 255. - */ - boolean capToVanilla() default false; - - int divisionsXZ() default -1; - - int divisionsY() default -1; - - } - - private boolean provideNonMatching; - private VariedVectorGenerator generator; - - @Override - public void accept(Test test) { - provideNonMatching = test.provideNonMatching(); - generator = new VariedVectorGenerator(test.capToVanilla(), test.divisionsXZ(), test.divisionsY()); - } - - @Override - public Stream provideArguments(ExtensionContext context) { - if (provideNonMatching) { - return generator.makeVectorsStream() - .flatMap(vec -> generator.makeVectorsStream().filter(v -> !v.equals(vec)) - .map(v -> Arguments.of(vec, v))); - } - return generator.makeVectorsStream().map(Arguments::of); - } - -} diff --git a/worldedit-core/src/test/resources/junit-platform.properties b/worldedit-core/src/test/resources/junit-platform.properties index 31bfedd9e..ee7c4fad3 100644 --- a/worldedit-core/src/test/resources/junit-platform.properties +++ b/worldedit-core/src/test/resources/junit-platform.properties @@ -2,4 +2,4 @@ junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.mode.default=concurrent junit.jupiter.execution.parallel.mode.classes.default=same_thread junit.jupiter.execution.parallel.config.strategy=dynamic -junit.jupiter.execution.parallel.config.dynamic.factor=1 +junit.jupiter.execution.parallel.config.dynamic.factor=4 diff --git a/worldedit-libs/bukkit/build.gradle.kts b/worldedit-libs/bukkit/build.gradle.kts index 1a08c7935..a9d1c255e 100644 --- a/worldedit-libs/bukkit/build.gradle.kts +++ b/worldedit-libs/bukkit/build.gradle.kts @@ -9,5 +9,5 @@ repositories { } dependencies { - "shade"("net.kyori:text-adapter-bukkit:3.0.6") + "shade"("net.kyori:text-adapter-bukkit:${Versions.TEXT_EXTRAS}") } diff --git a/worldedit-libs/core/build.gradle.kts b/worldedit-libs/core/build.gradle.kts index b9e808743..f5d3b8e67 100644 --- a/worldedit-libs/core/build.gradle.kts +++ b/worldedit-libs/core/build.gradle.kts @@ -13,4 +13,5 @@ dependencies { "shade"("org.enginehub.piston:core:${Versions.PISTON}") "shade"("org.enginehub.piston.core-ap:runtime:${Versions.PISTON}") "shade"("org.enginehub.piston:default-impl:${Versions.PISTON}") + "shade"("net.kyori:adventure-nbt:4.5.0") } diff --git a/worldedit-sponge/build.gradle.kts b/worldedit-sponge/build.gradle.kts index bbc39b71d..8a283bc0d 100644 --- a/worldedit-sponge/build.gradle.kts +++ b/worldedit-sponge/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { }) api("org.apache.logging.log4j:log4j-api") api("org.bstats:bstats-sponge:1.7") - testImplementation("org.mockito:mockito-core:3.11.1") + testImplementation("org.mockito:mockito-core:3.11.2") } <<<<<<< HEAD