From aa3ae636823386a6f534a88154d00fe558ed7a9a Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Thu, 1 Jul 2021 21:16:25 +0100 Subject: [PATCH] Feature/1.17 (#1120) * start v6 * Update classes to v6 method signatures * change rootVersion to signify p2v6 compat * Use 16 as toolchain version but target 11 for build output * add minimessage as api * Require v6 and don't attempt to "setup" hook from FAWE * Address comments * *address /all/ comments * FAWE classes should only act as a delegate * Uppercase logger * Settings for v6-hook have moved to P2-v6, remove unneeded if statements * Rename classes to Delegate * add whenDone task to setCuboids * Remove bad spaces * Fix plot swap * Initial work on 1.17 support * Remove data versions from the Bukkit adapters (#1507) * Remove data versions from the Bukkit adapters * Don't allow saving schematics without an adapter in place on Bukkit. * Removed confusing line (cherry picked from commit 2056218b4a8644836b1d127105dfa289e9cdbc1c) * More progress * Fix chunk sending * Repackage from com.boydti to com.fastasyncworldedit. (#1119) * Preliminary work on repackaging * Rename build artifacts matching our pattern * Finish up repackaging * Fix a few field accesses and old imports * Dirty fix for chunks container ChunkSections outside of 0-15 * Correctly read from NibbleArrays for lighting * Fix getSections and BlockMaterial for 1.17 * Fix writing blocks to the world. - The issue isn't the presence of a "-1" chunk, it's the constructor for ChunkSection requiring the layer (0 to 15) rather than the y chord * Fix more field accesses * More work towards 1.17 * Update Upstream a57f66f Fix watchdog, add negative y support. (1782) * Add azalea tree to `/tool tree` * Don't define toolchain twice * Repackage GriefDefender * Relocate under new namespace * Bye bye ecma left overs * Add 1.17 to issue templates and instructions * Move to adventure-nbt (#918) * Initial work for adventure-nbt * Some more FAWE specific stuff * Fix erroneous deprecation check * Workflow change * Continued merging all adventure NBT related changes * Continued merging all adventure NBT related changes * Made a constructor public again This needs to be public for BlockTransformExtent.java * Finished converting all NBT data to adventure. * Make this compile * Fix conflicts Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com> * Update adapters to 1.17 * Change build prefix to 1.17 * Move more nms classes to adapters * Move left over nms classes * Move Spigot 1.17 class * Remove unneeded adapter loader code The loader will find the appropriate class now itself * Update adapters * Update adapters * Lazy fix tests * Update adapters * Update Upstream 43da91a Remove method reflection for getMinHeight in BukkitWorld. (1796) * Relocate adventure-nbt under proper namespace * Add LazyCompoundTag as a non-version-specific class to be used by adapters * Better integration between old NBT and Adventure NBT - begin fixing the issues seen recently * Correctly NBT conversion method * LazyCompoundTags should actually be overriding and correctly returning a CompoundBinaryTag. * Update worldedit-adapters Fixes #1141 * Remove unnecessary massive lag machine * Refactor apply to applyBlock in subclasses * applyBlock should be overriden by all subclasses. Default apply to applyBlock * Closes #1130 Closes #1132 * Squashed commit of the following: commit a9bfa1a07c77083c844a0c3ba62f4bd94bed107c Author: NotMyFault Date: Sun Jun 27 21:53:21 2021 +0200 [ci skip] Update gradle wrapper validation commit aa7471f95317d28a16f62e4b200de8d0fea2fa95 Author: Matthew Miller Date: Sat Oct 10 15:49:13 2020 +1000 Add ^x,y,z relative offset support to the offset parser (#1545) * Add ^x,y,z relative offset support to the offset parser * Wrap in a try-catch (cherry picked from commit 28bdf7ff9254bbc85bb4f5f792b303943a3930a8) * Add `fawe.error.schematic.not.found` translation key * Update Upstream 728a152 Skip notify if chunk section doesn't exist (1794) * Fixed #1157 * Add a null check to prevent NPE in nbt code * Update adapters * Update Upstream fbb047a Optimize legacy schematic loading (1808) * Hurr durr I don't want to update Java * Update Upstream 0790e6e Fix CLI Mess (1811) * Fixes #1160 * Expose minimessage transitively thru PlotSquared Touches #32 * [ci skip] Remove unneeded maven repository * Steal tab completion from PlotSquared for P2 related commands * Don't error on startup when building locally Co-Authored-By: goldfishapp <8278196+goldfishapp@users.noreply.github.com> * [ci skip] Update gh actions to Java 16 * Update textures to grab 1.17 jar Co-authored-by: NotMyFault Co-authored-by: SirYwell Co-authored-by: Matthew Miller Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com> Co-authored-by: goldfishapp <8278196+goldfishapp@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 +- .github/ISSUE_TEMPLATE/config.yml | 3 + .github/workflows/build.yml | 14 +- .github/workflows/validate-gradle-wrapper.yml | 2 +- COMPILING.md | 8 +- README.md | 2 +- build.gradle.kts | 2 +- buildSrc/src/main/kotlin/CommonConfig.kt | 4 +- buildSrc/src/main/kotlin/LibsConfig.kt | 2 + buildSrc/src/main/kotlin/PlatformConfig.kt | 19 +- worldedit-bukkit/build.gradle.kts | 45 +- .../fawe/bukkit/NMSRelighterFactory.java | 19 - .../mc1_15_2/BlockMaterial_1_15_2.java | 175 ---- .../mc1_15_2/BukkitAdapter_1_15_2.java | 308 ------ .../mc1_15_2/BukkitGetBlocks_1_15_2.java | 916 ----------------- .../mc1_15_2/BukkitGetBlocks_1_15_2_Copy.java | 203 ---- .../FAWEWorldNativeAccess_1_15_2.java | 257 ----- .../adapter/mc1_15_2/MapChunkUtil_1_15_2.java | 28 - .../mc1_15_2/nbt/LazyCompoundTag_1_15_2.java | 153 --- .../mc1_16_1/BlockMaterial_1_16_1.java | 178 ---- .../mc1_16_1/BukkitAdapter_1_16_1.java | 310 ------ .../mc1_16_1/BukkitGetBlocks_1_16_1.java | 917 ----------------- .../mc1_16_1/BukkitGetBlocks_1_16_1_Copy.java | 203 ---- .../FAWEWorldNativeAccess_1_16_R1.java | 258 ----- .../adapter/mc1_16_1/MapChunkUtil_1_16_1.java | 28 - .../mc1_16_1/nbt/LazyCompoundTag_1_16_1.java | 153 --- .../mc1_16_2/BlockMaterial_1_16_2.java | 178 ---- .../mc1_16_2/BukkitAdapter_1_16_2.java | 310 ------ .../mc1_16_2/BukkitGetBlocks_1_16_2.java | 920 ------------------ .../mc1_16_2/BukkitGetBlocks_1_16_2_Copy.java | 204 ---- .../FAWEWorldNativeAccess_1_16_R2.java | 258 ----- .../adapter/mc1_16_2/MapChunkUtil_1_16_2.java | 28 - .../mc1_16_2/nbt/LazyCompoundTag_1_16_2.java | 153 --- .../mc1_16_5/BlockMaterial_1_16_5.java | 178 ---- .../mc1_16_5/BukkitAdapter_1_16_5.java | 310 ------ .../mc1_16_5/BukkitGetBlocks_1_16_5.java | 920 ------------------ .../mc1_16_5/BukkitGetBlocks_1_16_5_Copy.java | 204 ---- .../FAWEWorldNativeAccess_1_16_R3.java | 257 ----- .../adapter/mc1_16_5/MapChunkUtil_1_16_5.java | 28 - .../TuinityRelighterFactory_1_16_5.java | 21 - .../mc1_16_5/TuinityRelighter_1_16_5.java | 228 ----- .../mc1_16_5/nbt/LazyCompoundTag_1_16_5.java | 153 --- .../plotsquared/FaweLocalBlockQueue.java | 137 --- .../bukkit/regions/plotsquared/FaweTrim.java | 56 -- .../regions/plotsquared/PlotSetBiome.java | 94 -- .../BukkitPermissionAttachmentManager.java | 4 +- .../bukkit/FaweBukkit.java | 66 +- .../bukkit/adapter/BukkitGetBlocks.java | 2 +- .../bukkit/adapter/BukkitQueueHandler.java | 6 +- .../bukkit/adapter/CachedBukkitAdapter.java | 2 +- .../bukkit/adapter/DelegateLock.java | 2 +- .../bukkit/adapter/DelegateSemaphore.java | 33 + .../bukkit/adapter/IBukkitAdapter.java | 2 +- .../adapter/IDelegateBukkitImplAdapter.java | 13 +- .../bukkit/adapter/MapChunkUtil.java | 6 +- .../bukkit/adapter/NMSAdapter.java | 8 +- .../bukkit/adapter/NMSRelighterFactory.java | 19 + .../bukkit/adapter/Regenerator.java | 12 +- .../bukkit/adapter/SimpleBukkitAdapter.java | 3 +- .../bukkit/filter/GriefDefenderFilter.java | 6 +- .../bukkit/filter/GriefPreventionFilter.java | 6 +- .../bukkit/filter/WorldGuardFilter.java | 6 +- .../bukkit/listener/BrushListener.java | 8 +- .../bukkit/listener/ChunkListener.java | 14 +- .../bukkit/listener/ChunkListener9.java | 10 +- .../bukkit/listener/RenderListener.java | 8 +- .../bukkit/preloader/PluginPreloader.java | 4 +- .../bukkit/regions/BukkitMaskManager.java | 4 +- .../bukkit/regions/GriefDefenderFeature.java | 8 +- .../regions/GriefPreventionFeature.java | 8 +- .../bukkit/regions/ResidenceFeature.java | 6 +- .../bukkit/regions/TownyFeature.java | 4 +- .../bukkit/regions/Worldguard.java | 10 +- .../FaweDelegateRegionManager.java} | 134 ++- .../FaweDelegateSchematicHandler.java} | 150 ++- .../plotsquared/FaweQueueCoordinator.java | 205 ++++ .../bukkit/regions/plotsquared/FaweTrim.java | 55 ++ .../bukkit/regions/plotsquared/MoveTo512.java | 2 +- .../regions/plotsquared/PlotRegionFilter.java | 4 +- .../regions/plotsquared/PlotSetBiome.java | 108 ++ .../plotsquared/PlotSquaredFeature.java | 55 +- .../regions/plotsquared/ReplaceAll.java | 0 .../plotsquaredv4/FaweChunkManager.java | 8 +- .../plotsquaredv4/FaweLocalBlockQueue.java | 12 +- .../plotsquaredv4/FaweSchematicHandler.java | 16 +- .../regions/plotsquaredv4/FaweTrim.java | 4 +- .../plotsquaredv4/PlotRegionFilter.java | 4 +- .../regions/plotsquaredv4/PlotSetBiome.java | 6 +- .../plotsquaredv4/PlotSquaredFeature.java | 14 +- .../bukkit/util/BukkitReflectionUtils.java | 4 +- .../bukkit/util/BukkitTaskManager.java | 4 +- .../bukkit/util/ItemUtil.java | 4 +- .../bukkit/util/MinecraftVersion.java | 2 +- .../bukkit/util/VaultUtil.java | 2 +- .../bukkit/util/image/BukkitImageViewer.java | 8 +- .../sk89q/worldedit/bukkit/BukkitAdapter.java | 4 +- .../worldedit/bukkit/BukkitItemStack.java | 6 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 20 +- .../bukkit/BukkitServerInterface.java | 23 +- .../sk89q/worldedit/bukkit/BukkitWorld.java | 29 +- .../worldedit/bukkit/WorldEditPlugin.java | 19 +- .../bukkit/WorldUnloadedException.java | 2 +- .../bukkit/adapter/BukkitImplAdapter.java | 43 +- .../bukkit/adapter/BukkitImplLoader.java | 6 +- .../adapter/impl/FAWE_Spigot_v1_15_R2.java | 450 --------- .../adapter/impl/FAWE_Spigot_v1_16_R1.java | 452 --------- .../adapter/impl/FAWE_Spigot_v1_16_R2.java | 453 --------- .../adapter/impl/FAWE_Spigot_v1_16_R3.java | 454 --------- .../adapter/impl/regen/Regen_v1_15_R2.java | 513 ---------- .../adapter/impl/regen/Regen_v1_16_R1.java | 559 ----------- .../adapter/impl/regen/Regen_v1_16_R2.java | 582 ----------- .../adapter/impl/regen/Regen_v1_16_R3.java | 590 ----------- .../src/main/resources/worldedit-adapters.jar | Bin 456250 -> 597481 bytes .../com/sk89q/util/MinecraftVersionTest.java | 2 +- worldedit-cli/build.gradle.kts | 7 +- .../sk89q/worldedit/cli/CLIExtraCommands.java | 62 ++ .../com/sk89q/worldedit/cli/CLIPlatform.java | 4 +- .../com/sk89q/worldedit/cli/CLIWorldEdit.java | 61 +- .../cli/schematic/ClipboardWorld.java | 4 +- .../com/sk89q/worldedit/cli/data/2724.json | 1 + worldedit-core/build.gradle.kts | 13 +- .../worldedit/blocks/MobSpawnerBlock.java | 3 + .../com/sk89q/worldedit/blocks/SignBlock.java | 4 + .../sk89q/worldedit/blocks/SkullBlock.java | 4 + .../com/boydti/fawe/beta/FilterBlockMask.java | 8 - .../blocks/FallbackChunkGet.java | 219 ----- .../collection/DifferentialCollection.java | 7 - .../fawe/object/mask/ResettableMask.java | 9 - .../object/pattern/ResettablePattern.java | 9 - .../java/com/boydti/fawe/web/SchemSync.java | 132 --- .../core}/FAWEPlatformAdapterImpl.java | 4 +- .../core}/Fawe.java | 26 +- .../core}/FaweAPI.java | 36 +- .../core}/FaweCache.java | 28 +- .../core}/FaweVersion.java | 13 +- .../core}/IFawe.java | 12 +- .../core}/Resettable.java | 2 +- .../core}/beta/DirectionMask.java | 2 +- .../core}/beta/Filter.java | 4 +- .../core/beta/FilterBlockMask.java | 8 + .../core}/beta/Flood.java | 8 +- .../core}/beta/IBatchProcessor.java | 10 +- .../core}/beta/IBlocks.java | 8 +- .../core}/beta/IChunk.java | 4 +- .../core}/beta/IChunkCache.java | 2 +- .../core}/beta/IChunkGet.java | 4 +- .../core}/beta/IChunkSet.java | 4 +- .../core}/beta/IDelegateFilter.java | 4 +- .../core}/beta/IQueueChunk.java | 2 +- .../core}/beta/IQueueExtent.java | 9 +- .../core}/beta/IQueueWrapper.java | 2 +- .../core}/beta/ITileInput.java | 2 +- .../core}/beta/Trimable.java | 2 +- .../beta/implementation/IChunkExtent.java | 4 +- .../implementation/blocks/BitSetBlocks.java | 10 +- .../implementation/blocks/CharBlocks.java | 8 +- .../implementation/blocks/CharGetBlocks.java | 6 +- .../implementation/blocks/CharSetBlocks.java | 14 +- .../implementation/blocks/NullChunkGet.java | 12 +- .../implementation/chunk}/ChunkCache.java | 8 +- .../implementation/chunk/ChunkHolder.java | 26 +- .../beta/implementation/chunk/NullChunk.java | 12 +- .../implementation/filter/ArrayImageMask.java | 6 +- .../implementation/filter/CountFilter.java | 4 +- .../implementation/filter/DistrFilter.java | 4 +- .../implementation/filter/ForkedFilter.java | 4 +- .../implementation/filter/LinkedFilter.java | 8 +- .../implementation/filter/MaskFilter.java | 8 +- .../block/AbstractExtentFilterBlock.java | 2 +- .../filter/block/AbstractFilterBlock.java | 6 +- .../block/AbstractSingleFilterBlock.java | 6 +- .../filter/block/ArrayFilterBlock.java | 2 +- .../filter/block/CharFilterBlock.java | 18 +- .../filter/block/ChunkFilterBlock.java | 16 +- .../filter/block/DelegateFilter.java | 6 +- .../filter/block/ExtentFilterBlock.java | 2 +- .../filter/block/FilterBlock.java | 2 +- .../filter/block/SingleFilterBlock.java | 2 +- .../lighting/HeightMapType.java | 2 +- .../implementation/lighting/NMSRelighter.java | 22 +- .../lighting/NullRelighter.java | 2 +- .../lighting/RelightProcessor.java | 14 +- .../implementation/lighting/Relighter.java | 2 +- .../lighting/RelighterFactory.java | 8 +- .../implementation/packet/ChunkPacket.java | 12 +- .../preloader/AsyncPreloader.java | 8 +- .../implementation}/preloader/Preloader.java | 2 +- .../processors/BatchProcessorHolder.java | 10 +- .../processors/EmptyBatchProcessor.java | 10 +- .../ExtentBatchProcessorHolder.java | 8 +- .../processors/HeightmapProcessor.java | 12 +- .../processors/IBatchProcessorHolder.java | 10 +- .../processors/LimitExtent.java | 12 +- .../processors/MultiBatchProcessor.java | 16 +- .../processors/NullProcessor.java | 10 +- .../processors/ProcessorScope.java | 2 +- .../queue/ParallelQueueExtent.java | 28 +- .../core}/beta/implementation/queue/Pool.java | 2 +- .../implementation/queue/QueueHandler.java | 32 +- .../beta/implementation/queue/QueuePool.java | 2 +- .../queue/SingleThreadQueueExtent.java | 40 +- .../core}/command/AnvilCommands.java | 2 +- .../core}/command/CFICommand.java | 0 .../core}/command/CFICommands.java | 0 .../core}/command/FaweParser.java | 0 .../core}/command/PlotLoader.java | 0 .../command/SuggestInputParseException.java | 2 +- .../core/configuration}/Caption.java | 2 +- .../core/configuration}/Config.java | 7 +- .../core}/configuration/Configuration.java | 2 +- .../configuration/ConfigurationOptions.java | 34 +- .../configuration/ConfigurationSection.java | 2 +- .../InvalidConfigurationException.java | 4 +- .../configuration/MemoryConfiguration.java | 12 +- .../MemoryConfigurationOptions.java | 8 +- .../core}/configuration/MemorySection.java | 90 +- .../core/configuration}/Settings.java | 17 +- .../core}/configuration/TypeDescription.java | 2 +- .../core}/configuration/Yaml.java | 3 +- .../configuration/file/FileConfiguration.java | 44 +- .../file/FileConfigurationOptions.java | 33 +- .../configuration/file/YamlConfiguration.java | 12 +- .../file/YamlConfigurationOptions.java | 12 +- .../configuration/file/YamlConstructor.java | 4 +- .../configuration/file/YamlRepresenter.java | 8 +- .../ConfigurationSerializable.java | 10 +- .../ConfigurationSerialization.java | 4 +- .../DelegateDeserialization.java | 6 +- .../serialization/SerializableAs.java | 10 +- .../core}/database/DBHandler.java | 2 +- .../core}/database/RollbackDatabase.java | 14 +- .../core}/jnbt/JSON2NBT.java | 2 +- .../core}/jnbt/NBTException.java | 2 +- .../core}/jnbt/streamer/InfoReader.java | 2 +- .../core}/jnbt/streamer/IntValueReader.java | 2 +- .../core}/jnbt/streamer/LazyReader.java | 2 +- .../core}/jnbt/streamer/LongValueReader.java | 2 +- .../core}/jnbt/streamer/StreamDelegate.java | 2 +- .../core}/jnbt/streamer/StreamReader.java | 2 +- .../core}/jnbt/streamer/ValueReader.java | 2 +- .../logging}/RollbackOptimizedHistory.java | 10 +- .../core}/object/DataAnglePattern.java | 6 +- .../core}/object/DelegateConsumer.java | 2 +- .../core}/object/FaweInputStream.java | 4 +- .../core}/object/FaweLimit.java | 4 +- .../core}/object/FaweOutputStream.java | 2 +- .../core}/object/HistoryExtent.java | 4 +- .../core}/object/IntPair.java | 2 +- .../core}/object/IntTriple.java | 2 +- .../core}/object/Metadatable.java | 2 +- .../core}/object/NullChangeSet.java | 4 +- .../core}/object/RegionWrapper.java | 2 +- .../core}/object/RelightMode.java | 2 +- .../core}/object/RunnableVal.java | 2 +- .../core}/object/RunnableVal2.java | 2 +- .../core}/object/RunnableVal3.java | 2 +- .../core}/object/RunnableVal4.java | 2 +- .../core}/object/brush/AngleBrush.java | 6 +- .../core}/object/brush/BlendBall.java | 2 +- .../core}/object/brush/BlobBrush.java | 6 +- .../core}/object/brush/BrushSettings.java | 8 +- .../core}/object/brush/CatenaryBrush.java | 4 +- .../core}/object/brush/CircleBrush.java | 2 +- .../core}/object/brush/CommandBrush.java | 10 +- .../core}/object/brush/CopyPastaBrush.java | 10 +- .../core}/object/brush/ErodeBrush.java | 4 +- .../core}/object/brush/FallingSphere.java | 4 +- .../core}/object/brush/FlattenBrush.java | 6 +- .../core}/object/brush/HeightBrush.java | 15 +- .../core}/object/brush/ImageBrush.java | 10 +- .../core}/object/brush/InspectBrush.java | 18 +- .../core}/object/brush/LayerBrush.java | 10 +- .../core}/object/brush/LineBrush.java | 4 +- .../core}/object/brush/MovableTool.java | 2 +- .../core}/object/brush/PopulateSchem.java | 6 +- .../core}/object/brush/RaiseBrush.java | 2 +- .../core}/object/brush/RecurseBrush.java | 6 +- .../core}/object/brush/ResettableTool.java | 2 +- .../core}/object/brush/RockBrush.java | 4 +- .../core}/object/brush/ScatterBrush.java | 12 +- .../core}/object/brush/ScatterCommand.java | 6 +- .../object/brush/ScatterOverlayBrush.java | 4 +- .../core}/object/brush/ShatterBrush.java | 6 +- .../core}/object/brush/SplatterBrush.java | 10 +- .../core}/object/brush/SplineBrush.java | 10 +- .../core}/object/brush/StencilBrush.java | 6 +- .../object/brush/SurfaceSphereBrush.java | 6 +- .../core}/object/brush/SurfaceSpline.java | 8 +- .../core}/object/brush/TargetMode.java | 2 +- .../heightmap/AbstractDelegateHeightMap.java | 2 +- .../brush/heightmap/ArrayHeightMap.java | 2 +- .../heightmap/AverageHeightMapFilter.java | 2 +- .../heightmap/FlatScalableHeightMap.java | 2 +- .../object/brush/heightmap/HeightMap.java | 2 +- .../brush/heightmap/RotatableHeightMap.java | 2 +- .../brush/heightmap/ScalableHeightMap.java | 8 +- .../object/brush/mask/ImageBrushMask.java | 6 +- .../object/brush/mask/LayerBrushMask.java | 5 +- .../object/brush/mask/SplatterBrushMask.java | 4 +- .../object/brush/mask/StencilBrushMask.java | 6 +- .../core}/object/brush/scroll/Scroll.java | 8 +- .../object/brush/scroll/ScrollClipboard.java | 4 +- .../core}/object/brush/scroll/ScrollMask.java | 4 +- .../object/brush/scroll/ScrollPattern.java | 4 +- .../object/brush/scroll/ScrollRange.java | 4 +- .../core}/object/brush/scroll/ScrollSize.java | 2 +- .../object/brush/scroll/ScrollTarget.java | 6 +- .../brush/scroll/ScrollTargetOffset.java | 2 +- .../core}/object/brush/scroll/ScrollTool.java | 2 +- .../object/brush/sweep/ClipboardSpline.java | 4 +- .../core}/object/brush/sweep/Spline.java | 2 +- .../core}/object/brush/sweep/SweepBrush.java | 6 +- .../object/change/MutableBiomeChange.java | 2 +- .../object/change/MutableBlockChange.java | 2 +- .../object/change/MutableEntityChange.java | 4 +- .../object/change/MutableFullBlockChange.java | 2 +- .../object/change/MutableTileChange.java | 2 +- .../core}/object/change/StreamChange.java | 6 +- .../object/changeset/AbstractChangeSet.java | 24 +- .../changeset/AbstractDelegateChangeSet.java | 2 +- .../object/changeset/BlockBagChangeSet.java | 4 +- .../object/changeset/DiskStorageHistory.java | 18 +- .../object/changeset/FaweStreamChangeSet.java | 22 +- .../changeset/MemoryOptimizedHistory.java | 14 +- .../changeset/SimpleChangeSetSummary.java | 2 +- .../clipboard/CPUOptimizedClipboard.java | 6 +- .../clipboard/DiskOptimizedClipboard.java | 14 +- .../object/clipboard/EmptyClipboard.java | 4 +- .../object/clipboard/LazyClipboardHolder.java | 2 +- .../object/clipboard/LinearClipboard.java | 6 +- .../clipboard/MemoryOptimizedClipboard.java | 10 +- .../clipboard/MultiClipboardHolder.java | 2 +- .../object/clipboard/ReadOnlyClipboard.java | 4 +- .../clipboard/ResizableClipboardBuilder.java | 8 +- .../object/clipboard/SimpleClipboard.java | 2 +- .../object/clipboard/URIClipboardHolder.java | 2 +- .../object/clipboard/WorldCopyClipboard.java | 2 +- .../core}/object/collection/AdaptedMap.java | 2 +- .../collection/AdaptedSetCollection.java | 2 +- .../core}/object/collection/BitArray.java | 2 +- .../collection/BitArrayUnstretched.java | 4 +- .../core}/object/collection/BlockSet.java | 2 +- .../collection/BlockVector3ChunkMap.java | 4 +- .../object/collection/BlockVectorSet.java | 4 +- .../collection/CleanableThreadLocal.java | 12 +- .../core}/object/collection/CpuBlockSet.java | 0 .../object/collection/DifferentialArray.java | 13 +- .../collection/DifferentialBlockBuffer.java | 6 +- .../DifferentialCharBlockBuffer.java | 6 +- .../collection/DifferentialCollection.java | 7 + .../core}/object/collection/FastBitSet.java | 2 +- .../collection/FastRandomCollection.java | 6 +- .../core}/object/collection/IAdaptedMap.java | 2 +- .../collection/LocalBlockVector2DSet.java | 4 +- .../collection/LocalBlockVectorSet.java | 4 +- .../core}/object/collection/LongHashSet.java | 2 +- .../core}/object/collection/MemBlockSet.java | 4 +- .../core}/object/collection/MutablePair.java | 2 +- .../core}/object/collection/ObjObjMap.java | 2 +- .../object/collection/RandomCollection.java | 4 +- .../collection/SimpleRandomCollection.java | 4 +- .../core}/object/collection/SoftHashMap.java | 2 +- .../core}/object/collection/SparseBitSet.java | 2 +- .../object/collection/SparseBlockSet.java | 2 +- .../object/collection/SummedAreaTable.java | 4 +- .../object/collection/SummedColorTable.java | 4 +- .../object/collection/YieldIterable.java | 2 +- .../exception/FaweBlockBagException.java | 4 +- .../exception/FaweChunkLoadException.java | 4 +- .../core}/object/exception/FaweException.java | 2 +- .../object/extent/BlockTranslateExtent.java | 2 +- .../object/extent/ExtentHeightCacher.java | 2 +- .../core}/object/extent/FaweRegionExtent.java | 14 +- .../object/extent/HeightBoundExtent.java | 12 +- .../object/extent/Linear3DTransform.java | 2 +- .../core}/object/extent/LinearTransform.java | 2 +- .../object/extent/MemoryCheckingExtent.java | 12 +- .../object/extent/MultiRegionExtent.java | 10 +- .../core}/object/extent/MultiTransform.java | 2 +- .../core}/object/extent/NullExtent.java | 18 +- .../core}/object/extent/OffsetExtent.java | 2 +- .../core}/object/extent/PatternTransform.java | 2 +- .../extent/PositionTransformExtent.java | 2 +- .../object/extent/ProcessedWEExtent.java | 8 +- .../object/extent/RandomOffsetTransform.java | 2 +- .../core}/object/extent/RandomTransform.java | 8 +- .../core}/object/extent/ResettableExtent.java | 6 +- .../core}/object/extent/ScaleTransform.java | 2 +- .../core}/object/extent/SelectTransform.java | 2 +- .../object/extent/SingleRegionExtent.java | 10 +- .../core}/object/extent/SlowExtent.java | 4 +- .../core}/object/extent/SourceMaskExtent.java | 2 +- .../core}/object/extent/StripNBTExtent.java | 2 +- .../core}/object/extent/SupplyingExtent.java | 2 +- .../core}/object/extent/TemporalExtent.java | 2 +- .../core}/object/extent/TransformExtent.java | 2 +- .../object/function/NullRegionFunction.java | 2 +- .../core}/object/function/QuadFunction.java | 2 +- .../function/SurfaceRegionFunction.java | 2 +- .../object/function/block/BiomeCopy.java | 2 +- .../function/block/CombinedBlockCopy.java | 2 +- .../function/block/SimpleBlockCopy.java | 2 +- .../function/mask/AbstractDelegateMask.java | 2 +- .../io/AbstractDelegateOutputStream.java | 2 +- .../object/io/AsyncBufferedOutputStream.java | 2 +- .../object/io/BufferedRandomAccessFile.java | 2 +- .../object/io/FastByteArrayInputStream.java | 2 +- .../object/io/FastByteArrayOutputStream.java | 2 +- .../object/io/FastByteArraysInputStream.java | 2 +- .../object/io/LittleEndianOutputStream.java | 2 +- .../object/io/NonClosableOutputStream.java | 2 +- .../object/io/NonCloseableInputStream.java | 2 +- .../core}/object/io/PGZIPBlock.java | 2 +- .../core}/object/io/PGZIPOutputStream.java | 2 +- .../core}/object/io/PGZIPState.java | 2 +- .../core}/object/io/PGZIPThreadLocal.java | 2 +- .../object/io/RandomAccessInputStream.java | 2 +- .../object/io/RandomFileOutputStream.java | 2 +- .../object/io/ResettableFileInputStream.java | 2 +- .../core}/object/io/serialize/Serialize.java | 2 +- .../core}/object/io/zstd/ZstdInputStream.java | 3 +- .../core}/object/mask/AdjacentAnyMask.java | 2 +- .../core}/object/mask/AdjacentMask.java | 2 +- .../core}/object/mask/AirMask.java | 2 +- .../core}/object/mask/AngleMask.java | 2 +- .../core}/object/mask/CachedMask.java | 6 +- .../core}/object/mask/DataMask.java | 2 +- .../core}/object/mask/ExtremaMask.java | 2 +- .../core}/object/mask/IdDataMask.java | 2 +- .../core}/object/mask/IdMask.java | 2 +- .../core}/object/mask/LiquidMask.java | 2 +- .../core}/object/mask/MaskedTargetBlock.java | 2 +- .../core}/object/mask/PlaneMask.java | 2 +- .../core}/object/mask/ROCAngleMask.java | 2 +- .../core}/object/mask/RadiusMask.java | 2 +- .../core}/object/mask/RandomMask.java | 2 +- .../core/object/mask/ResettableMask.java | 9 + .../core}/object/mask/SimplexMask.java | 4 +- .../core}/object/mask/SurfaceMask.java | 2 +- .../core}/object/mask/WallMask.java | 2 +- .../core}/object/mask/XAxisMask.java | 2 +- .../core}/object/mask/YAxisMask.java | 2 +- .../core}/object/mask/ZAxisMask.java | 2 +- .../object/pattern/AbstractExtentPattern.java | 2 +- .../object/pattern/AngleColorPattern.java | 8 +- .../object/pattern/AverageColorPattern.java | 8 +- .../object/pattern/BiomeApplyingPattern.java | 4 +- .../core}/object/pattern/BufferedPattern.java | 12 +- .../object/pattern/BufferedPattern2D.java | 2 +- .../core}/object/pattern/DataPattern.java | 8 +- .../object/pattern/DesaturatePattern.java | 8 +- .../core}/object/pattern/ExistingPattern.java | 4 +- .../object/pattern/ExpressionPattern.java | 4 +- .../object/pattern/IdDataMaskPattern.java | 6 +- .../core}/object/pattern/IdPattern.java | 6 +- .../object/pattern/Linear2DBlockPattern.java | 6 +- .../object/pattern/Linear3DBlockPattern.java | 6 +- .../object/pattern/LinearBlockPattern.java | 6 +- .../core}/object/pattern/MaskedPattern.java | 8 +- .../core}/object/pattern/NoXPattern.java | 6 +- .../core}/object/pattern/NoYPattern.java | 6 +- .../core}/object/pattern/NoZPattern.java | 6 +- .../core}/object/pattern/OffsetPattern.java | 6 +- .../object/pattern/PatternTraverser.java | 4 +- .../core}/object/pattern/PropertyPattern.java | 10 +- .../pattern/RandomFullClipboardPattern.java | 4 +- .../object/pattern/RandomOffsetPattern.java | 6 +- .../core}/object/pattern/RelativePattern.java | 6 +- .../object/pattern/ResettablePattern.java | 9 + .../core}/object/pattern/SaturatePattern.java | 8 +- .../core}/object/pattern/ShadePattern.java | 6 +- .../pattern/SolidRandomOffsetPattern.java | 10 +- .../pattern/SurfaceRandomOffsetPattern.java | 10 +- .../object/progress/ChatProgressTracker.java | 2 +- .../progress/DefaultProgressTracker.java | 10 +- .../core}/object/random/NoiseRandom.java | 2 +- .../core}/object/random/SimpleRandom.java | 2 +- .../core}/object/random/SimplexNoise.java | 2 +- .../core}/object/random/TrueRandom.java | 2 +- .../core}/object/regions/FuzzyRegion.java | 6 +- .../object/regions/PolyhedralRegion.java | 2 +- .../core}/object/regions/Triangle.java | 6 +- .../regions/selector/FuzzyRegionSelector.java | 12 +- .../selector/PolyhedralRegionSelector.java | 6 +- .../object/schematic/MinecraftStructure.java | 4 +- .../core}/object/schematic/PNGWriter.java | 6 +- .../object/schematic/visualizer/SchemVis.java | 0 .../object/string/JoinedCharSequence.java | 2 +- .../object/string/MutableCharSequence.java | 2 +- .../core}/object/task/AsyncNotifyQueue.java | 4 +- .../task/SingleThreadIntervalQueue.java | 6 +- .../core}/object/task/ThrowableSupplier.java | 2 +- .../core}/object/visitor/AboveVisitor.java | 2 +- .../object/visitor/DFSRecursiveVisitor.java | 2 +- .../core}/object/visitor/DFSVisitor.java | 6 +- .../core}/regions/FaweMask.java | 4 +- .../core}/regions/FaweMaskManager.java | 6 +- .../regions/general/CuboidRegionFilter.java | 4 +- .../core}/regions/general/RegionFilter.java | 2 +- .../core}/util/BrushCache.java | 2 +- .../core}/util/CachedMathMan.java | 2 +- .../core}/util/CachedTextureUtil.java | 2 +- .../core}/util/CleanTextureUtil.java | 2 +- .../core}/util/ColorUtil.java | 2 +- .../core}/util/DelegateTextureUtil.java | 2 +- .../core}/util/EditSessionBuilder.java | 60 +- .../core}/util/ExtentTraverser.java | 2 +- .../core}/util/FaweTimer.java | 2 +- .../core}/util/FilteredTextureUtil.java | 2 +- .../core}/util/IOUtil.java | 2 +- .../core}/util/ImgurUtility.java | 4 +- .../core}/util/MainUtil.java | 24 +- .../core}/util/MaskTraverser.java | 4 +- .../core}/util/MathMan.java | 2 +- .../core}/util/MemUtil.java | 4 +- .../core}/util/Permission.java | 2 +- .../core}/util/RandomTextureUtil.java | 2 +- .../core}/util/ReflectionUtils.java | 2 +- .../core}/util/StringMan.java | 2 +- .../core}/util/TaskManager.java | 10 +- .../core}/util/TextureHolder.java | 2 +- .../core}/util/TextureUtil.java | 20 +- .../core}/util/ThirdPartyManager.java | 2 +- .../core}/util/UnsafeUtility.java | 2 +- .../core}/util/WEManager.java | 16 +- .../core}/util/image/Drawable.java | 2 +- .../core}/util/image/ImageUtil.java | 12 +- .../core}/util/image/ImageViewer.java | 2 +- .../core}/util/task/DelayedTask.java | 2 +- .../util/task/InterruptableCondition.java | 2 +- .../core}/util/task/ReceiveTask.java | 2 +- .../core}/util/task/ReturnTask.java | 2 +- .../core}/util/task/Task.java | 2 +- .../core}/wrappers/AsyncPlayer.java | 10 +- .../wrappers/LocationMaskedPlayerWrapper.java | 2 +- .../core}/wrappers/SilentPlayerWrapper.java | 2 +- .../core}/wrappers/WorldWrapper.java | 13 +- .../com/sk89q/jnbt/AdventureNBTConverter.java | 108 ++ .../java/com/sk89q/jnbt/ByteArrayTag.java | 28 +- .../src/main/java/com/sk89q/jnbt/ByteTag.java | 22 +- .../main/java/com/sk89q/jnbt/CompoundTag.java | 221 ++--- .../com/sk89q/jnbt/CompoundTagBuilder.java | 56 +- .../main/java/com/sk89q/jnbt/DoubleTag.java | 25 +- .../src/main/java/com/sk89q/jnbt/EndTag.java | 9 +- .../main/java/com/sk89q/jnbt/FloatTag.java | 25 +- .../main/java/com/sk89q/jnbt/IntArrayTag.java | 34 +- .../src/main/java/com/sk89q/jnbt/IntTag.java | 28 +- .../java/com/sk89q/jnbt/LazyCompoundTag.java | 46 + .../src/main/java/com/sk89q/jnbt/ListTag.java | 296 +++--- .../java/com/sk89q/jnbt/ListTagBuilder.java | 25 +- .../java/com/sk89q/jnbt/LongArrayTag.java | 34 +- .../src/main/java/com/sk89q/jnbt/LongTag.java | 28 +- .../java/com/sk89q/jnbt/NBTConstants.java | 6 +- .../java/com/sk89q/jnbt/NBTInputStream.java | 9 +- .../java/com/sk89q/jnbt/NBTOutputStream.java | 6 +- .../main/java/com/sk89q/jnbt/NBTUtils.java | 35 +- .../main/java/com/sk89q/jnbt/NamedTag.java | 3 + .../main/java/com/sk89q/jnbt/ShortTag.java | 28 +- .../main/java/com/sk89q/jnbt/StringTag.java | 26 +- .../src/main/java/com/sk89q/jnbt/Tag.java | 12 +- .../jnbt/fawe/CompressedSchematicTag.java | 4 +- .../com/sk89q/util/yaml/YAMLProcessor.java | 2 +- .../java/com/sk89q/worldedit/EditSession.java | 46 +- .../com/sk89q/worldedit/LocalSession.java | 56 +- .../worldedit/MissingWorldException.java | 2 +- .../sk89q/worldedit/NotABlockException.java | 2 +- .../worldedit/UnknownDirectionException.java | 2 +- .../java/com/sk89q/worldedit/WorldEdit.java | 2 +- .../com/sk89q/worldedit/blocks/BaseItem.java | 44 +- .../sk89q/worldedit/blocks/BaseItemStack.java | 20 +- .../worldedit/command/ApplyBrushCommands.java | 2 +- .../worldedit/command/BiomeCommands.java | 2 +- .../worldedit/command/BrushCommands.java | 80 +- .../worldedit/command/ChunkCommands.java | 2 +- .../worldedit/command/ClipboardCommands.java | 30 +- .../worldedit/command/ExpandCommands.java | 2 +- .../worldedit/command/GeneralCommands.java | 18 +- .../worldedit/command/GenerationCommands.java | 10 +- .../worldedit/command/HistoryCommands.java | 2 +- .../worldedit/command/HistorySubCommands.java | 22 +- .../command/LegacySnapshotCommands.java | 2 +- .../command/LegacySnapshotUtilCommands.java | 2 +- .../sk89q/worldedit/command/ListFilters.java | 4 +- .../worldedit/command/NavigationCommands.java | 2 +- .../worldedit/command/PaintBrushCommands.java | 2 +- .../worldedit/command/RegionCommands.java | 10 +- .../worldedit/command/SchematicCommands.java | 20 +- .../worldedit/command/ScriptingCommands.java | 2 +- .../worldedit/command/SelectionCommands.java | 10 +- .../worldedit/command/SnapshotCommands.java | 2 +- .../command/SnapshotUtilCommands.java | 2 +- .../command/SuperPickaxeCommands.java | 2 +- .../sk89q/worldedit/command/ToolCommands.java | 4 +- .../worldedit/command/ToolUtilCommands.java | 13 +- .../worldedit/command/UtilityCommands.java | 14 +- .../worldedit/command/WorldEditCommands.java | 8 +- .../command/argument/EnumConverter.java | 2 +- .../command/argument/FactoryConverter.java | 3 +- .../command/argument/OffsetConverter.java | 67 +- .../worldedit/command/tool/AreaPickaxe.java | 2 +- .../command/tool/BlockDataCyler.java | 2 +- .../worldedit/command/tool/BlockReplacer.java | 2 +- .../worldedit/command/tool/BrushTool.java | 35 +- .../worldedit/command/tool/DistanceWand.java | 2 +- .../command/tool/FloatingTreeRemover.java | 4 +- .../worldedit/command/tool/FloodFillTool.java | 4 +- .../command/tool/LongRangeBuildTool.java | 6 +- .../command/tool/NavigationWand.java | 2 +- .../worldedit/command/tool/QueryTool.java | 2 +- .../command/tool/RecursivePickaxe.java | 2 +- .../worldedit/command/tool/SelectionWand.java | 2 +- .../worldedit/command/tool/SinglePickaxe.java | 2 +- .../worldedit/command/tool/TreePlanter.java | 2 +- .../command/util/AsyncCommandBuilder.java | 2 +- .../worldedit/command/util/EntityRemover.java | 2 +- .../command/util/PrintCommandHelp.java | 2 +- .../command/util/SuggestionHelper.java | 2 +- .../command/util/annotation/Confirm.java | 4 +- .../sk89q/worldedit/entity/BaseEntity.java | 52 +- .../worldedit/entity/LazyBaseEntity.java | 6 +- .../com/sk89q/worldedit/entity/Player.java | 12 +- .../extension/factory/MaskFactory.java | 2 +- .../factory/parser/DefaultBlockParser.java | 10 +- .../factory/parser/DefaultItemParser.java | 89 +- .../extension/factory/parser/RichParser.java | 2 +- .../parser/mask/AdjacentMaskParser.java | 4 +- .../factory/parser/mask/AngleMaskParser.java | 4 +- .../factory/parser/mask/BiomeMaskParser.java | 2 +- .../parser/mask/BlockCategoryMaskParser.java | 2 +- .../parser/mask/BlockStateMaskParser.java | 2 +- .../parser/mask/ExpressionMaskParser.java | 2 +- .../parser/mask/ExtremaMaskParser.java | 4 +- .../factory/parser/mask/LiquidMaskParser.java | 2 +- .../factory/parser/mask/NegateMaskParser.java | 2 +- .../parser/mask/ROCAngleMaskParser.java | 4 +- .../factory/parser/mask/RadiusMaskParser.java | 2 +- .../factory/parser/mask/RegionMaskParser.java | 2 +- .../parser/mask/SimplexMaskParser.java | 2 +- .../parser/mask/SurfaceMaskParser.java | 2 +- .../factory/parser/mask/WallMaskParser.java | 2 +- .../factory/parser/mask/XAxisMaskParser.java | 2 +- .../factory/parser/mask/YAxisMaskParser.java | 2 +- .../factory/parser/mask/ZAxisMaskParser.java | 2 +- .../parser/pattern/BiomePatternParser.java | 4 +- .../pattern/BlockCategoryPatternParser.java | 2 +- .../parser/pattern/BufferedPatternParser.java | 4 +- .../pattern/ClipboardPatternParser.java | 2 +- .../parser/pattern/ExistingPatternParser.java | 2 +- .../parser/pattern/Linear2DPatternParser.java | 4 +- .../parser/pattern/Linear3DPatternParser.java | 4 +- .../parser/pattern/NoisePatternParser.java | 4 +- .../parser/pattern/RandomPatternParser.java | 2 +- .../TypeOrStateApplyingPatternParser.java | 2 +- .../extension/input/ParserContext.java | 2 +- .../platform/AbstractNonPlayerActor.java | 8 +- .../platform/AbstractPlayerActor.java | 12 +- .../worldedit/extension/platform/Actor.java | 9 +- .../extension/platform/Platform.java | 5 +- .../platform/PlatformCommandManager.java | 24 +- .../extension/platform/PlatformManager.java | 11 +- .../extension/platform/binding/Bindings.java | 2 +- .../platform/binding/ConsumeBindings.java | 8 +- .../platform/binding/PrimitiveBindings.java | 2 +- .../platform/binding/ProvideBindings.java | 12 +- .../extent/AbstractDelegateExtent.java | 12 +- .../com/sk89q/worldedit/extent/Extent.java | 22 +- .../sk89q/worldedit/extent/InputExtent.java | 2 +- .../sk89q/worldedit/extent/MaskingExtent.java | 20 +- .../sk89q/worldedit/extent/OutputExtent.java | 2 +- .../worldedit/extent/PassthroughExtent.java | 2 +- .../extent/buffer/ForgetfulExtentBuffer.java | 2 +- .../worldedit/extent/clipboard/Clipboard.java | 17 +- .../clipboard/io/BuiltInClipboardFormat.java | 8 +- .../extent/clipboard/io/ClipboardFormat.java | 8 +- .../extent/clipboard/io/ClipboardFormats.java | 14 +- .../extent/clipboard/io/ClipboardReader.java | 2 +- .../clipboard/io/FastSchematicReader.java | 34 +- .../clipboard/io/FastSchematicWriter.java | 8 +- .../clipboard/io/MCEditSchematicReader.java | 52 +- .../clipboard/io/SpongeSchematicReader.java | 15 +- .../clipboard/io/SpongeSchematicWriter.java | 2 +- .../extent/inventory/BlockBagExtent.java | 2 +- .../transform/BlockTransformExtent.java | 2 +- .../extent/world/SurvivalModeExtent.java | 17 +- .../worldedit/function/RegionFunction.java | 4 +- .../function/block/BlockReplace.java | 2 +- .../function/block/ExtentBlockCopy.java | 20 +- .../worldedit/function/factory/Deform.java | 2 +- .../function/generator/CavesGen.java | 2 +- .../function/generator/FloraGenerator.java | 4 +- .../generator/GardenPatchGenerator.java | 8 +- .../worldedit/function/generator/OreGen.java | 2 +- .../worldedit/function/mask/ABlockMask.java | 2 +- .../function/mask/BlockMaskBuilder.java | 10 +- .../sk89q/worldedit/function/mask/Mask.java | 6 +- .../function/operation/ChangeSetExecutor.java | 2 +- .../function/operation/ForwardExtentCopy.java | 14 +- .../function/pattern/BlockPattern.java | 2 +- .../ExtentBufferedCompositePattern.java | 4 +- .../worldedit/function/pattern/Pattern.java | 24 +- .../function/pattern/RandomPattern.java | 10 +- .../function/pattern/RandomStatePattern.java | 2 +- .../pattern/RepeatingExtentPattern.java | 2 +- .../pattern/StateApplyingPattern.java | 2 +- .../function/pattern/TypeApplyingPattern.java | 2 +- .../function/pattern/WaterloggedRemover.java | 2 +- .../function/visitor/BreadthFirstSearch.java | 4 +- .../function/visitor/EntityVisitor.java | 2 +- .../function/visitor/FlatRegionVisitor.java | 2 +- .../function/visitor/RegionVisitor.java | 2 +- .../history/changeset/ArrayListHistory.java | 2 +- .../sk89q/worldedit/internal/Constants.java | 5 + .../internal/annotation/AllowedRegion.java | 2 +- .../internal/command/CommandUtil.java | 2 +- .../internal/command/ConfirmHandler.java | 2 +- .../WorldEditExceptionConverter.java | 2 +- .../internal/cui/ServerCUIHandler.java | 48 +- .../internal/registry/AbstractFactory.java | 2 +- .../internal/wna/WorldNativeAccess.java | 30 +- .../worldedit/math/MutableBlockVector3.java | 2 +- .../sk89q/worldedit/math/MutableVector3.java | 2 +- .../com/sk89q/worldedit/math/Vector3.java | 2 +- .../math/noise/SimplexNoiseGenerator.java | 2 +- .../worldedit/regions/AbstractRegion.java | 2 +- .../sk89q/worldedit/regions/CuboidRegion.java | 16 +- .../worldedit/regions/CylinderRegion.java | 12 +- .../worldedit/regions/EllipsoidRegion.java | 14 +- .../sk89q/worldedit/regions/NullRegion.java | 2 +- .../worldedit/regions/Polygonal2DRegion.java | 2 +- .../com/sk89q/worldedit/regions/Region.java | 18 +- .../worldedit/regions/RegionIntersection.java | 8 +- .../worldedit/regions/TransformRegion.java | 2 +- .../ConvexPolyhedralRegionSelector.java | 2 +- .../selector/CuboidRegionSelector.java | 2 +- .../selector/CylinderRegionSelector.java | 2 +- .../selector/EllipsoidRegionSelector.java | 2 +- .../ExtendingCuboidRegionSelector.java | 2 +- .../selector/Polygonal2DRegionSelector.java | 2 +- .../selector/SphereRegionSelector.java | 2 +- .../regions/shape/ArbitraryShape.java | 6 +- .../registry/state/AbstractProperty.java | 2 +- .../registry/state/IntegerProperty.java | 2 +- .../scripting/CraftScriptContext.java | 2 +- .../sk89q/worldedit/session/PasteBuilder.java | 2 +- .../sk89q/worldedit/util/TreeGenerator.java | 1 + .../util/collection/Int2BaseBlockMap.java | 2 +- .../util/concurrency/LazyReference.java | 15 + .../formatting/component/PaginationBox.java | 2 +- .../formatting/component/SideEffectBox.java | 2 +- .../sk89q/worldedit/util/nbt/NbtUtils.java | 50 + .../util/paste/ActorCallbackPaste.java | 2 +- .../com/sk89q/worldedit/world/DataFixer.java | 8 +- .../com/sk89q/worldedit/world/NbtValued.java | 86 +- .../com/sk89q/worldedit/world/NullWorld.java | 7 +- .../sk89q/worldedit/world/SimpleWorld.java | 2 +- .../java/com/sk89q/worldedit/world/World.java | 6 +- .../world/WorldUnloadedException.java | 2 +- .../worldedit/world/biome/BiomeTypes.java | 2 + .../worldedit/world/block/BaseBlock.java | 67 +- .../world/block/BlanketBaseBlock.java | 7 - .../world/block/BlockCategories.java | 32 + .../worldedit/world/block/BlockState.java | 20 +- .../world/block/BlockStateHolder.java | 88 +- .../worldedit/world/block/BlockType.java | 2 +- .../worldedit/world/block/BlockTypes.java | 142 ++- .../world/block/BlockTypesCache.java | 2 +- .../worldedit/world/block/CompoundInput.java | 2 +- .../world/block/FuzzyBlockState.java | 7 + .../worldedit/world/chunk/AnvilChunk.java | 101 +- .../worldedit/world/chunk/AnvilChunk13.java | 88 +- .../worldedit/world/chunk/AnvilChunk16.java | 13 + .../sk89q/worldedit/world/chunk/OldChunk.java | 80 +- .../worldedit/world/entity/EntityTypes.java | 5 + .../worldedit/world/item/ItemCategories.java | 15 + .../sk89q/worldedit/world/item/ItemTypes.java | 128 ++- .../world/registry/BundledBlockData.java | 4 +- .../world/registry/BundledBlockRegistry.java | 2 +- .../world/registry/BundledItemData.java | 4 +- .../world/registry/BundledItemRegistry.java | 2 +- .../world/registry/NullBiomeRegistry.java | 2 +- .../world/snapshot/SnapshotRestore.java | 2 +- .../world/storage/ChunkStoreHelper.java | 3 +- .../worldedit/world/registry/blocks.117.json | 1 + .../worldedit/world/registry/items.117.json | 1 + worldedit-core/src/main/resources/cs_adv.js | 51 - .../src/main/resources/lang/strings.json | 4 + .../expression/BaseExpressionTest.java | 13 +- .../worldedit/math/BlockVector3Test.java | 17 +- .../util/collection/BlockMapTest.java | 678 ++++++++----- .../util/collection/PositionListTest.java | 99 +- .../worldedit/util/test/ResourceLockKeys.java | 27 + .../util/test/VariedVectorGenerator.java | 41 +- .../worldedit/util/test/VariedVectorPair.java | 32 + .../worldedit/util/test/VariedVectors.java | 87 -- .../test/resources/junit-platform.properties | 2 +- worldedit-libs/bukkit/build.gradle.kts | 2 +- worldedit-libs/core/build.gradle.kts | 1 + worldedit-sponge/build.gradle.kts | 2 +- 798 files changed, 5101 insertions(+), 16727 deletions(-) delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/NMSRelighterFactory.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BlockMaterial_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitAdapter_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/BukkitGetBlocks_1_15_2_Copy.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/FAWEWorldNativeAccess_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/MapChunkUtil_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_15_2/nbt/LazyCompoundTag_1_15_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BlockMaterial_1_16_1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitAdapter_1_16_1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/BukkitGetBlocks_1_16_1_Copy.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/FAWEWorldNativeAccess_1_16_R1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/MapChunkUtil_1_16_1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_1/nbt/LazyCompoundTag_1_16_1.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BlockMaterial_1_16_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitAdapter_1_16_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/BukkitGetBlocks_1_16_2_Copy.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/FAWEWorldNativeAccess_1_16_R2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/MapChunkUtil_1_16_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_2/nbt/LazyCompoundTag_1_16_2.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BlockMaterial_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitAdapter_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/BukkitGetBlocks_1_16_5_Copy.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/FAWEWorldNativeAccess_1_16_R3.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/MapChunkUtil_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighterFactory_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/TuinityRelighter_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_16_5/nbt/LazyCompoundTag_1_16_5.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweLocalBlockQueue.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/FaweTrim.java delete mode 100644 worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/regions/plotsquared/PlotSetBiome.java rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/BukkitPermissionAttachmentManager.java (91%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/FaweBukkit.java (81%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/adapter/BukkitGetBlocks.java (63%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/adapter/BukkitQueueHandler.java (91%) rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/adapter/CachedBukkitAdapter.java (98%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/adapter/DelegateLock.java (98%) create mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/DelegateSemaphore.java rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/adapter/IBukkitAdapter.java (99%) rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/adapter/IDelegateBukkitImplAdapter.java (96%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/adapter/MapChunkUtil.java (91%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/adapter/NMSAdapter.java (97%) create mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSRelighterFactory.java rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/adapter/Regenerator.java (98%) rename worldedit-bukkit/src/main/java/com/{sk89q/worldedit => fastasyncworldedit}/bukkit/adapter/SimpleBukkitAdapter.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/filter/GriefDefenderFilter.java (88%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/filter/GriefPreventionFilter.java (88%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/filter/WorldGuardFilter.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/listener/BrushListener.java (93%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/listener/ChunkListener.java (97%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/listener/ChunkListener9.java (91%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/listener/RenderListener.java (96%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/preloader/PluginPreloader.java (98%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/BukkitMaskManager.java (75%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/GriefDefenderFeature.java (92%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/GriefPreventionFeature.java (91%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/ResidenceFeature.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/TownyFeature.java (97%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/Worldguard.java (96%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe/bukkit/regions/plotsquared/FaweRegionManager.java => fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateRegionManager.java} (73%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe/bukkit/regions/plotsquared/FaweSchematicHandler.java => fastasyncworldedit/bukkit/regions/plotsquared/FaweDelegateSchematicHandler.java} (53%) create mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweQueueCoordinator.java create mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/FaweTrim.java rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquared/MoveTo512.java (99%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquared/PlotRegionFilter.java (86%) create mode 100644 worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/regions/plotsquared/PlotSetBiome.java rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquared/PlotSquaredFeature.java (68%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquared/ReplaceAll.java (100%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/FaweChunkManager.java (96%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/FaweLocalBlockQueue.java (91%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/FaweSchematicHandler.java (93%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/FaweTrim.java (95%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/PlotRegionFilter.java (87%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/PlotSetBiome.java (96%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/regions/plotsquaredv4/PlotSquaredFeature.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/BukkitReflectionUtils.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/BukkitTaskManager.java (94%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/ItemUtil.java (97%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/MinecraftVersion.java (99%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/VaultUtil.java (92%) rename worldedit-bukkit/src/main/java/com/{boydti/fawe => fastasyncworldedit}/bukkit/util/image/BukkitImageViewer.java (97%) delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_15_R2.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R1.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R2.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_16_R3.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_15_R2.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R1.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R2.java delete mode 100644 worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/regen/Regen_v1_16_R3.java create mode 100644 worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLIExtraCommands.java create mode 100644 worldedit-cli/src/main/resources/com/sk89q/worldedit/cli/data/2724.json delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/beta/FilterBlockMask.java delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/blocks/FallbackChunkGet.java delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/object/collection/DifferentialCollection.java delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/object/mask/ResettableMask.java delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/object/pattern/ResettablePattern.java delete mode 100644 worldedit-core/src/main/java/com/boydti/fawe/web/SchemSync.java rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/FAWEPlatformAdapterImpl.java (56%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/Fawe.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/FaweAPI.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/FaweCache.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/FaweVersion.java (81%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/IFawe.java (65%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/Resettable.java (58%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/DirectionMask.java (73%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/Filter.java (92%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/beta/FilterBlockMask.java rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/Flood.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IBatchProcessor.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IBlocks.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IChunk.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IChunkCache.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IChunkGet.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IChunkSet.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IDelegateFilter.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IQueueChunk.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IQueueExtent.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/IQueueWrapper.java (77%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/ITileInput.java (73%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/Trimable.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/IChunkExtent.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/blocks/BitSetBlocks.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/blocks/CharBlocks.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/blocks/CharGetBlocks.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/blocks/CharSetBlocks.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/blocks/NullChunkGet.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe/beta/implementation/cache => fastasyncworldedit/core/beta/implementation/chunk}/ChunkCache.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/chunk/ChunkHolder.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/chunk/NullChunk.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/ArrayImageMask.java (76%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/CountFilter.java (79%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/DistrFilter.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/ForkedFilter.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/LinkedFilter.java (73%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/MaskFilter.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/AbstractExtentFilterBlock.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/AbstractFilterBlock.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/AbstractSingleFilterBlock.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/ArrayFilterBlock.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/CharFilterBlock.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/ChunkFilterBlock.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/DelegateFilter.java (61%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/ExtentFilterBlock.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/FilterBlock.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/filter/block/SingleFilterBlock.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/HeightMapType.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/NMSRelighter.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/NullRelighter.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/RelightProcessor.java (80%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/Relighter.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/lighting/RelighterFactory.java (81%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/packet/ChunkPacket.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe/beta/implementation/cache => fastasyncworldedit/core/beta/implementation}/preloader/AsyncPreloader.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe/beta/implementation/cache => fastasyncworldedit/core/beta/implementation}/preloader/Preloader.java (67%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/BatchProcessorHolder.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/EmptyBatchProcessor.java (82%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/ExtentBatchProcessorHolder.java (75%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/HeightmapProcessor.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/IBatchProcessorHolder.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/LimitExtent.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/MultiBatchProcessor.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/NullProcessor.java (78%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/processors/ProcessorScope.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/queue/ParallelQueueExtent.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/queue/Pool.java (71%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/queue/QueueHandler.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/queue/QueuePool.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/beta/implementation/queue/SingleThreadQueueExtent.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/AnvilCommands.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/CFICommand.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/CFICommands.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/FaweParser.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/PlotLoader.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/command/SuggestInputParseException.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe/config => fastasyncworldedit/core/configuration}/Caption.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe/config => fastasyncworldedit/core/configuration}/Config.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/Configuration.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/ConfigurationOptions.java (57%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/ConfigurationSection.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/InvalidConfigurationException.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/MemoryConfiguration.java (79%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/MemoryConfigurationOptions.java (65%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/MemorySection.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe/config => fastasyncworldedit/core/configuration}/Settings.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/TypeDescription.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/Yaml.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/FileConfiguration.java (77%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/FileConfigurationOptions.java (66%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/YamlConfiguration.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/YamlConfigurationOptions.java (73%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/YamlConstructor.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/file/YamlRepresenter.java (80%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/serialization/ConfigurationSerializable.java (70%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/serialization/ConfigurationSerialization.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/serialization/DelegateDeserialization.java (63%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/configuration/serialization/SerializableAs.java (62%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/database/DBHandler.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/database/RollbackDatabase.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/JSON2NBT.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/NBTException.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/InfoReader.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/IntValueReader.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/LazyReader.java (82%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/LongValueReader.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/StreamDelegate.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/StreamReader.java (69%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/jnbt/streamer/ValueReader.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe/logging/rollback => fastasyncworldedit/core/logging}/RollbackOptimizedHistory.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/DataAnglePattern.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/DelegateConsumer.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/FaweInputStream.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/FaweLimit.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/FaweOutputStream.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/HistoryExtent.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/IntPair.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/IntTriple.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/Metadatable.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/NullChangeSet.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RegionWrapper.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RelightMode.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RunnableVal.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RunnableVal2.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RunnableVal3.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/RunnableVal4.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/AngleBrush.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/BlendBall.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/BlobBrush.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/BrushSettings.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/CatenaryBrush.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/CircleBrush.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/CommandBrush.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/CopyPastaBrush.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ErodeBrush.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/FallingSphere.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/FlattenBrush.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/HeightBrush.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ImageBrush.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/InspectBrush.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/LayerBrush.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/LineBrush.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/MovableTool.java (68%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/PopulateSchem.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/RaiseBrush.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/RecurseBrush.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ResettableTool.java (53%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/RockBrush.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ScatterBrush.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ScatterCommand.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ScatterOverlayBrush.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/ShatterBrush.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/SplatterBrush.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/SplineBrush.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/StencilBrush.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/SurfaceSphereBrush.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/SurfaceSpline.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/TargetMode.java (71%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/AbstractDelegateHeightMap.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/ArrayHeightMap.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/AverageHeightMapFilter.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/FlatScalableHeightMap.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/HeightMap.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/RotatableHeightMap.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/heightmap/ScalableHeightMap.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/mask/ImageBrushMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/mask/LayerBrushMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/mask/SplatterBrushMask.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/mask/StencilBrushMask.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/Scroll.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollClipboard.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollMask.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollPattern.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollRange.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollSize.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollTarget.java (77%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollTargetOffset.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/scroll/ScrollTool.java (70%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/sweep/ClipboardSpline.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/sweep/Spline.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/brush/sweep/SweepBrush.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/MutableBiomeChange.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/MutableBlockChange.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/MutableEntityChange.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/MutableFullBlockChange.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/MutableTileChange.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/change/StreamChange.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/AbstractChangeSet.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/AbstractDelegateChangeSet.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/BlockBagChangeSet.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/DiskStorageHistory.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/FaweStreamChangeSet.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/MemoryOptimizedHistory.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/changeset/SimpleChangeSetSummary.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/CPUOptimizedClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/DiskOptimizedClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/EmptyClipboard.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/LazyClipboardHolder.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/LinearClipboard.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/MemoryOptimizedClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/MultiClipboardHolder.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/ReadOnlyClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/ResizableClipboardBuilder.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/SimpleClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/URIClipboardHolder.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/clipboard/WorldCopyClipboard.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/AdaptedMap.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/AdaptedSetCollection.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/BitArray.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/BitArrayUnstretched.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/BlockSet.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/BlockVector3ChunkMap.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/BlockVectorSet.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/CleanableThreadLocal.java (78%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/CpuBlockSet.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/DifferentialArray.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/DifferentialBlockBuffer.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/DifferentialCharBlockBuffer.java (97%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/collection/DifferentialCollection.java rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/FastBitSet.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/FastRandomCollection.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/IAdaptedMap.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/LocalBlockVector2DSet.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/LocalBlockVectorSet.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/LongHashSet.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/MemBlockSet.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/MutablePair.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/ObjObjMap.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/RandomCollection.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SimpleRandomCollection.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SoftHashMap.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SparseBitSet.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SparseBlockSet.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SummedAreaTable.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/SummedColorTable.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/collection/YieldIterable.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/exception/FaweBlockBagException.java (61%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/exception/FaweChunkLoadException.java (61%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/exception/FaweException.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/BlockTranslateExtent.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/ExtentHeightCacher.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/FaweRegionExtent.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/HeightBoundExtent.java (82%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/Linear3DTransform.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/LinearTransform.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/MemoryCheckingExtent.java (75%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/MultiRegionExtent.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/MultiTransform.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/NullExtent.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/OffsetExtent.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/PatternTransform.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/PositionTransformExtent.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/ProcessedWEExtent.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/RandomOffsetTransform.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/RandomTransform.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/ResettableExtent.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/ScaleTransform.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/SelectTransform.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/SingleRegionExtent.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/SlowExtent.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/SourceMaskExtent.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/StripNBTExtent.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/SupplyingExtent.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/TemporalExtent.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/extent/TransformExtent.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/NullRegionFunction.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/QuadFunction.java (65%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/SurfaceRegionFunction.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/block/BiomeCopy.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/block/CombinedBlockCopy.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/block/SimpleBlockCopy.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/function/mask/AbstractDelegateMask.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/AbstractDelegateOutputStream.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/AsyncBufferedOutputStream.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/BufferedRandomAccessFile.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/FastByteArrayInputStream.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/FastByteArrayOutputStream.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/FastByteArraysInputStream.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/LittleEndianOutputStream.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/NonClosableOutputStream.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/NonCloseableInputStream.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/PGZIPBlock.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/PGZIPOutputStream.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/PGZIPState.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/PGZIPThreadLocal.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/RandomAccessInputStream.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/RandomFileOutputStream.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/ResettableFileInputStream.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/serialize/Serialize.java (82%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/io/zstd/ZstdInputStream.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/AdjacentAnyMask.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/AdjacentMask.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/AirMask.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/AngleMask.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/CachedMask.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/DataMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/ExtremaMask.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/IdDataMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/IdMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/LiquidMask.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/MaskedTargetBlock.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/PlaneMask.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/ROCAngleMask.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/RadiusMask.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/RandomMask.java (94%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/mask/ResettableMask.java rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/SimplexMask.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/SurfaceMask.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/WallMask.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/XAxisMask.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/YAxisMask.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/mask/ZAxisMask.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/AbstractExtentPattern.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/AngleColorPattern.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/AverageColorPattern.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/BiomeApplyingPattern.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/BufferedPattern.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/BufferedPattern2D.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/DataPattern.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/DesaturatePattern.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/ExistingPattern.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/ExpressionPattern.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/IdDataMaskPattern.java (82%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/IdPattern.java (80%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/Linear2DBlockPattern.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/Linear3DBlockPattern.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/LinearBlockPattern.java (85%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/MaskedPattern.java (83%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/NoXPattern.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/NoYPattern.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/NoZPattern.java (86%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/OffsetPattern.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/PatternTraverser.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/PropertyPattern.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/RandomFullClipboardPattern.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/RandomOffsetPattern.java (91%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/RelativePattern.java (90%) create mode 100644 worldedit-core/src/main/java/com/fastasyncworldedit/core/object/pattern/ResettablePattern.java rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/SaturatePattern.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/ShadePattern.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/SolidRandomOffsetPattern.java (89%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/pattern/SurfaceRandomOffsetPattern.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/progress/ChatProgressTracker.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/progress/DefaultProgressTracker.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/random/NoiseRandom.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/random/SimpleRandom.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/random/SimplexNoise.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/random/TrueRandom.java (88%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/regions/FuzzyRegion.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/regions/PolyhedralRegion.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/regions/Triangle.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/regions/selector/FuzzyRegionSelector.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/regions/selector/PolyhedralRegionSelector.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/schematic/MinecraftStructure.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/schematic/PNGWriter.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/schematic/visualizer/SchemVis.java (100%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/string/JoinedCharSequence.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/string/MutableCharSequence.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/task/AsyncNotifyQueue.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/task/SingleThreadIntervalQueue.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/task/ThrowableSupplier.java (64%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/visitor/AboveVisitor.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/visitor/DFSRecursiveVisitor.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/object/visitor/DFSVisitor.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/regions/FaweMask.java (84%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/regions/FaweMaskManager.java (87%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/regions/general/CuboidRegionFilter.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/regions/general/RegionFilter.java (71%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/BrushCache.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/CachedMathMan.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/CachedTextureUtil.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/CleanTextureUtil.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/ColorUtil.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/DelegateTextureUtil.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/EditSessionBuilder.java (90%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/ExtentTraverser.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/FaweTimer.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/FilteredTextureUtil.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/IOUtil.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/ImgurUtility.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/MainUtil.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/MaskTraverser.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/MathMan.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/MemUtil.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/Permission.java (95%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/RandomTextureUtil.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/ReflectionUtils.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/StringMan.java (99%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/TaskManager.java (97%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/TextureHolder.java (62%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/TextureUtil.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/ThirdPartyManager.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/UnsafeUtility.java (93%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/WEManager.java (92%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/image/Drawable.java (66%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/image/ImageUtil.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/image/ImageViewer.java (70%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/task/DelayedTask.java (60%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/task/InterruptableCondition.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/task/ReceiveTask.java (57%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/task/ReturnTask.java (51%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/util/task/Task.java (56%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/wrappers/AsyncPlayer.java (96%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/wrappers/LocationMaskedPlayerWrapper.java (98%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/wrappers/SilentPlayerWrapper.java (94%) rename worldedit-core/src/main/java/com/{boydti/fawe => fastasyncworldedit/core}/wrappers/WorldWrapper.java (96%) create mode 100644 worldedit-core/src/main/java/com/sk89q/jnbt/AdventureNBTConverter.java create mode 100644 worldedit-core/src/main/java/com/sk89q/jnbt/LazyCompoundTag.java create mode 100644 worldedit-core/src/main/java/com/sk89q/worldedit/util/nbt/NbtUtils.java create mode 100644 worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/blocks.117.json create mode 100644 worldedit-core/src/main/resources/com/sk89q/worldedit/world/registry/items.117.json delete mode 100644 worldedit-core/src/main/resources/cs_adv.js create mode 100644 worldedit-core/src/test/java/com/sk89q/worldedit/util/test/ResourceLockKeys.java create mode 100644 worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectorPair.java delete mode 100644 worldedit-core/src/test/java/com/sk89q/worldedit/util/test/VariedVectors.java 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 adaebde79cfa34999062701f38fc937921a8e5cb..74856d816b29df87bb0701a64e9ea108cec71eda 100644 GIT binary patch literal 597481 zcmb@uWmH_XFV1cJK+cXxMpcZXnsH1~er>F#s7$L;>{ z?lD&Vs4>@EYuB!4>a(_zECeJx7#J)p7?RGe3fSib{$C%T7u@HN7grNukXDdjf&f$c zH^Dl8@GHDe0i4f){(l#g7g3Ow5LZ=Wl$W@dpBR^uWni2|lx3iunwYLvVP0U{Iovx0 z|Gz0i{Et;3Kb4s}+W*^v|0(mi-~X0zwdLk<{vRd(Yis|d?SDynI=a}InVVU={f~40 z>$d*i=9swK+Wvn`CHtSJ8k-qAxtY8CkE>Jv|5IUY?_~G?&@);6I}qUu7})sd_^(I# zKitK?w({S4#EjjHfsPIy<}RPRb2Vf!WZ^JWVI}{!uNh74j9p!e;zbnugpotH15|{C zuM7lw1`#PKabsX?qRAoACrVc3_x5p>^ei~jA zfmP2SDUr#MWg}$e7cWEv@C&In z%R$syqNE%Wi9rz*F}ETvZN8PVPbyOm=Sa73{=rDEK@muT)+W)EAEf(sx(>8RVuZgZ zeyqM&bY-w*ICcyAf&U5@MHM(v&$HqV#qQssbad|DHJJ3$+eEh*LDp>$;L|fXk+-CE z9>7U_Dmou`84;k1B?rdYQ{?3-ig$y)09ZF}#H?DHsN_ZsLnMgJWTgsHwnwJz`A6|= z$Is6@G#)lV+Yj_0G5L@~r8R>Xk`%^E*Ar}njBa`96Yhe&N|13h{$3{@HDy!g1{^jB zN#a6HeS|-1AO9uUUee2W;3EjcqF1;VK3;dt7v$?N>^X}3z$&8IT8V%oGR&bj$iXVT z`^w-9S($H=m}l}@jk0iz)fBDSVX$~8xYoU;=91b3Wb-w zG$}{Odfgoyi4Hs^H)W$1-_AFImU)P^m2aj!;H}{`o0aVv&4y3&aJ$A$xhayL^z+Fl z|BXP;{4hT*=1+Iv@Mhpktck5wzdw1yug^QRF{?!|o{gI65KQ8!r$wZ0w4~`>uwHJq z>L{bi-%v2V()|`61szV(MHzIHKomlI#Y+Ef=!nyRF^yJtazl*#pj9Bro<&Xc8tg1L zlVg;gUoBN516;=*KP%wl?nV@-FeE)hM71AJ zxoGEnr}pz#1Kknqk0BK%|GeZU%huZDPw+tS9%G-Es6{8Jw-0J&Sx)t2R#c&~4|;&2 z^@%*_)Y{|vcO1CI&>S&*+VB`yFfgru7zd)p4i4rn{~H79@{V}o*nX5bD|nvkEqFT2 zhh)N5m)xVAaG{(Es!oY>g$m%ca1_Gxw?6xJrq^xlSz^00Y*grQWh(LU@yJ*MBu>nz zFn(Y{VB}wkk%_>2q2dD|Fs>^%8?0lJ!)2O|vn{u#kG~J!uRbaYLNP}VQtKc`22@yy zr;~VSSHgGFUnB~uw%Fkc0=-u182m#>lBK3-l%&c`R*QEd#r;c(?bh8e#Bg*fP0(q7 zOF9XQ^O*nynoiHx+uAJKDvB#=eltD%)JnfxE@6A=ppM~9DX%xd!da6k{&}xI&d7o< zZ{}#B0y96#mq*R+Cgv0u3FPh|d&7(EJ4(S&{*C>0^Q_iDmzSqzN04>`iz4Iooi=vo z3$(km*YV_I#^4{HMKkUV^0bJ9js`EO!TuAo70I$~dh&Vpm(KVEjT`FzK)F?x)M5MW zyX8|Q5iE#l*l9JVWLi8l3}sexTsRDAH#X|TUW(yIN4h78uRLWN1^HOt3oq>HxGI>b zvcCTyQEBL~(XOP!&OOl{MkE!?+k?z0REM|KwZ}S1;?5gspjd9E@ z!lAq6RdiMZLvl>UJ}qu(?_};LWv*IkiNraW>v+O4}LnzLJ7VGP8b@DlCohsp0hH z7=Jo0w}<)eFR#?!aI`wx0`pyO$`~=pq*RqQJ|#Dk#4XHBV;?KghoYxYk9l&$xiRv& zcb1hf@&+T2-=Qkx2M_mO@ab8DD!N_oiMg@(f~WGU+?w40B7pn%U-nF!!T#P+4BJhU z`=Mt39SWo*^POv^EM&qO zs%!fV6}wuM?`K&Yg+A<^c|RxK2? z;oF&O@PEvGY`NPbnutw`OS<4t#|oRkNzIFr9xej?L%ILrX8*w}d~U|x+1_RUOQ`w> zMsG)G5A`pc`3Kw5Gm}^F-$=v{yz1NSTh6}_*LOmJQ!LrnWxQ}i~Z@9~HOpOx0l9_|5e1CaRr9*Yoz%O-~_!f$99yCd%AQ)Xve=_J12GjZH^%b@acR zoA#Dh9%~L*So%uZkVQ~yMGfdy;JZl0E76AgA1q@?-buSQ-R zBvyS8L*bMNR(-)tlpX2m&tl-y146w6J{BI>fq#X zi>1a|H8dLBB{nj1@sd@)%CM6nQF81Et+&`+T6pl|9-hWe83nki6|HDMkoSee0}J2?NNnOJt1Na-`N_VEZ z54&um+F+nIr7@3zIWjC|ab`$;0YJgcxOffB?C2a|LL{!S$gxHik^;UJ{|mkX=L`!T zD3Nv6uy;Ui6Wn2LX^aSTeFu;6CUrmr*p2-5$PRh5qW8hes7v;n0dh~w{9JG~W~(o0P<2PpyhBbk`2_t#lB{aFgfYHj4Y zWwV*_c~Y^vx%qq{=Y59}e6C4&=ZKq1Y1;#OcFh_#!ThrrV;=UqM>X~z76BSd7&Bnw zF-7q(Z&4-yf@vXqm}9Y52}n}63@w#To53qwM?L72@8^7JmasYO06wXm&MP}_qOAQJCp{)4XGK_c0hjh5WPV$(pWQga(#$?d&1V?9V=$$1-hG*| zV|Jd&K_Tg;<*r3}1}-Ayl&El5;b@3vy+AvIm#BbEbJKEkRIY~q3Oy)*|DBIFX>|^1 zb-hFpTiU$YW_jf9j>oaileDVEM90^C9fqddI&v4iTT~n)y<}ERXt3l6yCe%7n7C!` z5ms;>9A?nQfhvQ;#{mt(Bz{0sub)eVgc$S2f)B~X|N9r)^$sz1j9+=3W1Eyvg+_~;wj;~6 z6}{yF3o2n5^`alN2LT5a0_z&`!QA$$9ABiJ!q51cyC6#Q~ z+~@bnLsJhPKN;dyZfp@1dYot8=_lR_mga}ke@4Z;qCDtIt{Lu@K1GVGtN%?5&Pz(__~whX5=%1tVDS`M zBtebjGcuOdpOJ_(W?+`{7w0bq7TphUvp{psV2)D8dX*oBJV1?!5(DGyifjyG zQlsv)KQCUt8!FvoGUg76x?-CB#jfQ`@{eh|GW4DYc%ag5%GkcDDv9iR%qrs#Ssqv= z4o%a&2>rXGQS_|WZ2rs%r$3#I_CN1vq}|Nz|CJDKs>~~WCWH&cWxF+ZWclGbva)%# z)bQxaG~6D=dw@X$FA~>Gd>N~xWODKCe!B0_Obb!G`=LlXKpuxR9U9hrGOW?7mpY;C ztDKAGYr`&ZtzI2$fs+(uC8w_zcPSiV8#+R zbq2rdoFOfQP&7Snc&1-zhAPjn7YrK5f?>Ce0Jw-TmFKk3|DfPwY)Mz;P;Kvc@3O>c z>#;e9b5M5!pJS?J4$|WP8zq4-LGBmU7rqk|VhlxweVPBkrlf?w;Js*$&4XL3u0?rE z8WLqzKP7K~DflJ}PwA9Fa^SjJPjH>SuSg4plhi_MEYr)OXPN%tT85{wIkBd`o`>mR zU&%&(=YJ|pp+H)`Lus<$Zn7xmn#yRvHJos-J&Zxl46NMzdOnM$g@q~(R}X-i?2Cbn91@eUu4>T=t$MqXcPJl%H?xYp;`9K(_KRxZKY&ddZ*gD5j&T0AA_= z6UZZLZARE5s#%=p7Si179cmQhiOn1a3@*br)Ar0empJUl$Cfhr`ud=}pFY?Aw24*5 zx`4zbRueBAA@j^lE&nhoE(Q(38b#!(fT#`HC3qCtvhEVq|IETQD~lpr1*)y{_*kNhN= zHT%Q~NejW?@8m@=%_o;ktRobVW{B3jbPQw@Nf1)q!CHL6=q!eT>5XX4fK2f)3W|e`rp4jAvXw~da`|=R;qe$|1eh+@#u--(b zE>Oy=HWoPc;x?AIjlNoi{Ic>)m_^GjNd_RyMyBiiFQc&5(sM*AqpsvcP=`eSjur$u zaj51`q_`u3foc5HXmND>KSMHICv0)KDn zixMJ`r^jXZI&QCTmN-6LUJ(&)zG4cq3Et*|ef?SjiM0WskW4WaU&0_`ypF+FFW?Mr z*Jfk)MF=KS+B^>oGd2)qTdGcJL~&v7Hq7p%@+&+El91u;;?}FT5LSmX(q$jDq%x@?u?=aFD6MF zJTr%xR)?@o;92&Yia0#3#OLb*%uOjQ7yuei-oFAS>Qh<*x|BqDXt6C&;;DY=+>2(! zT8kiIva}@1=rxAqP@tyfM~dJoRc@Y*c1rpvP^!0W@JFsyyg?4Tz%dy^K~R|)Pm*ri zP5OGt{0aeUYXvLku_0f`k0oJNmw+xQ%2r`xnPm)NhqWBv^IN~?9toD%V+OfxMsaA3 z*DCb+*coZP*oDH_$s=X7WtbQxz)ksH1PkuI%cEu@lM6}0BrkA&iE|1Wn6iM=4Y796 z=h*uVCW#RI$F3^x3&pt?kmG{zG30VkqahLo)dwE5C3+!@H~bmN%}mXpaiG<4v^dYR zytHJ@ncB$JACAoI5F^USNv{h$gl+)Tf7lT2#@I^*(oU!LmpDawma4!*g_ zSP~0mj%u=lQ0Fkl;eV?u`h^p^u>=%^<=NzKe0{xCRY`5z7gLj8%e3~IjS9wRLbwS# zp^;mDJ`9=@7|LwI^4d!pgodit6#GVmTE7h0(T}q`pPJ0I*!eY-jI>Y!$ENtsh={5; z6-&XmU<^Wu0{;t~s}`;J!H4kMJrry~aXz)H!U2!`3HKQCD1;Yi(fI`MW^vcrq(X7P zjNQjZlftSq60O|F@HI(38yFFud8SOttNhKFt^A}D9*VWfRjfoHSGn~(QyICBU8YW4 z%@49O?du$0p%40GjuH2t4(gvus3qDWG*CKyJJQM`FPjsMbX}v~p)2gK)GWR+;qvAN z)5*Uw%a*0vp6D&vVM5Qe``v2!@*~LmFC26uzFsLO@+f+@Pv)tq+0PH;^LOLnhDZZ) z6c+0|Gg2pS1^ZL~9_!ffuOR~E&F5-qbqY$)ce7;??)9w1Py==x|UM%y>@< zwh}ccCzobMAd8MDS2WpagcCpV5uunsNohOSRYeyhg+{X@Mg@#ixg=CQ+L5+~(RT>9 zJFY`FyprBw%s&npU{Mxx`cMQ;kyD6_>J=SxR)1O&#V~-i3t85Sha(|HYZ%Lz%`h6X3thhh9_yJ^?|{xJre@%n zKLD=-ldJ=}*-OB|701(y?CMVaIiY4ypo{S7MS_0^?*;*Bk83Mh$P3|PmxS_G=4jvE zj^uje*%PY~HtUuxb{|q)3c;^Wy6>PE_JyG27W$d%V)^MAOC-rqFjYoCFY5cEG^YzKb23Uf0FYgem( z#a8DE|6OcXYhutXRTu8X8!IYWX(Wb6zf}Q}V=^~bqoZZcZx+#SUZq}P_7~iI{XmwN z$&WzVfq0qcZm(jn>O{7#%XU4QnBaP1+7|SK{uMCn=a#D)AUVL}#sca2Oqk~8fL_@6 zCzf^{ppTH5w;Bb=-j!NHU;>5}KkrI5gDH!F2>_BnHnJ3xN{8^PIw%@~Ur0UNK z!1qhFy4V4C6fS1DLlw^oy=FhuDl9gX)tfy`0gm^av`w*tCTg_UtOC*@W(5Zw2Cm_C zqo(`5C|KZ5x`;Xovbj{Y`7SoUv}#`Qsk}0vVo}AQ%FN4vN`cyZOmF%w@@NB3F0Qjm znbjbt46W))n)yLVJbRfw!nSyKYLqpYc)19Nv)|vkI%!{o!HL!xJXzKpv|_yoZk;tg zh+*JRIMz;l9;5tJGHD~Ok;Wb-v>-^qQUWDqtKN8FS!|Br)${Aw-@175mmPMpQMPWX zj62@* zsu4FgnLB~xWOGz~cph2ZXvN1%*lTLRp7_=Ay#g7NIiKD7hPe`<*AGCf85@y7IhjCzl43NwBip zqqyk967q~SxEG>t~+c5FM}3*pli z^Ex)6AJy}K*uQhPX=qpZu>mkT!RC-e#^Db0kp+E#)53z+;%ILaX! zBkj)wjjo;QJB+6k$CNIUn*v0E8K=ZHh5gE7Wg&x_IoTa_ci*;r>CF+OvHM*)@e&kK zDc`TAX8i|`iT*i-*Hl?*LEZnse=vWH!mauwHRNLb^G!2x2RCas@Ba-uEnhEubqpa( zE_sC{_6E@|J-{i%VhXr(fi8F`xMVpj_(zZ<bdOnRYxUys%Rr;!ap_oa9}-s?#<1i4Ua z`CpE77clcEl-3T;a$bX*OYr-}RT#?hH;fE@yO?)UZ_R!5>62eIQi8*-dV2+0_*Vch zeIoMAB^X~pK;++Pnkr74L8e77wFjv$!_Hp*r_LC8t#&chtQCVjf4?71MTzs~^Q^hP zz-xG=uJW)Cq!PsHj-%m&mEiKt%7}rDxfox=Lh;jNV)k7o2>0$%NyTp* zJlsMxT{@#3Q@yXrR+gW)=vm71P6S}lG`w>7WSr3336|kUOjoi!=Bc#$o=OU}r5Q}u zJ%%@oQRtWL>Pfu8MS<;f9P21+CVK(8qY57BWE#aL#|&|~vaYPds0FwY8YJxQ=$9M6 z)G4`9jAi5;e_R<$@)Zu-a!9%+>QG$@jF*oLzPi6T`vgR}7wHl<4Z%Y5%qPnTnsD8a zX!uz4GI*}$q;L>~8Ikq*u}liv02T+cR?`%!?P}UBe7x7qgqn#jD(LBH*x}tztzoOO z&5w9HSh`3INTZk;ikZwM9P~!aS5ZsD{7?WSa+~^mM5B?g=+tQk3c4r*4w+xBok&7; znx;LqB&05@F=4s?QhCN|e+LG-3^67b0SWsi(qGffTYwTL5*#YK3l67yCr)21g3$42 z6}ZtOqbv81KyXd<^Ryd$>?P_yrgt_HbT%ZzD&Fm^UW|d{UQB&%o8(HY9l}vNb_#n} z`PzrWu8ri3AqOuiQ=a{CSZ83&#*E_{rKl6F>jxpNh3YVSg84ViHL5d!2g^jx4 z&0C`i4fMt$z5b;xMG%sW3g1rkK3>us<23!P3K#K3RRuOM?*Lf2(!WW%zk<3|Ns~Gu zI?C?SNG~f$iotMYX*WN-1IfI4y!@4%}aJtp>m`etl*&R zB4SIg3wT2q)_1(VO0QMuI$}7Jqh{BOp~-d|gVl-J=AZM9+=ZqRo-PwZF&eEYxog); zXHD3@Sdyk)UE;DHT#;DozdE}8^k|iN3ryF{h~&{p<>N2(R!2Nt!9;S!iN-^$Bp~(@ zqtoxkM_Ol82-wPe*rn3}PX@nIZdI$&dC+S{Z|E6r%x7qIpeB3fvz-?Qs8awZQ5JQ&z8y5+>lD;qCwaQ3n^LGXb2in*nn3J#CXWuF| z+WN?%EO~bULH4gp2{W)^C_g4V@naCE8~9==p*D1LJai|g&=eLG@es73~KidaN zTA>hXa=_=Q#Ri|-3u%%s4EN5)A2|QYI22d#Z`PsE%je<3m4fwVwnJzPa!%JDy(?Y8 zZluzyu)YY_BE;4ejrle7%kZA^%)~g9L^0MrudXd#<`lar_shuf`d55w*#RLvpi9h2moe8yXtGU1*zlI za1ClU@orBb-hUUnEimVydfgXx9jfx?sTfcF6D=@oou`*rwR9)kI9By4KO&<2@pmxC zck+xij)EXoyGrN6%O=iWHNCKw84ngUpe4tUVE*tY>+=gbnADDh)y_8D%*X_#A1~^` zd1yxe6-)=6((1(DG=I)7ZK${>wEQW~wxuDuGdqR@^E1(yTG$LT%oMffzuUeS9Gsk` z+XFW_qgqEi&=da<^;EX!S$Czo5nVhIUnB+SGZ%RF?$1mt1icv@{o&K5z@eurd~zdz zZTnI@7sH(7@U zn9LOn=hE~i;t9n*AGkS_1aQg7L3n(ISaqW^ZiT@8L3k)$u@dl2lSXh`u^RC2d*o28 zduC8eQL5-G+A}Y|I16m{kZ3iFWH>e#{cKY`U;J?Xz6Ae_1RHVDXxz&ccLiVI_ifhpf zd>agg|0eQHIglxWiS9=IHXYm$O_BNr@irNJ8*^KI$NKg=lpnEQVNcwkBF1y;a}hXG zxFOw5{&P0CKeE5d4%41F)CcWHagWeIH~Mp&mww>iV&rq`&{1@SaFGu#7HC}+ZW`z( zncZY;xgw{Z*gsPH-c6h&;4O!CD$xm%gJFtpcCh)`L+?$T{NRz|dfni$26qx@^zefv zOKw)M^)mbRO>UmitHXO^(LIKYJmEEmcQVm`4;dN4D@OLp!565s)14@6Slm#b96C6I zv#Y=qT2V|CD{%j4GlFvma#aO=(LtolhBeoLC{abaC^TpRE%h-hz0-Sg4u!h27z1b7>b-cf(WdWhXFb_3Dnbx12Z2-7tHJwJt<47xB}Ni z0XGL1wCuDEnPaNqlb{2IHfC=I{p5}m56bJJsHC_#iqVqOxr2K*?K|_fjxQ(h4s*J} zTs_RZy^e63xziHz{71>>0%Z5izFh&NHtceWyXh)D8aL%hX@Ct2Bo6Yn>Z%|m?<)(Eus0{ zF6TmrvmaaP`LNu9RRY6R$1SesTlRm!4!t_qa71r@NyX`tUvKeU`#rS_ZTWV;-`_KV z4c%nGe*H-l6oT2n8bV0z8>y%9z~EhWBh0V{s4~s0Ufl&oVY>20Ggc6M;XiJK1RgNb0 ztk^}o&-aAVvPjIFcNx2UDJ2sYjBVa2s>Rut#k+nWk3C99|A5Z-6Wio4K|}LPw6ndZw70Woy)yikv71Z zm(?K_ap2Dg^9BPh#_Adl&Ub2mhxEflojJSKU+wk4C>51*PGg%-23d}V9fkb~da&G* z1j9tnBHGcb_q}N>$s2E8nS*tKSe4bZ%2?~Bj0nfQOrBh-(-Jl9A;#bW{w5pz?j)``sq8_1z%?&fNT8H!40g#b8mnP zNmTC7qSQTRpr^ znxjm#-{R!xf85}!4#)N-n06E~HZD=Ov z@LJ&tRUi>*knrzgfXP?2x+h;-r&*Yp%b7PRNSZlGw&KZa%$fN!jB88~_>~9!XPdeE z*n2o3_l*OjH&WX(hub|YDu1N%R+My(aL$u)_V~)dd+8lH;q8}iy)d^F-GMbP%v}W< z{JS*#ho)Xrj=P$IvD+_@A3LhgNhP<5iu>`?%n6n&P=ez=&-h6%;COpH&4ZrE!d%YJ z;p9Y1v)9to&QRmza9+}J!ty>rH61kzUXIlGG;!_hm?BGI7_VcsGDr7TJOhP9dEL%$ z$Whhtf1@mh!s0fy+rv0K-ywg_;ZjKhyyp#MVsd*w|^lPA6OvzlG>+5G&c z`Dl{v#x7>o#t#1~yRAFS3nL3;6|b_pI|eq*fHTa<&LyX#!*>cN;5wv;CRioI5SDWO zM&01{u;JU)r41Z_ASQYIVh|L9Ow=PuGNdqv5E2$CxKi)S|5?$#@bUY2{SDDWun|QP z!WjE2$UzJn+EYxwwD_0I+5BGY0zYVkpr5sa15_)uXzlp4Y&H{?h8_vy* zEBJ4oz!Ae~8Ag9%CYgaxIbC*}+k%e;Uwz9veSt&u@qK=BBb|D?#VJ65;?&+d);I;* z0<{$gCGW)X!i5gRx8$Cp#U2`AS+vg&->8C{H^&wnTdB0>c;Sz91#BY8>GO6yvq0^) z^dOVboHyCa7{8;eE{P_jVZR2Ac;I~lNkgSMhekRhMP*zH&ji-(3@g&44*^a+%m%B+ z{mq!1$g%G-^_4g8=I*Lr*F2;m9K395H5ijn+Dd&E>U8{uG=Xn)vM9=%)KjKZy&Q0w1bVdh7NrwHS=1;n(e;>| zJplG^M|)n0u66T2R5-{i``Wb=!k|>W8(QKdBaSC3ETLD^z57>~R!HBl;3uUQ(e%d` zCd`W?$>XjSS-A((-zT)z7#Uij^znDT=Rtlz8-HLfTh*{<$Ae^2cX?SEg508r`O#my z{E@HcgS+`q@dU&5VH00#IZ%P#%y`FTUWyQ%h=5CDdJH1_oj-&=aM6Z#Mx0cF2hLE?!+3-aF{8+uaUJfFQbQsYq31IEa@Ta7)qE zmxSqwnP}=N+XsuCEI7{+><3y~Y8s`^2XI)BfUtj;&ahvILjc3bf(q?<`);1U#Xp2L zlXe`)*l;eg@#V$<=L9uY{>Vfp8^jjXIE?T;#Xeb;l`#ZfH74GxOY zX4s(#YRat^WKS4-M z1qzbRoY5HxEXVAH&BGHTKZ0?mOv7D#`aCpqN;r$~iwEn@_Z@nceIFA*2qVfhe;y4k z2e=v1;#4xo^A22;`-c;w6!h9)mTxIr)lq3Fu_*z|3a{fO3WoB2yFMBs=o7>|nmPu> zfmmKFxl8FDvoc@r0xb2ybi^6`o7SqX3UoL6#X_V?TL$8NGkO3C(Ym>bPls09(Ww_a zyN547#0dqCaW^s#a%hh8*ih*+-AWld)liMyI{}E~#eZxQP3Uy>ILbu;X}X5LI-9%9 zd<@-in?l(xFx&*;vq~ylHHRZOLB?1(Z5~;vFDhr2O?c7*j?O*_wK%+A=HyTYBLeWo z$vUt-$T)XX`GJ587Z)STvUYOzPF~4SB0#%eZlB4?U;oRbuo35wwAz+y1lnBZ5! z1_%5h?oCdBcbkvRsVvvmNy<@P1+t`^-|a@8Bc;7m4|Gga)Iy~BmBx`rIvlX`>3Ipe zsy|@A@B#zYT6|qiTgAd$?#qfA@nnVij~9zBWW}gay^?1ZSt%++*Lh9xBg zFQeE;>h&YRefQs>-tTe$mNtW=K4JT7gns|h*Xv16UsQ2MRpR)gja5Z+>_qycB3|Z%2=t4=Yz{c$9<`mC&>1)sB3PFZJ^{E*AU3`GJ8&uETzA60 zr}ki9I!3@wEtIGIf^#{h|3Ll3oVzjHat8)=NTQK!c$0DmyGHEsUIIvC+e?jY6+v#zv~> zBo#Wfvi0C#!_Qe}lzv#p8-)$EcQbv~yM8jwKX_#oEm;Gd`n!P0XsFl_qyu6h0J8-8^w?fFnTw3p z4C~@FX-`EHEp&8oXTypcq~|>dD|Nl{hh9mdcbpH%@wz{4mat-b5EMx7o34sKU9UW+ z1fI6GKR!;ez&f8!%hLNtciwToK80hHKprFNmlmr(e9cg`N0bC85QWjTdc2ju(X&`2$`poGFv2|AL zgwK#%{6o>O(rBy9bM=AM_CQF2Vynj}10N3*qBqV-pe3(2lG>Ezw3t?rCVH?d^&7e!cGf8-y6yn z_}tFrjD)^AA^Ka#q+mZbD-PWZ)KQlGnRQYU`4eK@&tP=&gwvt<*4*e}IHtLFUOa5kEMwUH6Ozqx zS&Ww0riB++{L77Gg8P*VE8^Cz4?l=U*(m3;3(-PpmZ#F)d=fbKB`8hjEFuw3q3)J% zP*rCU%qy^qU2;~>iw8e`u)GI>G)F|4WMrX@4Kijb`iQZ7c&`3PjW~c3u9qs1*CtZs zQ=h=IspQ95?{<-*zI%Ie?&!=d?achH#4&4Cia=1Mm#Ue5{EnCt)K*{3Q9#1Kk%GRL z-v13yL-{Kp3ce|9nD@HPTb7b$t-8OrZe`YZxqf*+_6HIBA5k~xwY90LnU^PmopN(U zKpF->XpAm+JvYmH7tJD3ZX!gwrhUnb*j)se>9}l!VWVJda<=8i(wGeL1Wvi70 zvIO0i*D+G3%X#f3%vJy3chMdM5`1J7mYwp>67UVYPixR){BXqcOQ(x9_osF>Xu4ny zg(=~*tyliaU+IfB?c2m{l3ac`=Tooo*cyKBusS~G$F|_8-AWJBN07f<`VcI#jAZhx z)?52m)5f407)#cfZ2sJJu+>=kJjTv2Z$d@XgiGBr;OP3?;@r_kRR>*@7fWU+X=700 z7G8jA^ZPr}p@Nx93btUOlBIHqPs@;ZzDWqz4W%U1@~s9(&xcLGn#Efd#S=5{!rk}k zM%ik|eTl_KO&eRDuivAz!mM-#&WLKOp_^wmNt)O#v1%_db*LFlmdmWXE^O^ikS}Lz zYLvE}vy#T9e+xvNoU{-yprfutL8EH*;6Ac8m21wFcYzchX=6*5XQ~W_ogbm07qU=# zztc<8U2gZb7y9GZmW!FF&*izHT_^m0OU6@P&Ui+!nfy7S+7Bb!_=l{V;l}s=>Su!7 zawMaGKGoOLQy*t7#frV~oY)8lfvN~Xfz8TD%W#%kdSx`Ka70q^=qS|z2^L|wa1xUw zZh1WliSUX+>{@MpMLjaNd}JnM-2v@Aodn8iwBzve!SMk^lgt)n>;ZXF*$sMf=cp01 zX85EQdGv_&Q27lKy*&jM*$s+s?=Z>Tzzc;2*C&r9^9-SAk2kV!_%T0s*kXecC0<-P zXDDI~OA-J6M?ZFzh&B!NlM5mK$%WAThl@>8jxMg||4PR`&+&?23(RAB&>&c0bOgX} zS$)wS7Z+hPfR~aUw5pBZ4`088m2GY}_l(>vc}9?n{_kVFuUAO7SXL&{&5lin#m~YG zqi$2*_>L!Dx?Wg`{5rnF7~!8%i^9@{Ta^L@`t#IHH)rhowU@4sG+Sw~&xRR>QIi0> zUZf?W=2kyELMS*b^rw$$^8q9k$e|!gs7YKMr|`V#T~Q|OuUrEA5i{Sfs$3Nf6&WeQ z(ypi;Uvv==hFr!NQZ^%1jjXheNa^^;wJln(r!Ue=p@&iZLHXgk;XwtsIpF$vD;GwZu|Ei|WDYin56;J^6*$in8Tbqpz>>~$QtF2df`s)wcFr&jU zqN+LH4CNtPV_4W#(MFJX)~s6jENfq9u|MB+^W3>Cggl4Y=g&Qfx^HIb23Ha3RcMfA0{3@8D1l*+AA+>Rh|< z)pHZfL9>~{{_?~w+z%gzoQ7k-m%1pt)gyy`t(doj2`RqA^f^4+6|sHFuR_7AczjI} zXlMjXCuj;V_@gkW?1iuHxUK`?*=qwC$0tcQdSLD39mqYLaP1H))W$(Zxf|*S9}#`ye=?hixF~%E2XLpj+KgYcP;bGk(Tnh_aJjzN8}3rXE4EJb4An-ax9s0k7i$=;_j=D;%5K9FE0o^yi55fKq=r#58?wG zfanJ3u+*Z022!UmN+27?eB((6XA8%jRc0D)G>!IVR*}BPe$mm@;?$vevu}z211qoy|&xYDc=-Ss<;+!W^ zi#CRECdYn=jL#+jWe^U}r^)j=7>fbtdh9oN%BpCxGp)TjYm_%`JOmAmq_qAzpfGu| z6z}E)I&XCMj7y_J%++_0?H+p(PpR<6&5}{5&xQnsd5K{_Sz=87E-jUe5l2)7T-(<; zKrf~&Djp>qFOTJ4NYyV?YDnL(I!c*rm2ue|(J^{Yxt>yvpkH_}nmV5at&)C2WCJX@ z=c6|A)W~%Jv=`8HCw-)!p$t@hP_12{w_caJFJq^^DfImMUL{>Rw}fr7z%yo07#w@t zgy)?kQqOmcEm&Mx;l{Lio)W7n+`eTrqPJ-8B=?Bis}ucbL0pgt zBB`SQe;Gn31RVqL{tnZ=S7%krW*h8_5T9i3rCAl5F|9BMN@vmo=GiSoALiWh7U`{J z$usIE-of4^WQbHA)PrGPiTiv2);f6E!1R88X9-P`VYaDJv1;s5OC>Y+s_^?do00o7S}CHGUrmURL3>#CJ}@) zcFbYM7lB3DGjS^XEb=f=tldbR{w2yPvPOPdp?1zbiuL~b9{>nYh!`8h1p_PN|L1wG z^2VR<`mi>(lm6FBC3HMH&<211WMh-&gbF2qM1fROLxx1DG=f5qQ5K=kb#|t8cVYA881cRCq|BTh7sh6X@WF=zKgJ;{1jhj+B>KQ#`{pV#p&A z^C~GOa;E&SRP+EDc>;0v2&FJI#>QRzx2B!qZzZ+-g$J)}dj2EPd82vlf?YEsq$zwo-@?44?CdnphA>S(g$U$-%k&4aM_qbD_4!=;E$NcKuXJyQ_9$jIL zCbh_W^&1P9S%a#Fgg2CR^*1#cn<&q#Fv2+31AlEQE{ROS$t)om;eq5B2Ds=gQW2j- zgF1U@+$utd)vnk@_ahb_QJ(_!8ThCNs5bI(2J zzVG|_f4=n7>(^Das@Jn>?_S-7uq@lxW5#e>P4t7m6Sax>fvzV^S*qjIw2-+&2o9@H zDiavk@cBM(dxKd^B)XKkpo-dNlxF!}&2@SY(ObhK*1Bd~8G-(dwB8!du+~xMF?6YQ zIXj1RwUpo6`cxTH6}&sMj->AS&U_#~d>!xk4!F5Ld<}{I@M!IftX#!Hj<+}qos`ZT zTbCT8XY8Lr?G}ub6mV+|$_=HX*OBut6I=P!=MfkA@?vx(PNqaUJLrmOZd5ZDFUDPwLa&x7shlXzC#u zA^{s!V6YT%p}BQib(=*Mi@@g;G`s_#12v1MsDG6Yozt# z+$gjLuk{LVe&|RMVPOn^SK0FBGWFFaA-caSX| zkWO)qaaBU@SXJHwklS1rl$CX)!~@14S}H7wBso0|T&VXBap+l4wd0;-3Kq#$A1L#Z zuW@8nTo>a7azcAG!h~cPrl_rmaq5Kov%}ygd=N%dW~`~fCk5~)CS5WP*8h|rsqoy#LHe zNkdq7rMIwJSteN`T`I^@Ya!9EfozZ)VW4+L)k(2VwrJ|fw2s$}Tf*58VVboswy#NG zK@69tlNiv>yMMtls5g5|*rph9>agCORbY*$}Ly5u;&i?Zcq4rj3^B?oktUoTBP9 z46s@qX0&G!DdhC|V#*O|yMpGl2UfVbT!cKK=*(cR{C%MN%IQs)td~jflxeUvsrGF5Z#%W>gfOT5bapr_Y>7E{qYY)3l`0f zPKlq(jcYCnomTOVGp-XoW>n%if?EJ_iBdvlFCP~5+F?kx;6}3i3C=H(j~1^bk5ZVG zDlPT6`V2P7-YY8<7BGg!VNuHTc&IG#Pq9&(R0@=@-nZ&wO%?mWZ#_R#lfjn@0mlQ@ z$s($iAL21dwe`ci_DA1CkTuzw6=a+#wT7ATCk@guj+`<2zeg0{Z9R=T=YvOH=4rZ* zX3Mb{qniEH#_XG$#;*9SnnsL7T5aolj24vuRUe#NMkmF?qODq(W#$Bn!zWUwu!d)byZ``HeH@yF+rfpAJ`QtLs1Kd%xX`_cYYz5b zS`}wVUqmd5t4kNw#Y?FsK~?%v4?`O{)^mi}2Z5?0HUiy!PT#4`+y4dzf6Um*s3*Ce zjVI~HY&QQ=ok9}Jwn`eX;Xa{ibq!`f8pO@lN~(ts|BF{Bd`QcL(Uj<;B7he=htBN= zhuC+Mi>eA2v)oJ;cN9o@#B06B(rZQG_^wbgaA)o)Nh+zen2V-=HY#QV(sY!6rMZr z?q;b5zW1STEA*eS1q|+VUg;beSq6zS&4sa9970;dmdm8|!Hwx5Y6-%y z6I2!inT*<{FWL_R)2^FIYn|XjhzVHHbIH6RT$~QueGVYP4bGw{8F~kAcx1=-3nRe5 zPk#4PHvLmB{%y&)K#$`p!@p~=NmW>mVh#U=eih}gv?Tb`Cn*y=6#xAf93-P5{3V7F zn6sE^V-gIF;#Q*C3!`53iR*=?FSvRYU&4uu66U*s%bez@*0tqC6BzoM&I2Y3>&B^0 z(!8g1C1=6&d<7eKr#QDlS(e2L({EK4PJ87tim=Ga*FYgtuJB|Hb8{#d-;=nBgP=B~ zBC8qsAIGDp5{1KPnhK{1eR<8!ESh|W`FZ+h>p@uRoP2Ie_Vvey4_QU(y4w&F!(46$ z#~nYmk2zQCJ8r~tG#O+et&$4N2lM>S(B^0L{U`Hu_o8;QT=L3HLLU2y+y>)~b=-p= zRvZAa5F;W5CDNBntAr)vf23r;H@k*sMAbQSTptsSyOg5Y#5Kx3{tdptps@g}+aOAE z7b&s^oE>e5C^@^^1$U92M5OzMBM!+PupRs{ld(Ydin@$U(JI6^y-TFaGQ&{x7%~jW zl2O12bjI*m+#FPk#)?QOS94XJpt*GAx`<9J+fLEbUzqlrIXRe2qDxd?GE-kVH>_(i zPo}Q}>5?v$*n8iaDs3ywHzD^XvhXXRJ9CjgMU+ssbWo)8h8Fl3bJ$!Lo~iMaEkUB0 z9dND~T1tuczrL?tg^n|C5RdIX+dsZjKBFLJq4Qoz(7dK8;P^1>hqd7()MunE*7-qK zn0XkvZ_0ztt;;D7d0?ud33C7JElf`;0*O)?RT`oM4_yR8?@%pP3vZQT7B`4qqFi4= z_(^1b3BOUVoi8WfK;N>7;*@>D}!sO|pURRC_5(z@*I&*q$SW*22f- zir4Nu&K)>(KimpuQ*XFPJU`3|_NLs_art_Ujh{sTN3aGPdWO7GkDoeToUnM>iO&fJ zxF0gxcRn*R?(@>1h?l?Vy#-feS$wG9MsLopHQnyoGZ6Vhrj|J>G~;oPknJiz1Cf)S z&C`eZG+ZJW??UBjGi3Q{W{hb$g&0a0&yH2oE^AL`*N(G$3cC1iHnvF$Dvpk9RQk(t zvwk!FEpn(-N3@(tJ*_A&)jFni)6lS8T+-F9@b1_gwOPn~(A1#al5nB%>FK#(r=SgW zwN)~n^{Am`P1bYyQ9c5y6L$25yG5p^+Kv>TnrR+E!J0ww$4IQWym0W7F~A5SBsQU; zoUdtUlzB+=7NJs*TFT07JNiLI!J(Ecb=&bSE|ql!B@XaaBvJo0Y8%3rn2!m1VYZ?N z8UA{+hD8*gatFE;+>`4^&@rA!*7mQHJSP(phl~XfqogPbrdVOY2;7WN@~(?-Yrs%_ zhxn4@TWoQXUpw2`M((QUD=WWP2$-!J zFT2a9r>i#pi+_@(Bbzri@(pGwLH_BqA@csx4Hx;Wl4v9UxZw`f47Eh%2mJ~2HO7KD zlNu*CcJERGS69^XJ3%deS1SC$+5EJh`4h*9XjkDD_#JWIZ)A|y6o1NzXMyAJZY7f$ z!cu{nRGKm=6H&~w4XELiCRE~~1NWQ=m5}oaP~^rY7_t6Mj_)ZQendRs7a%ec=Rak1 z9%E!AE{J6Y&vRu4FN|d<&h?Yd&8`afDIN)A9Bg8hYU?^u6ZFshlIkx$lF%Nh$lF$- zs9Mtf;u1E_nPuFYkkp-Be6kYw&tYU9>yb2TQ~8xg=r2f<&+Q2d%n0AG$lq2~lh#KC z6h`dN^ApxqV-nU@sL7j}^vU1WtrsCIBB`3CuzBdACuN+vMcwE+Vc0mx8?0C zxJM<3UTBbeG%Bh%r}@<;^j)YXuMcEb>{mYGk$W^vsW~J0R3`YW9#L`6W>@VSJc^J% zHDXe?-G1{)Pk>q-OXged6dPfFlp!BlO{L+U?9>~%c}$j3sIF4E zWqQLQM{254y@h^*B&S^Ar18r4t4m0{&`stW?bIIuT<|9I4R*?om|plKWtnUhna%nO zji8=GCA*%7C)-sMsx@XeX_IH3A0=m5bQPP`ebgp!zp0boJ=)4( zoO34KpEo7ZtzJ=aZ}=-pZ+!}l)PBS#&_52zOx6pk*DieOji6pICi9Ja%8VplI41E8 zd@78nUI4!VLbEKs@_X#wED;o%0%nY2J~AOKR|BkmqIy? zEWu$F&LDug&saqVZm_i~cN5@jkQs$YaKb5(&5CQVRmVyY83{%g2P)$*gFspJL*V5r zOLb#K_ktoWP>~pANu&hA;D|%uRVvGMi$(8(#>`U@Zv*oT!f;6dM8EmU^LK*-E&PB`Y5g zIQCOUqj(80aJoe+C=gjT9I9>5Xh;~X!kHM*6k9f}ZgLz1p^ zfePVUIztAMW9yn9$jF{Sw@n)zgK`}$Aqn@a05Ao&+6^{^usRH;24#EbQ3J_%+vWnv zc;EH}$@n0m7Mdf>A`-eIpiZEm z6rdo-5@3hnA7LnPT$ch!7zLE*(E@}k|G~-sV0s{2_783V>Q$Z!oQ`D&9Z=&lbfAjb zRlvtFrNj8|n*IO1h67%E|C{AvCh%d@ZK9~%tJ6`%mN>koPI@pGX)WEDVJC|A`F$2mb=X1pl7mUXVZ2 zjfOg4q?g8(A>Yj2l_;W?IiHm`#MLr9VbhLoB_*0Pc-fOBOP+{y#n_CEH|w{#WSq1e zN%|;7JR5Jq{<4{hg=D<;xs@{{Zy24?P(pzntaeXf!ooRMZ5Y1drIEC=An#AULA+Z$ zTcR`V$o8?>ebmE*Ds9r0?u_9aIpcpgZ!6ZvTGYVS_S8bcJ!Wvw&xgbS%b>>D-a|gXxRlmIqv^+d?XhXpe0g6Dp0%j`7b` zyan5S3k)(8P1VpId%KhSrB)Q?RF@quo!hkj)EE6STVk24G=*{JKO1#0>R85EjNKT9 ztjS#d;m(RX;$RF|sj#DKivhCNOcV311mHM}9=`N&4s|*y|=Za(V>c`prM`R$cV`?U9XeFnh#)C$7`sS%y;WY zjDX~hi7nHs>#3Etcc@2#uiy?s*cv2}%vvN-{$DOLUp;2rVewjeF+c^yGeIsThKdWB>S4~w4Ol-kOW6icT&BIu6cbEuZw)=u07ga zo;f$kdzHb~#DCrC{_V~52$#rL^3S!erw#0&4}NhxnO z<5|6OhDkO#YqK2DTM``cTjCv2TcVz#_{N)}`No=}+6S9reY@WzJNLmz1aI(3z7D}E zpb5>~c6fF8UyN*Z1^RJ%J!&7fMJtqjEp71#E$|1zbrH7)Y!2IW&^t5TXtp+Z!mo_! zcYJhcU!c!$1ZG>4ugo`wo*D^`-n1BR{VJNC{TGLP1I};-Mqfi?V?YIoaE_oPIQO8$ z->!oJV9#mCO#V`?jQ&>lL;@V%T!ff^dWR(S1&B{?`tmB?uaEKk#axMVu=EEh#Tkzz zB^FzZrEcjI-Z; zzhv2g4}UGTtwz+#^jvBaP4-rfZmg~bB?p5yopb2$R?m)kYKUPcbXk2pYGXXA#^?Ed z8L%G9KP6kk>B;?wT-D#X%W5Kcm$JO&Yr!|FyBCy$wUv;Awv{~iHnz;61WG`F*rM+ShHD!C!sX*xzke+h2Z{-QRu} z%wK<3*57ZJvNMe770_z<7U7_DYxx?L#F3j{*58$Y^&vI7)jRVA_TQcFxaTCJUVv^K zAVA0A|FmPhytRY5sj>6_2^rb~h75iGWXNxm)gmevuSUzIPq_xzSr0T)gZuC%aj`LcRk z8h#0UfeB%dL?F7BN*!~7g%URmcr>3lSJ`Z?tfRR1|24y(ion3)nM))`zzJ?V_3S+q z&LyS16DTKEXl zG(Ikk9F7DXDr3=8z(oAcmYhDaS4sxop1WHf1JdpV?zR?BLcr0C%L0%0xI9kH>ZRHD z9pCn-=28uO%QZC21wLXI&>DyRXNfteX#{;|%x6Zna&`MwAFB@n9n(#(mrHc!(bl5b z?`~1lWeI6LvY0ErWo3DjqKCGf02y7O;u82_z018tY9od2z_!xD;V-rUIo!>)V;|-y z7GsN%#Wd==$3mf&?u(~(ocb#aTWbvh@rbMmYA(|97-yrlb zW$pUXD@}dl+1f)NGQCvji1d7pS^gRyUg&24MV;!24`uyA?(6xQg_`fElII_N;pCdE z(jkC^(0)wUJo?I>9-~TK3_ zV1ofX_oM(LX-mfJ{FxxwhO+|evIwpyov{D4Wc-9Cl;y;fYz8Xa->a3-y<(EdN2iNl zqyOSU-N4bQ*xbH}ohLD63)-&cTfft+{vz1;_FuX zC(Ex8mJr_hrA&!uJi|CMts%9sp5&C^$@xXbx1jCP>Yq=%z=ecBWg@$ymOgW7hV*YgUzdJg=}5#CMoryH<-wqrt+ZqJU`A z;bqKR<#XkG8q;G<1|zAKkb0IFFLO|B@@R2$o z+re-R?gFf)ilX6}3RcH|t3&H=wkfJ`2 z1tnJcYh3}mK_;suE~isY7lc&HkDIMP@R>B5hO9gd&0!JW~zq5s)&4h~Ww`Lw55 z$L-5Mv;p1D2=bWe`SEj=+rgpTSo8=xZt2_&;tG%`%#u~&Jh1Wb{FjD=j1EUUzDrja zo?k85g>SMFas_uj5&gywcK12(nkt)kiRxBxj9>}xgYLr1pTxQ=2*g*)b;WySb;dC7 ztXKe>kh$J-&!ArKj}@td_&WlGC{|(1^z>YqXy}%W)N(on!?)s6G6xwf^&fDi@bPt! z|MLFGZje%t3k?nk$T5+TSjq*6HUFj-L4Bj#L-pRlurJG7tIXwPQDG}vU6n~Q9X_mZ zUSDZtzNh+Ju9b!8FlxS8e_X`C*AXsjP8y`rlyRylKuwXhmOdz7V0khW%oXsjAs=VW zHzem^XER2(;-k055w&Q`n!7-!*CdI~XuQ>-E?Wun1jYzmh6y`feQ4_RI|Y-%Pt>#Y zW{`XIu~>)SvI~YS48K70Qg*?QBirY!s%FHbyXaS>RkcxIy-r4bp!9cB%L^WG9_OjU zF3^!X2DD9mCQPRsjiHA{ja8;>Wh~LSEsBgSHvU;ELb#dUOiK`$;qdciZQYyHilH_B zV|@QLBbRfLBweqN#5Ocz-K_Z;>Ou1o0ShC%ISl@q%E(eyOAT2Fip^*&K5>?O^+A<~1T!=}0@@+n(Lqb<8v(K(5( zL;Zg94iA;tjS26bL^Bktba&5d>sZ|x?*-9?AKckzdFxP<66r=dn__=QNLL5}Hds?4 zDL=h2u)E>}g}tjkJC>jSnY;1Ijf_XXm;BTfdcqgWI9rUjD*{m{PX;c?@ZnvhK1+5FvgQrq4MkS=1@_R z3(_A?A(d|!64%(${(Skrrfwj#HK`rYZG-su$`tjakVayKNxdLdp1R9SbHP@A#(@uu zfSUb`3n6ng;EX*KcD(ly8t$A(&~{}>$FBRWKvyI~f7EAIpXN-LI*Vi)O;~>)oZ>${ zi=^|~Q!zUG!gSOA#vnVVmEl}!^*Pb3c2K zbND?o|M!Kx`0kzQIOIlbGxiLpIR}%!DVq0Ie`oU3usM6F{kkg^DePF0mx#iDnmir_ zB4KzFFF|>2TPopmo_F7`2b$*({#G+8=g?{+_blg_URmF$kkmn`F*9M?oFd{iS=M(S z{Vj=A&ghsE(a+AIW|rX`*hj)h_b3cPCmrQ)lS^l6rWUIM4{K3%e7LAIQ`Vy*GrmZw za6BNO1v!RI_gBcG*Cv}YsYtp)I9MezUp@8&xeuh`zK2F@Ldb=MKrSB`g(R=s%BCe7 zBPkY-KlC6#73>VzDZIgBCWl9GoGpa|pEAC;t}&B|kgRkNYC~ujhy%H?BSvS0;JC$% zf~Am&2-%C4sdV@>%DspF>WDBVv@%AzgIS<>2IZNXW{Q5w5+0YY<= zHo%>3jz8v0gU~McqTXwNiij=eC}0C% zvBC10+JSb*R&1%nl^Buy`*hKWiMxY4T3{LGKFezHzH+jOS$|TsK6B6_MFtz0)FI#X zN!zASX0rEpCYbwrH64NuHrfO{d>S=r8VlWA?Stp?w9!@;v<^r~0z)Cv}W zB)66(+l@DRh0HQl%3?NO6bPAp>&DM1<>W_}WrZvn6NpRMpP!ve#><-WYW*R4$H1@N zWu=2`;(B@PbQ;MOY+lDf%(`Z_S~|nsQizo_i9KP(cl4aWYFUb7ntp$8z?-8X%WPb@ z!(fIuIe$9K7d%(tL0+MoXKmh|lCC1rv@!hK$9>Fe2P61V@s7`Y+gkd5PCI)^VR>>! zYgo$dESE~#(}$#7(&s+uC0sUr&FikaU-QBS zZ$}{T1<3|<`CXEE5;!EXc!C%t!P&*Z6@UKpDBSq70AiSZP^!?@3C`G7Ssqp{)o6TK zvAdF3ZG>`rC2EMym=%&2Lu0@KLz_|hg44wTb4DQa;iIIy+vQzQxhXnGG8O*!raKiR ziZ4+~R$(Er`an$j)1g@;N3uF_ai7K_S=Txu%$7hVESYPony%RK6oR$^f8_<29j)@TgU+zj;N>RB5eLr zRvcH~Gy0I=^t)qWA8r_O;a;3_Ti!#a`Ia`O6k#SjM*J`HKBDv*18U%&Fr{8mq#0c| zQf0j3^D$*#S)>gaPRJ7sXijMLo|50|r`6xfrx*CBT%+@=4qB((_~=|a@>5$b4-yP| z5OR|f3Vo zuK%EHlI^tVJ#F}E9TO0su8yOM=sy3N)^LE?poQy-jfLH~Y9-v>6Ipu>nGSx>n-+bq zop#rLM)X&=qU>V0uRik^b9hsh7Nj`QPuQeC86xkHoKs3W@kZz{m0iXy_?Ce#pdBNnwUBjXHEB7)=KbymJk?d${FPS<;&LS7?cO&rh^2NzR zg%h$<_1jSm;Aw@!{lz)yqS1p!NQ0Y5gMykt8e$^!j-PXCgbw?`oL~KoVH>46CiDkx zYA-%r(3=*#VZZscx*lR|4R~in!8N}gh+u#6HL4y&SNFm-t{zxGcf&QN9@JO=!!`I= z8s?Zbfkw4RxfyMBWU?_k+%{w*f~^)RTB=lJU*oj>Kzb(^C;zIoIU?hrh(+F5khDHfL|7OPe4rpnp=n-N-=5hZ$xf(QKFE3F(#(+PHRgQJ-Llcx5x`)lZe*RG2zuCKy+=hJrQG}JW(wLarL zQ4_eeqy+V!&zAbXmPDHW{ImaeT)Mt0sx%tEe61X+#80Oip9MGcpWjT4R@9Z%b}@1C z$kCel>`Ga!`=nS{Ctd%(Q=ipoycnI>B-cbj1q5DwVvp56x>KM~)g7pui8?!OUHZJP z&o%jM25fplZS&nyyAl}_S?@x*vfK-Nx9zQjuCm)=5QvL0Ip(|auFSBIf=8rx{t<@Q zlq3SX0V#*tR-I|wpEz3Cn(Zp$WVjL!zhq`rWe%G@(!25dPmZ?M_k(gng!c?hlVciL z_9~GjT2^@YLmi*No|4=uQM`_R2bU<9pH+HWvOT>7V1gOPL!0*JUELm|;q1y0Sg%c& zs7oB|_2V@;#)fblurwq()cwbJP}qo#6tp2!?B|E?#$g>5UI&mr>CnZnUeE9(rI^V_ zbxKSr{0E)F97@{?dgazeJ@Uv(oP%WA=jKU5K~RgBhK(wJ9jExZzJ2xrgiwY!cqdMG z!?C?}-j_lXa>KBhnIoBbii+J7idK#4ce;x26f=j7vQCS9!%W)79aFeTNnQ;1t;$)i zY5NlPG%u_k##h20TM0E}YWHc{v~=~!No7d>?%FlssGZY_M3i44qlD&(z;pPU=yEN( zO4FKbbB3)yfm=#he4yaVDaOc*EtQI6GyF0MCDEAl5HnW}sU+YGmTuTpf&04Am$obU z5oyfXP?&9y|A6MO{-_Pv7m>>P&fQ$MxNc0Dh+&{SqyE05v(?<-gUFLo|}JOBX%i zi9Bf>Ne58u4yEYULM2*B#q#V-uiEL!u^*9lI8@j(VSNINmrl@E(3QZ~chQ)V!uN}H z>R-j={aF0D%v>S5`T|!px2WibHxaATb$`pFARxinvZ#b_opB;RKZgO!y!d^W$ARsf&LO^GIFm?Fa#tbY&)NAa)PLVBhTl%J zvI1Ik70{yp(~;UL)@J`D$%MY*ngyEwCRsx;GdL)Dfh+w+E4|@%;n~sbj0hHvP9O}+ zw72s8pjT$A^!Yf4+6CdU<1*v&1Vd}4+G_qs;79yM{VW4Vg?hp4-KupUjI~%<-gCQv zz!Bfn%k|BbqyGy+w>+KoFQQVC!aZ=buy`onR9tz7rRauJFymMFQTegPckVDNo;qyF zEVeU^iP|$9Hu%zMH+bVTVn?_wEA2)meg7#=zMV_hrDb|MOkjde%-;*4GNDVd3S}4P z%j}RJ0#BV7v5S}L1Pu^&9qY{ zyKxAumQ6dyB>ZBO63uVk5 z{3_@AU5I`W?3nhm)DVQPoPYM;{ZdJ``z}q;x`wq3&kPt4R)JEo+qBP*7E8HMO?sOGzEt#hTYO}%CEvt(m2Bbk}& z4f}qY*mqaD1fmBW3D8@yBz;T^8Uib1s$(_4Pae7T^U|xk)|CpapT><{D5^wt3l>lY zgtdHWO0PPOHPWxEsCJUfXVj2tPE8Zj7h21U3AyEO_>w%+x_ZPbF)F%oaG{?8&Zt?fY59Mv1kJ^0eIf3P8o)U-yVT%X-#p4-c(+hik(1Z zO^`1jR|NkgWXhg!i_;o8yv5HNPYqaqBYjGu%M+fTL&F?3#8UelEWSlj8I_fzsrn(| zg-;}(xIwks9CnrudWEmE zcVRG6)8kk|lEo;&E)7B=PEQC9LSS944-!MD$u~+x;&d*Qd-ZpcZ#ZY@+qy6DWa)oF zU9U%Eh-zPo_`8i?wABBWI>DEKbtTMzt^OPwa1ycmJqk8+^SVv961BpwkQ^{0<7XuUhcd-ikAzi{{0jCgE2Vz4OhIM@ z4oz^L&YJylm>G4n5)kkOw@up*Y_bxNW|S~#9hWf zSEs6xjbA(4?)?hdb0xYkc*asGo)w3Y?P%Gh+pJ)cH{8KBqX1hI(;EdZ05KNg!`~!L z=pkxZC}D9VoM%u`aG3?O;BNHw0P>e8X9sEz`k#qnzGbqQdGz^nkP>luonnk{&aF^N zNLDz?8OEA1IJD^V*kGpBSi9iK8*z@s6lJ@EB^lh8H{O|j++c<~e4-*wS_mR5ytPTC zR9BAhz=NWckaq0Sj^<7`@>)I=wo{KgRp}yNsb<-J9yEh$hRx}78N5{Nl#A}VyoQky zpT$_=<3+KFc#VdZMv0&$Pf-<=A=~Cfyi`8S=cFXL85zo}{%b@R%R?vMF{S6UX80OC zC4k5ydNIgAp(eUrQLxmYvPs%YwZfeB$Xh403qvf4Fo1U&@F3<9jvkzr%R0d% z%c%=M`eWm5F3l^MKs|P>THPgeA{x`VpdS8-YVtaj256db>P6QhAGyXqZ2M-}`fWAv z%ac|wSMy@r7q&4n8zd-(naeo^T`B!^e2^c5*pH2{^YUO5U`+pYVYX7@z!Jl0CDp>V? zDD?gmlc78+Xk+2%crD_Z1~`m_wUYvToP+VT6r&?2A?{)}HpNBby&H(<)nGDKQlrL-)bEG{(Kg*ImMR7&gE9yYseH zfAEz#mZL|tXSm?V7ny5fy_Sk#Z@m46b}uuYu-|6j8P_!XyRqq7Iu zcKD44$x!O?u?nr!LyiFm!cCd^8{{LtW9LxSPx<#oVG051LLa}YUm==~E8YIYiA9q2 z(aj16$;A=zp~!UdM?TGoet6Sy_@eQKuL;{lcPrt`4J5giS4DqvNEnc2$LQm6tYQTO z`x{0#Ilt3de{txG@`2UPR#L@G=7PnQ?SDaJA@<*h# zFocZi($m+a$~4SvR<@FVPN zb$xEYAbrh+zs$c|8!72>x)2E=ee8>hjzZW66qbl@1d=5Y*FE4ygKyF*6ulJ-{PEeP6ZelKWIJ&{=-MtE`Wi`P&c zpc8%J<1|u|sZ~HnNIem1Ty>CtUTZ&8qEJo2@F-nx0yL+p_3~%7KHlny1J5dxiRCQ` z=u1!rQw%&tIk44e!2I!ydkDnSyIhym}eA`Jlo7EYElGD6}g24bl~!KpLgxo)HNn zZGfWbQ#z*8MX}uFbPFV~2IAhwFu+@F{k7V1N;Dxg2;p8QkriaPyoZM62Q_D_dH%#A zoDqHV0xiQcts8!*<|PYz>=Bcgu)G)5=p+gyVHLjCv)4IWTzKu$-(KxYFQJBgP@R$@Vg)whO=FBmIH--`{ocHyG17;5mCW zux5tQ|Fw7hztq>%&;=HoNBg93szvokY*p2fas;QcpVdpr$6O`LC$|=rSHV1G+s?1h zuA+QgJk$5^_%ok0yEXIG4F)kHC3OwvDMobj4fJQoHyAR4IL~kW+H28mmGL;rBR&?7 zdY#-&+?!LMFVCvq=9*E(p?J{6)Le5jiQV-Lm)K>STvi9h-K?MCH|7fMUs>V*1dER0 zWf^PE)EDfW+J5GzGU`H{6tYgr$54rer$>v3R|N^6uOXXa)f80O<5*?8E)|qj#1;+3 z7BNQKMywQ&^K%}d$ttW&vfS_I=iKYhO)}%*=-IWZS}Gv$k4K6a6$MeMo%dcUK|lR$ zJ&3M#@Y;U~{`K&!C`^MZJMY++AG5hra=_r+ROzm@iHH_+DTRi7q`EDd@g_I9dp9t$ zh`GBuTF()ZWo_}Lg3L5>PdltrdyE;p=jdY5WPF8o7D9^jhK0Z{B zg7yii4zRd*3I3@Wr5C~!kyOt&=f*XTj)M0g=%;QZY9~lYm23N+LMeKiRi@c{J4TGe zH<#xe!oCSjjD@~|IHpP*qOwA-O)pRx_MKp|cR@*p{U`HBY}e^YTv4(7rZo)x1h{?ytId$Dd`+2{1u7+J)ri+F!}4c(!y z1DB@(=DA-@&Gxb$le7Ga-W8TjF`b)nXkct^yxnmHMS^MV_w>lQ;R3|J>Ll6#^|gU6 z`=r%A^(R6xR@V(6pAaPPvim3c6|_D5ZaUbo)i~cw5dw!}CTE^FF2Fpms|c#2?N%|2 zm+V(SM9xVz@pIv$vS}LCYxWq{jc?58bi}{(_pNjXKH*4r(;<&o>?0Df(5E1>j>@oF zqX@jqL~zk1%eeeWRCF6=XcXd$3#+2%4Q+nl{CNPO@DMktnH58~4BMi_xnO19W4gVo8t*@zIr9L?>J7Ybn=Ax$n>D-9BS%Ur_^K<3iey; z9QBu45m%<1c)u^p0{JAR>c;MZnGAB&2pVRD8O&0O_qhsejK68+lx&b5s@ z#{d3<<>n-MWgTFOYnzG=@?=R%Z zU)dW7*2KA{ZcOPLK99iiUoU@_I-Z^^V*@~$AUR_=>{Pzbd>7~KOY!RLc8gjQ|8Vv< zz)HyV8?Tr5iZq_vo|eO7E{5I3;rYvakE^FvV>z)opu%ue;dw_iXk&w|Sz6&7sika|qxs<@G-X)&<*4--@KbZ2xIZ)4=>2LZ z6+Mi;y`i;N7ara!v)DfJN_hXneLX|3O3 zc^kwbq>=GNlEQAzTrL^KN%mYdZP!kmY**$Mg! zv?1sT>#;s^9R1SU#AN2Xx**fW{6`UcR*!br1-bzRdSlN4yK2g>Te2o{^}*xUbn6vQ z)8$g5EaDb_Z}0_2vOP2_)#K5GaMcDGgXTFtN8}>jGpzND9Wt3MHw&>8xn5WPH*cGG z=XFyYv}rzwc~1hR|A)4B4350p+J`d}Tb-n%iEZ1qF|lnY6HL^xZQHhOPHfwp$s}*i z`=I{ke7>LRs_x&nuI}10=%_IXW&EUvMrJ2Jhh5~{6ICTaDNa@6$l zzXVZRjpwL^nJUhRj$046k1g~OBJbSgL$K?$crnti@v&qjxjX2f(`6;cMo0x%1w9Ae zvY)g$zwO0OPWX>G=M(5_K(k%dZh$?MR29Vs?XE$_S{(cZJ%{o9tro-QoMWgg8r1-S zNel$cUlGnO?{?QLGUdG7Ny@-Ioc0^igD} z24KnZX!m>jO!4H0(B`&L6b6;&LQZ5w(d#5Qmq6CYAHUg9b-e=Wa7khu;WYc&a=_ia zJ4a5kAziQ+g%1q)jt{X4|(#6CN&_)9!LZZof(i84q zE_M}*zfdgwM7Qn@`?XuS7Pe=Wdx^=9OVe%p{?kSFW7BPYwF9Y$_Ra!6ph#GM zVpbW@u30!yF^gGPB&c@g@?8IkaC|p2n~+gLN87`Sgc246@LSCO1W9k8l@CJCjeZo~ zZmim_Hp3U9Ql$MW67Kq%_nPbeBUgoGWD=U7;19$5rV+}$|pV#M?9!#LMp7tq#%?Q{z_?X(HK+`1xya*`K_ej9Lz$E zXWM9*YdO&SPF~f~)uN#=d=ZzJ)r^L~OV#;phN+Tt;B0MrWWHh2V$(()#*kL^CO=$E zlUHtEDp%Q&w@!>OCP6Z~ZRJm4m$f3dsgLJno(q-tZl~CDbqUfLg*oqNtJbV+HkUbyf84)BY6a+;xaSB zFCP+5m`F2CrH3o@Y{S6^g{{p{2Bm^ZTz!pIq*N>`zzYM>!bJ1lWfhutAab?%lCicA zdpaX=i=nGWJs9MAaQqT`Wkc5RwF%#qscpW}h)>I62%tWXd*@s%(pQ17wqQB}`ef0p zp(RsP!5D(Gj~8w{K*;^(9HK8*M(UCOeTERhWBL%^oW&ZP>|!gkE|pUnK!C^nQ4&jKn$tn-;WZ-UVXlsTWKN6PKelGs!+>F8&g$I~x zfF<%MyRrGOTEbJk;>%30oNcI0bTRx5GE4cD9z^HN)-CSjbyvBnbYnJ+!A||SM&n#3 z6TOvqcKO_Q9I0AMTY94A2#J>Sz9DLtl)&cBDLGZ;G;#|tnZ7REaW9d88dLR|C6#Yoh(0&Vk>`@U z$79(+#8&78TO* zpgR4@>&iVo9eYvLHm!Eqt)wjhU9u}xUg}sQ&rAbBJ4dZ)=P!BRcrFKrkVN3hs4u3P z&;sOL;g{D?0YCLh2LKO*>eO35=S{g%Np3>Ji(?A?_6j6mn+kfF1eN>i3DtAQ8rcQ_^F#ltjz8 z+{k!JM3h9+k4Rpf{23%;vOu6gG|cXU$EIx!z<5O5CBs%l`5s5cU_M4ojOgx7OH~kG z_)}j9yC+=i&6#$8xi;L--^+I(rGqmfD}hD=(+;SUIrR(2%0SN$kuNUnJ3hiYA1^-$ z{S8U}wu5uRZ;*>W`W{di^Xj9sBd|;C_jBUSTxYjuPv#xh?p7dn*KgPTebn7ABF6%` zWa9&6#OHY;4m_n(KODNSNQT={mM}^w+#g{YuGFvKyO5^PoN`mRuZUZHb=gb+N`T3l z$$RrW(W|Qb&d#nQ9#V^3ZVr^a`Hei(Z{5b|*Y6Zl^dw3<-!ShKMonVODE>zB1uyXP ziD1L3q8pJ#%?P`lvU>}jJ(B!^+4IvJ|IbK}V_r$}n@=zg>(hYtpH?oZSex3Iy4e43 zB*?!!XaVoVbXm%nlxm`o07!pj14yAZRn_oea!7PbtGz%Ii;?=qO}dVC9N%#J&ey%b z6bLlpEj09f1?D-AW-NMTf>7Sc?1}9ADfj8LG=d&?fv=%E-30WlT)c2NJEky|5%G%7 z!ZW2Y>dU6%W;f!jx(&y`jljG@WPYfW^kw?$1Roy@Yl zs4l5)ENR5}Y~Gugh*^n5pE2AkJ&%dx(sX_C0YT)$;LTtr+?m~F<51*hUrS~ZmnCjH zfl%fyXGJdladd5UpVy(d(g7{#Y2YO(-AqKmhjS)(aR)5}@>JDDNrSz_SY3tINHIRyG0c>!BlNk;cAq^u+^A;>dO{-LkS+?8< zbt^)QQ;B@jM-j41bdSoC*J|#P?2j)07;Wfng$y$z3XG1o1OI#C%!*z=&6-QS18yq_g0`lzQGjj>iS_^nrYnb*SNVNO{&lYZBFa~`Bds3MX^^SeuZ^Ta&lW_&BK-`vz zqUl}v?^{E>V}zDO^976DjAM}Y`~M->d5;4c*?cnF36cK~_SwJGI%4Mk<1(8J?E)CV z9{C`#yi(s2G!irjNBqp3lXQTQ#VF2HgtyuSzy=C!b!czWt*!I9J);nZIZ~e%qGt+o zhwZ1D!Q^bdl6@F$EI0lX_oY_gsOiWkbQhjw_Sd^*6M z@VS-5$y!kwjk2JN!5CVg3%6fN%*Qf=As2d1f7sqT76yzy0O)E#cvWjKraFM2SX=re6?%aKQ71_CuybJ*zr_ z&hmOSoa+1)Z$2tr0^EMiNOPcYw2li6b197mnpP6Xnz9pTo#U@wymhK%G~L32*L>`G zH%XAY5n3QQdaRSqhujttEl$$-axf#d3Q(A8Q`_#L*`?{x3<0DRC~HBftrl8FiJVUy zWSKfWi|IaZSo34+?Q!?pNE4cP|HD9?jXQ^s!U=Xx0OJBSO{eVhqt!@puH=F1(+HdM zyy;#kt)Ebvcu+mYfbTFZPx^?{^CBZ^yWn}UBpLLl%}lgRJ-puTXObI#nul!Y|IEz z#izIVrD^T_E#X;=8t`>;#?}_bl+#mNsbQSm z_SiUUV=CBkRTU+tu4J~MNDB&aSyz=hP8d-w?PhC|jjMn$IaWQHZbd?+O?eAVnM)e{ zLZtI2bFqMqO8eEtHenQXAl%P+52Nn`Sa7Z^T5EJqA5OqVQ1LqUx*CL-GO4;Q2*<%3*;yNqAfKR(8qvR88|KwAmY3}z zAW}P4$ESa`EzIz%+K@7$WxU=U7f@X}5pv=kYBuVQ^9u7Qo>exX>K8d!k?Ar?Dj*=g zS86&A=c8;j>nMnmlib9V04|+FR#6T)ijA04kf?T!8~J5IKli!Rat`x^xhoOG5SJBN zWS<|VAGaypm94#7kq9s?>4C$sD=7Obhw8|yFtAM3A1eFKF$RS=IJVKUm_~uc;ZuK$ ze^*3b(E+RS`;HHeU&9npAb0hk2}CfStDK02*pg7G^)!IbEJu~F7FxVXg|TEVNBv?) z?Ga+^YPmuqll)j3lhv5+l)@_iqg1MTQ9{ak)kM>2c~eAg)=mo(ztb+ucntrCU@-Z5 z!_b} zMmjPcWa$sr`dgDa&@sfaDsefiA=lpYn@Ky)j(=7oFiLan~vxDxDmBh9EBYzX$dN=8-Tpx;=WQ$ z$te{J-ICmtPK$tm#KRh780r<~hl06|hbIdZ5IVVgV zvMIpMzcd`JwN)seloFH1%BajJuT-5DjV)Y6G|Nbml@bYK0wW}he8^}nUz2#NfKx{l zBiN&64`wcpQ+cCQlUki78qFFY5g|WR5me17K8P^_CvuAur%H=nyr()>rAa>@j?u4_ zNxnoQkCkntX@XG_`fUh1U!zXBQ^B$L<>wx4-S=CsTcM%Vy@7D&K?#iGaJumOK?=Ze zgaQ>kN{&(`nl=Vj_zcY!VRvb(r1y8nx|QNqQ5y{%>h5A7>b7DfCJ!Jb%${Z`^qRUF zZCgW!&W(DD)VHuz{7uub>LtvmWTnWXVWprn!Y7=`vBgN|LPIw62L_^J&YrlVq7!Fy z*uWg06^D{QgHmapZ#RDMn|$JpE^x}-`0IAym^VYeH^I?eM{VkM6!#hlowoq@3*X7X zGw~R5@9uM6$ac)s8)5T}$jUgfF|HpN&kO3s0kRR6AIzWE0nSN+KBYBliWjBKgAs>t z0nox5=k(2pW3qt%{hJi#fkK^;Z$Q+MLIdm@HhY@DME@HXdy2pe<~^1szF%C^O+sa0 z&mi~f1nroGAswF*E2 zz=t@>e!gd{sDvUW1}UcQ4L>OA846422%Dagv9)T3?dE2dm1atI-E#Do)&Bm*m|87N zDk-c?bzGrL+E?)X^W`fTKYqFCZdb$LwJ7G8zIGF(ZA^beIxP;u{* zNDL2)7B5d9UIrwYm5xa=?0(7{3|Hp40T(Sc7j_+Ujlc>;g1$50Qm%g0K~LV#**QQ+1|g#^*f5J)X1JN9IC8;w zy4iwJZoCHAfuJOV2_4MyeXr;9w`b3Hr!Cr%(T5;X*z;sFay2tmrY5w>Xq}pPikB^X z8$fc21-yQhay0ltWhadnowaB$5o9VAVvGfgK`Q&Y#5XPix7p136wK#+{sn4_2F`3v zsWc+bH#>$Tg7o|RV^Gr3iJ|5q50!3AAda`?PDx6Xdz@;yYY+)yw~6FDMc!`=P7~@qrwuYxa1jGCmA#>NLKM=y?{57l=8Fd>qae_-EuxU2aYhV7Q^fUo`3Z@K`sW9P)FSMg~$xamxh$nqCV*G6FTx!4WWK;B1* zK$p>y)`i1@uL#E{%enM~tlgr^sc@Z<)HtV5BFP#jmK;&C z-iIaFQ*E#E>#A=vNH2?&M|K|5g*Sov z?O%&M-6Fu$A)_zc;{!dtA{t_o2l6#~8S?0O-@C91MAXB>ZspgDiFvJBT>*mu_fQlJ z+lnPOjCC4EW&hSC?4O%!TVNNOS62dmej2WxgC2dh?x5md^6?KNIQ|KcJ2gB)zek|DA0 zP?<|jm;9s~x*OqFCz7i-WcsW0#ZJZS(79t`%`i|OybsslR-AWud5_n=AF>-M<;BZ; zD&rP?`=|b^_}etcF7j4@z^mEYR7)-8_V}46jrFc=WrBTyw2!J)UCgbNWoPJ&w62m6 zMpx)eneEKni*FCe z^SuL~X_?PkEXUbhJUt(8Z;%G?xKxpZ#e~(nIA{py(48ZQ869-{uKR+i@kDi|ZOI#E zp@(-(r11#*(T8vg$A9k19ts`eC7B{MrvR*xRFc-f5r~0snnK4+D~SGU*zJ>~v!bZq z>+yAeZ0uuN#$TvLN;ia zvi@aY(Q?q&I^)${N|t5vZCQSEy#~Et1_H&6wZIUwB~0I;pW(-s9(dp~V8hVE*ee>f zkwAcpmEW^_6Cfvp6J^&S2jcLQh^J0osEaz*xvM{pmj=L{`Q)jmOb0y+gWxcM)Ecl8 zC=5U3gtnW7jV|1>pzw!q*~K2h&7C@ieP}k20~}xHh}9}Iq>0aL6NuyzP`XQ%iVxf7 z4lWrf%>?3hMXH%6ZRSo8lH{S&M0_DQXd7A6Fk{-X(5dmMz5eT1|XS!k7tl}us!M~3IqPUdV^#Im&u}VP{!#pl7omn zHl(m#Sh*%BIRrJ2IC7M~pZa@NC)eF_>6mBzIqc(qP#9d-%u@fwf8_dH-T!o0keZs5 z=>IJ4O?h-Bly{`6jv`vc^87oJQZeoKr2tYK7_4LzJHtDahpqDEJ0U6w@H%HLT?)3$pSjMda+^)dWh$=DUBI={ z>nK3I14Cy#lbOZ{e*vLr!lY;#^NqX7xK%W2k9WdXfLW(?gb1u)#4Aa=CcQhi z8p$#IPp!{hS{3I0v4(*XJ~n8u80OGfAd&kH;rv5Gt=(8`23@Fc*O0PQj>LRib}YNz z5GR2Z>67fsK6p|TCs@H#NS9zT&in`a0-egIRYsqUFSkobXMKQA3s;xIgi$1(p8DGZ z45k-EUE=*NMDz2w?vZaegh-=suHx36TcYNvIjil7x?OL`%4=mFcq93 zsz>R)KbLw_%_KGobiHG=EgMovo?c--NskREWKA$E@yKYZo zzPlj}ccDKQxb`RUQSBclJ*o>U{P+4+k+VlLMDc}E$Bb>R{q8D5eA>h;TT(fqQF(jR1}; z-G4@n5%6dhys^p&p&b<+trE247=P!T-Y1BruEiVecJXMsg5i^bT7a?A-z0iM`h>T* z2v0%G%e6$@+Q4n-NvZZ#`{Eel-6g97Vl%r9H9JW=;-X6L`(zgS+E%KfE-P&h)?gkT z0oT~irH{?e#Bwp1)#k{>eL`h!b{L)y4pCvl$N zR$so5Uy-`%q|cKIT8P{hjKwAU2K-r#=4 z9R$f?(MeWApb7lc9|(tp-`T)ER+|?S#bSBhU^%|cy3SvuaMsb^2d4*1&M?ve zG40=8o1e_va76v*!u9y-t#r+d)=u^GSuCt^Q>6)>N6Kc!a6w&m-`GuD79l?R8}5XHL1Gvt5;bM` zuDY@p9;ZcD5$n$0kk6}vf1z4=cNPSojS`PIDh&XKv86#O%UxAv703@W_{-(v<)`Q8 zQ&n`_qH3((Xa3*qHGjMAMsymhC`cYw1>2_K@f9M;81IOe8ip3Zr+xkO*$VulDJ{3o zaeg-}BEs%1ye$$-&Zg79jv%Y(PjppmujM7RqE;eb)e+#%SQK+c~L4YmT~}xW6rla_TY`rqb*z{&$8Jnr+X;s_E>d4iRDSYCl<`ZY8_+NN?z}D zBllca%#$Ai0hW32&2*ccWV{N>Bl7rdlwBc>z&x?gpF|2XxognBm)#&0GFdq!+eIl< z(l1nMDM&>f61L9l5xV_>HM>6T)_JIQd4d!J(5;)Wj9aiM=jML=Yxf$veH_Ry!%yBL ziWe{M{*8spWnXY)&HIGYeS+OIhvim+$=rYjq!zfd{^XF#wdivM@o`CPBf<$QUBi{<(UPfVLP&GOmIV?c zn|UVkQ28>^o_Jm1xD0YhUDIy$BmOWl|9Y zgJ7xbw%Kqv6Q6#2@iRipzlGC0XB+LB%ksjmY{zI9(b5QwjK5HF(!8Wj1EjvkU(W#! zPIaQ5-~OY%fTdnVV1CvY{m*IlKW&@$U-d=R)8T(=jM{(CyQ{L4lOxnR^Y^m;XbC|I zL7W8-hl{3LdBn=D=T&cBC2!IV=j<^sGV!0t$a(KTzvPA?;}qCi85!*%GY)$c({WTG zi>AxYq_N!l{OEQzGuMCjszWdU+%kIKI76`7h{WbSW^1CgQ&ndAlK3c?@q%_r4Y9X? zfjtd07{Z~%&Td4uqbU6d{3N&_5P7s2BAtclNmF477J`f!Ufs@VwM%kg0fX3af%%cW z_~YrAiSmJwTb@NqC9Q~vyjMfEu_hM?Ju9r~SR;@`*Ds_$)Bt)!9?^ECiRc(3KUaqq zcEQv_dqz`@b)F5Y{~O3bP3%rci5l_`>xBf55LHg=;omR1Qsm$Ig+NEttfr~Oqf!!m zJgj)bsPX&NV_e@u@{lMn9)U$H`z!GCu88Z(-W05vq7+5@OY^I0A+*)Cn+X18@fjMW zdWb$J6p1A8Pw{Udp@0!8km@k~iJh;7hf!1sfYWhB6t9nsh(}d2UI{ju_L$snBe&$iM$!{ixfD3dQ&O?DLP=6X^Pn`e=)9vQ zgWe8n#dCXmOEl}R5~Uw5;)_<{%_=?AHR756=H(sOS1#o2_n5Op+ly{cX0y2xzgdEb zMLx`S)E!Rl&a7!ZOS)O{SG@m=_m;wLv;ILRYPQ=Sk z0;*}sEIU4wT%twq%OszjYt0W{7$rZ>^1=Or!Th3F zSeMH)959bZnGpS@UkBNCG6y`+^GdBwi z>L{4FWB*`i6euQhDfkV)^w!O7yoZW}Ds&+DeYN1y-v)bxAWvziotlaG;?z@1NkEeb zPQ}Z9ZgM*>s%M1rBNX@%Wc|hx{|0Y&Ta$XcP5Am89)#52WC-H_f~9I0TM?$T1*DJ9 zybYhV6=3?z2Yx}OP9i{0a*`!huS;s-S z2B!Sabed9j&JL!=F82TJXi}uuCp{nt$XvFXA6D=D@tBL10uzw$!AJ}x4SC6DmtZcH za521T`={$%*P}vU7=CC|&=Sa&=K@kyhxR*ZKRP z+6_t=g%I>1dDf!6jZt$7T3maoCEOlO*&1_}Hc6L-vm|Qz`G*sGVw^|G!x8|Apt9G~qn}zcBcpW#cz#abXIC z`bC7OKtFBzeiJG#1`$%hDx!fyxn^x zGo%b=hDy?vjzOElAi@3)JXhXF3atO0p2yXIEy2`>aDyzztrrN%bZ?^R)JDeiPs=vJ+S3d&=Q6q;pnc7lRl zl3mm2zyk&1{RHoKAXH`2MB`XM?fA2TJweh{Ttu-LbR=rDdS&ND1xvOctD(hRAaO() zJ#T<>Ko)jkF+F#R-r71=%fc$RP`*6n;a;$7Ax{8~Y0OB=;kz{VAQ=&##sz^C5cj1N zX@C+qmD|5OVIaA|iYLZmlkPgF<19O!x!5Nci8#>b08^Ky8nzJ@czQ_#*XyBg) zp@134BsrT-?s~&i3?llfUy`;UJNWz6RB^ZkVcr6r#i#IEW&W#%oJi3nhjIJoEc5GR z<@^YUj3IAL!95|!`FtyPlp$>nMqo$5d9d9>xu-J4-VN!hdp>Qmpz{nY_Q@D_dJAhS zp0vKVqnb%})I|ikFPbQz;M&l>3kLHvAwmLbC|v7qVUA}8x{UNEmKe_qtdP7UtR7|= zxePul82PW%`7-^rfYAHESDpCcw8dXAeT|m0p9A8t`+Or77;LL+-XZxmvf}ZIFuPx4 z5tdD~#*E&*W$n|Irj(9sFePaA&d!K>9{Glx_yB6uG}>E_3&P-I_@sQo!7+5E%xbPV ze@2saBfx zs^LitAx(LyF3qS6b)&fIhcb1P(0=eBBjExg`;|_TiQK}dVPxT&8TEeVF$(2e4E)r6 zw&_AIQWqOKONd>Y`q{I5XYc5eDb2-c$}Xsn8(yc*p~xn$OL*^hU~$2)M;d&;n5eSM z(o$)p{sjq@Sy`7VTz+!_FpRLWShrqi?CgLd%9|?iOn6)w?iaJNTVksGZfoX?1?!&9 zT5^KUX~UFCbfx$`zmD7)BA1enyc69eH)M6GbY_efUy-xVx9yXN)=%TRN5aaYvBsmF zDFkt>+KPu$E#^Z}^z!|ycA?fJVEO{Dd9F`~{irHGnEQO}{oMKKmM z*E|EE6ElV)<>A7?ww&@CotCap4i07@1AvaLfSTS;=*z{XH(fnC4yE;L4yL(^_? z17h_e!mB3#{586&dveU8*%)Uov0O2ipx~9(2~x--voC0dh^hSWGoh;~%PM?!5(k@K zt$VPPoGN*b`HhrmOL6ucDUb8nzQD5M+)n*Z`Ru- z4vk*@gcr9%QPg0NQ%(Tsf@8^Bh^f1D20%)^S zxZxR}?)cA~lsqLA78k*sr>Vpq9ad|C1B9CRY{i?Z@$O-nyF?#v4{Y+uGG=3t+|GsK&sE_%679lyw{38PN z(xE_PS!Na258Z8Y6fwB`H_s1DHw>%pfuWu4bEGle_3={AlAwS6@n~A88TRERu`h-1 zzt2^2={yhs2L@mh%WaCG(j=pV~gzo2s5PZ@pN#Pyg*rJK*S)naQN6h{#aN4C&zW*8^D$v9+hv<5 z2nt}M&;rN+$Hc7B+DuFo8$}#*7HLF)^v4&vW0=4N>-U)wY2sQHjT6No?ocO^quC^e z?CZjUyT!jvpr=Nki%(U23Cr8Kky%yiTJ@c*BOt;~haPD<{CsQXtEDeH{%#CwR`q=* zNJ|&qnQaTm=RsNGWHom3wY>daHbWDEBk3hX|+ zt-pv^Ab;|Pkm(h!T_B@fh{z3WYJfspV9W$!?^oJU3Zc@>;L$urygm?$FebSr%E|~M z8Q8uiWYfzVXg;IPu#%ZWqdD^;CBbIM5G|HDVzq+tpH2X+;xnDWD zt=6U9+e83QO@qC--3E8E6kZkjNwCeu#Q{9BivG}NTL;=d9#K)4nZ6Y1VE|S;x31k~ za>bU>PfE>!F32f;JDb*w8yECxr3@l!g{Qv3F74lB{PrwJ#}B`7%T+pnwae*^jdP1( zF`_{fUL%5a1^GEt`sTf0T9nYQsPF`0NjuVmpSl2ZBNTJv-t6TPFjbUD`Jf*5bGM>U zck)tmslXQU+UO7W=H%iIHJKD62{Uz3Vj~(md;(Hdyd-A#fgvCZA{sw9d<@SK2oBwf z`h@zxk>oZC20{l%-6>Z!X7o#nNd9ORT30W1$q7-`nyg9UIZ$aHutcLROEUgSejtxr z3~>?fij3nl9GHCJQ7fUh+sAUyz}u?KzZ`fxf#v0pWh2moEu!L zjPGz@$DujjOXpiYw0^u_YG5Oj?hy~fJvbu~#pipijISD_JoUZ>2Fy_n>f|l2$Xjy zxyWQKoX)g({--=4LryGYs+Tq+kk5wbsUAtEPxZnWn>R2k%)DOB15-QDyy4uDtOI<; z5cgJRDdxDYPC|(Su+sRQr~E!{7RrODCjecj^UmE8trB8rmZR z!lQ!~;yPA*Cu`nAhe58dqtN)quI$@&oYsw=C6!(5o=1+!&R=B$enQ<)+#;G=AxnII z(#=3*nT#9MQ>hKo%i$?-T&JSN8F3XcX!c^oJ-bIV+;h7l=mwFO3^(ZV1sBZNlfv1_ z;e{=xl&z3&`f}zVGdIoeuOI*6d0k)&Ag=txB(6W%!T*pQ-2e9FA{MT8*3SP0xHqXy z{mWY5L+-8a$wX$emC7}KJ{hw%i#&o#Zk@Am$WA)NCX2jI**~`5gU^w@*?n`*@TmiQ=cK$YKpbv7NM=IXOWXrPR^87$BME zho)vznFS2o?jtF8?e;Y{!!8F?pQ2nf>0jj*iCJzVr)#cIt|}f8PUe=M25)f)CH2E9 zGZo#|t5Nyce>iXAlpVj4APgX$3jAWYEQn=6LK9)~Pe2HRTyOD~@$#=wq1GF+gbLQd zPL>$kUg4Z}o(dk#XX2=oe({uBuHLhhPyUD!dU#uJih;DgpPw-$NuA&^t6Fk2N7nN%W z7-_ObPgj%+f+G0R9R8IuFceF$HS-s=sDol5x<|^D;V-MPk88nM3l{2XDBa@Z$fCPFuO0z_ zj=3fmsh7WIOBa$H#t5Cg+huV{?x@2`Ij?yNz5HsKia7xX%uneS-2^+eMJ-ZnCOnnK zr66m_b6vy5?M7bESsc`yLbS3BDWf)M9Y8 zM$0Hmz#1C5dc{b}S8|^2B&W<5-|b)t6ZBT6rk^_1k>3!(ua7vh*&HzR@;)mM4W0_+ zD(3Z$PcbU@%T~MnF!_d8s%d`)squk7n6PI?s%)ZWu3>~x#(oFo@5yPwFT5(&{74Jh z58%bI!ymri$jyD|sT6vb1igqGq~kaI(mtlmLdSr39|5lXLJ#CI`&+g;KD?YLvwV_M zRpvwtk?bc4bK|(Q7YknWbE122dK069TM16w*l$}e_}+Vy45N>^n;*>6zHiS8^Br%I zQ4bnF@a<7~m&=^bYD`)o(`U~j9 z{mmPupF(mzGg}zD1ty$o56dBAUSXfc`zKFm|JJ%sZHvt8ML(tkca|~HGtnhd@CLCX zDsa#o#V3FYQl}622e-{H7Phq~wgB9HU|h8pFwc91icj*&wU=UVR@&)VIUC3?3?ub)n;8Re`;##fbbPe(<+Y| zVr4<9A*8e_&Pi}R6A z510ATd5eNRn2w;H7z`a;KTdOQQr`YI{k`^~%Xt0{4~0*m{A0kU_f$|GS$1j+VgKxR zMmi=#85Mf-OzGftF%0Tv>RHxCL)?MTT~(JF@23r)zyAALVoIz<-I_EhVK>Az(z|E> zs~=~8P0`#Ewjy%1+FgUa`;O+MMavR7>?}Z%o=|O>G9Q*nSE$EiYuNf0{i&;u|Kd|t zoi%Undl4J#0>D2}MOmoD=Ki@lhj4e2}R^@?gjN z)u8m*fnue0uKV;pan1(=f!DXL;5W^@UKxPlud-Jnao98NS_E*px%c3re0U$MwpE$%rl*CO;5V$S|tl*M^hT7je>5GfQDiT`|Nuf;emHy=-KOO4I>lD503SkyPdKGF57Y z?6yFqNOnfBn{r-$SVlC{++r*HZD(tRQlTQdP?q+H2wK1WKw#S(5HA{Me5kQfnkj1o zrD6pUe$tzqQoIB-Tc)J!63soD{L{FxM&;ArjqIHTL2vKIp$EYfC3rDT%k`heSCOB_ zS15a%J#DnVepUTy7Dw@MF%9W;NQQc|&UpV!;P5A&e%;xGgZ!}`PtY6BbV!naJ@-x? zE3>fex0uT>s_7$I|5H6>SS%97v^8iBRD@;1ChNlaigcMX=jzPZYz?_dFxwFj$S@}| zvC<2-XYc6Zpg$v#*?Q$HkN%lXu@~}E!_Z{-ekaBJF5K9fp)+gY$K?qL)IShg3p>$>=-F-*O7wO+O zX}w;m_~z%pJowWo=$}5u{|#AF-~2D-blPUt>M5aVUJ|4<*6W(G0WBcNHhBJPeJ!9! z232(8^5W8MZ8Oc(Ol!UrnUw$aAOd+O;rA>w0fa2|@12S;KhWG@X_z>=zUa+Hn((Uy zDProy1=sUr*YUnP|CP7<@wq+NL%yA$e>ssMaTq}49wO&RJ*q?PeDNfxRs^J4v(LTz z1&VE(sZxZ3{6GyHDxEczJo%G)dRYxq)xHn6er%kF0pq9jvgEQXxttxhpu1$?*EU%J zuGh6I*M65gAE1j+1-bgdL1)o6`38;0ugXOD!>$+QY6GEC5E~JE_@X)1*4$9$c0n5hJ!S)voU8vxRbbz zdn*)ECuD-=cT{~;Urbj+5z^w#@7EZg@!PVo$om~b%oJYJxKTO0kdva&BY^ZrAICZi zc*yN0u`y&R0eBUTR&H+D296RU?V}g3#;R*PDOMqZS939~kd2b~ z(4`n4@pAIqTQh~i-7xQiSB-8)k4aRX!jc(X$@*i24zCLt$x5Jp?II=@04w1 zMPEVTS5%Qk_I)|ZeFPLk5Q1Y*Cu?abwsf*F# z?oZEy&5D_P-ERA(v2iwwu#9kzmJ3cyJx1d4 zZhQl(-y+q<87x$Mhs+K+G{>(`G~NZJUeN=`^*JlvqTt7EBWXT*)vos7{GYqa_e9wI zt*y`qDo$atq0${hp+^_mpme0Ze1l={lFJpIw*$H#6q$1;QSH1YVfF}j;icN*-m(4j^@C$(q3~mN8~C+17dba)LxEV2D0Ikr zov*lWB;ULr>}pXa<`oT!*f$pz7XChRu<+${cYS~vKxnA466F(?6M;BI&cEs(iKp?9 z?RyytX~q-r8}T&bnTDQpHB4EUDcU=1W64W-bi-lL!LcH)*Jc^^qRyADMA!22Ga%}F zO!TuPFF2nrIJe9XKbY{($b4^6c1_774t$FJqcJr8`1&TT#^`d=*7U$K-;kv|e9?t_ zVDYOK-4;PwYBci_y|PY#`xxg73dCrsg@m$D2x#-fWENNV^YU{^L0mW>Yk>Sjy;72g z`v+Tgq6+xF*S0G$Y`jc^B{r8VZfNNk2f=VxUKs0Eq{U9}G}cfpLN)sT(e_SZmUi2g zZibOFY}>XotPI<>ZDmA;ZQHhO+qP|^Vx7IKcCB?=|GAx)^BH}7eYDe9sy zghDi^oEX1zOx&1!f_BWU$8rOOpG?_<1pzcd2dm2Y58xwjE&loiwn9B}Fhki);nuJu zRuxKYjP3JH)%y`BM%L*8&i7`=Lq9Sgb>LsqT3@c<akC{sJIKe2~O0XNFItM+FaVW~fxY9cv??$I;}+PEp9NYDr+kz{k@aUb*rDI;$gw95_8OFQ>auW*GqxIN;t z4Xq&3JIvyNOzdr~&qOZ+;?nm`6cr(uh*P$#vJ05b=}{t+{joKbrZ8=pc|}yI;T`-c z_~z`@Rc|=3OVb{2X5k&rpDkY~U?Kh?PoO|bI5g&TvF5z6B_Qae9EGp}x*}$saq2r9 z0Hl24S6f^RArSboA0SqsXadtn`@E7QV5{h62;tv!XfNR+Kj%j<(GgaJM4k{!a)oB} z-Qek@-g#FvyQE$ccO015q`i>;ur)8P#!>r!uL{!qbGxwrN4)sIQV|uTWRT>Ld8(K$ zx@ANEC{YT_$w{oy`;y<1FepbzQOeR@~8T1o5Y5hI~l!v z?I~l;nD3B~^!|s7=8`QP2gBXlz^jupoB*Iv9f!^zyE9@YPcAWIOrN$Z)ldIYj<+cS zZGbvS%n%6`IPnEyf^O$Af_wc}a{z7D%%js*@Kb;@2J)oJVY*DmvGMXE_IE+{22`uJ zS4Wmk3%8EZFbuqPw~=Cr8uY23Ub#TB#)h-hG`cy>sH7rrQd24Sy`pD2^FgQRsHKXu z#=R4!$9AJDGR6L{LI7%1{aEy^JA}kruT|;O?YnJt^B!+5={zzY7G$-yx%(~UDL!63+g3ZQ`yfHlY-)|>9>a^rF=z)zw#CTva zhGL0cI{qXig|btw+p!T(5kKncRTEGisYB*bYLjs$)_Dd`r1K7V zP(v#?Nt5piUkk>fs*X@f&s(>w!aiaEGo}0cb6(PI4m7*FHkrfv3zrn(N9YS(_2PKA zTQfFWBGQQv=O>T?22+NrdL1+d71te3-WB5cUY1UPjG~R{I}|630f^cj?BVcXL|bZ~ zR4ZTNt2VKrgwxkhVX#DhwAmG7r75ehCdpJc_Dfzc4uR1Qra@OorSI8mEnD;)Yk(UJ z)|~fdJrr>O@cDl@9LU>ikwd=EJ^S~$|A%5T{_WgLnmPP8@V7y6>c3($+AezKQNhX- zLvwHQ>S3^g5y5(UN^8We2&1*Rw;j0>8!oIjGW6TsuD7mt2g*n>BOty5a1p-1WRBA) zZUpFrI?mhO?l#{#UpCu6yx%V%yHS6$BGOYQn-Rz8FW>Z5Vl~-px$SfU@}w1*y-rwP zFIZ{XM?B<(Dz`42);%oamYeSm{u@cAmW3Tu0 zI=57{yjmsGeo!&nJ}c!sb&ymKy&TE7de<8Ke3(cOcih7CUIu5BX9KTY>TNe!=ELci ztascio;wci5cCJK26))es-f*Wzx@lJtJQ;TW~Lm+?1?25Al#ILU-0+lt#mtp%A|r3 zGw5R&$q7Mj0Q!O?N?qXekK3ZUX3EIvRlk5uD{UW%4p z3F;d>`ulf|_U*LV7{Chn&~y-y`DPx3#mJE4I#t9wlpD?TN%aHV6o(4A>krEBEIqGz zevDVn(_vMK($DL-3tue=|M}HO)f((NuyTV2OR_;xA3~AwOg(J^dQ=j3@FQ z@@q0j^BG56k|$GB=2rui#?@O^s?dGn^sjtA$i1^&1@~m+S;K+tMG)@lQNvLtc1X4G zMV+ePYYR%h^b~rP^oQ%6V3t_Y5Urz)bTiNGh$DAYRdvtFW>~6=>Dv6;wQ;B|mi-%l z7E0m6hF1Ih2l1LFA|TfOy8srx3qb21?#(2PoQ*7HE%n^~Ck4xjzQisE*w+YL=en{jytb0YimlFOr)*2WOLp%sUiXx4Zpc=j>nbe* zqNggpl>6jMhR5fYN9WheD@-@^B_%qafPnk}zC7RrWOFBV;3BY5jtgF-J6fH=ib>T- zZ2xwF0Dw?yc2jwcOpczIU5egA-j_=QTw%1@d;P4P{nC2|DRYMG{PW4V33~N)?{@&( zZ|O0oRp$);jib-hW9xIJ)=J&s{d=FBCXlImtO5JagmC6badZ_sTr~92z`5D??>y(A zRji@9(_CwC^@-7HHbXv^y<3R+4wAZ|hA`O7W zYl<5Ulhcp!a@St}(U($xv%sXHaSH#j#;e%~ z2W~A#f0Qi-s3Z(&jcbM@z(}k@(M!~c;*)!u5|Vbn61Bjf)6lkZf`>8rQ@3HY%`1S* zB(*;VIt&ntu?MJf_>l5{-O2*$(9b(yq<*jk={QA^qX;{k&pbUWc z@=?9eQq&|XC5PV0o;R_#t)IT0_I{kKT=rdlHD0{Hw4^no42%*6aT_7p z-}RGJ!@KEYywZq>Zw|@}F)0Gki@T;ibHR}n&jO(9{Y`>ti}wHHw&x0KWwQHzh(v#n zXbk`1!~Q?C<$njgHz?UDAc-P>(S&H$@_-VBB2>^cVEP?|4wU+<6XzBZ=cF=6e&pFX zsO^m$&~94UK9hd{K8Bpt9amGlfAGfb-Cux(icvdt8(um;U3k2CU%6a$c)h$%bpeg< z;ST-K2j3-y)r;2KuTe!xq-sxWn02ML8lY#ta*b>qgddY!L=>Y>SG|qTTa<_-vqC72 z-70qMSC9e6#>T^-mjdk2_pz+mXzZLOl*yDAd2h2C&B-a}wYC2KYZ@9E>w8eoRp}&1 z9`n?}f)Pz#J~eMbyKtpVyhKxyc)-~wP}mGpo(nu=aX=cDsi>^+7qVZ_D1b2=q`V>X zAzW#7H3!LFJbXLYH$Ef}-RRlOXL!=wuIDG0P&A(9P}cyY9Pt)ELSMjBPe!+0;7sY> zsMO>akC>=quaJ5WQ|T)?G5sX{HZzCxo&ku7q^FvLKMBtiT<`qaTUOBO`-AMNmDeWG#pk9`^Qap`bmC6!V zY>y^&<$ltc#DRH^dzM~{tFFnBW6WgA@OM^PwMQwS%Mf;Y02iZ^X~;gHSG(Xn(HH1c z4EWzBjxn-Y^&TwZt!)mjQPQriZ4?=(h`;(42o|NN4O<5fV~ zCN16Q7k$P2&V_T3-mBL{Y|a*prP|y^1d3^e5T8|E6D&(WTWFA8ajt)dI$}n!JO~vR zZB~W+e!}r_TBNa8J8#(BYItb}wV=})TnJ^|HbR)2ihmCAm&v2$()+|J)@qKlmV^JL zSfI@@jF%VR*X#^CpHC~B*^`Dk3L%d!^&2*I8lyJ;3q)XDiNTEF`O>hi?`9AJh%1iW z=MO>6ZO)PLObXPPqL>}_pHwJ5>qiVJfX0srb4IbtWGIFfD^y-Btt*Oq9_X3vJ{ez8!dfe?vkLZ+I# zx2hOY33fxzKJUM4581$i8vk;lXnX_Kb^re>c^m!zRvs#ptQ5W-Dc;tIwIdhu^sE*4 z6Y3O!plS*QsD8*fii8C7hkgM6Cr?*Cp!5-pqCfay2ynb0nE=+oR(kURN=(Y5 zShc$h{zXz__r~acAv5}*2!RS>VFEpz905HR{0&Q*QQ`#qfSunbdBV-%`sPi z**P=!?892n7Y)sqQfQ~tSH`K`2P(Lm9SI;<@+AM*94W=GI%|#;4@3gBih6V0{iB=N zDl26|U$Fy&!_?dp&7&`MWGJQR%+()=_C3wfi_oKRv6N#%XfGjri^!1IX+F$|jk4RxEU*kp={fRb)phl zIzt`1rN0f)za(G7WCh?EytC5u_AgMhG^Ae@*+n3YA6`RGg9fX57;r|H0u1z&>1HF z3GeW3urE$~EhD>|_1cXFwT|861K~pM2BK0O3e1ly2z-?r9PPI$B_VzlgL7B#G(x*A zVL=R5BW=&?*VQu}ZQP}s9Cr(nRnzu7oyGAh_l5cdLY#JHc)FR5ONgFbi2ar9-|v~Z zA3W;=-+grMwnGs(IRrl0746d{k-X7l)XS`a7;w69zCvl ziM5SZu7P`<=TqKmxqtQ0{~GDGw^{iSw=+i@dtC9<{mU$WIiA(kZ7Zw>|p!VtX+Wrvyn0K^nejV4xWXCr>}C6a?l}1Xt972m;Y1ml)k~UxoJ3CLuy*F z_LRwz#6D6{WWhQAAjH7vc{a~zuRbN3(K++rE;re!jHT%kdA5b=@ols&Lw}VSWYP=Z zIYuEySB@o|PSB}if7U;}W*=XH$>CPcZmrMPmmR6mJVC!DZIP>u_}OTAj(dc~GD4r+ z{Ac`p4Ly({S5I;1+srmT2F02XC#=VkiqqEQd~5s()8~9ST3YxQNanaX%mdI-v6FuB zVz3LXp*2xlg#J1e7;};O2K30H znVI*ci{S|+e*19vGkFN4mRL3!nb?PvS%5Vz+#=6_7eQjsL*r2d?_5E<+^ z!_e~LbyE?G# zyL9}%OGoD){zU&*=_nhSni>2LaPPkj`7|5WYSey&yuz}w8qnp!vY!IsCRVQ!=W2e)#}Z z`xQWP!pp+XPlvz@PW|HDcTdnT^2%$b1B}3{GtekhGJ@`g2%zf)R!XfUg4LK{Dk1QL zYJHCez9mn3BdC%kNeOh=t%O#pbitkDppuOF_eta5Q#`{*ZX8xir;ol$`qPiiZM2wJ zZ7(8P^!Gz`L(dws3>CNbq&MSz$1}DF9sXLVx65BW6tE$dTpZLvb|L1Pb@>!nl&^Ne zJ%0lE0StzKw!*fAfPth}sFl|X za(v5-X(Fon*a6dvRp7&Ui?CKCejoyv3QM?txZZ;Q%4ww5i(tul|;&B zk=3=K8)q&~V>El6Nh|Q^D78NXGYJE^&P>l0!RAW&7K7xA-t#@~ge%e@{3MjhuSTuY zz{DEro&2(OConC6{ViVC<1ZYNXC#sE9n1@*Ks)tXocn2Ok`r)oPC1c!hg+g$k1fx* z&PIs9ZptSY!HDbYtAHW39?b2sXc0n4NwUycRSpxW}7%>oJ7pWB>9n z8GvjnMz9;=R8?224($xV>=TmD)h9j+aUhub{+uo zn$`G+>qf!R-pRnx$^QR%ASWEwgpj|i-gCs1>}=1NFVRTiw}~T!1vFNh^R3bYLxT+i zn@_q)$`2ySmJ`G4rO7yK_1T%y{}7>7b`#KJCue$`WX)(`{DSRfrjfC?g^c^lG~&Ad zRAb}w_V~1U`OEWhZt6#6&+PQyWWVM}&{%+1nP&u+)1`7mz-?(YiQsMO9;baMK_Zs+ zsW6>jm2CkL4ua{lt&nf!9=Wz|^ER{@Gq%d|FP#_>{CAceEQ`Idy`;n~EVjcU2@-7@ z_lUwJdn&*y5AJx#LqNi;y8`|FQF+DyTESKGf*;2_f3rwdBwCEIY^i{{G@rQE7Sr-6 zsV{tX_6|EE^s7^P_Yc9!wGhBf_X<1$hB2hQ{18PtX_~wN`iN6pKQo+A4w{KsqDCU+ zMd7p z1N_*~VMj-3O;7i7RdP_p)r2NI%j8hKLz2$+#WgY~&Lq}d1U%L-lAhB4>|ExM&aCM8 zMmEkpGI}Pj>5PoiPI;LC{}maMzBT9JoF>}X!UR|*{E9QRAX;8aR(yH)jtgFiApMK! zO0$J3;rBcD_vIW5;)y64Nt4CZ?V&SJ{Q$Z3B2h4y%WrA5H}B<2VEVj8F|+T!fL~7G&9F=9=UcE-2^M zpwaAu^N-DblvscY!%F7(FVZT3&MJ|)-&w6t4-(`4rHvu;hTP5^G2(`MY3z?IgS9u3 z`baAf)1+}LhOd(7f;%NwH}a;LzwU^%KZtue-9Am3d0PLnwDOkMd>MF2tPJGhND&Bg zx%&~F(hV1P>C1k=xIMT?mip)>T1tHUbXn-?Stznyps_5Tx-NOe&Wig8K#fXP&2ga? z8WzfKu$i46 zs8;B!r|FVow9&a92fQm}O8^NhF9fd}&ZzyO5L8u&(5L=tbIs+7=c)bfb?<2D>PKRA zIsOlE5!nHfd;0sUYo5x57PSTKco+Xm#(Qdv!W~*Bu@Oaaen>rx&`|ASz*y_Tboy%V zZsp@*?HP(3gJ#8dU73Eb^Ed`nU_=;edGu;!HjVS>DGaZSS{ofTEgluSDm70H{ObE% z>pJh=*8o$ODuE)kV-C}Y+&ZzFVqRV~5;7?zkpe>@(veaOK6n+*`oO@<) zMdHWqYE`N4t1`3m`$7L95SJNm+qr*=Jtk<8Czew7?SwFm$cO8hO`(hCCAy6P1~NRx zd1#aXf&9%-ERW5EjAc%?&1wv^HESC*%3#Q_LGc!;4r(Tq&r5I%bCZ;^ybTlxXLs=f z>1rlzGCYPwZQS!30jB}8x0*TJ&aB@i!5Zylj?$N7y#O`S3GVJ!H0Wg<$&Rm1NQ45o z7XFsn^^t17pbrdzs6}`=`HBR8fGO0DoXqoo5CBmcuDOA}_xc#Wg`j`>YpHBzX{q-= z+b0!D8!G?bhW@t(jz9DtNzRCHzb%qwPL`Cu^1X_nxo5Kh$xxN zPb9C0f-3jOLLT=>o6cvn7sZY`ASzb#=}ewBho{L551%Ktr^)x*^PsFBlDXpu0;+;S zq7bYzY@VOGT@VSR&B|`OL$EIXJfXWtOG<_XO*qKb>*eWT&I}ffbAuOoU|x ztU`C~J=y_K--O~LM>@+^L;9_d&tgocTn)BatNsuh_em^>L060WuqtON0UVOu{Wb~= z6i(GH%QrPL=sZ{61iMP4UU4JuoM%@Mckl1cs5qbbv4L1q7k(fcx`1-X9`mFrd)XfL zW`6S5IRRVTRM@R$gM8Uy2BKiPn6><+Z5jlQfUDXns$Zy>Ky(rWt=yT8G!!yDL_=5_G%x_JT|9FI9>9qQ2iz|k{=yV zL>_nKHt`;m$}u@11P}zQmNHkQ0;;{T_XNYEBMFUYqTF{yBvh>eO^U#?jVSkPoTxD*fXw`MW%(2zI94L=l}T%GXH0v*O47dw{)|pLo#y!x z-}RQmpAI(S^RP|+Rbb9P6JI&zQm^=x1_3qc_wO1?U~*IJk&Y%-J8rS8^;cK4ev<}B z>@rI-kN}B$0WJP}m>EGf8neW|KiQGToeHx46dEO6m9z2GAlzaSZS>u{9DgEoxIiFQu|<3OHDNYiLr(JT+QZr4KR}X(z-VGb z5fgU>b}>ZkmF`?WxO4th0MuQWT0O^CJE-hc=9x z#~ilg4zC^R`ry8X*@1+34uWEMw$j`V6T2e`zr`+m!P$R?W_`wNbi+l}2^#zP9DA>G zpwP%oe9c$m%eYFg71xD zng91bUDC)z&%o{f&L^?Zz*2(uma$Iruh5032CJwLL(1NeFPZhTGJ~`ljm5_*uBott z`l%(x%DghIT=DP-@qRc}UGkV4_3PuD%qMc`bX?CYXPf9(EL_TXI>*&G7n8~D+}@Qp zD7_yY@-yh{z;CrO8n}$+Lai!AiMz%23v-8u10%%4_Lg0Br3u=q_el}rnG@q=@M4_WEl-JUB5C(5KVefMeg%@*HsG zv{ImCX4Z&g^#KRUgr(fn>B_zkLBdFZgWE4xZDGkxZ*zBkVXU;re20<|0ZxN`5vCF3 ztoCAkx-9aQ5>3uDhUG>XVX`$s5o>qSl(dw@Ou74IagR877_iQ{wozbbkX8aqDF(ZBGA=64VyxwI?dEPN^slo z!(I|nU?{ajd!rDZqmUOrufM7m27#Lsnne|0W#$~h){pp+RIY*pY3PXT4_~9=A2?W9 z6#KPcJWkfkDQKqJ5-pdjB;T}H4C`KT02R924QlXg4$h%C(#SZYv73Zwy8!bJKm;XS zDW)I&poXISk59oRG+>~q(Z0+m%{vGod>ea`O6+c|4S)JfwNkker%aUvO|!ySsRVWP zRGk3a&};AlOEQ;qy6S2@&D{sKHB{UX)SqG+ZOe@-kNKwpH=E7R^i69`=kWMs7^2>E zhjwUM|D0O;n4}*R6A0~L6411F(AkZ6A1>Z9g~GJ}qCt4DP2{0oQv)Mu;h3IWd(r7Y zF=_vrq(0i~$n5Hj^5u4HTKYL76q0L;v&5+g=!_6DX9tq$Jq=Mbf8j$Aa>?cpZ)HO%y;Zl$)twK;7^$tG=*uFq$mW9|ms z8T%8GqkUGWC}fFE=-Z)}`)`Z0xgpv~X6}2QNP#wu`W`FN#ro$Yg0!#wm@3PYXMsqR zh7?z%QUX;X7OEF?={A#Zq|d(0n!WV`@soZ`HfF{U-ehXz=&>GyH~ijrGC@5*h=?YASh~1OABaR^W?DglC<- zFx(Vfk^#EH8D4P!*dzUQJ?&GN{Qh$4(HmI+>Gh6FdP(Gg=53Z*C_C6H9#e=B%GG8a z`g@KGnSt(sN4`rSXDiMw^!!38I57Jz$)ghqt*J%^-n?DaqAuN8!jeD zu+9vnw_wzBM(P8^?5@oIfWh)E-FmLKr}#Or_RnAaqVk))L-Me@jh19lQ~1AfZn#5a zZrsRk|07^VaasRw?YBPo3IC5o8LHUp+1eTz3h6oOiI}WIuCVdUB%fQ8KhRuZN-WQfO^g|+DMPsD_DzQ>t0 zU|lh1ln>k(mqjc-L5)c$QT<~NUR7cd;wLy(fH!haP{Sl$_zJcKjp_yK)?*tM3Qes~ zzEN}bxoIkDV|a9FRq=*#D4M@gZbj^8rB1rvr~izyUZ@XcZKBE(aak$msinxh_U1S3!rD{6;IM2Y3xIsb213VmC! z-knr>GIUEtJ2F-V@)}Q7fDVLl$e`T`q_FX>M{s)T3OLZv1m&d&k?^#gjS5`_Q+Z2B ztiUT5BWg&H&`7G#o~7P0Vsaq}C}D*imf#YQN)w#MOs;NP=!L0KajQ6!oPse^J>LLc z>f~koC8QKtvWryV^&ldl37672BF(tLz$wKt6Exb&Z-l;DujL32#dBf*SqoLJI1CR} z>1YuB0xe;POA>gjdY!sCrKn{A=d4f& zp*MDgep%Z;dX3TP-H&>_xbipj?&SKXd^O8bvm%@%c|U*p{>^1z4$SNx$A7_t$5uc{ zTA-I#4$O{6T{zB4%kImg^qOWU?(HU!8{Yd&Y#;d6|i_iU?{ir(nnM3r;om*+c zFkV)?!f`SDWJ5pI&1wSqC?(r1*A<-pJfjaJz<9jh9KKFA<`m0g4LKq()y&5%sbV1T zxKMWa@PZLsJ~e|SOiq+M)6wKG#tue>vnQh0W5$U(&jYW>!GsE%98Cv^ zPc7wnILC&J?BjP#;Q~O;Lp;|%^UmVTTS)u@%+=z|r~lod-+mk6HH$3q1mhG+M9#B&nu$MyaK{;Q^WTO-rRZ z=ac)gIlNWGB_OUDt;RS`{>Li@_AG)*^?0Ae{V0SBpf@BOXysjw zl!>DgQMMb;-4(OhZIVw&FvVLC=XsRby0#gT+u2K(1HQQrVrR(Gh@6=Vmm^!eJ}73$ z(8;>7<*nl91Z-Tx<^7Ut#mvE8XqkXJreg1cUqRXstDWy}PwfGn3_tTvpald%>hTw# ze#$4+S1ZcS`fVQHc-+3=+Cn?|%tw)UArU~mW5wUu)TC$e|NMg0^G4lx$98{#e0_FX zeg}@c31c5{VDF>b!TwT1&CPJqtP!l5ay;f*_#4U(!Km-*?R)mPK0vz?*H8o?)Sm#4381L5dBtNTRxxVvz}r)%S$UY0(Ja&HS4 z8^+d55=C*ky|&uMZ(76j7qPjxILmL_Jc#ZZJGy66A=X1v{0wp*C+DvzOp#)Ovr%WT zkWW~-v{{kuBG7m50Rd;?1l2RtOHk5`=AilcYEaXnfMwqe(Z@}{{)Zdgw|e_5A$;4) zjt^8vsn%PusYO$@6DY5l*ajatEScuUmU-~n6a-oq;8)`+_mNu|c#Gnc(7*zzIs!L@ zL67?=I!$G9dWyCXpFl)i{_38t-j1!??Q09~H{=bpQ_LS%5eB;2cT<=N%0oAkX4u_B zk3m3Z-Uy)|-!M)BsIWB$F`;DEHUC}sTNGZKJP;91l4%=0Ig*}wMbqiV6n|bi9bBN| z@O727Kqvt>IYbtbac`~-n4pg2)Fw<+;{Dh_8;oegh9mo8k7r-8m zqF)Oegp`2klQgo70FDhMO0eHQ?wVUoVI3g1z0QMBsl+hOqKi9z^wgGS@c5PoO+{67 z`2uXhyZYxl-0M|n8qhGrMSY@pDl0;x-8(e~Q~ZYnQmsae9{wsTp=9VPo6t^~2D3ivmPS6wA3Ph%z6}LSHR3B!u$C zfcp4D_iz6jko{HoTNg0(89P7 zrUK-c;jkq4z#sEpuNKiAKL>LJ0P}ydP--yrymx-+hr~gJwXnOC=~&&VpR(k8w@gD9 zLaYKzA!hTTJYwi6v|RjglOZ!e655(8%@Nb4P>j^p0I}~1!e92UVABP$BtEE%;OTvN!yoZtQ29GgLB{3aLh0aw*$cLXER&$) zTf&rF!h}HkKA60!Qt8N!MUd1c43dBc8MG{xY0*u}9u>F)>tmVHlG7+fF~BEAA$v=yj2>8f&vB*+qFR;#J@tC! z6DK?zEJ%q**{Xq;_1wC3|AE*cu-CUDO0xVj_T_?jR)nQYspZ!H$LgAV#c(!(@|FrA z^0H|Twv?NcPhc4+%5B>Y#C=7H3i~{4Uuh5+OUl~|jq2LkKPBMJn#qL^&%;uN5L-hv z#ct``>^Tu4lVN-9n%ZspgQW;Xq7^3YI0-BK)m3?AHi2bqd2co7X_%HL%2v$BMm3Oj z9y=?u*vkxmKgt^4t{S(~v|HjD2Xn(LoBZq;)`_tGzUmLiT#7{-+1oXE*s&2v=g=*~ z?=thTM3#i5d6h*rMwu&Ebd$Zsp zpF`_}Qs)|k`?Od-U9*Q2YmFa1ZyUuMN46KZAU?-iz3@~Ht1ORsMVh~SOpl*hp1yED zt-E=*v+@mYu5oWM%URI#HPy7gjJ3L=46nnzSwXBlEjQ3jV`?6QUt!d>r!Xt_~hDHL1H9aIr16*|D>Bc@}H7l5xUBrF_tOm*d$`Mup|++2G*G z&|QDviaGx|MIjb0`!v^YEN*fNQeU=6*VYpa9t&X~`3r%?j!{Hx*hNORf8ks+{X)68hmp^i5vRNjUgdjrfg$Mlz>aKD3;)oM2u3I3 z$n25Hn8{}>j;gV4_`ncT{RMS|?W55ny7MBY$2z{TgDlC23(BrmF4I%7K~sO= zijkHqQcWCV>PiE)-r;!&iN5)ST+T`&f>JUVU)|}g$z|}%7UDg449wCwiha8h>abj` z9rB2*cF@bdIRJOY(I(PsmGsNVhA-sQrxSM^WNA==_wU=(kPN^p8{*axCrSK^hve;( zdP>BdDSGWpB%eeP#_SDnkgS?(MkE@EgV1+==+uC8TYOOP=x%Wrk0hP;sp6bp+q=Kk zWw5NCFMEwWiQ6gbGSa1Cs0!CQ?a6f=eU($FD&lp}Zdsq!1d#ikdr>gS#;2*ppRna! zW-(wYICZDC5dw3TtjH#I4w~%BIY6r2;d`T^utdCbP@ks}GqyS+Y;EJl!JmcCM_L~> z7p8;uAp+SAoU`D-KCQ&_OD9V8HGS|t#czY^4lP{$*>kpFcx;G1p7W;qj*T_!w8mO` z>b#RI)^YQOS$u2cWj0CgQ2JxVPtcO9MlgLG&PPsQiAComqCij)&MPt!&)%8seh_VD z{aqPS3`p?S;Gv>8fPe2bvYH>$u1B0wTMJwqyr*o`1C;2KN-@Wf$+~MbJdYxTWR6m+vv`` z`!1^llK^|def9S_CI{S@fPDG+kQ{6oM8WSAhD+};s+lle;=W@Ecol+;kg5&&fRiqG%8J4|f87Cw9J9u*B)#zYZ#YU`lY-$iR^Pko4jiG7NI>yMH`-LI}qxVs{` z9%id45)#xloY|l*!Koe7Ck)_cCx{bX-dMvU`idEcTj<}`H!W>F#4`W6Msx#>hbDxy znvgL+>q4{PCj2W&Hd-&@H#{Cp&>>$Wx=HX&yK|P3(x$BT0Rj@E zW)5ZD5P%Zo4CSqi5stB6h?dF2Z6SB?76sSNHt;N&+y?PyHGB@kT|buOE#con6-hZK zN>(ALC5oa-?}5?U*959jp515w6&?rO2F=YSc>-sI1uGNNJX zxO0Si<;v`rLtZAxT`^hY_;~SAx0COqY)4C`p#$icH?4pm>4?hP3E4KBa-;hIHmxpy z;EReiN?g{|KAMp_x25;k+FFM`L7Yyy-mQ3@_TYY!q5A9O^9~A%W;a8M-7g&1gVE6e zZMl*BGA4s_Y}b+#xIwP=+|UrZDSEqx*KL#r$#&Qr+Pw5P!Hf1kG|Kc3f#c!au;ZTw zYC*j7`m?$nu@a`^)war@>NJm02D@a2sw7%vM7yrE*%W=0YM8KbOHF~|Y$nN1jD%K= z%G2%ZRPUO9QuId3#4A+lOM9C7;DK;Gc^byfs4Of_xpVK%s^E&cVG0_wYZA*4N2`q_ zs1IC)(c*YH=A2iwx2{7WmA132~{n3 zgQX|xu}H!5CWK_A=E5BQ-?j{1bIU)G!i9#@P3^{Qcdtj@hHa<0v4`i-M>!yotnw?u#=c8Ptm z5AVvlkiCg^T_(caVcOlFK)&jGv5#_PJ~&G(_*4~b;N3-8a|Jwv3;}M~@xX9uoApVu zKq@G8YKzO|(6|r`yVVgoF|8*9#`=*0kC9{uO=B)y)s^I(L7(i&713n4%I*%%h?rmW zMixZUoNfRDkFR11$$L|T`(%w_l0I%4SRERu0GFoIUANMxtZvddfi!jGcfwxTxF_M% zRU|I5T`tH@r^Q%z1?n0ueC@+1jPj2kH=%W!G79Kg?Y|qCIBr2q0y;;D-A;C$T8 z(>MipnrXey&pD}|AjknT61>9GMAD~6lY!!1f1c9B-+Ip+Z%FaXWoL9qU1$Y%oF+bX zWzlSqB9i0Whhh{Hcvr1&e|NZFS32QS#=KhDx8;TXF>HJ)_D2_#8X3o9e*<6iUa+6T zBe@qWtsXfk36QGk^YS9`b9`$VP5A9-rtoWzaS!}Wx{s%PT{x1oEPxEw4zd6Ric9n zUd`!O)ukNo&h%f(w&AOfL!ZbSu^A3d%S??SzMu>m9Bng+TCv!P^cve2R~J)&f` zI%_sa&M2*7+0tLGM956p&MFWaiIn|zitaDI9(GD;byhu@JhGz40LxG~cB#Gt~c3;t-^AF34(23u@ zKg?M?5hX5k&BsP?8}7jCD=Y9-DIzNu>LTh{1scF7^)A#bhUC6#l&BC*k9g#)Smaod z(snSV0v$Bod5jhO-Z6jGCaqU2NE7N$EIN0H#L3v8+0e5!T*KBa{;ri}6+Y>#Y(Nk! zT|2|{NnRX>X-Xt7uWOWQz{fzETX9?xc;}Gmy|+Lp?bXeQ0@WwWSAx zDc%1L`twju+pAc0s23Wy{v*DVwPkLUG&K5bMSAUqhPXPPre%a7HF1D0%o^W@-m&*ZbdiIJ#zOXsP-9X2@g+)>T!_}rVWBGUu@r$Kl5xU{FxZ@{_3Gaq zBnpkNu@NOh7SC8=e{_`RX=>IcYkXw0ntni+_cWj3pmX$KIwS+oZ1JmDnppH=_=c(#8WoKCs(R~ zUFRh)h2@di+h%p~a`d8YnW`j~oW&;BRt1-jO%#Qxuh8oFiv38Egm8wBE~h3%hOCedDid$bUA#LD`jV^8-K%>aLJ_v+#4jzBdx=>*_+uD4{?4X=Uo|k=c)PoA ze_s_udw-Y&;$~L=-UdRrifK+$A#vE_4vf;Y=he-qlDYM5njTj4U>6+iHlA+c+us+# z3cB;=Ufce5bv05KnzXl=K|5aOA5exV1Fcrhv60Kpb(U&2yV>3@(*#vX_#{0{b9Tin@ElO#v5CIEs`J4Ah5X;2t-Iln<@hLbiQ%4mUa@@8#j{(L}Q44a3k@ z?9IK}`1pv^mxJT%-v2;-Fk=FaMtGx5hg9fa;s9-vm8`)@TzLbWBsK-bwD|VJifpi} z#x_TE9;UKmh3_0*s6OeWAUi|iK>q?y#c1gFJf_{6{+tw+)@A7E^c?AAEzIIFbHyjM zP~z95CFGhbnfrO=Y!Okfi<#B8GgpwfTx?k$hi=nox6lM}1yd&=l|7HiyjX0>92+^FZ4_;(sG@tXf&!prj+y+6yLUKUGrt5uaG7rEmYlk?lF{G$ zvc*KL)35cT5TCGjvJBs_!$BiFo|d zd6?l>@7ZNMo(?S3I72@REQ;u~qpFF?P6Jw8XXiE}7liPB?{{A~iME%%s)=}9R^B6= z3QFJ@{WTrq^^e=?K+5hX{tW?dA$2z*hWPY-SII1^n!XEk;}5j(1+IfJfIbD>i*bpM zB6gXBg1*+H2XlR(__nR`hV0=IPW4G~;^j(wV;&0P0UkH(N~@utO||Vy&N7z#MVH(G zaz^e$@HsxmTR@hhctIJLEAQquy8`eN@!m0?7+-~Kiye@2H8@zot<{}{!_ZW^W0xX7 z3l4v<9VqV%ia5htWw$3J=mlC7&$^ zAN~dHXQ-n5OZk$iRfr*s3~5r!!$n}WcHcA4Ob36$Yy+~Pe0b}Zki;DvF{_DfFu`zR zT^D_5f=f(Be%;+4k52w(BwjJJkb1)ri6@S$!B8TI%*2hRT$-9{JC1~XeiDpE)4CP}E`XnD+aCooSj7LK?LJJ$?vQLA=^Op#~F^o*>aeL?u zq1*jBaLY~GU)nZ^#gXtGo%Qn-+U@bT72|a1lbAFd#1{ zbd0d??s9tXkLZVE(V%uqtCspF+q&zaTEr=7>`&-`H`*)?M}S3)6clf>I89MNn^}#B z#Re@q31G>S7Q73Nrbar_kT_g9QlNFcSVQcxx8{(teBZV2^wfy2aRjZ*3T{;^)T&xK z#qbqnz7m9W4Xm@Vwn|<2Y4CuA}F(4IqQIUn)2Qe14Osij?w}I zDis`$JXF(y=a*AoQva+*gkqH^^v_VmB1PGi@$?_b^#?^YH2yJEcNTKS#v5K52*nvI6ZVw4r7bIz z5U%fL6G=K>`!XwUoscNTK@;1DNp8J5;GjaPL`4cyrNp`Vly{0LtnLHqbMh!n6=4>enbaG&c5kJ4ls%X`u`5> zF#L&kfGDqjLmls%Mec$2CA7?DIZ(!d>D-!1dh`zt@nbhGiIa~@ z<}=+%rQK15={yJVX_>?_DpbB+E!6Yd?+biSM3V8Fbpyf)g6LP`{tY)6P7guWXTXh- zvTLLkuDJ7yI*66pfyE${X~rdvmdA3jM@S|qvGUDTja5Anf-6G0?ZAj^8D-t-B#y@m z<6HhKh`O+ouFv&ii5GTZhPm#9Ax&-r8ecB7dKC^|nmF*!=z@V+q|17q4cMq412V%Ugewq0~qs@R*&GZZ`-&~sl4D{Ss)s~eoMi#wN> zPW~84%)KAcASLCS!^wO!Ugb$TH@1BNs)DcMw} zusK3zdWH)1lqXEDt!WR|#Pnm!cB>;_z2|Ng?-TQlaE?WiLHE$d{1)`kO3Ep&p=N7n zi4lQ+yHRn$RTSwXuG*N$8`sm}89tm)Re6iA~j;HA2DNOSvab zg_zlyJ zi=!OwIy6f+;w+Rhb(X@TGoxMh2XobVJ?__X175eRx%-YB zVVpza2W8`W%kompZ(x>EE`|)jE*SXV@_;h6Ct~eSV(UUA8V$roIj9l8z815^qzX1F z3p2y6Bns_M889Tks%6kd6oWS1xckw}sB8D6f7d&+WecALz%E(tUkAKC-5B$9gGRU? zNK7+D2~d`b1XjfvMjO{ygB9?%Qx;u#A}T}A{CVGkGpqwe(+5h~*PyRU#JM04rtpRm z-O-BTr7X!;wvg?MTRq8WA)yfYTSF#I+s#fS@p=^}_V=LVe zMQto2$PdU=wyS`$QSAdzwrYZDD%<5i;mP$0QMw6(#g^-ZLgA_Q$)H}S2;@LzEA+J} z-B_b?mjvLUcIF18D&1(KddY%qtM*w^zT`pqFoXEcMe^-a#`LlQ)IuXfvQ{Q#E>y^# z#u0x40J`@7ZQ=U&9Ad!cc)#fE|NbDDHNjuH{KxmSCw4YF{BUwT`m`DTE#>}DvT3Wsi#!e7=jZ0W`cXYBr=u;8!B}OE%EijWa98w3n0{nRcjQhmsq+d56P}D;xTG zkJRngbf6A5es(|fj(aCUcPM(_c`N2tZ{#j+=dZ0{$z9@3m@og-0pDAwg&T>7J!N*B znqtI9tSrCfJ)=&zlHEr)j4eM$d+3zCXti**U58Fg)m@raa9a^%+W~^D7=}(zwmpCw z+Ey_7&ZZmYmJmv_!j$LfGp`rQ^)Rm&kZv!;EsNLh?cUH^wwK>ukS)7Cb{!)FxCU6f zq$zv*`Cy)dr>%+`ejWb|TQxgFWW!o&Wj}y(P;zz@Gaz!7?rt^LguO&F!?%}WhD@6* zykxlWa+X0}0-E7;8>!3ktTL?mz`kXP$F{=f&9sj7FIW~EnMyHD9wUU3+i?WS3X~!; zT;Ph1ILcm=IM>8!3YE$v5R(}tlDU*9$(t73Rm97TWy&KISY*mm6oxs=P?O4C6{skh z#>8>O$`)nL+#~=eH}xS3WE>QHMH*RIRY?{N3i(~Kl|@Q3?n@$NwTTgOlxKwoNoOt! zJV_eY3$~y|GWOX3iL!aX+;r}Oy3CoC1mOH&L%8f7V2UnxMihEvBB8x^<4#dT>*}B* zQ1;^~$a%Y%)V}2If?H&ht2CF`8ip=)+d+?_8)E;$L*B2t^Y?>SX{SOiwnkp{4cNH= zUjf|%&^{eodj65tJ}Fx|{*lx^K3!Vzk<~tmy&$qxcy$YXhSgJObBpF2-crW(5z*ey zwE*iQt-YhI@Vy;(_MNiuq_$F=lz;L z6pnF_z$}u$JUWb4%zUDLQe5r1LT-`M+)nxVSSJgHY1f)Kr+Dyr&E0-}e)kF1GU(AY zmu?2Si;Of=*u^EZ!6&@BKy~FKBsb-(qf~9Wt11Iks~b$YacX1M59!S8Ln`rEb-CSv zGdn?E4{N*R`WGV%!)hBkIqr6G6R-du5n;#!IB%Kho`@lZrnxfm*@uxiK7EUOjTT-k-<>em)k(idyH zpHyD)VsmNiM{C=TrmCC()M)8TZoJYesTE;+YUz(}thAu0Tn<&st5spYclXCQ8+t=k zI2x)_SpD4R*RR-EA%U`VGCU@~aARv0(kE-LYd~2#7`jqQ+m5zYQH#WWukM#(a|!8R z+gy=^f^MxFM_D=@s#a7>#r9Ov*JpFd>6dXaj3uW&8k$m7Yr$SGtaY}LT9vU5#8!Ng zhY@xcqVRI?yXKkwsMRDoYB(wfpzZkk;?U{&P{k)@O zGdbUOzGC!1aS7zgnH-u6!h?yjThLHKhq5;LwhBQllmq)sC;NK~{*T6OL+^ z$IMSw9~CZm|AxTq-)b#ZY@YiC7CUf(9nqxh@(!9=f9UQXFSL&XH@5xInSdOjiV;vn zsSs8Mh&2&dr!bS>VR&j(v;i{q(7y&CjrX4N!lWb5KFjgmQ~b~RqR1=;n=$T^7utI@Egc9 zc}B2N*1btVrJk57Hh!EOrhm7U|KPXui*R<@ADDQW;_%Nw6#Jk`q~-96LDW5kI(01q z*6@bGGK0VqLk13J7Sa_5Dy=yNkuGjZWbp+9brtVBtDSQ>?>n5GbqVh~tsPAfZwKU?%^Y5Lyc-q(uRHI}Vmhxo@J(_GuRGyQ zQzEZB;*CfgZyV-Izi3V;#*2gCPm{z8oIp+|%1b?8PAANZ3U5v)&dVEjPAAAq3KzaP zp|1FGqAKt<-VcK6J{%=31L=RYZvZU3?mzCgjJ&TvH!SqLuLPrAA^o9+sw(P>gTu-*K5G0&bAS1xOA+{AwA_m7TN?kDH;t|fgDwM$t^(tK_1hMyTB;(e zqHLni@JEHARL1g_#$tsr66LS#ME;pEbNd|zR{p@))|=-3FC9_>zbD_f0KZ&YQp>sO z%kQhSI@^;8k^w2iY$+q1>v?L`G{<|IgX#6Tr{^1(K4d%JOu+Kj4=eB25Ao4_$uM3K zbbW2Faqr(ms%~a!rIw+J(eRD;S^@l|9DHxc#Rq+9K_=xn?ko`|(e$S*`#GU=LnAyNIlUI|k-{nh6UO`5v{J&ZJ zK7JTTErSz<-r`2Uv-ZH2o>@r-#`aV2@C@3uE@rF&g2pdZ0}PNN(_`9XvDkX^kbPE; z!~w|VI*@_vmoYaQ^R_IjVU`eLDho$O;X`qhV>@jL$G}~|&aYc79u@@vc~MrU9(xM$ zVu|EZh8_A#hB(tEhuHBEkt?h_zEtyTCirYy@_SH()SL`CafmRoyI6l*TtkfM$Y;LN z4er=OWL}pDiL`CWh$? z&q9el;`FPjJx5$k2{U(jK!W(AT1?I8l(^JM9=ISB7!;_A1BA?9dwUlR(+Yt7apL8*-&@*Pf0y?8oo*M1rZ4E4$yUGyWiaFB}J;B+Wf6u@{Fa^pQ@Cyyy74&ao70OX)M)tZ@Ejz#tP9}v{%-Uk8 z`o&(&U4yBQZs}Mu*2I+5$0hDe0miK z<{g0SLt~b@2#ze2-Vg+1RBj3s%#mb4lJS-TnwI=%Sb;nv7J)9v>_F5jMk7jQPP0@S zgB%+0TGK0GJC-IL0&B-@u>5Uj%#cM1MjrJ_G}pdL6%Wi|J*>Bs9Ii2;@-RF=VakgB z(d!3aUYZ0FShGXrhaKx9n1KF9#{;bIs#3i$9@c$4b`P`_T|wL0-O|vy!e8qh&WMl zN$da2V6Jba`=9Fb|B8CNL%2gpim44f1Cqt!jNlF@vo^dEIIRLa6Bu3VBY(0+KS>$x*sv z_L#J$rGJmeQR?~O@Ov4lRciwZ@L*xiE1eAHu8`8br-6%9gzODCQPAGq8I@p)s|w#U z$enz6-9m*xpOw_HOFvHHOb;f*IFfu)Kxbb^ zmiB6Zvm*5>tCj3n#GplZQ)fhUMHOJ@@mkLiq%P4oGI=NHjIwb$O@=W!Er}I#^I4TP zZzA1>2!2WQBrZ+`{y7X_fSQ8~JPDk;Ja$(C;?1N^n77MzQNAz!DK%2MnEXXEh;OcmXV08&y$5cT@ zZr~ut%*W<|^5D=3;|&=i>g`IYf`(;Ex-`2!*H=@YNKPcjJORbYtP4JfVcd|*>gk|H zm++deu{c4I*dD6;N%cdaDjIS!jjFyxVc7?d0nDiw!EDZ~Nr$qcUYMAX_s%TbQeFg% zA&Nv1B1l>uR2d}duU8gQCe;_y{y8Q-Tb?XGNRuZ+k$;X3t}+@MOS=VTiKpRqRuVwQ z5t3=J`{vJIV-{rW=E`3zGI9-haP$FjfA;KwRsgj7$uc8Cke#1n+&BhcxwTy zrlWO82#<%7x;8~4Fq=FP z)r!W_AOY*g=CB#gJgL1bWMSHcLHvY6B(&Xiqk=>5c8G44(uh6_iNcpKb@;x-xkh-W zrf6*o+$XpytRZyISJZm7iRrk(3&F~t$*c=~V`e!zilKsDI(1=6yjZjzW+anOs@e*D zrfSXH2Yn$JKy4u5|5{wy;+t7+0OY-1RP+6_uW9v^u`DF>>YC{f<=_o?$DkC!3x`cq zrXZOr4!cIk@bKFg(8m#Jd8Zj*SsB0y9n|2*ptgqc3_m2s*`MngIgXNdp0Jr8aadY8 z_>zw?RBt(%R|vtHCv}Z+%<3H;5k|S56k(IlwxG1aOd&^$-9v_wao{FJIxAo88>N~H zFAb1Iqqg0w0!7hH%tPzlFNNHJRY8n0+5x3*^i~9>Sby9a zP%?`DIalumUDWjJRl&o`<6AZWW%-&-u8ta7(;lgiRM518X|yy255dK_G*XRWaU~x~ zjO$=Tp$rLcIPG}(?#{K=eEU7f`+ zBlGSJmM57=TLutz5>80Aj=Ch}^DMb=WjeRnNuOl+3YWFU zoRszwD-JEhL_|cl9ms%=+Scw}DO7t0j7%6eo6=D;Eo}>n0!eeM6^4o<1C?7b6^9Dl z&;!T39O4?J!yItEvt`@}5thXw4k49|YKq})kQc76yqz4J@BSW4+RU>nXUBh7OQrru z2?&C?g%)~6;+M*!A2lWS$C1<{U3$ovV>1^;h~rpOg3*Pw6qgsQn^e8>()Kn7g zP*h}O-1qW#y3h2qB)k=UHyj>I;W@0On^nksN+V>GpLgQO>0WbxsB@T;#>ik{@5Da| zc+imnlwR3izW&`B@)AFys$baHWW6zh?rGf;HzIYUu4n~FsXLMn&AmL~bo*3(UdUPW z;;|hMD=JB|__cg)D2{>A`=!vV(S`!G<{;=XhT^rS7%4Ht7%+GOb|4i)b)0Idb80O| z7}-A}C9>LGf~0yOaw=Rg_7x|LWn9taUvI;8$t#|S*7ZVZ>uyLLE5vU0knMp~IZ2lH zvIO1UhxRZ58X-Jl@mQfWe<+d@Dv96(G^mNSl@prF>yir9MeAwAKvf8$Jg~5_)RrTsTR6H`6J45U0(C0~bTxvNtlk4JypIrGH&N(! zHl5GouP66g>+YB9_q|l99aJ5!61uOH^q1}HLD%;^TfphpvfJ%v_X~t+|Mth?!ERPMXVd(m0?p!GMY>wXO}$fZYS9x8@3wEh&JAw&*S+QT_&MGHE!`LG_PFnU zYzgPt;Pz$YH;vEnK2T(Z0H8mC^ChTU3dSdYv9H> zv9kpZ5RjwD{|}A)4_OuXFRuFEXk?Qnw3n80`geDt_?3~vy%`?tJnM`gw0n~|G)-KR zL_)FC8Z)GH1}hDMjfu^iIT_QyM4@%Wn2=n>Z%U#&IUNH5IZ2Jg84wzH;M=R4x0 zEp6w;$EK4A1BQ3L@e_kEY{@ljI`zGqC>QrNQAA96|JP?^=F zfyNDNtjcq?d1}25&=C+2}cH=SiefT#+%k+B6 zigw3Q@iweBr!itcnS4OxRolVb`PtO(aXt(V|7?L-fK&@1iP4g=+DiQ>H@Sj}}- z=VoSC_qBBoE;hF%SB5&VE2Uh;ybY77Bns(h01a)1&>&XwiIRk|)c6#C3L6T;d5FOm z|K^h3!UX#+Sms|V=@|rB( zQUzGW5-gQLyRcwgLh)gkQHvCX=gn!Yu^4@68>$6GxkOAN+NR(Wz{DnF&a~x4oMp%3 z=_zYz#!9{TxVB@?Xs{~=w-0AnT^ZQAK^1=K6y^oqEtkloid8UTU}QgNg>Uko~0@l zh)Q#^%ySmso1}cOj*1l%jmS~NmGrO}`PE4&C*#R-cF9ZXVV$2sMYEn9SIvILdQ5n>iK9X#Tly@GYga3Yr|rZK2({ zt~if-uKMC7oy1p$N0LdE(Jadxg=A;-AJ+rT8{yZ|MB#Y){KMiPHwhuWUM5z6%XwK? zq34lK7pz29XPbl**M59^Q7Td8J9&de&rQ+!C{&jh_Q1R>S0lQ7W`yvYi?6|WXV0&3 za&9c?=x99YcW_%|=R(aq&}IFEXCUGOn3VZey16jzC8?SUe6p-{p|UV<9lepnCp@=T<`!eAAdW)h*Aj# zECUC%cy(!(y@vZU;pXl=WgN+CL1RW?8=b~Q1ql>Vh=O-^mBPEmgAi7!{ zK@0YYXtd4Tsfh=EDS+iyae!Sf1}pK|rU^0iAv;r248^_jL7Q^P^E^b_82IE$b=)-+ z)6!+^Ti%%k+B}E2)f2>X$Wxkg=Ax9OEMaTl17S38<-GL+VsSgnh#6ck5w9%$lKzW8 z5OF2#>Kqu+(xw3Z;)x-rch;3rd78bgk=PRXyz*(|4f7aVaiZFsSKLWqhtu1iP1qEn z5Ao|X7o)=O=81XF*RprKLQkXL?aLjFr=A04p+q$PrI6!uW?85G%z{Dz24!mRaxmrP|58Pm8Fup- zIB6GmG1KXdP_Vh{O=ocppXy%Wi z@JBCTA8-L* z!QGbbgpcJU>_GhKLAiyeDwJkp6X%)_-evN9dS`&HG{$YjLUcv6PdTWo?X>1e2_13n zzr>8ErM`vp=MRQPAp(xu3yf7=bBPv@9`D8aruQ*Xd#$i?mruxT>#~SXluYB>`<9NU zrVozMK7@(Q-v$~9w9&R9KBHN7L)3$LzH(%Y~N0v`j4^^kgM1K*f+9n}y&7Imh2nyuu6OtK>txGwQ4)*kgT?G)^ z%~Fg75CF%egDG~Svkyvj@QZ;fw9OlSTguGgr3+n@-i;)~wJ~OvhN<|&zCXYG^TPCl znP<-7;Rsl@mh(%-OIkk*aWm%&EBr<5YD(MX^=jg~D-5IED=lU4L%@QY8;=a5xs- zX>}|ZV)<(^_w4DXwlKKp)jTvlcQhgno3A3pNYvJurE1oxa18yL-v}0CK?%H1L!;`( z+0p#);30RoTx2h!IRVVqzgDYpp&m+qzO%@wJCW)q2A%-WR{}|<=&}{8)9y?K zD5>n~?2RN6S*1Oo&t&nwhht_uk<_*@wG@TsI`+CV=g}>=56kK4Myzl*kt$gH`@I&0 zX)o3NP$X_RT~*8qToY)o0*l!O;JnX{>9@)5a!YD6-v;2SoQjRsvtDEVSCA`i&U$c* zcD2w7txjSqtvT_B0w`ip$vMbMyy+6}L#!mq@nxE<@Py9$UFjzG;Z0>QjiY?&hJk6He`_(X4mXlU9p{Y9r$wBjHg^yMCpXmWS92GPR90!|4zc^MmgNJ(rj=iHM1akU@@mbZiI;xWAm(QGP%$f_lg-x|c{&hqx zr0sEq?=Pu`1e23_EuF$oR2*AOYL=@trpLj~<~)`G@G*qTCGs(wt;O4t`6{5b$C`go zxTONj3yV}(G38HF;bur^yJN4HU*j^49JkH*={_+UQS#j5>bZ}zSUhzgL^%8Q(K$=682F|dtR06^)uosZ>P4#HxZsxgoWI)qa~5AY+%x1D zR%2sxY}~*h^4NaE`|C&lcrBhk>@$${_$|y{@1?#_Vf9qrQ+-e>8P0WQfQm9(JQ^>j zZ}}lIcsI}MWLSliF6o;qwoA_&_E~cJM)$zgKv~yyMqC6*h}9O9uZzR8zvlQ&(2^BI zna+=H3wR)MZH54%pt{)ECv8~1d^C#Wo>m|$7{P(QbnC|bhDy^cP3JeA?qaF;#jg&I z?qXm0n7_iO_zu6b5|NI`PPqcl$}KjVLbRHn8zceUpA=B^juRA zskx}6cMJY4zt4C2(eq*2+8w3R2Y>~$Rx$>2Ga;JK_3wlsxwwnMrfiNd`%qc?S2no~ zfh#vFAR42{*+cXGX;ZPiZO)dEV8Y=J;?aVg2zD+gbws(uVB2PQLZo@Xk6j5Rl`i|y z>LEahrv|RlB#$hUOgmjZsz9sNK7!1tv=(O&l+CJ14GU+GNXNvGB#v+VDbuVie(6Db^QV>+8B+=hBZQ13xl>Q2` zjM^;Ep|=FFLzbqX5QF7oIrdHa7BV9$$zIM6@YiOJtg6aQRplyInZ^oS?={4J>Qix_ zw_{o6+Z{W`IiH_@+jIFY&kJK zxRk5(b(?{zGf0Xo8D;-1v6}7ex#5#hK#H-L0VTQI!? z5p_=-O1~8o4m6=z$N_xbGlQ7CoR~hX;Ga-&qSiWSM#Df?MCF@#d>RHo4De}-L6J%v zr9;T8#ZCO1+-Oov2VMFKEluowhW~WFAJ%~OE@!fnO(&;UN57A)0w6r%AOj%vxum-f z0NF;pE$~?K7uPT&@;wuMcm1Pe&8H_)yp$oTw=#Shx(w&UxVgv@I9e&ioD#`jqTZ2u zOnQr4oE}2;Ng!^V$TvjpSud3{^8hti(!A#d-C z$HXqDbJ*~_!6g7G{w4AA9iF~&vrtTdQ!L<)h=q1`WQ~Ac-?Kn3zq1pG<()K+{U)d&#!@-{kd_L$4Grp|Q?5*tIr@2|)pP$~Z*33fDDktb zOMD5;)ELTrkC;}N2w6NeT}cr99`1~ZDQ1Zc*Ro|m6UT2t$|o|-$cYmu{;p;#t;U0K zdb@CeA)<@`8`e&nQuAI~dESaheW@STUTYZ}Ka4|-OB@Bj_|qpB`hn&cAt#0nM$#E! zxee!l7pkXj*eD9yvH$evP)h{gN|0`Iy}uYWpU7-`ih$#HPh9OcxLMIQJWI%=pwo$! zYVE_W_{PXxHLUZ`^I~MV9+CdWk@QlJ=njMd)ZdwC#Nn*SywhrC$o|?Py7OdIH8msO zV_AMbq;xH>cTEra!x!*7*g!ssS06grOh3kLgai*Q)@-k#-A&00u9&MzXuf>K4^^~> z&>55b2$q!3yNhw)YVN_LFCA?R>J-q`$R*BHEj=4z!3yFp!v|9u_STy`tbKrzvplH1 zH%GJ<>`yo1Pj|K_a~n=%{{mxbyP3vLM20szIQ(xo@?Yv98$-jqy&py*!I1MUqP-^~ zPl*3M?QN8s3i9;nUJ!fw(|#LOlt2S9(pf04Q~AEcH*oq%EnVO>^Lj>mdlayGL{LaT z_v*uEO$JRTB%QR_XVCiuW@y>9S z0SYl%;o#3D4@_lhAYE$C&@flsC0Xu;>+Y!yWuB}*`tzJ%d+b!nd)*$Bk}SO5V&H-> z{4DB2>E1q?U0t?=aF-d7xO7q#dvYL44D7V97zbxz+tc5k~R8$PY;I4tr<6v{Au+HX5qDEiT6yx|jM3~!{T z$KW9AQCWe>`B|R!lpa;uo22a;VGB->V-?@rcqP^GMe~QaWx3jmONlcx-Sa zh!s3sGQ8<@S)O?fi{;XZl>xnXm`7Qd<6Ot|>BJ6PWfxJM za;!;D3w`S3c0CYPK9ZO%Rz#%h$9W>BEs(B_l0eG-tUAbL!_+dg^IVQra!Y%(NG~Pv z3Pn?xOn9$2QzUf->UCM+uT!M;OmUMFOJhA)Lv>-aLB|Pj!+wVGAmIYttU( z;}%6V_?BRQA-*Ar9w%O(B1h1-#wC>>m&~`lThP}%`KLpYk7I(5?zNokw;`W#MG0S7 z3ER2j!o2RKYsNmNYS%qG;0&{%XZd)kQ}ECxlxw}J4bXJ85n-R9cF8I1csvMUxj=4O z<I$dK=ty+SY*Ga#UYcYPqIS>%xfKWL$ zoC<6tuyhts7f|OFOy(-7Bxu=B0pVr74HaU(W}m*6Z`kB8)RNcTp|!It=#-nIz(){2 ztNT+y?VE+ZjE;M3;psAqvAi_RF(v6K+FC8;ijKFhENtjy?rpzxmQbHi-x+#p;Oe42 zTEAFiBc^T+S!0dA>zbTgT}kJd8tpJHzQsJ2d4Aj;x#^g5LKK}zYp-vd~E`PWK5gWp_es)`aFl@THUdOF{}sHDLX?*SxF~9 zRUpg>@7kxY1^{J`y7%0iLQWd|{P^V?55KbPsz}T?FirY#34LQFydA>o4Kepkd+^QU z)_6T1`~YfEh%Y$(6}@&UwgAb4nVT~M{D!&tw}+qkozCr0caHeMvbAWtf6qs3dgfYx z(l@te|4sXi_%rKExF?V86!wkk3$RD+ktt~wK&5^oF|{YT+83QQi8r-t^O9%Dur*Dq zNB4>{cH#9n*r_biCIgxJD@c-+?thh*zoeJ;}tcVj0JE!3v$=jr41_WItxj; zi*Bb1gu^^bRb2$qokWWOJ|wXUs=GzjsWh}{m&2<+r&XN?-UPxG2W?+~FK^0&!42e* zwJ;@6C;8Hs2fAT(ZBMLA>XP`Oc^&8#zY@p=5LHJ8*18wCUsiIW1v;b)7x;HCIO8kz z>y%FE7p<30kZ{_O9myt1H8LXQ5pq(=Ub3Qw-iE;|3!|`-26fNSa<5CU2bDEjs9Ah*Kqb*&wZM(W`+qR7^+w8J!+qP|X*+!SGuY7Cn+?nLgze#R#lJoQA&B>d+ zv-eu-QBCF%(g?!LY}ZG<5ef$Mym>D6?(>P3{dwM09k^WBfj9xs(O@`J?p;a$?T*w6 zorFn=?yhib8PyTo)=~ZD&|WQ$c=;zc?vP^D6RCV4etc>d2&7+@w=s(}S)HxD<5+o` zQFcXmn5FO#<|D7Xll9w~L&MMK_bWg1fWjH=N!)Esi&oLc0CI1Q+fL5;zu1k}dvoR# zb>xh{pqWv`gXH6@e-)hC9$tA`yK?^SwzOr}B@2aTp$iA@&Ojo8>`>Y@P@h81GuNZV z-HugByw)c9ycn65Dt-@H^}tR#5^)jkSw%0!&$cL*l~}!W{K;2ANIq3>Db?&Y$oC5W zy_m(yuXvO=64!GAv?O+LQ9COBa_|ib_;$FW65#$Bf!rr;Qb6a@I%Cp<9f;KzbH&>u z=Zu6%iFVcKs&4yA`e+jGVT88FfU%1WSlDk^pl0egCnE+e%umSao{wl40x?jY4v3;B zN^Nfw^Gm}yP#Lj+yMye>%L7vu-KaWH<=8sl+R!;nz=1*23pjh}`f^8@Ymi7dkUN2; zrH}%h>)o+tYTJ}&=CI^J+|QH6Ym-nfqY$z2TscH4j9T;BWc_pwt-%V(w+}@h2guJP z9-QK@RaU3CR^_-%6iknDY%X+xF?ck!RQvW72|5M$cM0}Y37h#JcM1MVr0)GNzXW$_ z_X*1j;zZPH3J6ng`*?DX)4UqR0Z+3^U+bk--GF1xZw|710ST!6YdOQ@ob-htpeGHk zhL+J>O;XDHT~oO-htIApVa2QPe5C}};Mp2FSWB9n^Kk66b>EecK$3m zBDPdG8S2Pd`BmS(~LuYD`tXT5ML4^gm z1G_uwlF`i(zIKy-n+DjCwsPSu+C{~Fr24ma!R7U2hHD9=hUza}Cs{+5u+hFm0Vu4- zx1?U^+U8#9YgR%$K=Z=b-*Cuky^$a+9x?({g*A7D4R-?+g@~f(?Q-9jW=@J+4R?lc z%#o=Bwc|Xng~<1jh-_WIAb-+c>FaOM|1QQxpZ~+^{R2dt`T-)!{eP?C{&SrvVdnCm z@;K-JT4<6nkum)j`Apqb162aej{+<;xJI;6vqY>anL;RIw9Qz=k{BX7ra~=xjKPUw zq8-7;d~sXL;ydM2@p6ib&+l2{>G9{spjn_PBqsGVx!+7V=XJQV*L{Cp5CTP&m&W(U zhZM&cMKe~j^{^whV%U97yYueaPNXt-Biq>~Akob;Eu2(tJHE0skiJTP7|La$uUgxI z7;ygk*pWg?rWpS~RHROHLc(6iI4HZej(^#IK`m26hSae2k5j+Tcicls7ZW zz=^Eu^2MNHwZ%6$qM*XP@)HqAL^4xfcNG+|4yBXIi9w2=mYSyj{r8sQ(BFkc&Tn?e zN`Wn}ly4`5PUFy_^J_@>JKVb%@BWuIAb7tqHMA`yRnCByg*X0-9ov3Pl#l9mWAZ0q zSz5pAFr+hO6uWpKeXtCJzlka40gmMpG`U6TpGK%DQESCV+4{L73WoC-3*pd7yTyKD z47SgJ!>5Rc5f+=i92WZijCmELP7#1&JFC-(lbDFP&y>@BZ-9WFS#r_h$mWP?jPVyY zei~=TCp~lL5xzV?TvysBWZ%bh&m;FxT7Igv%u@s`u`aaJGFd{;gM%l3Vq)2nMMghr z9J>zXUVF_>(qE5NcR^OQr_|wMP-EU#AtO38t$-N|2rK|gwG(wAezun|04{ZHb1RFG z{g(>@*8bcFK^-ynEI$;qsLqO7et4`|4IgPCAMyX%1HXkt`I6U#)Z)&I=VI#_pAw^soEJDXGZrZDG&-;4zr`YG`v{c2yPl&IND4d(_fc!8En%rh+}!zq z#dcOzXVqd-U2P@(>sW1c$SUBCCunSlWXp6G`#0#Zgr2lcU|FCO2M; z9nu9?0$lvNo>p6??sth9A$8nWo@f%4OvL5z;=fTFBD>pg?xvfPiHFr*8TGx#PPkKjw=sdNLbH zjN>vk<0?7}(C|$~G1+n$C=|HxLe&OojtLY@_O5ns%#jTPtCqg(*~f~vHB7>D5grw# z^XSFi$AWLc?-aMv8a{W_U@&dpKiE$0Kk4Q?FFq$-zi;fnKOVsZIqWnF;f_&!m_N!5 zPZe~yMl#Me{FORP*Tu!BPIaX^SXfxgv0YQGTMJLj;mxFbim7{chLK}laMZmmYh!nL%-(b*ZnMygFt zEoY3%xw5j=PgF;aI}6BM!^VPs6tBVB*skTjEi`klrMR}#7ky+8n?LQgmtKKG?g5LAuzvt>(iP)zh2|p^ZsPYB@XOOQW6F!#nPWQYS!Ap%Hk#r{0N~4F$)VJt zk$)u2+H;dc$TkbiP026Pr%ZMi=IlGnX#MmM{>myNjTDy{WYne+aPTeBVMtjc zsc{!sRwY)7^TP_(m)a8-<>+jyRCFC#y<>~nPN+{sRnIs&W>11RgZZ(;=Kms*aLZ@B ziD}5-m0qFQYR6+?lHnyVg@aKGcb!&-st9i@t5F1UMivJfVUu!>&XFx8wp3RaP(P+O z$>P8T`8;%#!V&+CY&I)Zldhz5asxk2lu&BO!zRc3&Dlsl*35-7Of@Q+p}-6$wsKg` zE^$bA7#QP-ZGXrrLY_mjn9+ENH#9%4jZLnRl%k9;hwU)Kx=QD4OCX$%>DD)~jC0x=6KlV-QSnKf7meg=;?iEJ&Z-aT!$4MqW z>&mSb>Q6pv_RSMv)?9~(u{QZ^`i`$*wAfQ zZ!7!d69BlplRlJOQ|_@nC>j$4c0yo06#VRSi9=j~)$Vqv)i2`WuhaTP`LMWd6#p2F6X|PqSJk&yce|LK zM5dViRkxBn(rCOHuZy&C-xS~Q7aGD3-tZS6y5$2*-P~yR%aC5R#6)>?z?sIp5)_@u zu4#0c0M{+fi4Tc1j}51aG(g^d_~qe9Fv@;V#9_8 zMV*?q2jL%7WFcP`Xj0*63);&fOc{NHKwS6Vbot+$-Ee?h?kqy;i}N!SrBlH~6@|JM z#p3_y6p(n4daoIl^O@Lt8`Y>XK!}*`1vjq2?0G z7aV!A%3FB)r+u7Q*bx?I_Vtso@`_Q?kS9yEi`t{;-}z;cO|#If?OG%wrPMRrQ%-&n z8B)-@qDd$7iWDg>V+ehb!tsrsVk_@ONN}du=nP|r-h`C$9Rv<0;ZrV9sGmB@5D#!m zwg0uf?>Jt4;sF8Tvi6YOO5?K#Ilp&!Eg9H3uP@Q+~T9#ixd zH>BoH#((3^Abx}V_vTZZ+l) zS$k32X!v!q^plCD?Ys*ZRPfFP`XhBN0}3YWr6*$M zrlq2mA`q{)v!{n#KUF2pK>x0N6J8?ouMuFxHd3`hl%%GT z)VU1g4Cf#Un2-`ppFOI+WrygFv9_Mlp{A*`zBNmG1<{v_t{c_By@mL2ZCN+VjKAzo z*$HLTf?{T~Z2;~;THr1#9XC){zslN}+tb69^Ks0Y!+j%acc}~cnoI!>o;K5y{V^j& zY(xWhsnZRIarCj{k!z_T9oNEh@jcwoA>&a#TES~>Sb zFy@ii8{N*VV3En9vaorZ1UI-Fq$I!>->!^~gWf-kWQ9 zThlhlsIxECJS*GNr^BhprH=~Z8|?1Y!J|QTAFGkW?>G@Ecy~g-^8VK1EnE7N0mYRg z<)^n^(QKhwTic4k;GHRuPd*FIlK+R}uZ^)(WlNE{U;(sq0n~uzyrM?aTvz5U-QrC) z<8Cl`ef)5esw4pe=-|Ab6_Q?pdMg+PcKuo~`46S58P`@)t>%#_>BQ?I0yQL4O%B-K zm7OpDNfTxYj&nXZY0oqmn{WG5+v;=pMXP{GdSzu%x>DO7UN6y7zs6bxFW;=Zm`MS+ z4%mz$8C1&6{3Hp=op<_tUGuoc?tVrmfRXO$wztdJWOIjNv>&FN)vyHGj}x7^72a8r z-68}@Tr`$N0d{b>d592OQ4V%}W?xI(O0FCfXCz;#)EiX)K-+4gah<+A5CRn^AXK~# zBYXW9Cwcv3@N#|VcrnD{hbvoe;06rgcHE`1m&?_Gpk7ehf`o80f;`6_9O}wY2GkIb z&I5Mw{(bi`ZNy!p;k8eup;24qB1sCGKy7~&ift}`Y)D(J<4coNCV@YB zN|A&o*4*lV5*&ehm&-_Vp8^+DR*6|#&vYr67P!~c5&NUB7YO^C^lQjOM+Jl#bpgjQ zcJLrkdnY#|MKQfgZ(r! z#r}wS6F)pFp_dFCllAy9lA`GkL>jXz*szw~by3QBMDAkmj9OZQ@&~3#-9|(I9dw2= z|Jr&bFPVyhDV3w0mO$Dv7WkO`b0X&ftWWl8t2UP@xp5SEhi&_|WVTq!H220=Fh{?H z!(b9lPVWJ&Z)EsL^P*%(T!iAW9W2m~n~F?(r}2Jo4f+LCaJ@k9YHoU>ci+`w%{*;S zGJT0$T1N+Kis`jlGgDPnQD_)Uax9rrl)7t5@%y3 z2j3-c3e*^tb$(Ix>2>%Gy~DESi^~5;fV9{}DGy`3{BC*ab#)#hFL%T2Wt(^}?iQJ0 zZH(2+3QSRVUe(%YXJz(L`D-LtVZRQHhBR&AhIA4|q@4kd72DF+eDLJgE!oN|+Y@l$ ztUsjFU?20o_4VlX1_?uSQw2*|9IXoFWxtR0;1B8p%{r1$;$`>>wwsW* z$T#!8x7~4Njisq{MF#8_r~uY&5j5mpAJn0D=og)dPJxnfb6;sG_1-eU^lQb{zin#E zoL<=rG)q_U1<@6VFb{J7h1&$Tx~O_G94bk!!pnum7A6AB7s;>}McZdV>&EGxV1!&D zRmr01e-iSjMG2IeqmvG9+Q7u{KSAEV1gQ2P8H~CkpgYyMcF8l=WOmh%>gHy0o)KK7 zm#gX-vXDd1*5a@tKBcVAN!b0wu7FVno0sIr45{$V*ExAd z`|(iYM($eO7tLrF;8@j_GOohltynfHY~V?L0gD(&6b=u~q#Y@R{wE9{UP0%jif^HCH@T6(3yt z$d2*40@iL95Ygm_z;p1J-$QEWUHwbXS?<@MClnKFoLI}(Vx|xHV#PbVs6~Y9K8UV` zVM7FYd-)6+fXx=z>0kFUtG~O%^}X`HeiT%Ne&xanC0x2e)@GBh*eO|FWCfTr<% z4MZ>2`Tpah`45N0(bkd` zo?7TSMhlM!D;@bk66#B^pcL%;G|Cz9z2f=@2^BfGocOjh^=BqpdO_Ck)$ES=Q7uK? zowcc;B_5#>7k9FWeT|Bzp6iXgsh3T1ykSB9je|GN`=0Fs{SR{8Kn$YkZ!9ZYZgoS* z?u#0mYfJfu9hYZluC&+u4Ht8w7M~2_=}*=p1$rLH`jaUB*bhCB38vO(?8AF09w`AD zSpZyh{IvcC{!RRGa32aN( zF;^N^{I<+-P|>TvjI`+-jvUsHf9wN|T05gDc=W?OxAgk`U0NJ%LFtxJ(7J~hs5dRm7Pk2T zEf#P)f7wq0*p1}8?Dp(MkRKE=hweM%;Os`iWVc4&qe%IjeXOx*Y&q_bYg*3cp+5}E zA_nGyl>O#x4zA~dN`BGCWdgAH<*gMUCe-OMP!{c9G67`#W{_9aSQ{3!7OPUKlacy& z1~E{QguFq2aRAv7?;fX**BmW2pWUG_{xxlxCm%ehc_&;fd{JEOHbh**72B>?x&V-` zo#C`Q^r^_!(CWsn*s0b#OKgp9^MeZjWMVYL{gwJF3EvUDiuV=o(Mb2zx5Ysg0K@WH zJP@jrXIA66-`-3CahK^%?<0w=@1Wjw!n}A9^nEbuyElT6sH3ei6Rm7Ey*Qzhg8U&N zg76_q(~qfdpf57DQro(=FC9Rg=x=dO9ef z-k{6bv;zM-#31(p(^sly0r%J4D!+ErVD?%u?%zjWrB44H5v8B?fk6EBK1B{!_5{w$ zs{!Pq%ar`*Uyp`gb^U>g-^_R39~^Y<``sBV515H3`JYJkd}Y{;RTnh0T%V$=j%DVU z3;0?!WcRNAjCT^ef9A?Yb&jX1s_0%IQURc}6{239sf&odzjB;4VW=Sx4~RkinH$7_ z2KVU2NwJ^VSQ$Uu+>_(9@nTM(jbNzJjNZ}x3|z$``nn@`EbUGb6oh2{MOduw=?u{O zKEu`W%##-e8$p#pACqK~@fruGxWePCW42|036!Wa4YG<>Qy+-($~{5#pmHu~UY;W4 z>p~LczGO8x}dDI2i*Ayy7> zb#vA(YoO3yODGlTV@>{Jk@gzl0VaV$;$6^nQbcI879hV3GM z8@}FtO-cI~Q$>zR?#PmXA^CpVTyEtv`p{TE+DB!2FP}DSe@N?0Tx9y-NDvtI(ne(( zIV4ydSA@-~`-$9jV|ZHbYQz0vMJgb|hbr)lnt6nmX&1!kxq}dLB6JkOxPUrREW#`n z_R7yjx)3lPzC2>A@@t=-RkA_h%i%&<<=62_4~|Y=826qVW#$2y_$>6k;;e8?4-T}@ z(C<)Aax}a7Ne3epTe>l?B*6$~m1NkJLU_4gw%QMY=B}$k(gX}5QKBKbhC#Fx-nR6) zt&iSOG6yID6+fE6k0m$0r(rJMh5Y5xa-(&p4NqVkCh4WS@FytP%`OJLNV~RC8%8lw z9uWE(UCC~os>FUIIo@-c;EQj>)lx%C2~ju64w-6XYxss)us+W1*;g00RuCgiOe56V zk}f^_NR|;T^*>HRNp%yybJWSQnTvQ5(%iaUSg(nB8VMIJ zvgXk&tca*FrbbH0YU8os9X%kjj%Z~aOWGrII1Fq<@CEP|n?Q5HW!6`&F#DMH!5w2( z(mXw*t5+i~WF33j1IUIa;ZJ5VI~`uzl~A45K#rJ%*DWID4k%iidj+8i8UO6lkI)^c zi)@)kZjRtfIP_i3l$=eJK|WMvLGkHymJ1HuIvH5w)qB@a-uJs_9?&~-2<b9|#4(mpFbQHQrJpd+*S)E$hW*v1VHgcdJK|f~Zoq43g3rUqRXXJW z^qcUXca?9zpTCo(4G*_ED!k*fBF%0Dl5K1#ong`7hmnb?hoPAZVnu!*P{d@ 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%0DjtErPC5ckJ?e6-@>` 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 z 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 literal 456250 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

V}k3Pe`bp{z>YRR zdfZYtmni4<)cJDsXHX0Ie{s(2D(+jyHI}2;ihBbS8AJ8(_ENIiC_$8ByXlT)bp1Xg z@hS3%@6mnkh)Sd<@Js*uukhy{`(BdM+UO&p8AOOW_w_lbK9X0Xyj~if-ZD8jiv7?P z8q;P5h(J3VCaEHDXxdh32rD z;X&XP51CS*vDRNMMBtMf`KGB=97kBloFB*Y{Mf(ZBH0{=5YV|LA|o`1X2`s%B4t)HR|vf7A#utx zKs?uyV1=cENd#W82Og<+ZQg&>K5=n8JxBb6E?IjJH4%ZqjGsI$(-{e!#x)Gr2AGZN z0@>S~blOu^h7}HkPQ4I&SYbLi->oEOd(|4DLSFZ>{#L7@&Dw&lTQglu_qMo=;(8yqYF*(x~FA5bwsH829zj9kKz}_*&6dRgOo_Z1$Ev!ngNWaOC}w=SFvx zf)w#b(NV}1`y2M!90k1)?8*B=UPdpraj)6C<@17=Mw{BP1L9&Rr<0HNpc@mq0eGW7 z0I*(>1XAw+MslXz^H;?^|7(O&-_&k-12V&er3&fIg5t6KBlc@bec^Xe&BV4tylYN@ ztZuPsiU813vd0nUHPs6Ve+acJ*O~6bk!!Usj~GjJNWROV zW9BOw4P8uOLY+$=b%eo^o))#w-XMX;U@>D;{_AtcMovCre`Rw9I(A!b4YcbJYGoS* z@z_$t8|h{{!h)$1+{ygVj@(Q7B%X1=WeJ-hpWVJ~#BTy%szkxqTjP>xVn2eTCP2RA zGeO2+^sQG3B^Wyap@fN4UhEmRgy2XPKm!&cg)U(-eZNR}hd){Z7>YbofHf2SgKjxW z^2z)Nk1PRO!q1{vH?QE&)6jwWPXT8K7cLB=Wk$-gx;{*I>46rGb5NQ;T`$N z2Cyaei~#N<^TR!Q0T_xtfB$^l+n1vofROkzGB`e=H~QAJWSaC1>SzHVB;gGS4lwB{ z$@|!$$>=-ShDU~nPc(NenvH{4Oc0p<+J9!nN1baR&G zY*w?YH=kF`lIYjIe4)V~!mn=i-+vzBKR#GKQ@%w~Z z_)rQX60B61_H7JBgY%OD6%1Yqm@x!@U&t%Y^HvBD4p39P_+u{$NM@Y<-j$h~`Lgbl z-|;Xtx%Kh-gdHgIiZ-(3IUhu(6=}>72iF@}j2_Q-$*{Qd_>DjO&V6rZRBW&zNR*Fr z*Xk$kKr&7%j)GkLMz)S_p6;lef_y3V(m(8frE{4y;h#~Qs_aoy==Ru125H%89rk}N zi!wZNk>}88!b8YP?Z)|#G?Q?30mW9UqzBi?K+paStl9>FdQRr%R%Ro5zS`93<1w`h zG%?ryF~smGB1W1_Ei?Ix?^1ZkGPhtUU<>6z#Ipf1wt1iA!vGdB*MYQT&j_IMl2J z1{i77JheH0&Eu8OfNNOip+f?SC>?#R&Y`#?3~CYBYyD}G(oJ@cC7SH=6`&iR+tU7s z>_!lc$LOipbMvb?Z&!}P-Ag&;x16MUDgs?+uwprzu|gR(4S22hGFn2KXnqp`R3g#ua2D7ZY%&7*fXWinLe-l8gNFx>9T~W=&hq0JW~OG`Wi~ z{9K-H;C92-&%O{SC$>MiUU_RpR+Ob+cMSk=6)$WEeSI03-j#K*dYrXT*CqaU84JtbYDf>39Fv7K3a)X~zZHIo z&;&6On70$Dc(OyJ8t|6pZqPl1yKs>iIgmXlMlCgR1lAW-+Gm;o3Ceq3qBl+rTBCp*IHSOYdUEyGlh? zjctwGw@^+#H&WMErh(vEgOb#LWF<_gbvHJN}q5c3hC6p zYK>l8vmk8xePfMI*D4j!+1Z#2z(S=&a!=K6N{J5>^s$TCj)! zSGh9UyLVv!CHxdrvsD^gA5&^cUcg~=2(k;NA> z%woQ(ZfEr!rr)=FX>i1*o#>GpM>qzI4uoRS+%;hsL`H(n*&%2A889LsJY)-4;|drs}~BEhE*ttE=bU$5*>n_RHX=u_j-R| zv09*09Wd9C5E+pm6)i)NMoW0N?HY4bF`WPktgo=n;yd{aNZw(7cB0ogJ$`TQnGx-( zrwvMLt~B@krXGwlHP9c{RrWv8rw_d0e|A6FD%_v?A@qNt9jcB%O9$8gPdCW_U**VE zJ5fLv`7~k6v@t|uKtYS|H7Y3?GdN>nBrrPL*ifhAu$!&e8yz-Aui0fE2B7$x&M>N_V#{rf*SahK6EDhp4fT@wIq|&tSpp~ zgcPDv?C`gpu_G0rsY}#7O1myl@M~qD4@42#GX)a!Eo}wFL(ExwZyC;1ZPH{+Os^V3 zoDFD_{UIf1gn?pMf9|r~lr5!ZnnnEG(RrQ0oGpDU;VkP?g`IC&e`J%xE}n$hUTgi| zCRzCPd7e7VR&z2ZZY6ey9i?+uc4=3&gHE$b*C9@4OJ$ed;nrt=i6R&4ZDvvF25YE_ z!W73JT*l2M(EVfDuH9ZS{%m0^$Z9JtZ;7VU0zWNz|6XJLwl%joR0Mv2Rq{$$QsCGu z##nDyOi4$+U!uj;M^>J@BBw!MK%TCqqjq;Z1H~d4C!Lw1`^Q8(ZFd=Jav^*M>ZSOv z>Oh`B9Lb6}>xQ^vAmPF;T7|dH){UIzewR<0H=`HDIPvsK>(OUVGN+9NZa-)*DVxs~ z25H~}SHGWMj4gLD@(Q|4-AnT6rZW{?yV>obn(2MgB_;-a^}4!saKa&V3LSGQ#Wg%_sTujCq0N8LDIRG}Ik2qDEY+r+1GU>ln&E`?m~dQS9g&wJ@c}W#ITpW0#OjM33YnC2o)=+;D%R;6EbJ4>D+ZG#t=L_Z=X zW&zpAg)y`@kYd$=l*;6ITvp}f`pGjfk2KYJsT2UX0!OasbB1<_Q!%=2KfIP^4Y3%< zz<0Qx%&aSq|08*#Z>*OC_LF7S_*p-4|BL#Ocd$0Lx70LtHMKHxu>3zfBB1Igj?*tW zmcBY#hPxY6QS^&uHzvP`8f_45h}J%~^)iz2sM%*kq*6elp#(Gyzki_6c%x+q3{z$E zD>GZyhQOPFM_<;oA*bNi_CTL+t4@u`j0!8<8&QI=+P8e8#=mf236ZvAAirD2+AR_>ab3p@9Qs z`VNVu-f3t^U9X8{#{^?Z-<8;OH#|DK-F&w-nh(c?C9VspXL3bANhYPE^X!E*u20j# zG}w6OqdCS{5#8R~KQcvh=SAPXQXGoqw-3kAohXiak3|yMB)O__!#NYB^~+QS)Ep9E zSfSm#a3rkGlUyddk#O98)=pW9l{)^`fo#7gz;U+3wD7ZG9ht-;ALr|>gHYd2v{v*n z83X3k1WKPMPAD%@iD7~aE=6)2rS!D?x-X8>(><%E8%xixnatev@#Xf&atT+Q=hn2P z!@JQstbvNndxBbl_IHX}Qv-ASexWyd2s?EH!5|&(k(5^bJMB_b>6Uf!1sST`0 z9H-Ps;LRj_y|A97_2a^~&q$RMOzXCy?;B@+vZ-0_Q*#)dLo1%{;Hp(rhct0R{L8GYVqkqKICjpG@qko)hi^ zva|Z(uvL)q(H?E3DRN78LehG8m__y1RY?rG8q{B(b zP=Ex4sIj~Z*%gZ%rzzimrL#^Azcb`R{V4exQt%+5xu@M&y%mk7#(=%-bDhKliQ?w9 z?KXR8-DeL5YZS(4Z zQnxkrUrqfS3CU_v8E9I)?cmZ|kcl1HWK9|V?{@72xu7=eTgYJv;=Kdxz&(al z_+-e;LM0tOtrB~K-*$9u31^?9e!O$a0os0+8~yXn=apWvrq~Dz8K;0fs9~sHH^a+& zs61wQOf39bD1q7R*x+#O8pP`1;6=Y1L_->l0S2xcd)^sd;E7GmxJb4C>|W$eYqj_r zkT(dG1pc$Y#-E8Ajr@FuZUg|+C5ZoVji}~n8H-$ja z|0R|7#!0{r{vq+ShY#x?8CVta7saZXVz2lO%PG<%e22&HN*cqEEGkyyk|1n0twA(G z9ee=$q8GPFSG?Lv<^%EYz~+YB;X>(d2S=Y6gPiUB&DXoMb??wfx_a9ista|0YY;lg z3%sKyp2n;xuVa5s_1~xG_{ayv=%*e8ed1&PH+t}&_0|8-19dyiH8Y%EqCA<^1Ut|` zL!@cy*ECW11$Z&X@#W=e&0LHUkE{&zvPr^x5RaSQ@L4b4ThjG>x@8Sq6-?BldWg}?XAZFK7rC;u+VauUe z=V(RRV9}F(7$TI)C?q1BOsFx1+K#f*$ZE~qE+s@#V3xy{tE+@fjh_2)vX*y|BC+!A zF4h|)+E0z&qV(9QU&G^FVWDf#-kWMTtys%+0N?Dg=zeyIHema2l$xvxslls`9!CMg zRuki70eQO)2mc#T1$vr2M}44e-$xZUc^)^8D`7EaW}V&#E2QH~7*gb5DP9J6 zNz6P{VbEh4rDNq|UtpxnS|HAP8AJYKs|sRZCHO$s8^zCn<4zznRo)P%5iZ6S<{lF` z>lA9v?NUk;T(B>uQH6nLVLnzaL8AHt?mm!63=cL+B7?Y4P%uO*7I zqu9V2HMJI4X;2=yY)01U)GZ=>?r`Dq+a`#-Z48Tl30xnO6mEP(`sVPN^)l;-ScS02 z-u?3d*BcwD$WY;@fsO@p&&D3;Z)^DXOOk>94^_5sv+Rw@*e-T>q-P=HXrDqyNRz51 z0b>H>k4%7g>=`_;|ThWZq+M32htGm^Ykhd{TMB{64iCGk3E7FC>T*Omgc4-vJwi1OVav5V0R_||Sx4~*vO+3`x z->*IC*6Yxk+RaYeE!K@BqqvE3gl&zMp5}p0@XM zs9DUOr@JdG{R<+m3P0xBkc+IT>&2hAGhq_>9QGl-lCd-5EAIZIvX?JAUp|oF-+4Np zu(^l&#D9F?9XxT3UOFW1Zfz5+fFe=7NWAjQxSrBZc@Jyoc0Ob7pK+Xi6h((;pC@hk zfu)C4SMm$%^~?K0un&1y@B}>0L}h)SF?sXedf^`VVHEfgNb-&{@QOenW+k2z7Q>a`6BTDU(o)uWSs1Q_r;L7|MFT{ z*<}Mh3PpiqCPpC_g$s3z%pis!NhF2`^rI>{0bpb(z@K9p=@2g<%kFamPVU=&HQJV5sS)RGH zJ&BZ?7!IK5wjn;1?h~|&%mjwb^c~3b$Ar89aSlPwA*vnK^v4)~U&bM9#w!qpAtZ+K=A5BR0IDqjAG4)M7YDDe}e4BnzyBzqN7EyG@h2b)w#440(cDa1fgqdn~(V2~jP?<{N+u;Gb%$cIs5Kt$Q zb7TJ7j77$3(5hU;WYLRlXA0On4qnR2oHDyMRrZV+UBkvjzD6|L(i+z0rb5`fQv<}n z+!D4*0$e4n$;w*<*fqd^&2h3df!9xyvBPcAlTF`O(IsgSlV2_;wCIO9yJQy>)&=%= ztfB(5q;w_Hc{}IlhGf$hT(y&@uz)sm9Qmz``nq)-GazN_cUNw8L_iGhmj9_{Ksfnv*N`Xk2;Jt;;f3 zk5+Lh^(u0u)0^bZY;$0J-M_u@r>h)*fCo0%B?HN;yacuGB>Vc}fQ}5t^qGB?PCd!= z37||{2~g8Y6OFg7C|`3r+s9o*__6UbF0%S+W~aXxP@FMSn}vb(N_x+PuiQN>5w`lH~5 zj=eEJ+V@a*FzQ^JaErMbR^Rxz|{gnlL&jdx1Al>l&hx6Iqf z`8D)HrPueeQr+&^ZFC8xLpSuxT8)T~IMJWsUcg zJGPP6D0?aCodVTK4THE!*y=VjYG0hR55HD$W!m=mlP4bid=$@?iqD?AE716?sUvTI z14*|-0W7|}Uvh7z4u2F80mGfCT&pyH_}^Pokblm6JlD!B_t}ok8rG=yIMlHsU`JU~X2`1kiwDkhPS0Qw zhXfG?bt92Eu&|5R+iPH%e=ifx^^Pe_W@?Zd(MJ|2PibTI`4`@wa{KEV_)uQfnDAd& z9BQtYuWotBc|~anb%hbvzV93oHw#T@FmJC_qEIcvP2u+Yf(~K=kZt;)ue#LM_qFzy zi(ygoWYx1=hjyEP?KJ!lc=uoGuEJ%OS|69v+d_4+dQvxMR)zhV_qmzx*+SXc<7nw^ zzu8_c_+(FTdY$Nq23f!s*qFK!pdTzj<3$Ibl$`~b%}QF&>s}yYdU27E2KNT`l~?>m z*CDjBr;kD+G%l;VuYO>(y|lgOB>N^s17`yf#DTm?D#vM3!>hQV;iRIj7c z;t;zfMrP#bFOyn2{oo@e5i8i&R=d)~t7f)aYBeyJie6T$$KC)iuFx@0BPSTCOuIX| z`d9J59#&se*HBSd&cFJUiYiROR__B@iOrh|V^! zu!(||iM0`C$FA}7SSN@;^$=zR>Hmtt+4{y2> z=FeE(kMbLK`YZOA!?xtHo@|`GVL5O0f=-ZqP1anayxV3eiUJO2f4!~0T!RFs-6N+b zHoI50fEsOUJC@GL0B~K%9BNgz5Yh{YwNfmv^DZ@yazV9aJv@QM=rl~@Dho)Vsz z6Dp~|^i?STey@CUu;f9!^m3~VrUar1AJ3$LqChPOA%I$G*XA`g5D-OM+^MmZ6fTOS`B;gqR*%%Bj_p*r;;TqfM4I-+koRuVd{qoT&vI9XINrdF zr$}pOIrMK1@ASuDLGl4@{{Z5Wa>5Fqh~s~yq>AiK<&~hqpixZS=~}Uvp9J%%T(EfX zkaRa)-xx6cL#d^mX4W+oWd*)MxJkSq-Ah-9q~Nh2l8HLYek@C%HW91YM5`rvKgaS7PfB^C7B4(gG2*hkil_S`urPomuFvr{rWe#Vf zmUY@(Aoe+YZ{G|wCdNORzt}rr5tU`^^Du1@uosIJ!l{!iC?}64GZ^2E;YsS{?X@y_ zD_ZG-Q6K*|DNz|js&=Q;`IA$TDMJ};Kn1H>$CB;`crwu!0htCy>N|Is)LpF(Fck2_? zDNL&zWoZdOqWvI#oI^xF03a@=@J;vmzD9n=ByP7r+f@( z>z&lSv$F6w`JzXpPHv0LlBz?v66Dk6J_CVU6p)B%4&wJCiZ*{%Hcmu`)LgUgJnG3$ z1uH7-U^=bKZT$sWU7+#R^#+xdXWx@DOxLl#@m+yy42M{a<6IdxI` zu4*+4ulXRz;S{A2iS?9aK}ym)Yd%fduA%0L>3X3?y~)ajNAZIF&0bruqn^JIh37zY zQ+^8YY5+pMcgmt@S+RFBcbI<=u)c{HWGF|4#=I_v-q%=}qXhe+!j<@zt>aC7-yzc= zR=C(8a9wmp^l7@5hO~_W>KdBUrDj&`JnBGTc2w1D%7%-ryQj=&;p9B>!Q>Q>MaGVO z8tY{#5AT+etI!xsBpCJ6YtIJd_!UZ`THLA9iBFK&6&a6!49S^x>@<#%9XWFtl_c^d z$CL(7`fK8I@Y&94>!X2K^k&S>Kd+Q5|2g;?O~8rI8s-i5erU z;1v?WeH@%<%5F)`?rvfXFrCqEbuM0#zJq_p)5RNg9Z8A~87)?jE=YOE!{|J7+!4)H zzuD)mBh3Da^zGAi>`74X5GyouT2sbztfk@hH9%k1g>9#DbaV7@@3%V#j|S$7T}2Fo zNgIi1Qnt62)iuG6Y>7|0&#|L471up4K1Hp?^uH_%^NiE{KW(_nf%40|ii3JFI5TL< zA~AXQc1d%W^b6h<`eEyhlbc4ekQ$p@VViVypGaV>lFC%TnHw;s)Xt2|&>A0fpENI6 ziUMgG!;VmLA3Oif5Zhoj;PcAe=C-N5ytpcqq0r@Wk3!=P2mcy`l*V~8AD^sx2IaIL zD5TX4*yvKOwsMI9B-#tOIiueFy61;hhjlRt6{G*k_YGs@#CSRPa4Pg{UgEm7Dvuc_ zQ`93d96~-$wVR3sd3MypP+fc4`eNFDd@q)<-h8G=HmdQ zzs+nO?xwo$+Jjcjhvie%x9iH_(#>+!F{@CG^ElKzRG69vJHGm^S7R`aM|&;|!ZbpH zO-buUr6s7Hf)hW%3qu9{S0?zCaDuu?q*+Ndwe7%+LNj@X5sR+DCHLdg+mGyTDyr{O zJIrBzO<>`I4x+Q@Fd{=2m7mVO$tpg8W1@<>)MsAcDP3$uIWd&32FLR$98VUr4)Je$ z{hztm{>N3`a++v>NmSOz#h;{UGVxo*MKDxl!DWEkyt!TsL%HOQql>B{g?!NzMQq$^g1}aEL*0E62k;?AA#oE@c!EE2OC(N-){Jn|QrmDm4&pF= zJBLj+BtBu7E-wh@bP2!Dt~sCmFfq4b0YpjD|FW$T{pq{Hn3iVvCR20B2yhPe0K#p; z)Y%;|8(v$b;bdSKSM0cxmN#}$9OFeWn{aW`&~}6df6mbnd*-CAj_cco$Y`0XAofxk z7nT_uF&=mXDqRx7&;p+`I}kVg8mfEH{y1{--rYrSlJq1)0F~Hz?6^0ne<{ zHnm_sq+)v6(3kd@Yx-T{i3}SxfN7pNf$g8R7@6YnotI1Hi0YK!FLwGGc!>0-g-#LX z^k~LFHC@Tr1}!{Udee#qq{z+?ajcgRRCW2WDT>y%rs|GNxvSesVQP<^$4J!?MS>tP zc5CI;QrfG;F^<2JtZDdk^nxkhlZOk_oHCraWuQ5XMWVkS49sj^v>*qbl+ASs6XpNF zWT=CcUlh!3{tB#ajv*WLLK-faL1C!Es@`pgQJ2gea(RLS&Py2r8u58bhSqjk9yjM- za4V8XuJA`bqPPu?nq{=^WK3Jkt63JouEiQ0P?p}lN{KqA8;=oCZP~3cZo}R%`#ykI zuPY`;{5&+(UpYhG7^TJbVxfct;99 zo8GkPGn0tGj=&Um1aCxo*K>mVH@7n00R67wuhnd==d{H|`%>*}qg$OiZi2Fyu4cRS{CXSJ6kI1P`42$8; zdy(n7_P&Tn?*No2B$+fa7MHve*;h7a+i5pNnv2}Efq@M?xaB=lAu$4>( zvl=iPq)6tOcau9V8gjk|S$jd;46zy%N}2kgo{Lo>h5Zu@JqXYlu2Sm@DAHOg0T+pJ zMGX`Fg^(s144Rv)1Mm(I&Pcb2YHw=4HO4H(Bsawb5GQ*IOn8Q*-DIa-rCo7eWqBmY zOvjDN!z6qE;FU()(T~==^ujXy{oTA?QKm2w>>1DdEQmS`+e|H(GAxBv_m3m(s^Kb< zf)Ohnu&X-pC`ZipxL)4k$zW)YYlvg0Gpy(ErqOX5vW^vFOH(DV8f_AzcK}E&r-F_#3`sm{P@w zxy~JiEh%>WaNbEb*IgR+D#emD@M|jC$~`(h=Mm5wHJxfK+u`3l64F5wU@wavMeSfu zop3^3+mS}Vc*P0vUCTL- zUklHafhYgNY)nQwY(pHE7JD>oep{?WPyE4Jc5!qlO^-Ak%|l;u-3`}i$vjPu(uN_C z3`X3{-uD(GWLuh_28lK0gWRJ97QWS=-_5pzT~gOMjDJ4qr*!kgv*c2?3_%I0`p$p? zKZ#yZm5yUWvNS*4wd{Cm8o#J_2}>qS zjT8Mr9WRmRsh74K2Spd(wg*4FCVkK$tEZ}h%+44J4^$?e;8lJfOQIS}X7GyQU)V{G zBv(i-)4fLWqMV%8R>`v)bJ^>-CF}T#-;`-ScC!zyVqi5Ey*HHBEpA{vHgV|OvEEr+f&d>BNWR%fv>G8xolFdc_ca@RZ_^VLpjnY%;DLim6=m@L6lWa|mT+?9`1ft2qO`znrz&=awwIm4a& zfsxGcM5}KwfcRqok^ZT3SuXSuW_xcEqsOU=}$Qot8tfKTURXl*xQ~U^iWhJ5HeDrxHm7MIS zuOC_V|0tgUzu#2+B^>)&2Z1}TG#}<;4ts4#_s3e#3VJ~MpJGc%A8A`|ATmp~GO?1=>Kp8jvE4CyOrLfs_8)T zOf&&ad-m7~KlUkk7eEt>4d%`5ID+m@M`&rX0~#^Odc6PsCJot&b(ZWqCn^Ud(ZxE; z9m%xmVc|Ydb+A%X%{ku{#^vsf7kTH;?bCVBq%*F77p9%>Mj{6xcv9GeJ7IKcMYu6D zc1wE`=jJ$Y)Jc|5$d~Mul-0F!>0*26mkhdU8pjjxyKF&4sYJk#2TocB8=wQ76x z$zBdm@h4Ib@PHlnsG71%)Ds-5sZ9E&^qOD2lAV+7lv%&zXfA0@a3};Z{c(~5ItT+CaDz7)ZJkhLn|U5sGWaql88 zhMFf%t?7lA>c6|1ue5MVD|wPn|Fk|zchSM!(Q)_HfqCf%+-xw2Yt{w6iXzRX^W+N* znJOHpL61!jR;w2Bh&7q9>5z5JEzmVpr$SAg(oA@-o;C)w7HExix=;O6h>pv=(UgG9@rwj|rX>EX!l9Hr)6(YoPtT_FqS z1vkmyo8km?>AQ;SFiEoi_-r$@=&PHm_~&A@)J=W0-9T}n`Va>vRxK?j;n_G{)Uaf9 z!(K$PP(KmYWfoAM(*)Pyr@Q-}l7*m34|F(nlwg&_M#yi+ro!b8_JERncRB7c)5y(D zMbUBP4(;?Dxdvi81x$JWJnPASo|fK9^}0|RH(F!F zbj+S;JNy*N`u*#81`QJz*g38bn|T>x!x-X51Dz!v;uNq&*W4LZ-C!Ei85dY25IwH@ zn)sk1b3fvvScM_gJ1L;%5Au9 zeuSbEB||_5?>*CS8O931thF_E+K@ohIn7<{k;&fZY9{=1dlBLsVE*LrcWX$ek0fdh zrVkN*7$iaBOp6+km4Oh`-y5dEpcSe)lDie5`>~6E9CypS6vrtoMBPt8=VVl---SRp z*4Y8)$!4Ww)os}!d@2$ngRf>+wk{|JgoOKO`clbB4V_c!exxjlnUxQ=&IR0NwmDJFhB!9nW<3a3%~TxY@`D086Idh(`})#ND9>_ZpvZTL#2=dzs*ST#TbmJ{IvGFJV)O1YBf`{7uHS1B z+^jc0M8vJZZRDp$%gb>!?xFtGf{7a~TUHW#4_b8FMo#;%Srd4N8!3@J6b%$(T%p)J zFAwFBfAabYZvXCCf+eiWImALibF-Bjqs;~?;%F|cy}&z4KS0Y`v?N-%y$vRZd1^%U zc}-;dK&`Fa7E2#cKW#V%th0=0FP1fVSaQPcd?=mtx1U`dauo3adwwigJEOl&DK)$C0%w)oI?Umy#g_WStpg+499c8W>CvM|_cLT#b zrZ|2EuA&cKI`YL!#BhNCAB{bOHe>UP;IKCO>1rD~8yl@+m;UCSV!N+g8+SHc)1S49 zh}(wcerB#$#BDG3UA?(Bg7~Y$F1|7h6fcEHZ!qq57+nu%Gg)eeLKabOgao&5k4sgt zghkDU&y&TMRP&O7xPp^vlM;qXi36qMpKP+&TI&oy(tNgng5c6I<7!64n|=?ae>LI+ z?cxlf%8woGb%?CpZF(FMO%MWPxEn$#1uEOiH;<9IyjIqvtWOqneJ*%b%~Sc*`D{ox zt@sp=)WNIId3d=Iv%JjRtqZHBbugpm!4y~>viA54*Z=jdja3k6twW*k`j07md1Np( z%Fq&M^re->Jntt?(t4tZatG?j92-m;N@@#xXjRrPJ{kuGJM_Orw&4RSOK z?S)0Y#oyc8Q0^lWZu&eiDNEP~kSt@zbq9 z7LzHXGgpwC)qUx*e*8uQQx0SkP*5-ogv-Hjz7^rw>$h2g?`=0y2_1qU}-Y_y31BDNOkvy3xUJ~p4Zw54_EnQUi6_RS3{-E<)*fp*9}d{rcE|A zI>lsj1=cxgOT7`i)46cBmJIW9*O|lDp_$DJJpxQNExqVxi5RooR5sb(&r}2Jq{lWT zS*R_hjhc`S-%+Vms#ou-`9 zYBuhvu*z36WiWu&N%0bw0sLY0XB9)u0BN|qRfY7KUV!88U6qnPH(IU#Fo@Ss(UN@vi3ItT>5pyrY)0C1(<}o%X3jc)P}O4>k%F+JqnI zgRA+7hI;<=(!UzX&1JUFzXaI+!f+9$rc-cidK&;l)Rg_vs5d9yok!)a5-O>^yxm=v zL@4+s1GVQvMC83c-7`gn#2wEG@_~^~SC*pa?H@jb6`e^*y+1`XZsWle0=RZ=H`=l? zW)4}|!kCn2^g^ghdz4(0yF^s+mwtv$%LAMM9Rb;yd2w#OmSRmNzJdfNO$kkkvuz7Y z(x>=I9Ma9T&m8OPkP~v_>DztrynU-R{_Y#=vsIZ|?alaAsDQhTfnu!D!f`6<8)?8% zqOB_GTBu_4E&uqI;JWV~UPSz9FTQQ_5h3_?$$etzZns`?_O0G^-M0Svf#04MH>gml|Df;h{Nsow!&i8G(@ZjAaGgWSMjZ*I#i%unGj?3ytBF z(D5xB{iinXHoa_tOo}fnt7TY7m9&r1;D4*2g0#H%p4DQ$M7}c=k5??)CulTi-khjJCNyiX%gqDYXPXXis6dBd}5u7jISf zRhNLKeH1J3X5Y>d-3yj07$0B(FpK_QLPE z1ai9UQ*r2^v=2DAq0_eHJ|&8!HmAJ#|J=)K>v{1!cQg=sS#IH59~a7l(`cJ`*{v1S z+9;Ny{?kH_rJi1PH#i2I(jlK^=cqd~{jzIvJ+5 z&Kyu_KVtYUnZ7aQd}Z4e=px=5Own7vFT|kdCxtl(c~c28p=75J{A~sJ zy63-^n~sJ=sej}BlN0FT;$iK@2eT|)Z+ajcC2}}jr!_Ux4l%u>N{P)|nbX>hWj2e; z;IU>4Oh2-(*45=+NERB8yOB5l@x+XgM^OYsJ{k#=ge|zdOIHHw$?9k6ZVaZ0Tfm6V z-|4TY^Nmk7@EHT+;Z|QD@=R@8fi6=Ef+FrTKhud3PwSOYO(3d8gQ_DrL<3mPCIz0& zhy!+rKQ6;kf2xbNO zahPYR*y47a=34ycF+HLqf3%jSwfjnXO4ZdV)OYxaqe4<}(Va6ey~A?i$2tsfKaW8r z3~BUNeewH;&r#?DC08-{Yw|L8`pq%TRff-?xAtd|cbce*x^wPqPM zpegc8NLSIep+n++%k~uCCU=Hx5hinME$>=e2rLE4&WazLo_G#p`+vdAI8Sm57LT)! z&WT)&*B?=jIV)I>ogIvD95C{+KC0TTf?_2wNxa>kyQ~G{mil5CtX6TN1$9s}+l>+> zsweA{#t{XHGwUp_Tji3|`T!9SdOI%+2+5*Elg=i%@(l7ImdpSx$2k?&FK?4`71!^m zuo6mA0JJJ5C9x2-ogaS$4qo}7Q%CSm4GgU{MQN>Ut7AT86)5QGnEJZq-bdm?4`uAI zbE+~vvSGnXRN-*Rt#1UIN0(73fQ%N(`9stSYHXq|{~C{$WjsNJ)k}kFq)XY+n~O1r z7GwqzCysQ=($tzbF5jSQu}_(z{ZZeZiyuQBlgsj4uA{djCbhSMf*9KJdP8NGF{aC^ z?Kyn@Zia+-NmF0mQ%zsi8s?bLvw6M7D(;@diMK#hE{cVB?J~(Kl;6oZkMzH1s;jh> z!y0oNpLHsWaLncIut)2d4I}5LePTN$=yS}Pn2*5813P@yPY$%jt6sS^-R7hxt0XOY z+!)*Rr}gR2L+iyD7nz6}N06G>zw{tvz$O^i0rkU-i&R7Dodry<(H{)X2^$VkdZYH~ zohmzKQMRM*>76<|CQ;p^Tyi_KH_`m)+iTr1ziZ|n)r;4$@SzYo{!)` z&x{HPUqms`&_DejLOufkEb~m8Et*(bi%109DG?qig6o9K&(^dLdo~3}TgSfcGzg=h zyrjFFK@RbdRf$YWCmTm*($OFFGQ}<|Nw1dUAjiB1!FGR_kU{n$9srj@J6&fFsF!^m zkG>T1!~7MU9F@(JUyG9)74#{O`+LD(3fBB3I-;GY4; zkoLx*BH@E==u0450|;V&KaI^TTSY8z{xa+$>F^ga<1LlTIJ0fw1~@E$hYfpsRr{J`Ly07DS=fs+@k-yItP zY{P&#%(bo;p@UTB_90{F7m)z;t?7+r<|AnP18VytZTl0eAAG@p=N&IFlDB_weI_)p zN&YQdX#mUeXOMenwp;i-d6lEH3H4DcTqsAP(r>k&%TEvf@9MSBgjePn#~+6c{(~EF zd1lE<;BTOFDSqF(3&aqgV;q7sdvVXa7Se`b%JlDU2hheE;4Rd5xG?8GgwPwL!j04du}x<7(cp}aj^?VE&1IoO(U90jN=LM!_i8IFJ8q-GcP9{r9-4}hCWpSvYg8w4!)K)||CkS9EP$~)g7fo10u%b5*7{oA% zohsXxNNjQ(#jILV^_x?17;}!s#ffnauN%Dy0zhL9$ZUb1;w#FGi?nrPH7XuU8P0ex zhvDms((T(3SwX0PHDy4m?_tj$3!WPr9pEgM=3Z%pQKEk*JvH=VIk;&|LsZi`o&thn$d6~Rf+2JR$c#-4pmtLVj+0$ zCsHK1`uLywxz3CR50Jc|pNU#Sl}+8o034($f_11E3xr;1+eD>yJ>OB2USnKrI|n zZ*sBV`x*zxTnGQqLWG`q@ls~{5c9N+oGm(FQ;#sF#U(G_ONOjN z#4y>X`{}u21n27EAVh+Oal{!Q0y#XuP6)v=tr58<`hm!fdFwrE5q-elXj1?z((=OSMJzn#n#EI+ohL}(` zu_bG(@Ft4sSK&GK|O|T zfcy0V0i%>-80RQchg{1mp5z9r>kQW&W<~dM!B2wFruq#RJ$?|z2`;MvJBD6D zyy1fi;5gvc17@XNRLwbj+oeQZU@6b=KoWPk2R;}8WA9oKQB)R!ghlEIsTn6{!&>YP zYt~Z663G|>u;V>x!eogegk#?XC=Vh5&4AZz(A~AHI$`L6kGHfr@jVWD z+Y#yy0| zQF3RM#!{h%57YzT6i`nFVS(xac#2OHR=+DA*_D+tVV{BW0a%KzkhKSv$4}*hqLqhd z#)#sZ(S3LjGT3**1Dg@Rn`)yu0p0XT1<&R(Me{q;IT=lH^^v;ew>O| zw1BE%V0Bs|D9#2Fz76~qz?8ARo7_oO51>YGccb0=^4CT(7YYDk8-K_GUUEzvX?NFL ziRH%27Rd;NvjjD`VTtV8KBO^2kxJ+{&SaNc=+K`!lCn4>gUpAG9(6 zd6cIJ!QN~m(~^+g@Dg!OgnEV@&_I($a79seHCJ2y12ZVS0}R=`A!F=Z-P#2AKl}$A zf1Up#@q`pD@Sv}Q{?3!|w#1g}xQEGYf&ANj%EW`65mbXXN1v_-02Aa1gg;phfxioC zf}hj6V9`J4+Np#y6lXg(fix%hT^Qgs$<*2E^5-V*n2%?If&i;A1wg?M3GGjZ^x~E| zKljtdgNnh@GAJVt5%G$EC&d6JqdCSHzFV90Sed|tGdjc;6_?5ChlLm66zd7S6HkBs z{!cYlXsmnucZJA}Boy)BZpbLiB(%J9`ghHM8qtfiXmIB=G9(I&{jA_qd#etKqFtge zj|gyk`u^o05#Xf7;CtaG7;f_ZGd@Eia6WmT@x9%-I|;}kvHiLMgri=hYQB~>e0}&J zAoB$!MJJtY)>&ifjD34L9ZBn0;1EK3M|CL1{*^>*w1}j&_Dco3zj~lBpS5Ym-Nx(K zWWz;+)ER&X?W=%OUq)>2WYBc8MjU}+VW@=g*O{krAZ~07v71Dhp<_6X|A4C0p;Rv7 z*KVrnia+Rs&4nWT@T{I^;7{6-6-Ecb?XBqVj-zk;w?O`{ebjLN-E6&mB+szJc{$h! z&vBCmg1;vHx8hg3VH@4}UH4okW80(!yU<}*0hzHjYaDCQmzwx1O@xi{*P)VYNTe?) zxx*fVr&p*a0|}Co?MRa^A|o1jsl}g?Ug=g4wP(op5vwCc*rRXmNX+G_3Ad^}Z~CKY zQP>4@#3Fq)q+Rw$frB~=m^bhu+lXn2Sck<4WaJw97?wv3$-?1guy^bT-?*^_0QubZ z@wa1ORAsn@ZSw_>!t_vM9pcSJEucV+ZPtH|9l|-3;Lkdy3NIHrS_e zn30WPw(blynnGWR<1I%q(&2qDmtn-Up(_Z1A=?G@ZXFKl7SBYSKRDt4!y-yWs)Q3F z@pTb?p{W@|3rrbP12GeYg~ysU$2|wo2}Fc8;gnQ*j|re+p7U>XZylp9Kl3ir)Osz| zBl53ziq0wrgs$)W?D>0s5}b@)WenZ12}+rM5oaO{)7Rb2M~rusB}2LSY78vZb;seP z3nEvcY}h7_8AiyzKs{MH4ynIz%^2SnQav!$n%y4ac@c9aARn;3knRi!1ygT~-w}L3 z2$>fYsQ@YQXZlRUHrH*ErO_(~+dKpVk+g<37gvl*suIX(IqX_;d#dh8>!a{f!T1E& z1~Z$hnBx!+=E>>LHir9vkm{U}FYI~!kqky^S9#LIOwVZLSC*c9z#5bjhY5F#nT#Y2 zdcsGdHn)JFs)>cyZRS_(rRMK@@~sCh>_Et>%L1TAgzUU{Hrc2@8r$9a(A{7EJ4yZ? z9XVObhvtsEZ+l=MwEHxJj!mT@w7_mG#ol9}*WCS*!+ zs$f+An2}bk30h!Cf7N*aS|Gem^Z-%s?7s6~cb=hA%VCp`=YYCLdfNugHm`<&=Aj8%dONGBAv4Y#yR;;_qAsO0NBbGhgNgMHKrUvoxt&;BH@|3d~ zWPrsn2|_`M{9AF#+!!Rn8D8w!FB^e%D13WAwm>DuKZgqi{qw>kjELR$MayxfP57a; ztey3@4R#UCwoP3PTL-p1pEa0$Rdf``XWNlnU$;Z{_a$dk&1-HrBaAq+>?V!ER9iu; z6Iwz;NQHbe!kUCQq2Y(r8?-}T6+rfGdY~iC-@hb6kJ2KP@x@p1LsAFRjK)|u!OR_^ z!j~jyBc5;Hg4w3uOwCeez03B^?hLXA6PNN>z_U&PS{Rti`ZQT&s4Z&9gr1-nee zt;>-s=MQt%BQsyv;YM?wX#M%b;rnRHrS>OROk6TmJPka(c_MY&ZvRexaeC8HP5$FH z4|Yv@bgN})PpB_A_Bx*Byso?p?qLq~x22&O5(Q;U1a@4Ddd9@~gc$aYp&wUda;`)X zS-2J#il=%%Z1hCXOSRI9<2xV%+#v34oXC+}2M)kVLXboCgvrH8MqVK?EH}f93TrGml-?HXwO0mJHzFw=+34rWd!g zp%yz#BR9pz*zWt0zbr|U!gTie`57Oqd0IY>XRyZKkl;#eYgvNr<#{*4MU%qAO9zrm z(wwVEHC@sMt4v?zlWyE@@uVtW?r|%#L>-d z%}F|1zTecc;J1We!qDI(cBRBg{E0i%$GkB+rqyYUQJ}fmo}*e*Rl|K{trgPQy){+K z-T&Zwt(x-}J`<`-yEe+*os(Ss)w1iqt?f)tPkXaISH7;Qg`}MEv4L>H`bpzYVqmdk zuF0QcFs-Xo)$N!$TLhYZZE_0mKoQL4Cuxb(fa$p5(%tMi`hw(X`?PjJ_IO2Zc_*8p z>k!>P$~|ZHoEvs{bk@F73?z6*ZqBW)W5G^JRb0Sw2)j_+!w}VH{Vk*~@RKe!vTmW@ zi$oKrlCD!d-*;fRRYSy=@G8;34)s9+-MKYH!&N=+$M`;vUQEYO=aI-gW{lqI2aLkhUprzq{v*YcG-|vN7=z~~TfpIotk$}@d34>BqKH~_4)OI| zof|HzayfZ&U5Utmhyw?qNWA6(j5|B7MV%%-T1(_+K6HXSH|>aHoN%}0-&8e8pXRHj z)N9QPE5F*LVVsLoA&wBI979oILQ+LDjU-d9S9MhpylB+8QpHrP>N3eE7gHXbX=Frk zW_fXp$-JEq5Y{9MVmIa&3(H_^Ab5p1x5K~mV&C3~MtTjeJ2ni;J&?t4(JD&prjnc_ zLb*NxQK79)y%kbp_~9@}h)sb9nT5s+U7=LGg@fiu67ZLll1PoEy)lhYw{}_6j+O!M6)M`?7~3v}bCPpiiSg+4@fhEV2i4Ilk`spQNH{K@+W(?4z{&FD*Gu^8 zNN>9_h^MkS_IpVMg2YQ08V$3RG%+bf1RpHxB?Lt1{P^aPCpNnCvU$f}d0+@sZZ``u zl|;`J+IGk#>v+fdW`^)e8j4?={Ux>3-3gxHTycL;bYq{vbM2UAF>kfX6|knd(=o8y zk!DXb=V2*~1gHFh)UFceaV}_64>gFA3du#A4@d4)?l_Xw2U(Z3oe0uVyyZfVakmYi z>&Heqc^y0yhz0gxay@dbWO)wo_7L72APtOMNLDAA(O|OZjYg5@QGBJisnsjLg z^#D~miS74W8gFW7a$scn{6I2j{1<}f5B1B)Ee1NQP~S$1IynM^Oh*7c1oqAR2e{5W zHfg1Y#OSA|<1|Qf>d`zrT2*N@sG+hFUf$9Kqyo~9kakJz#o(KuCYV!DRah*HUcLhE z8^OB)g6)p$PbLZ)hP7i4t=07quG|PsgeY8|WL$9woZX7DTG$wua=@x>e9{^RE7;((^RBTx&n{ zQwSxo8^AQ)SBlzoKWHd4_*OdcY#0>Jea`~gYme^-Ny;*t^5S-o5)(n2E6TQxCbtH73s4!Qh&bLkeQ#@fxL;aD8e{Y~c#X z_!Dayvdz@9>2dgKNYexL)Ueitxo9V5_-aYh1NYRh-laqN=HIa_LEoM1(xBRsnX4aR+#a(RU}gII4DWtKBF7Jml!NWxG16ceZI>*I2rH({@Ed<~G5? zAbH|*H9gMSW%c>(_`7R}KiHXiy0ogxl7_yF_1n-mtwOUXZ;6$FlCcAlS1>JDJOwbTD_*n1T|_S1e;g7`i>ZD$IvZE zHenM`hY#^q<`^-A564wz?K4RZAT@E@T#+C0CP6nu`X7+5O!i}xsI<&m>SHvzv8L;o z5a2VwZSts$P{qL7wP!|p98t8(%UjToVyw};Nc8bzzQ4AfS4-lO#AA+=N~8}MI}7Lv z^68>Jj>1kw31Iw=L{}k1p9$7aRS#56KFF@j?Uc+7b=OhXQR5t)Ov*mOu(Wg{KDPxz z4M*lgt2tACBcud?X~lnbfTS(&dysci5$9^%47vo z$8d@a;=TP@#3z}rJ3Z&$Fp^R5{>SDfbsD8qTH9RPZ9ud)O-MO2)vMDZmV!WARbOQ) zqJhS~EXJ)gLXr$~!KhAA6Q`URdJ-`qRgV_Kn8G4$CMX(gFKSQMEv;~>k@7r znc9+y){K&Ls4_?d9n+#gF=(7gI!7uAlV&xNOF!otEC}Q6@&3qaF5Eq^xrrx#4=P4j zhy}kqq`1fz?vo7v4kBwO+ z=E_9ZEF*N2z3xh9YS#pN7tLZmZ1d6n3UaDvYp#cH#t@+;V{2nN)w?&(+duP@e8$k) z^t*H>2Xi3@=6n|LVngp6=i;c=)uDQ04|wsR_YHCBun*F?P7FzXq(Vx!uMuSgGU`>` z93+a76C?}j)F!BPPw=#MI9uIT7VX-;9__J+)jjTVy%3qVZ)Md1UIH@x7siB2XI>Z+ zqq436FDm#SnJz?oU@rV06#0&R*@=$gF!xY!#XsT{#Rz9nBFMAq!~>imI+Khg4|>IG zMUSdOFe}9f!<$=(p35!NVHiC|e~Zm-GZP->go8$+!|jgXox_>?>G_2OTuM_kU^jJBczT zPLcLW-YW{D=n3o#VVdKNNZ0pTKXIwP5o!Y!zrQ|RT_PhE&^lEGao*8|&iB{FgM8CE z`7Cl$A#9+UqiGYQ{4Y`O>nR#|$R!^vc#_w#PIg}I{!OJ5dMy)pQ4MYn3Yjj@+9>71 zTOak{{47UgnJ(pVg`QHU4j!X}X_?pXB75}Egx-q^0z~~8MT8rRJEDRP9}i-!HirHP z9#njxEIfU}loDMV%}bhTpnWtV;0w3YJMt724&Xky^EJ`MElXvK+*sz_*qJ@Ts_25V zJos#y-Y4Axg~7WBcv9^&GP-;8}0iu-iO@s z{bc%$*h1X?gSdmskGlG?^5m;EE*cmsF?1Cudv*~+_josyXXVYGz`w$^ZSGHmaB?;* z9Y897h&^Z*AQQV?#4uGjo!Syqg~5v-D!a>c<8-bBF64sa@mJ9~WBEcXSFwT=pCCT{ zvmx*7rZ_WvsTi?L0$(9f{3b-V9xnv7GhDmP1^BZhCyo=4>$=j4sIJ=i-0pSY#t;CkB5L0Z;u?cVtAW>E7wjT zA{C%52}fAVW{cHWqIwvjP2i;TaHKQl_@3_JkN@HaYiV)`O)9|8ShB5q5=h-7yf~D^ z=JZj*BktA`a=3;yYqN)k^YD1MEiA?=@933j;U-Ns)VsY%wocq{oN16CT^##z(%{`3K2Rg5JTm&cB|J{q`%iLn# z37OeGF!(h6e66cb+xGVOcQfb7%>R+E`1B}9haXtvF3Hs*)vdOhuXg>jqdG3yrQ3lQ_?LyDBsa8UBf~&^np3{Iu>a8%b=}3t^Sne zIv*0VnKpm8Js+Dn68k!pOWIXUmS2)zlV7pSVX@t&gHK7XsWxv5Q|7|^uaE~~?+@ZX zCydLsv}NlT&pvr6p2-2tQy;S5y5AWoe>?JqD*7+`H)%uu^nVKfSKi%CK*2T{G6)Ee z5d=i~|AKe-KVYqj05@w7a}iThb63~@4Ilpx^xdeAw;#c(|MwSzwNy8rPP5;@UyO}| z)zh{(R_*3EN}YCWv&}`>baN!jRy-NgI*-#`9b$?>3gfNhWUvcVxLFY~8Cd%!G%RY2 z%XaIfa?j=RSO1QSv?pmj*@utbEQ7kWWQ&ZAg0CjWy`J~o^^e{TqkxY`N3ac%1W1<1 zf@f3k0LAbEFDOvx>xbdDa^aWsFfnu^Tp$_77spTG;R5J8>^C{@&l->~yugw} z$J2LDye~tnZxQA1#e{~#0x$t!OL!oxG5VK=)wdpq@4b7_-|)znThTY+ljoX;Lt*nb zX7A7PnJ+zy?~=nn$V*1tFQxDf@Hea=b1FDvd`19GHH5zHZpDasDz$qR*OlgB@~lajfKFwAtqmVhyrSN*%*RQVJ$1*mz-E74h;kVU z%pV^mT+3Le9qHHzwcpxa6C6|@v#jjqR3=oz?aF@_B$4-tNnYHpdl@?38nb=L0WvbBM8sw&W44$MEC2P;m;z&f7d~6$m z57OUX`2j=ezJhNr6l`iAbr>m)$*@$1+xCsC2ea~$EpV!y%*ee_pz(k(HXa23oSLjn|Xxu zOds!_RXWwjV+^Xt6?`XPduEHulTl!~OBK5LQ%o#8+#F6?QwjKZfA6AajZhTPVnlg0 zX%)`o&)wgONOq*ePr{C$oz++zCV8=O;oc;(+Te3RheDS`2JbpFSPIvo@j zE|A%+>l#KY5OI~Kt#=jQqtOe&D|peUCtni%h(200+ft3v$WLY+N9;&F55Ba{KrE_b zs4CrWS4L8FG)s!n_T|!*bJXzs?=X=hY`bbj$x^YT=VA zR+&{#LZL%(ynuzy)*pM<2ZdP%4YuDNpsc-)rn>ky!Wv<{$SHHqj>QCpsrH*p)l zxwYaGscejM9@-im= z6taOGF0yI#Yc^?Q8mpeA+^cYJ*P#E_@%*(STeCvcXp(Z};lM9j1924kmzJEfD$`Br zj>yU-tIqZ5mYp|NGP$ZX^#Im(Cf)ICQNRDtpdorY1&+ymFKlrWugh|sWvrP;MVn-L z^gB>Vd<0YDH||~=B~?n*y?#Z}8XR|13HsTxCc`fIAGF!%_HC+GER$;F8^1LLZ>uqb zsq~rBrCRj{PIK0?a5Iy3AphR+7_a)m0s$`X=-MrfxrDk+U_|E>5&fBnp;I2XT{HpaMVV(t)<~ zNfqn$W;fLNYw*R!MeY)B@4|sLqWlL(mdxl3c)HsIK9&%O9jd*1>@gzY>oF)H^}R!! z!{UYJmiz_}3xKQKCC|4c&#u*51h?qEHpwBDdbwSaG%vd{t4NMUl+WY#Nlf7i6Td_P6 zyKELy#Lkyj)Pk3{+y&{YT=IJUWav|%hzz^zn@PO=$@^Q&2JE6U^vtbi1Z(J#?E@nJ z0YTdwmymdP++BcPTIqP0FW+qW0M<`>{P?XfKE_La98#e6m|*TtW70iB4X=wte_xs3v0WnNqB zmZ_4Z_HLh11E2O`B2QZ zrArhH=S|qODP?gk^@K_nC1lyiM|~(s92fP4ZPEO*6yCGk1v1VOIYB;G?m&&|a1^NN z#YdFaQH$tL<-`@p=XPa`E;{Fr-j2XlyKc6p3{gjfv8<9e{2o}9S% zAl_BIXwL0*EhTOLIf1y9u|blIIQvaRd(@bkRh<)(Kf*&UlkD5X0Ad-SKndQGfN*wG z-om^aL-dlNo zhM=I0$m@Ii%vA(P*AD9? zmq;D*|8Pq!d#F~!5yxzfij1@7l~lyyyxxMDSAxyK;TggONUiQw?dgdsobFz!ySx!< zElK5O0L}(~abze?T=1m*SaPm+y^*cAiF7&CV{}*GA{z3-%_-}!fzNl%y0}>o1@rcB zFwyCMa**Y^2$5@T4jGuyn*#BCIVibDaMX&33uR@J!#``z)ifG*{h2ung^Z#}ZZUE! zIQM**y|DTkF=t;yqdzR-aHm2=lrgs`V4GDkQjnt=|#nrYY*a*G~L zlj5%GmNB|UtYPm|R+{vBX>)o(4njAzvM+TUsdBZha)?U;kOrQXv0X7UtdKy^WuP0O z&ArGpAbH=QlOs{6oxKfjhcdAYcM$6mH8b}h&vCrmBlp}3#CUsV%=p)4T$`WIlMEzm zVXI8b$u$%*#r)NJNH-c~i}9~s2-3Y8gS#5!%b#~KEI8{SLOv3d?}rolO`f}dcK(Hx zt|mS#2D}C%@}S(j<=b6f${uYt+5H8_gRyn-`S$bg%`mx_`h^E-LKna-Sc_5-Pgi%F zZX;!t-D<+b8;d@=idc0ehwxnBIb7fwD&yA-(THag#{TtDK*Gb@@tbi|hVF<$T}D%L z=K3LI&r`4b`n{@R3iTanhE1wHP4j9`yvDHYTD>nKH%7`evvLuYQajZx5YMl`C1{2M zfzIn$M&Oi<=NziqELS)NzXhhSfd_*)~$i2ej$da@Wec;{k0y2vVMqTSu#|^eGWvAA- zjIiQHee~qd)PsVa1v~}+h595kLT6NNN@>IMi_PyVRghU4vrg$V{Nd4V1G zj#5}1uAR4jh@P#sVBVHk-N9RD3w;nGj4?<^t8(_dL*0)pceQElu3kax>*Lm%^Pv6l zVgcw8zUa_E5u_JWf*WL~$O1D)Mx+6bh=bB<J|rbv9g8ip{$?x2i%_;W&yKWZYHF8)^i31t(|l@ECQuIGoBy9;K#k}QiC(N)~b)YyS_`I5g>W5%)5y(Fc0h8VNlXum!&Cc$; zGbYwHg*apOMjQRT?eH7AH@5XrTP>{RkeS2lySCJiEAGQ%_DW*GT30{ze(XDqBE*YF z&|5lj@ac1gcuGY0v!5p**|JAUMszJ8i3^8N!Gh2kyM$9Z@x623vtN3LL1}QH_DPCy zG%~;0|ECXs(zI8ttC2$-`RBi>KtVtx|1W&FIKT}c=IG#I?&4tYN-m#tD(Tt4rN)Y52^^g7Y*bGDBz#>u-IMQ)%czbAwH0bqBr#YgTIFW zK0Nd8A^_?oMlFhQn3M?2%wzP@rKJ*3D9tb}d9@SN%dqr*$)7he(sW^l?Nu_MIi~9c znta<%!N3C4Guxb=$BpTc#;TL2r(#Cy>q90~9Yhl<*YGL7>I3FrcC*&(#%1}&;}iGR zLX&-H`>^Sm1ORXSNv+7D;IFd1lOm^@yfif-zdsiSJGh1q zq;`#@W%w9ESzJ5B<=>xu#F{?FN52ug5D*Ak7cYJ}mcaAugs*!X1fCE+5kgsc z`ffb?-2T_1ti&*ib^4d?BmFPkNB{q`*di|WjxK6$00*=GkiAWPS`l3Z=SvZn&z{hs zR)cRrKS<_q2*%uj4H!DCzT6?7Ln%vC4y>8zu_oB2@^7~jclke^ zvnYX9z8;M;3mLN-IIYD-DF|Ye+bMtSJLp!!EBQ`X<@zXdqm@0Zq!byw>^pGAh+}?W z_&1PikgSrQ{;ei}X&5uE^~qP4kZRRU{y8s~e*2(l3UJQpzfV(3;p9J9^(YY$T@g+BU=vN?htq4&QowjGgP?W`1n!e1;--*+p0NC5_EU=gP8L3A496> zkJuWDbuI<@rtmZD6*(;{!ZJS*Uz;Ni>FznGu}Lb$FwPjc3n`f`x!1=R%4p1KhafGd_)-~NI5i$Q#}G5pd?4(9t@MY0#(q!;5D;$| z5D@ME&y_9;aQM$KD-8q3ZFQW0+>;T--<(w+tj)+cwmK>0b?ZoDYYv2^*CcvdqWDud zjV~k4Y7Oyun+`QDO}6#Ql%+BfqN1WZBusGFB1gf*1HwmOBfhx{_6CWXthBth5&O4i zf-l5@-!J?>xtsDwXk+O!m7REH9`t1N2e;ws;SRHTs4(SeJL?a^6U#@P)du8 zqi|>FGSQ#X7ka4UU(I*YouwpYM1j9fwFg^6t++bKNV$$R6=189Pcz~5o}(|)yho|x zG+huK8l2|QT=a0^xfqN@=NXXSV*l9X7#jOP-td%Di!j3RnY!+CPgd%)?fklNH0*s* z-gg%4w$ZHn(O_rqfOe>{N20Y`&29IYW%YIWcKMdJS{5~kBvVe|wmS1eK!;Rq+I>hU z8qKW4oc1uF{UkHUup%5Gp#l1rqtBE0zQgz`Hry#&!))hsc=xG#h08d5Mxq;?$bfD8 zsapFX_5)KAqj$M(z9j#eIjrfpLIB0ch-G%*&Jj&%q@Q#FR{D49^=eNi+egPQ16Lvd_^dhLPfP^EGA z*za6)?LnqAC114zp|aTd2fl_Zx|<_(%-1{GL(Mi|_^jt-`H9cdIlCXzabL6sLZTR# z68c1xn=Ks=9UX!)D2DCDsUtQgL-xA;&C1j0)PG~`tD@p+lxA@!xLa^{cXyY;-95NV z7zTHDx8Uv)T!Onh!65^|N#OGT_ndX_InUqItTk&M_QUk<>Z^NCa%?sQHkH|phzXiWW{64Mt5)INh zg~loqHF8XzL9f6{i)`9AA^)qS1Y>g+i%gy38t>C;^;PFaKphc}ZO)6-L2#_ABvh2- zMp@)1k>DN4FcGs!rOXE32jfHG%e)~~gV>fpcB?Ox=P0o=#yiYYG?ic*)po3CF5k>n zMZGBVZGFapR?c2Rxq>usdw2q)w%SQZnu$Pll!Ki)O$F3dl&F&}r`m+#P%QXB;>X22 zL>H`@S@08W(5JUV`R$j;bel*u1WQdPgKL`kmFHWrP4t)Hstls|EQ73VP#nrl7+m#)^aJPrf&ug4t`^%t0L^OQLZ0z}A zcoU@ncJ`YInEbe4VARDI6~@n6Vc#aQp8K+%oqq>@&*I8T(_J-VN6Z7G@__fi}qNk8i_ z5b9e=HVs(OFO4~9&f{i5~Yup+D>Q(Au6De9Lj95~?gDK&Y;T4_99ju&Kv+}1- z{b%q{_daCt0t^d%8MzV3(xmGq)8P{&53_=O=J z+loN)0-(H+qRnlQCM-J9xCG+2qCut+Z#_$}vxngv;V5D^W^?y=s}b9bw6VT5m}*KO zBr7361)yF;T0jOmmCyB?T9$I1S=UUrL9K2b)9DuV5O$zFazfKP{9wS(97PeVf#GrV)=I}Trce6$Hg;tX zlv6GJo0(3FWIq&jlWf4%D>a|1Qd%oDU#I2MgvF$36&9WXw=--2b@9G!w+L;w-uxjz~?2tuIa0;YyV>BELAi@OU&VA?hlAh48!R3PH1LjB)=C zT49cXvq$*!C?(0=au?=TY$k2sSFCSS3fC*Tg_Y*1g8XpCE?l>a&L5g^ps!S4)M_$n zwe+p1mQ|v>H$47r#k2r}^PtwGK)h8kH@A4-;t-pw1SIlw;aelwSO9~>(At7+%aY+{qw>`D1>~0_HTe)vj+{gP#HP3mPLCQnHi6w zVJo*@WkLk~4P&`A!H7v^`{y-XNH{LXI2Tb>6Mp*NfppD=^ZwuaduG`mdlF8oBX>tW z7u={0@G#NFB`fY3GabU=C6b~{?n3@2f_-vshc5Y;)jB@fiQYfoO5{DPoc=wiZGH@D z*hUfQDiyJY3_3SJ{i3ot3@MoCZ`exNT1s@cd!a`j$GYJ&Wl9yNteH=R^LT&Z$d)3q zpZ4IN)JKJ#YQM&Xe?#MZb$bwSxN`TJS^e_AvsxYkc5Ij{d#oacp$rp{5g*NB5bb~i zGc$IM^(;aYQv*{AQHMZcGTh0B5hcXOJcm5f)ni~Th10Q7y%lM2`v5kDV?MXU)jg*> zoQyX`{LAV$w!3=Q1RLU4v5tHfov{3S&`6=BlR*bTiVg#?iu8zUOoOp3Y$WhL>M*-& z4po&|OOcwx@Wg7cDjdMGOt}g0vi7n*_U5s%xYAuf*_PgaR@~Hb;PdKDVG1qfRv;i9 zac=`_#po{>zO8984wm8E7j`ywHFmX*#1M=z2m%aLX;rjUK-mCmxjbwyhF`9=9tjya z6$BH4039rER8f4VV1!EHpne>Wk_a$!T^VqWKmf&PumxcjJalxHG&u1L{A_M3Q)bV0qXCZw2n^xO~hJX`wuvFUZI zIDE9~nLaS8qKvysG@^IFuOr)t&sfvmyWM5x@4 zs&GMtfYAP@E91+Te*vso9Rn9Ezz2Vkb5v?}M%`vw_*olN+FnM7z&w|nD)HH=i1{Z? zs&bQZMtQfHx27|NF&OB*`xOu02A_Bg-ZOk*fZzrZ-cx2L(=1>P&xB-miD2%%w5ZMQ zEADIJd+y)a;P>yrst>RJt9_7QA(4kYdPfh+QgGAE!Jkr#nc7*PR9E${a|Hj!kJpKoN7l=S0F}Bpr=jhA^OgtGt zJj@tG#OR)W#aVW5NYNbGsg(;Tw&RBy=DbHMr7$*Nnv^=5DxTMTIMuS=-2Q-n(qj!e zdqi!eYE5B$E&{NqJzZ#q!Xam7q%*Ci(a4l0)kVQ>A=d`CS|iLv#y(|f80XMNtc><) zp?EkAoBqd!8Uwv*lhr-<9e2(3g?^_;bPP@S0mvRXh!xR3Jb!|Gs^7xG4F&!WhEeNJ zas?V|hQDo&l{9(dLweP2vJDlo@}StF)TEU|<&dl>PBulY<3x^{kN5@E@$I(CGeiLw zf_X{%sr-PAtbIgo2B8u;VZWueG%1Z{xh6mT8A>WeT!m3Ci*+?Z{Bs*Ze=|qA5w`YC zZS&A81%^e9c=33uF*P{SSNcI`N~h5!9_1E)v$vh47!+!uIEHZFLr5-CcJ58>`#xJZ zG+6!ISj9QBL|;UD;&OC4SVWp{(KD&ZYRrf{3z*@qput2JY;K7|d~#(~TKc*}OqD%q zMB1AskmfhDM6!HOTd_t?{);N-$8WMu7$=Ox^$I>D6$IKshQdsDq0wdWn;$8^-})vX z!WkgXL1t9RRk;l)Mmq|Y-RAn|MNx>Z?tWqsG3N!o&oHDS8JWqRUXw{6;2+WHpgqPyV= zuq2o<2>*%3+q$@tOipR1rl`kNq5W7b2H9;69o?C9;F*|%E=&s$HbWB<3#rSM ztFT0!8Gw^t*2_in)e1q(&~^FS1jDLL8i`fMop1bgHey%2>$d(<+!-z?@`6UYti5p5 zfDdX6A@@XAK5ms8YRCA(GXpoS@RayEy4D{iKYnmI9!Yi^;Wz+ja?T)UZ12$|li^)A zE8lf;Q#s2Yeek>E)IGU3d7&zX?va1QtdcU{%uvke;Zo{)eFB;8mC(vRV5S<()5RkB z7fJOgcgJmvj)BlfWYwDv_hiR+-Q9)~Zwhn&Zo)A93si|)@_LjE9b&*pJ3I^InOmohVali2_QQ{(Q|dcW4n0Jx&njDc-L5H*2k?Dp z?N32l$MCKZWc{;3;U>Ps-+x2?nTF3A4xO6xZ2Ov%_2vvY=J!WRF7d;0@PxrQCx-BC zZ$HVqLVsu4yHW=hy4v}LGJkX=b{@;Gu9@(0EHzrw-WSQ`_ zbBs5Jc*bJYpQui~#~9)j@B8(QrGR+8VOu!0hVyA;6dTVnx1rxZ7Yl5xh8^}z zCv{pA8VkpuBTD2MrJAF)kr&IAh^JL72(S@oqDs-?|5b|1j6sDNn&3cQEqF8T>xpQb_ z+MJ4jb2NKZPFBBtBu@Y}Vu(Xv8h5P6{}!xscyv)S2=K0?r45#=*=4?aBz()ZIB86o zN^A=V-CP<-YrRwnqglq9B)0B3*UfIs*N+voMwpLZnMD~=jy({So>&g8?~e5K@E^Y(MApCeKMJvM1u$aI%W@<|z6gYJ zw_KXe~C;agnCW1N4PGIi=S6R-5)mK_;N$HAur(<1$l;Zu;7qTRY6)O{?i`M zHER4tm=#wR9U9&WtrPMzx+7qo=fDr`JwM~X3~`q3z^cB6kx!CCAv@OfjzWnb)`9{3 z1@1pfryd#te&wTdI6q3q=pTksQf^;dByG){Kg`7cuAOZaEOG3&^58|$LR@KVbuADs zk^=^Mjd&wyPWN*XTnS$CnHRm{=5|we?LpWLb9|iUSMh@1gW_!0Hx%=`=)%59FMN5{Fj{3=! z_;<2Zf-_}l{++pW<@XAJdb=>K9$`L7wMm0?x^zH_3K2hsprWpM*H48svz~2e!4)R* zjCAScGg%kqdV;2=ZyO4`H`K(txSkj?_#{im)I~T!)f5rfqn=blnf<8o6Kv&kSfgCd z;q0M$;p08(^Kp`~1}JFnnwn=qg1VJVEyXR_yV{mj7ovHe8TK)R=T(qx``SUiChJDq zQ&-xR$HI-5;=>N!2@VIx|Y7Fkae+uo9u zr=CrD{4}3lVKZO5U(6vO{X+01?ua|jO2jE^Q>dc6WV*eNpx68{4Nr@gZHNL*FzkRi z5V?bP8}xE_d`IjNm+_Z9!V-TUh?cjD^QG%0|4L{JCTEnW>rl;oedQjNyW`!{Q{mdX zzb+EpckajYyNBCGOrV5CScD*pdm&j6iekpxm28qGbWVD~+DWI}4Waygb!x;ZB6v++ zg%Kc%aUjNPlh}c*xfRi!YZ3K&6AS+V-MM}fhQM#%ITsB1{_upBwn#lgVI!JvC>rOm6c*2$^5?U6a<)p(HXUMKitef*c;Ztvrk`z-%s z@2W`fA3F+x*eihzCDr8x8b882C6cRR8~AzmyMS0@m;M;fJIr1bKiIpfq3>{hBzJJ9 z%5%KpyHJ5dcetm5g};D(@P0&hpH5#3$-V|5_~G4A&LxP8LiWPH(4X2A7K8>t`jOo! zⅇ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


mVrzv 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
    ?z?r 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

    - * 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

    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"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 *

R;$zE1ldwu8Rh2YdD$N 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�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 @V;(Ox{2C(|oYW;CiHEQN`Jc1A zVE;h=n=ftL5f{n{Z?CRz-2XlSVDjB5P9TupF=Pt-;}gKn!rsE&=|4j|7!_!dlIaRR zMtv2btt+I_R;5MH!c-`(h-5Zji>qtgWb9A}2oG{^`QP@+e?&lYij2Ia&af8H*JD!q z7AZ85JDz(t=`}Tx?Ii5A4V^yp3MFvk`oOV}pGw+F#TA;1aTN8&(nK{MRp7bCg3Q^! zbBRLzdc*D=qX6|`!Oa>Ue`aLHMy})-S-sTZR^!xC?lig~GE^s0?=eJ^gB{>Ouf|Bb z&Z3R$`@A3ie8FGVM{OAR3GYQ-HzR3`4H|wIFszHr$m11b1JkTkgCjWwwC0WKHXhb^ zh$KG7YeY0KZ6MjCW3sgt=cmNzPOk`*uStl0bcrmutuN3j2^gXIs)VdPBYDUhe)wBc zv^+$1@&Z^+s&3z|@)Q4QMp?l=qlN2$IGutQ78l)yzLtOWHqzrY!{V5Y&5TA+bHY+K zB8G;>=3J^PVg5K2U3GjTfvYY1F!3<4{!p4+aCjrdmj@Pa?;Rtf7pI9$Lry)LY1ouC z59}#c?0SGOSlu{68RpRHxq7Nz37cd5s~cRN%qh=S(t9Omw%ogVW`1ka#;vDdP*2U&6-)4SkRTp1!K79d=A_<%>>4$ldh4Ra zYpqoI&VmnV;`|_QMoU`0f~@n&o*dMK((Tt(wt0~^tipU~rL_I11&RA5l1ZQ{(mBTj z^BOA?xC>6&FM#=FBDo!>oqeZ*r0Pq!U3@7SHUnnLcBp;}DB}jJ>qF5lB$TcIie;|^ z{-~_O4I;9Aw=xq7iFyyDg3?|G4&h-HiiP%ABzB@MMvl2|m0>QXZjrhoOQhd5n~I*a zN45u=6%=06MhmmK9Xl^XA^s@UFVJg`()YK@xCeQxW8Eg;AVwGb`~dygSbbc2PV@GO zsYM7X`@&P7J%G8$uDAv39fXQ1260+*xY_fpSisw$9qmY`#3N%=@J(LBA?4N9|N9>b z9LU>Yq&bAKKJoeg;C%f{ej{o1|NFzH!ntD(;|;%)+gxewiI|F*L?L@dh{E%H;!;d6 z6rU^)Q>Oq7{o2|*bDZ6RY*^u_vI=~s#TeOQe3ARS977);)y(yV1%8_u|?1kyLN zi*21o)v;bH?T#pLmXi#JjRi`qHO979dOag`#%$Sn;f)r9&_N&BRYOogu&fNBYRRk$ zjmX0OMuPUkFV6CcejT|nJf|^9O&EYd+5Y&a8XIc7n%p_}-rx^FkHIWSN>p65ff3X( z)-&|7JJ83W_9{mRB?3pE5Wb?_GzBzH^Tk+M&TAON@_8Q*lt7NNk;z_8?}Ve&1fr)Y z)?4R(6$0C(%S0L*coE=`LRTbCW)32E(d)Je+(;Bdptv>GD8%nDe)VR?OM9} z(-qUpVw->vi&YuLij^X&fCS{TWNCzarIqsx?jXa~WtZyEM3z@)hV^;z84TYc?v1*P zDV<%5_F8E|zn{C{k@N3o-!s>n3T@{o_sSXE9Kh)M5>2IzaXNxJnqujAVpx`{u$@Sf zIRX*g-$FM?kBu?ZVFrC_3 z=LeTx-VeEt&p8YJT+FCpy;&My;m9lTUJK3P~>~m%ZU4a{8i<<(Z>{`&JCX1_+ z++jS1zdB~^XT?<)